瀏覽代碼

切换青柠模板

dxl 4 月之前
父節點
當前提交
a0f22af97e
共有 76 個文件被更改,包括 3015 次插入1182 次删除
  1. 3 0
      .idea/.gitignore
  2. 6 0
      .idea/AndroidProjectSystem.xml
  3. 10 0
      .idea/deploymentTargetSelector.xml
  4. 19 0
      .idea/gradle.xml
  5. 10 0
      .idea/migrations.xml
  6. 10 0
      .idea/misc.xml
  7. 17 0
      .idea/runConfigurations.xml
  8. 6 0
      .idea/vcs.xml
  9. 125 46
      app/build.gradle.kts
  10. 5 0
      app/proguard-rules.pro
  11. 1 1
      app/src/androidTest/java/com/ytpm/qnjz/ExampleInstrumentedTest.kt
  12. 47 46
      app/src/main/AndroidManifest.xml
  13. 0 25
      app/src/main/java/com/ytpm/hydtw/Constants.java
  14. 0 494
      app/src/main/java/com/ytpm/hydtw/activity/LoginActivity.kt
  15. 0 101
      app/src/main/java/com/ytpm/hydtw/activity/SplashActivity.kt
  16. 0 6
      app/src/main/java/com/ytpm/hydtw/dao/Config.kt
  17. 0 62
      app/src/main/java/com/ytpm/hydtw/loading/GlobalLoading.java
  18. 26 0
      app/src/main/java/com/ytpm/qnjz/Constants.java
  19. 2 2
      app/src/main/java/com/ytpm/qnjz/activity/AboutUsActivity.kt
  20. 3 3
      app/src/main/java/com/ytpm/qnjz/activity/FeedbackActivity.kt
  21. 2 2
      app/src/main/java/com/ytpm/qnjz/activity/GameActivity.kt
  22. 201 0
      app/src/main/java/com/ytpm/qnjz/activity/LoginActivity.kt
  23. 3 6
      app/src/main/java/com/ytpm/qnjz/activity/MainActivity.kt
  24. 951 0
      app/src/main/java/com/ytpm/qnjz/activity/SplashActivity.kt
  25. 2 2
      app/src/main/java/com/ytpm/qnjz/activity/WebActivity.kt
  26. 2 2
      app/src/main/java/com/ytpm/qnjz/activity/ZizunInfoActivity.kt
  27. 1 2
      app/src/main/java/com/ytpm/qnjz/adapter/BaseAdapter.kt
  28. 1 1
      app/src/main/java/com/ytpm/qnjz/adapter/BaseHolder.kt
  29. 4 4
      app/src/main/java/com/ytpm/qnjz/adapter/MineAdapter.kt
  30. 2 2
      app/src/main/java/com/ytpm/qnjz/adapter/NotePagerAdapter.kt
  31. 5 5
      app/src/main/java/com/ytpm/qnjz/adapter/ZixunAdapter.kt
  32. 4 4
      app/src/main/java/com/ytpm/qnjz/application/DatiApplication.kt
  33. 10 0
      app/src/main/java/com/ytpm/qnjz/dao/AppInfo.kt
  34. 36 0
      app/src/main/java/com/ytpm/qnjz/dao/Config.kt
  35. 1 1
      app/src/main/java/com/ytpm/qnjz/dao/IdiomStory.kt
  36. 17 0
      app/src/main/java/com/ytpm/qnjz/dao/MyAtInfo.kt
  37. 1 1
      app/src/main/java/com/ytpm/qnjz/dao/Question.kt
  38. 6 2
      app/src/main/java/com/ytpm/qnjz/dao/UserInfo.kt
  39. 16 0
      app/src/main/java/com/ytpm/qnjz/dao/VisitorBody.kt
  40. 470 169
      app/src/main/java/com/ytpm/qnjz/fragment/DatiFragment.kt
  41. 10 10
      app/src/main/java/com/ytpm/qnjz/fragment/MineFragment.kt
  42. 5 5
      app/src/main/java/com/ytpm/qnjz/fragment/ZixunFragment.kt
  43. 107 0
      app/src/main/java/com/ytpm/qnjz/loading/GlobalLoading.java
  44. 2 2
      app/src/main/java/com/ytpm/qnjz/loading/LoadingDialog.java
  45. 3 3
      app/src/main/java/com/ytpm/qnjz/network/BaseRetrofit.java
  46. 37 41
      app/src/main/java/com/ytpm/qnjz/network/Callback2.java
  47. 1 1
      app/src/main/java/com/ytpm/qnjz/network/HttpError.java
  48. 1 1
      app/src/main/java/com/ytpm/qnjz/network/RetrofitManager.java
  49. 5 4
      app/src/main/java/com/ytpm/qnjz/network/api/MRefrofitInterface.java
  50. 1 1
      app/src/main/java/com/ytpm/qnjz/network/api/Result.java
  51. 1 1
      app/src/main/java/com/ytpm/qnjz/network/api/api.java
  52. 58 0
      app/src/main/java/com/ytpm/qnjz/utils/AppListUtils.kt
  53. 20 0
      app/src/main/java/com/ytpm/qnjz/utils/ConfigSpUtils.kt
  54. 1 1
      app/src/main/java/com/ytpm/qnjz/utils/DateTimeConverter.java
  55. 1 1
      app/src/main/java/com/ytpm/qnjz/utils/DateTimeUtils.kt
  56. 430 0
      app/src/main/java/com/ytpm/qnjz/utils/DeviceInfoCollector.kt
  57. 1 5
      app/src/main/java/com/ytpm/qnjz/utils/GlideRoundedCorners.java
  58. 1 1
      app/src/main/java/com/ytpm/qnjz/utils/GlideUtils.kt
  59. 2 2
      app/src/main/java/com/ytpm/qnjz/utils/JsonReader.kt
  60. 1 1
      app/src/main/java/com/ytpm/qnjz/utils/LocationUtils.kt
  61. 2 7
      app/src/main/java/com/ytpm/qnjz/utils/MediationNativeAdUtil.java
  62. 1 1
      app/src/main/java/com/ytpm/qnjz/utils/MutiImageView.java
  63. 1 1
      app/src/main/java/com/ytpm/qnjz/utils/PermissionUtils.kt
  64. 1 1
      app/src/main/java/com/ytpm/qnjz/utils/PxUtils.java
  65. 2 14
      app/src/main/java/com/ytpm/qnjz/utils/SelfRenderViewUtil.java
  66. 17 4
      app/src/main/java/com/ytpm/qnjz/utils/UserInfoSpUtils.kt
  67. 5 3
      app/src/main/java/com/ytpm/qnjz/utils/WechatLoginHelper.java
  68. 2 2
      app/src/main/java/com/ytpm/qnjz/wxapi/WXEntryActivity.java
  69. 2 69
      app/src/main/res/layout/activity_login.xml
  70. 209 6
      app/src/main/res/layout/activity_splash.xml
  71. 19 4
      app/src/main/res/layout/fragment_dati.xml
  72. 二進制
      app/src/main/res/mipmap-xxhdpi/loading.gif
  73. 二進制
      app/src/main/res/mipmap-xxhdpi/logo.png
  74. 8 0
      app/src/main/res/values/strings.xml
  75. 32 0
      app/src/main/res/xml/file_paths.xml
  76. 1 1
      app/src/test/java/com/ytpm/qnjz/ExampleUnitTest.kt

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 6 - 0
.idea/AndroidProjectSystem.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AndroidProjectSystem">
+    <option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
+  </component>
+</project>

+ 10 - 0
.idea/deploymentTargetSelector.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="deploymentTargetSelector">
+    <selectionStates>
+      <SelectionState runConfigName="app">
+        <option name="selectionMode" value="DROPDOWN" />
+      </SelectionState>
+    </selectionStates>
+  </component>
+</project>

+ 19 - 0
.idea/gradle.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="testRunner" value="CHOOSE_PER_TEST" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 10 - 0
.idea/migrations.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectMigrations">
+    <option name="MigrateToGradleLocalJavaHome">
+      <set>
+        <option value="$PROJECT_DIR$" />
+      </set>
+    </option>
+  </component>
+</project>

+ 10 - 0
.idea/misc.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 17 - 0
.idea/runConfigurations.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
+        <option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
+        <option value="com.intellij.execution.junit.PatternConfigurationProducer" />
+        <option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
+        <option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
+        <option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
+        <option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
+        <option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 125 - 46
app/build.gradle.kts

@@ -13,60 +13,113 @@ android {
 
     productFlavors {
 
-        create("lzk") {//乐助客
+        create("zrhbs") {
             dimension = "version"
             signingConfig = signingConfigs.getByName("debug")
-            resValue("string", "app_name", "答题王乐助客")
+            resValue("string", "app_name", "青柠好帮手")
+            buildConfigField("String", "DITCH_ID", "\"2025062508\"")
+            buildConfigField("String", "APP_TYPE", "\"205\"")
+        }
+
+        create("ytlzk") {
+            dimension = "version"
+            signingConfig = signingConfigs.getByName("debug")
+            resValue("string", "app_name", "青柠乐助客")
             buildConfigField("String", "DITCH_ID", "\"2025062503\"")
-            buildConfigField("String", "APP_TYPE", "\"103\"")
+            buildConfigField("String", "APP_TYPE", "\"203\"")
+        }
+
+        create("ytsbz") {
+            dimension = "version"
+            signingConfig = signingConfigs.getByName("debug")
+            resValue("string", "app_name", "青柠记账赏")
+            buildConfigField("String", "DITCH_ID", "\"2025062501\"")
+            buildConfigField("String", "APP_TYPE", "\"201\"")
         }
 
-        create("zrb") {//众人帮
+        create("ytzrb") {
             dimension = "version"
             signingConfig = signingConfigs.getByName("debug")
-            resValue("string", "app_name", "答题王众人帮")
+            resValue("string", "app_name", "青柠众人帮")
             buildConfigField("String", "DITCH_ID", "\"2025062504\"")
-            buildConfigField("String", "APP_TYPE", "\"102\"")
+            buildConfigField("String", "APP_TYPE", "\"202\"")
         }
 
-        create("md") {//秒单
+        create("zrhbs2") {
             dimension = "version"
             signingConfig = signingConfigs.getByName("debug")
-            resValue("string", "app_name", "答题王秒单")
-            buildConfigField("String", "DITCH_ID", "\"2025062505\"")
-            buildConfigField("String", "APP_TYPE", "\"104\"")
+            resValue("string", "app_name", "盆满钵满众")
+            buildConfigField("String", "DITCH_ID", "\"2025062500119\"")
+            buildConfigField("String", "APP_TYPE", "\"100119\"")
         }
 
-        create("xwfg") {//兴旺富贵
+        create("sbz3") {
             dimension = "version"
             signingConfig = signingConfigs.getByName("debug")
-            resValue("string", "app_name", "答题王兴旺富贵")
-            buildConfigField("String", "DITCH_ID", "\"2025062506\"")
-            buildConfigField("String", "APP_TYPE", "\"105\"")
+            resValue("string", "app_name", "盒气生才赏")
+            buildConfigField("String", "DITCH_ID", "\"2025062500063\"")
+            buildConfigField("String", "APP_TYPE", "\"100063\"")
         }
 
-        create("hz") {//合众
+        create("lzk2") {
             dimension = "version"
             signingConfig = signingConfigs.getByName("debug")
-            resValue("string", "app_name", "答题王合众")
-            buildConfigField("String", "DITCH_ID", "\"2025062507\"")
-            buildConfigField("String", "APP_TYPE", "\"106\"")
+            resValue("string", "app_name", "真真日上乐")
+            buildConfigField("String", "DITCH_ID", "\"2025062500120\"")
+            buildConfigField("String", "APP_TYPE", "\"100120\"")
         }
 
-        create("sbz") {//赏帮赚
+        create("xxff") {
             dimension = "version"
             signingConfig = signingConfigs.getByName("debug")
-            resValue("string", "app_name", "答题王赏")
-            buildConfigField("String", "DITCH_ID", "\"2025062501\"")
-            buildConfigField("String", "APP_TYPE", "\"101\"")
+            resValue("string", "app_name", "财运亨通")
+            buildConfigField("String", "DITCH_ID", "\"2025062500121\"")
+            buildConfigField("String", "APP_TYPE", "\"100121\"")
+        }
+
+        create("ytzql") {
+            dimension = "version"
+            signingConfig = signingConfigs.getByName("debug")
+            resValue("string", "app_name", "赚大钱赚")
+            buildConfigField("String", "DITCH_ID", "\"2025062500022\"")
+            buildConfigField("String", "APP_TYPE", "\"100022\"")
+        }
+
+        create("sbz2") {
+            dimension = "version"
+            signingConfig = signingConfigs.getByName("debug")
+            resValue("string", "app_name", "赚钱赏")
+            buildConfigField("String", "DITCH_ID", "\"2025062500052\"")
+            buildConfigField("String", "APP_TYPE", "\"100052\"")
         }
 
-        create("nbcs") {//内部测试包
+        create("sbcs") {
             dimension = "version"
             signingConfig = signingConfigs.getByName("debug")
-            resValue("string", "app_name", "答题王Marx内测渠道")
-            buildConfigField("String", "DITCH_ID", "\"2025062500019\"")
-            buildConfigField("String", "APP_TYPE", "\"200019\"")
+            resValue("string", "app_name", "日进斗金")
+            buildConfigField("String", "DITCH_ID", "\"2025062500143\"")
+            buildConfigField("String", "APP_TYPE", "\"100143\"")
+        }
+        create("sbz4") {
+            dimension = "version"
+            signingConfig = signingConfigs.getByName("debug")
+            resValue("string", "app_name", "青柠赏赏赏")
+            buildConfigField("String", "DITCH_ID", "\"2025062500149\"")
+            buildConfigField("String", "APP_TYPE", "\"100149\"")
+        }
+        create("sbz5") {
+            dimension = "version"
+            signingConfig = signingConfigs.getByName("debug")
+            resValue("string", "app_name", "QN赏")
+            buildConfigField("String", "DITCH_ID", "\"2025062500173\"")
+            buildConfigField("String", "APP_TYPE", "\"100173\"")
+        }
+        create("sbz6") {
+            dimension = "version"
+            signingConfig = signingConfigs.getByName("debug")
+            resValue("string", "app_name", "Qing柠赏")
+            buildConfigField("String", "DITCH_ID", "\"2025062500210\"")
+            buildConfigField("String", "APP_TYPE", "\"100210\"")
         }
     }
 
@@ -75,26 +128,47 @@ android {
             if (this is com.android.build.gradle.internal.api.BaseVariantOutputImpl) {
                 var appName = ""
 
-                if (flavorName == "lzk") {
-                    appName = "答题王乐助客"
+                if (flavorName == "sbz6") {
+                    appName = "Qing柠赏"
                 }
-                if (flavorName == "zrb") {
-                    appName = "答题王众人帮"
+                if (flavorName == "sbz5") {
+                    appName = "QN赏"
                 }
-                if (flavorName == "md") {
-                    appName = "答题王秒单"
+                if (flavorName == "sbz4") {
+                    appName = "青柠赏赏赏"
                 }
-                if (flavorName == "xwfg") {
-                    appName = "答题王兴旺富贵"
+                if (flavorName == "sbcs") {
+                    appName = "日进斗金"
                 }
-                if (flavorName == "hz") {
-                    appName = "答题王合众"
+                if (flavorName == "sbz2") {
+                    appName = "赚钱赏"
                 }
-                if (flavorName == "sbz") {
-                    appName = "答题王赏"
+                if (flavorName == "ytzql") {
+                    appName = "赚大钱赚"
                 }
-                if (flavorName == "nbcs") {
-                    appName = "答题王Marx内测渠道"
+                if (flavorName == "xxff") {
+                    appName = "财运亨通"
+                }
+                if (flavorName == "lzk2") {
+                    appName = "真真日上乐"
+                }
+                if (flavorName == "sbz3") {
+                    appName = "盒气生才赏"
+                }
+                if (flavorName == "zrhbs2") {
+                    appName = "盆满钵满众"
+                }
+                if (flavorName == "ytzrb") {
+                    appName = "青柠众人帮"
+                }
+                if (flavorName == "ytsbz") {
+                    appName = "青柠记账赏"
+                }
+                if (flavorName == "zrhbs") {
+                    appName = "青柠好帮手"
+                }
+                if (flavorName == "ytlzk") {
+                    appName = "青柠乐助客"
                 }
                 val versionName = this@configureEach.versionName ?: "unknown"
                 val buildType = this@configureEach.buildType.name
@@ -106,25 +180,25 @@ android {
     }
     signingConfigs {
         getByName("debug") {
-            storeFile = file("D:\\mg\\project_android\\dati\\app\\datiapp.jks")
-            storePassword = "datiapp"
+            storeFile = file("D:\\mg\\project_android\\all_jks\\ytwljz.jks")
+            storePassword = "ytwljz"
             keyAlias = "key0"
-            keyPassword = "datiapp"
+            keyPassword = "ytwljz"
         }
     }
 
-    namespace = "com.ytpm.hydtw"
+    namespace = "com.ytpm.qnjz"
     compileSdk = 35
 
     defaultConfig {
-        applicationId = "com.ytpm.hydtw"
+        applicationId = "com.ytpm.qnjz"
         minSdk = 24
         targetSdk = 35
         versionCode = 2
         versionName = "1.0.6"
         multiDexEnabled = true
         testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
-        resValue("string", "app_name", "好运答题王")
+        resValue("string", "app_name", "青柠记账")
 //        buildConfigField("String", "BASE_URL", "DDDDDD")
     }
 
@@ -209,6 +283,11 @@ dependencies {
     api("com.anythink.sdk:adapter-taku-gdt:6.4.87.1")
     api("com.qq.e.union:union:4.640.1510")
 
+    //Sigmob
+    api("com.anythink.sdk:adapter-taku-sigmob:6.5.15")
+    api("com.anythink.sdk:sdk-ads-sigmob:4.24.0")
+
+
     implementation("com.pangle.cn:mediation-sdk:6.9.1.7") //穿山甲融合SDK
 
     implementation("com.pangle.cn:mediation-test-tools:6.9.1.7")

+ 5 - 0
app/proguard-rules.pro

@@ -276,3 +276,8 @@
 }
 -dontwarn dalvik.**
 -dontwarn com.tencent.smtt.**
+
+-keep class com.ytpm.qnjz.dao.** { *; }
+-keep class com.ytpm.qnjz.network.** { *; }
+-keep class com.ytpm.qnjz.wxapi.** { *; }
+-keep class com.ytpm.qnjz.utils.** { *; }

+ 1 - 1
app/src/androidTest/java/com/ytpm/hydtw/ExampleInstrumentedTest.kt → app/src/androidTest/java/com/ytpm/qnjz/ExampleInstrumentedTest.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw
+package com.ytpm.qnjz
 
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.ext.junit.runners.AndroidJUnit4

+ 47 - 46
app/src/main/AndroidManifest.xml

@@ -2,18 +2,19 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
 
+    <uses-feature
+        android:name="android.hardware.telephony"
+        android:required="false" />
+    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
+
     <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
+        tools:ignore="ProtectedPermissions" />
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
     <uses-permission android:name="android.permission.GET_TASKS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
-    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
-        tools:ignore="ProtectedPermissions" />
-    <uses-permission android:name="android.permission.READ_SMS"
-        tools:ignore="PermissionImpliesUnsupportedChromeOsHardware" />
 
     <!-- 定位权限 -->
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
@@ -28,18 +29,10 @@
 
     <!-- SIM卡权限 -->
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
-
-    <permission
-        android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN"
-        android:protectionLevel="signature" />
-
-    <uses-permission android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN" />
-
-    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
-        tools:ignore="QueryAllPackagesPermission" />
+    <uses-permission android:name="android.permission.READ_SMS" />
 
     <application
-        android:name="com.ytpm.hydtw.application.DatiApplication"
+        android:name=".application.DatiApplication"
         android:allowBackup="true"
         android:icon="@mipmap/logo"
         android:label="@string/app_name"
@@ -47,27 +40,17 @@
         android:roundIcon="@mipmap/logo"
         android:supportsRtl="true"
         android:theme="@style/Theme.Dati"
+        android:requestLegacyExternalStorage="true"
         tools:replace="android:allowBackup"
-        tools:targetApi="31"
-        android:hardwareAccelerated="true">
+        tools:targetApi="31">
 
         <activity
-            android:name="com.ytpm.hydtw.activity.SplashActivity"
+            android:name="com.ytpm.qnjz.activity.SplashActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
-            android:launchMode="singleTask"
-            android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
-            tools:ignore="DiscouragedApi,LockedOrientationActivity"/>
-
-        <activity
-            android:name="com.ytpm.hydtw.activity.LoginActivity"
-            android:configChanges="orientation|screenSize|keyboardHidden"
-            android:exported="true"
-            android:launchMode="singleTop"
+            android:launchMode="standard"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
-            tools:ignore="DiscouragedApi,LockedOrientationActivity">
+            tools:ignore="DiscouragedApi,LockedOrientationActivity" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
@@ -75,60 +58,60 @@
         </activity>
 
         <activity
-            android:name="com.ytpm.hydtw.activity.MainActivity"
+            android:name="com.ytpm.qnjz.activity.LoginActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:exported="true"
+            android:launchMode="standard"
+            android:screenOrientation="portrait"
+            tools:ignore="DiscouragedApi,LockedOrientationActivity"/>
+        <activity
+            android:name="com.ytpm.qnjz.activity.MainActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
             android:launchMode="standard"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
             tools:ignore="DiscouragedApi,LockedOrientationActivity" />
         <activity
-            android:name="com.ytpm.hydtw.activity.GameActivity"
+            android:name="com.ytpm.qnjz.activity.GameActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
             android:launchMode="singleTask"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
             tools:ignore="DiscouragedApi,LockedOrientationActivity" />
         <activity
-            android:name="com.ytpm.hydtw.activity.ZizunInfoActivity"
+            android:name="com.ytpm.qnjz.activity.ZizunInfoActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
             android:launchMode="singleTask"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
             tools:ignore="DiscouragedApi,LockedOrientationActivity" />
         <activity
-            android:name="com.ytpm.hydtw.activity.AboutUsActivity"
+            android:name="com.ytpm.qnjz.activity.AboutUsActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
             android:launchMode="singleTask"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
             tools:ignore="DiscouragedApi,LockedOrientationActivity" />
         <activity
-            android:name="com.ytpm.hydtw.activity.FeedbackActivity"
+            android:name="com.ytpm.qnjz.activity.FeedbackActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
             android:launchMode="singleTask"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
             tools:ignore="DiscouragedApi,LockedOrientationActivity" />
         <activity
-            android:name="com.ytpm.hydtw.activity.WebActivity"
+            android:name="com.ytpm.qnjz.activity.WebActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
             android:launchMode="singleTask"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
             tools:ignore="DiscouragedApi,LockedOrientationActivity" />
         <activity
-            android:name="com.ytpm.hydtw.wxapi.WXEntryActivity"
+            android:name="com.ytpm.qnjz.wxapi.WXEntryActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:exported="true"
             android:launchMode="singleTask"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Dati"
             tools:ignore="DiscouragedApi,LockedOrientationActivity" />
 
         <uses-library
@@ -162,6 +145,24 @@
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/anythink_bk_gdt_file_path" />
         </provider>
+        <provider
+            android:name="com.sigmob.sdk.SigmobFileV4Provider"
+            android:authorities="${applicationId}.sigprovider"
+            android:exported="false"
+            android:initOrder="200"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/anythink_bk_sigmob_file_path"/>
+        </provider>
+        <provider
+            android:name="androidx.core.content.FileProvider"
+            android:authorities="${applicationId}.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
     </application>
-
 </manifest>

+ 0 - 25
app/src/main/java/com/ytpm/hydtw/Constants.java

@@ -1,25 +0,0 @@
-package com.ytpm.hydtw;
-
-public class Constants {
-  public static final boolean isDebug = false;
-
-  public static final String TTAD_APPID = "5713373";
-  public static final String TAKU_APPID = "a686ce57b07fc7";
-  public static final String TAKU_KEY = "a43e9b60c240a7c41b0b47ab9659fc27d";
-  public static final String TAKU_BANNER_PID = "b686ceb761ec69";
-  public static final String TAKU_NATIVE_PID = "b686ceb6a6bdf7";
-  public static final String TAKU_REWARD_PID = "b686ceb4adde62";
-  public static final String TAKU_INTERSTITIAL_PID = "b686ceb5bb14cd";
-  public static final String BASE_URL_V2 = "http://advise.ytmdm.com/";//生产
-  public static final String BASE_URL_V2_DEBUG = "http://192.168.1.9:25001/";//测试
-  public static String FULL_URL_V2 = "yt-gateway/";
-  public static String GET_CONFIG = "app-service/wx/defaultConfig";
-  public static String LOGIN = "app-service/wx/login";
-  public static String ANSWER_QUESTION = "app-service/question/answerQuestion";
-  public static String GET_QUESTIONS = "app-service/question/list";
-  public static String ADD_POWER = "app-service/wx/addPower";
-  public static String SAVE_RECORD = "app-service/ad/saveRecord";
-  public static String GET_USER_INFO = "app-service/user/getUserInfo";
-
-}
-

+ 0 - 494
app/src/main/java/com/ytpm/hydtw/activity/LoginActivity.kt

@@ -1,494 +0,0 @@
-package com.ytpm.hydtw.activity
-
-import android.Manifest
-import android.annotation.SuppressLint
-import android.content.Context
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.graphics.Color
-import android.os.Build
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.provider.Settings
-import android.telephony.TelephonyManager
-import android.text.SpannableStringBuilder
-import android.text.Spanned
-import android.text.method.LinkMovementMethod
-import android.text.style.ClickableSpan
-import android.text.style.ForegroundColorSpan
-import android.view.Gravity
-import android.view.View
-import android.widget.Toast
-import androidx.fragment.app.FragmentActivity
-import com.blankj.utilcode.util.DeviceUtils
-import com.blankj.utilcode.util.GsonUtils
-import com.blankj.utilcode.util.LogUtils
-import com.blankj.utilcode.util.NetworkUtils
-import com.blankj.utilcode.util.PhoneUtils
-import com.blankj.utilcode.util.SPUtils
-import com.blankj.utilcode.util.ToastUtils
-import com.bytedance.sdk.openadsdk.AdSlot
-import com.bytedance.sdk.openadsdk.TTAdConstant
-import com.bytedance.sdk.openadsdk.TTAdNative.RewardVideoAdListener
-import com.bytedance.sdk.openadsdk.TTAdSdk
-import com.bytedance.sdk.openadsdk.TTRewardVideoAd
-import com.bytedance.sdk.openadsdk.mediation.MediationConstant
-import com.bytedance.sdk.openadsdk.mediation.ad.MediationAdSlot
-import com.ytpm.hydtw.BuildConfig
-import com.ytpm.hydtw.Constants
-import com.ytpm.hydtw.R
-import com.ytpm.hydtw.dao.UserInfo
-import com.ytpm.hydtw.databinding.ActivityLoginBinding
-import com.ytpm.hydtw.loading.GlobalLoading
-import com.ytpm.hydtw.network.BaseRetrofit
-import com.ytpm.hydtw.network.Callback2
-import com.ytpm.hydtw.utils.LocationUtils
-import com.ytpm.hydtw.utils.PermissionUtils
-import com.ytpm.hydtw.utils.UserInfoSpUtils
-import com.ytpm.hydtw.utils.WechatLoginHelper
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-
-class LoginActivity : FragmentActivity(), WechatLoginHelper.WechatLoginListener {
-
-    private val TAG: String = this::class.java.simpleName
-    private var wechatLoginHelper: WechatLoginHelper? = null
-    private lateinit var binding: ActivityLoginBinding
-    private var progress = 0
-    private var countdownTimer: CountDownTimer? = null
-    private var isCheck = true
-    private var mPhoneNumber = ""
-    private var addressInfo = ""
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        binding = ActivityLoginBinding.inflate(layoutInflater)
-        setContentView(binding.root)
-        initView()
-
-    }
-
-    private lateinit var permissionUtils: PermissionUtils
-
-    private fun initTTAdReword() {
-        val adslot: AdSlot? = AdSlot.Builder()
-            .setCodeId("聚合广告位ID")
-            .setOrientation(TTAdConstant.VERTICAL) //横竖屏设置
-            .setMediationAdSlot(
-                MediationAdSlot.Builder()
-                    .setExtraObject(
-                        MediationConstant.ADN_PANGLE,
-                        "pangleRewardCustomData"
-                    ) //服务端奖励验证透传参数
-                    .setExtraObject(MediationConstant.ADN_GDT, "gdtRewardCustomData")
-                    .setExtraObject(MediationConstant.ADN_BAIDU, "baiduRewardCustomData")
-                    .build()
-            )
-            .build()
-        val mTTAdNative = TTAdSdk.getAdManager().createAdNative(this)
-
-        mTTAdNative.loadRewardVideoAd(adslot, object : RewardVideoAdListener {
-            override fun onError(p0: Int, p1: String?) {
-                LogUtils.e(TAG, "onError${p1}")
-            }
-
-            override fun onRewardVideoAdLoad(p0: TTRewardVideoAd?) {
-                LogUtils.e(TAG, "onRewardVideoAdLoad${p0.toString()}")
-                p0?.showRewardVideoAd(
-                    this@LoginActivity,
-                    TTAdConstant.RitScenes.CUSTOMIZE_SCENES,
-                    "scenes_test"
-                )
-            }
-
-            override fun onRewardVideoCached() {
-                LogUtils.e(TAG, "onRewardVideoCached}")
-            }
-
-            override fun onRewardVideoCached(p0: TTRewardVideoAd?) {
-                LogUtils.e(TAG, "onRewardVideoCached${p0.toString()}}")
-            }
-
-        })
-    }
-
-    private fun loadPermission() {
-
-        permissionUtils = PermissionUtils(this)
-
-        if (!permissionUtils.hasLocationPermission()) {
-            if (permissionUtils.shouldShowRequestPermissionRationale(
-                    this,
-                    Manifest.permission.ACCESS_FINE_LOCATION
-                )
-            ) {
-                permissionUtils.showPermissionExplanationDialog(
-                    this,
-                    "需要定位权限、手机信息权限、文件权限",
-                    "此应用需要定位权限以提供位置相关功能,需要手机信息权限三方广告特殊功能,文件存储权限保存信息到本地文件。取消将退出应用。",
-                    PermissionUtils.LOCATION_PERMISSIONS
-                )
-            } else {
-                permissionUtils.requestLocationPermission(this)
-            }
-        } else {
-            startLocationService()
-        }
-    }
-
-    private fun startLocationService() {
-        getPhoneNumber()
-        fetchLocationAndAddress()
-    }
-
-    @SuppressLint("MissingPermission", "HardwareIds")
-    private fun getPhoneNumber() {
-        val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
-        val phoneNumber = telephonyManager.line1Number
-
-        if (!phoneNumber.isNullOrEmpty()) {
-            LogUtils.e(TAG, "phoneNumber=${phoneNumber}")
-            mPhoneNumber = phoneNumber
-        }
-    }
-
-    private val locationUtils by lazy { LocationUtils(this) }
-    private val coroutineScope = CoroutineScope(Dispatchers.Main)
-
-    private fun fetchLocationAndAddress() {
-        coroutineScope.launch {
-            try {
-                if (!locationUtils.isLocationServiceEnabled()) {
-                    LogUtils.e(TAG, "定位未启动")
-                    // 跳转到系统定位设置页面
-                    val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
-                    startActivity(intent)
-                    return@launch
-                }
-
-                var location = locationUtils.getLastLocation()
-
-                if (location == null) {
-                    location = locationUtils.getCurrentLocation()
-                }
-
-                location?.let {
-                    val address = locationUtils.getAddressFromLocation(it.latitude, it.longitude)
-                    address?.let { addr ->
-                        val addressText = StringBuilder()
-                        addressInfo = addressText
-                            .append(addr.countryName)
-                            .append(addr.adminArea)
-                            .append(addr.locality)
-                            .toString()
-                        getWxConfig()
-                        LogUtils.e(TAG, "addressInfo$addressInfo")
-                    } ?: run {
-                    }
-                } ?: run {
-                }
-            } catch (e: Exception) {
-            }
-        }
-    }
-
-    // 处理权限请求结果
-    override fun onRequestPermissionsResult(
-        requestCode: Int,
-        permissions: Array<out String>,
-        grantResults: IntArray
-    ) {
-        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
-
-        if (requestCode == PermissionUtils.PERMISSION_REQUEST_CODE) {
-            if (grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
-                // 权限全部授予
-                Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show()
-                startLocationService()
-            } else {
-                // 至少有一个权限被拒绝
-                if (permissions.any {
-                        !permissionUtils.shouldShowRequestPermissionRationale(this, it)
-                    }) {
-                    // 用户选择了"不再询问",引导到设置页面
-                    Toast.makeText(this, "请在设置中手动授予权限", Toast.LENGTH_SHORT).show()
-                    permissionUtils.goToAppSettings(this)
-                } else {
-                    // 用户拒绝了权限,但未选择"不再询问"
-                    Toast.makeText(this, "权限被拒绝,功能无法使用", Toast.LENGTH_SHORT).show()
-                }
-            }
-        }
-    }
-
-    private fun getWxConfig() {
-
-        var url = if (Constants.isDebug) {
-            Constants.GET_CONFIG
-        } else {
-            Constants.FULL_URL_V2 + Constants.GET_CONFIG
-        }
-
-        BaseRetrofit.getInstance().apiService.getConfigs(url, BuildConfig.APP_TYPE.toInt())
-            .enqueue(object : Callback2<String>() {
-                override fun success(body: String?) {
-                    SPUtils.getInstance().put("WxAppId", body)
-                    wechatLoginHelper =
-                        WechatLoginHelper.getInstance(this@LoginActivity)
-                    binding.loginBtnLl.visibility = View.VISIBLE
-                    wechatLoginHelper?.login(this@LoginActivity)
-                }
-
-                override fun fail(msg: String?) {
-                    ToastUtils
-                        .make()
-                        .setMode(ToastUtils.MODE.DARK)
-                        .setGravity(Gravity.CENTER, 0, 0)
-                        .setTopIcon(R.mipmap.icon_fail)
-                        .setDurationIsLong(true)
-                        .show(msg)
-                }
-            })
-    }
-
-    private fun initView() {
-
-        val isfirst = SPUtils.getInstance().getBoolean("isFirst", true)
-
-        if (isfirst) {
-            binding.dialogYs.visibility = View.VISIBLE
-        }
-
-        binding.dialogYs.setOnClickListener { }
-
-        binding.agree.setOnClickListener {
-            SPUtils.getInstance().put("isFirst", false)
-            binding.dialogYs.visibility = View.GONE
-        }
-
-        binding.cancel.setOnClickListener {
-            finish()
-        }
-
-        val dc =
-            "感谢您使用好运答题王APP,在您使用本软件过程中,我们可能会对您的部分个人信息进行收集、使用和共享。请您仔细阅读"
-        val spannableText = SpannableStringBuilder(dc)
-
-        val ts1 = "《服务协议》"
-        val ts2 = "《隐私政策》"
-        val ts3 =
-            ",并确定完全了解我们对您个人信息的处理规则。如您同意《服务协议》与《隐私政策》,请点击“同意”开始使用好运答题王,我们会尽全力保护您的个人信息安全。"
-        spannableText.append(ts1)
-        spannableText.append("与")
-        spannableText.append(ts2)
-        spannableText.append(ts3)
-
-        // 设置前景色
-        val colorSpan = ForegroundColorSpan(Color.BLUE)
-        spannableText.setSpan(
-            colorSpan,
-            56,
-            62,
-            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
-        )
-        // 设置前景色
-        val colorSpan2 = ForegroundColorSpan(Color.BLUE)
-        spannableText.setSpan(
-            colorSpan2,
-            63,
-            69,
-            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
-        )
-
-        // 设置点击事件
-        val clickableSpan = object : ClickableSpan() {
-            override fun onClick(widget: View) {
-                val intent = Intent(this@LoginActivity, WebActivity::class.java)
-                intent.putExtra("title", "用户协议")
-                intent.putExtra("index", 1)
-                startActivity(intent)
-            }
-        }
-
-
-        // 设置点击事件
-        val clickableSpan1 = object : ClickableSpan() {
-            override fun onClick(widget: View) {
-                val intent = Intent(this@LoginActivity, WebActivity::class.java)
-                intent.putExtra("title", "隐私政策")
-                intent.putExtra("index", 0)
-                startActivity(intent)
-            }
-        }
-
-        spannableText.setSpan(
-            clickableSpan,
-            56,
-            62,
-            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
-        )
-
-        spannableText.setSpan(
-            clickableSpan1,
-            63,
-            69,
-            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
-        )
-
-        binding.loginTs.text = spannableText
-        binding.loginTs.movementMethod = LinkMovementMethod.getInstance()
-
-        binding.yszc.setOnClickListener {
-            val intent = Intent(this@LoginActivity, WebActivity::class.java)
-            intent.putExtra("title", "隐私政策")
-            intent.putExtra("index", 0)
-            startActivity(intent)
-        }
-        binding.yhxy.setOnClickListener {
-            val intent = Intent(this@LoginActivity, WebActivity::class.java)
-            intent.putExtra("title", "用户协议")
-            intent.putExtra("index", 1)
-            startActivity(intent)
-        }
-
-        binding.loginBtnLl.visibility = View.GONE
-
-        binding.activityLoginCheckBox.isChecked = true
-
-        binding.activityLoginCheckBox.setOnCheckedChangeListener { _, isChecked ->
-            isCheck = isChecked
-        }
-
-        val token = SPUtils.getInstance().getString("token")
-        if (token.isNullOrEmpty()) {
-            binding.loginBtnLl.visibility = View.VISIBLE
-            binding.progressLl.visibility = View.GONE
-        } else {
-            binding.loginBtnLl.visibility = View.GONE
-            binding.progressLl.visibility = View.VISIBLE
-            startCountdown(100000, 50)
-        }
-
-        binding.loginBtnLl.setOnClickListener {
-            if (!isCheck) {
-                Toast.makeText(it.context, "请阅读并同意用户协议和隐私政策", Toast.LENGTH_SHORT)
-                    .show()
-                return@setOnClickListener
-            }
-
-            loadPermission()
-
-        }
-    }
-
-    private fun startCountdown(millisInFuture: Long, countDownInterval: Long) {
-        countdownTimer?.cancel()
-
-        countdownTimer = object : CountDownTimer(millisInFuture, countDownInterval) {
-            override fun onTick(millisUntilFinished: Long) {
-                progress++
-                binding.activityLoginProgressTx.text = "$progress%"
-                binding.activityLoginProgress.progress = progress
-                if (progress >= 100) {
-                    jump()
-                }
-            }
-
-            override fun onFinish() {
-            }
-        }.start()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        countdownTimer?.start()
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        countdownTimer?.cancel()
-    }
-
-    override fun onStop() {
-        super.onStop()
-        countdownTimer?.cancel()
-    }
-
-
-    private fun jump() {
-        countdownTimer?.cancel() // 取消之前的倒计时
-        val intent = Intent(this@LoginActivity, MainActivity::class.java)
-        startActivity(intent)
-        finish()
-    }
-
-    override fun onLoginSuccess(code: String?) {
-        LogUtils.e("dfdfdfdf${code}")
-        startLogin(code)
-    }
-
-    override fun onLoginFailed(errorMsg: String?) {
-        ToastUtils.showShort(errorMsg)
-    }
-
-    private fun startLogin(code: String?) {
-
-        GlobalLoading.getInstance().show(this)
-
-        val ip = NetworkUtils.getIPAddress(true)
-        val operatorName = PhoneUtils.getSimOperatorName()
-        val model = DeviceUtils.getModel()
-
-        val map = HashMap<String, Any>()
-        map["alias"] = Build.ID
-        map["brand"] = Build.BRAND
-        map["ipLocation"] = addressInfo
-        map["ipOperator"] = operatorName
-        map["loginIp"] = ip
-        map["model"] = model
-        map["appType"] = BuildConfig.APP_TYPE.toInt()
-        map["ditchId"] = BuildConfig.DITCH_ID
-        map["wxCode"] = code!!
-        map["phone"] = mPhoneNumber
-        map["deviceId"] = DeviceUtils.getAndroidID()
-
-        val requestBody = BaseRetrofit.getRequestBodyByMapToJson(map)
-
-        var url = if (Constants.isDebug) {
-            Constants.LOGIN
-        } else {
-            Constants.FULL_URL_V2 + Constants.LOGIN
-        }
-
-        BaseRetrofit.getInstance().apiService.login(url, requestBody)
-            .enqueue(object : Callback2<UserInfo>() {
-                override fun success(body: UserInfo?) {
-
-                    if (body != null) {
-                        UserInfoSpUtils().putUserInfo(body)
-                    }
-
-                    startLoading()
-                }
-
-                override fun fail(msg: String?) {
-                    ToastUtils
-                        .make()
-                        .setMode(ToastUtils.MODE.DARK)
-                        .setGravity(Gravity.CENTER, 0, 0)
-                        .setTopIcon(R.mipmap.icon_fail)
-                        .setDurationIsLong(true)
-                        .show(msg)
-                }
-            })
-    }
-
-
-    private fun startLoading() {
-        binding.loginBtnLl.visibility = View.GONE
-        binding.progressLl.visibility = View.VISIBLE
-        startCountdown(100000, 50)
-    }
-
-}

+ 0 - 101
app/src/main/java/com/ytpm/hydtw/activity/SplashActivity.kt

@@ -1,101 +0,0 @@
-package com.ytpm.hydtw.activity
-
-import android.annotation.SuppressLint
-import android.content.Intent
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.View
-import androidx.fragment.app.FragmentActivity
-import com.anythink.core.api.ATAdInfo
-import com.anythink.core.api.AdError
-import com.anythink.splashad.api.ATSplashAd
-import com.anythink.splashad.api.ATSplashAdExtraInfo
-import com.anythink.splashad.api.ATSplashAdListener
-import com.blankj.utilcode.util.LogUtils
-import com.ytpm.hydtw.databinding.ActivitySplashBinding
-
-class SplashActivity : FragmentActivity(), ATSplashAdListener {
-
-    private var getTlCountDownTimer: CountDownTimer? = null
-    private lateinit var binding: ActivitySplashBinding
-    private var splashAd: ATSplashAd? = null
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-
-        binding = ActivitySplashBinding.inflate(layoutInflater)
-        setContentView(binding.root)
-        loadAd()
-        startGetTlTime()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        binding.close.setOnClickListener {
-            val intent = Intent(this@SplashActivity, LoginActivity::class.java)
-            startActivity(intent)
-            finish()
-        }
-    }
-
-    private fun startGetTlTime() {
-
-        if (getTlCountDownTimer != null) {
-            return
-        }
-
-        getTlCountDownTimer = object : CountDownTimer(5000, 1000) {
-            @SuppressLint("SetTextI18n")
-            override fun onTick(millisUntilFinished: Long) {
-
-            }
-
-            override fun onFinish() {
-                val intent = Intent(this@SplashActivity, LoginActivity::class.java)
-                startActivity(intent)
-                finish()
-            }
-        }
-    }
-
-    private fun loadAd() {
-        splashAd = ATSplashAd(this, "b68400ad783355", this, 5000)
-        splashAd?.loadAd()
-    }
-
-    override fun onAdLoaded(p0: Boolean) {
-        LogUtils.e("=======onAdLoaded=${p0}")
-        if (splashAd?.isAdReady == true) {
-            splashAd?.show(this@SplashActivity, binding.splashAdFl)
-        }
-    }
-
-    override fun onAdLoadTimeout() {
-        LogUtils.e("=======onAdLoadTimeout")
-    }
-
-    override fun onNoAdError(p0: AdError?) {
-        LogUtils.e("=======onNoAdError=${p0}")
-        if (getTlCountDownTimer != null) getTlCountDownTimer?.start()
-    }
-
-    override fun onAdShow(p0: ATAdInfo?) {
-        LogUtils.e("=======onAdShow=${p0.toString()}")
-        if (getTlCountDownTimer != null) getTlCountDownTimer?.start()
-    }
-
-    override fun onAdClick(p0: ATAdInfo?) {
-        LogUtils.e("=======onAdClick=${p0.toString()}")
-    }
-
-    override fun onAdDismiss(p0: ATAdInfo?, p1: ATSplashAdExtraInfo?) {
-        LogUtils.e("=======onAdDismiss=${p0.toString()}")
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        splashAd = null
-        getTlCountDownTimer?.cancel()
-        getTlCountDownTimer = null
-    }
-}

+ 0 - 6
app/src/main/java/com/ytpm/hydtw/dao/Config.kt

@@ -1,6 +0,0 @@
-package com.ytpm.hydtw.dao
-
-data class Config(
-    val appId: String?,
-    val secret: String?
-)

+ 0 - 62
app/src/main/java/com/ytpm/hydtw/loading/GlobalLoading.java

@@ -1,62 +0,0 @@
-package com.ytpm.hydtw.loading;
-
-import android.app.Activity;
-import android.content.Context;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-public class GlobalLoading {
-    private Timer timer = null;
-    private TimerTask task = null;
-    private static GlobalLoading instance;
-    private LoadingDialog loadingDialog;
-
-    private GlobalLoading() {
-    }
-
-    public static GlobalLoading getInstance() {
-        if (instance == null) {
-            synchronized (GlobalLoading.class) {
-                if (instance == null) {
-                    instance = new GlobalLoading();
-                }
-            }
-        }
-        return instance;
-    }
-
-    /**
-     * 显示Loading
-     *
-     * @param context 上下文
-     * @param message 加载信息
-     */
-    public void show(Context context, String message) {
-        if (loadingDialog == null) {
-            loadingDialog = new LoadingDialog(context);
-        }
-
-        if (!loadingDialog.isShowing()) {
-            loadingDialog.setMessage(message);
-            loadingDialog.show();
-        }
-    }
-
-    /**
-     * 显示默认Loading
-     */
-    public void show(Context context) {
-        show(context, "加载中...");
-    }
-
-    /**
-     * 隐藏Loading
-     */
-    public void dismiss() {
-        if (loadingDialog != null && loadingDialog.isShowing()) {
-            loadingDialog.dismiss();
-        }
-    }
-}
-

+ 26 - 0
app/src/main/java/com/ytpm/qnjz/Constants.java

@@ -0,0 +1,26 @@
+package com.ytpm.qnjz;
+
+public class Constants {
+    public static final boolean isDebug = true;
+
+    public static final String TTAD_APPID = "5713373";
+    public static final String TAKU_APPID = "a685138d49cd2d";
+    public static final String TAKU_KEY = "a22c218b031fa5bffe11dee94206557a9";
+    public static final String TAKU_BANNER_PID = "b6851397a0f614";
+    public static final String TAKU_NATIVE_PID = "b685139660f1e1";
+    public static final String TAKU_REWARD_PID = "b685139511e20e";
+    public static final String TAKU_INTERSTITIAL_PID = "b6851395bd2c77";
+    public static final String TAKU_SPLASH_PID = "b68b93fde1ef36";
+    public static final String BASE_URL_V2 = "http://advise.ytmdm.com/";//生产
+    public static final String BASE_URL_V2_DEBUG = "http://119.45.71.139:25001/";//测试
+    public static String FULL_URL_V2 = "gateway/";
+    public static String GET_CONFIG = "lime-service/wx/defaultConfig";
+    public static String LOGIN = "lime-service/wx/login";
+    public static String ANSWER_QUESTION = "lime-service/question/answerQuestion";
+    public static String GET_QUESTIONS = "lime-service/question/list";
+    public static String ADD_POWER = "lime-service/wx/addPower";
+    public static String SAVE_RECORD = "lime-service/ad/saveRecord";
+    public static String GET_USER_INFO = "lime-service/user/getUserInfo";
+    public static String VISITOR = "lime-service/visitor/login";
+}
+

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/activity/AboutUsActivity.kt → app/src/main/java/com/ytpm/qnjz/activity/AboutUsActivity.kt

@@ -1,10 +1,10 @@
-package com.ytpm.hydtw.activity
+package com.ytpm.qnjz.activity
 
 import android.content.Intent
 import android.os.Bundle
 import androidx.fragment.app.FragmentActivity
 import com.blankj.utilcode.util.AppUtils
-import com.ytpm.hydtw.databinding.ActivityAboutUsBinding
+import com.ytpm.qnjz.databinding.ActivityAboutUsBinding
 
 class AboutUsActivity : FragmentActivity() {
 

+ 3 - 3
app/src/main/java/com/ytpm/hydtw/activity/FeedbackActivity.kt → app/src/main/java/com/ytpm/qnjz/activity/FeedbackActivity.kt

@@ -1,11 +1,11 @@
-package com.ytpm.hydtw.activity
+package com.ytpm.qnjz.activity
 
 import android.os.Bundle
 import android.view.Gravity
 import androidx.fragment.app.FragmentActivity
 import com.blankj.utilcode.util.ToastUtils
-import com.ytpm.hydtw.R
-import com.ytpm.hydtw.databinding.ActivityFeedbackBinding
+import com.ytpm.qnjz.R
+import com.ytpm.qnjz.databinding.ActivityFeedbackBinding
 
 class FeedbackActivity : FragmentActivity() {
 

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/activity/GameActivity.kt → app/src/main/java/com/ytpm/qnjz/activity/GameActivity.kt

@@ -1,8 +1,8 @@
-package com.ytpm.hydtw.activity
+package com.ytpm.qnjz.activity
 
 import android.os.Bundle
 import androidx.fragment.app.FragmentActivity
-import com.ytpm.hydtw.databinding.ActivityGameBinding
+import com.ytpm.qnjz.databinding.ActivityGameBinding
 
 
 open class GameActivity : FragmentActivity() {

+ 201 - 0
app/src/main/java/com/ytpm/qnjz/activity/LoginActivity.kt

@@ -0,0 +1,201 @@
+package com.ytpm.qnjz.activity
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Build
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.Gravity
+import android.view.View
+import android.widget.Toast
+import androidx.fragment.app.FragmentActivity
+import com.anythink.core.api.ATDeviceUtils
+import com.blankj.utilcode.util.DeviceUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.NetworkUtils
+import com.blankj.utilcode.util.PhoneUtils
+import com.blankj.utilcode.util.ToastUtils
+import com.ytpm.qnjz.utils.ConfigSpUtils
+import com.ytpm.qnjz.dao.UserInfo
+import com.ytpm.qnjz.utils.UserInfoSpUtils
+import com.ytpm.qnjz.utils.WechatLoginHelper
+import com.ytpm.qnjz.BuildConfig
+import com.ytpm.qnjz.Constants
+import com.ytpm.qnjz.R
+import com.ytpm.qnjz.databinding.ActivityLoginBinding
+import com.ytpm.qnjz.loading.GlobalLoading
+import com.ytpm.qnjz.network.BaseRetrofit
+import com.ytpm.qnjz.network.Callback2
+import com.ytpm.qnjz.utils.DeviceInfoCollector
+
+class LoginActivity : FragmentActivity(), WechatLoginHelper.WechatLoginListener {
+
+    private var wechatLoginHelper: WechatLoginHelper? = null
+    private lateinit var binding: ActivityLoginBinding
+    private var progress = 0
+    private var countdownTimer: CountDownTimer? = null
+    private var isCheck = true
+    private var loading: GlobalLoading? = null
+
+    private var isLogin: Boolean = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityLoginBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+
+        loading = GlobalLoading.getInstance()
+        initView()
+    }
+
+    @SuppressLint("SetTextI18n")
+    private fun initView() {
+
+        binding.yszc.setOnClickListener {
+            jumpWeb("隐私政策", 0)
+        }
+
+        binding.yhxy.setOnClickListener {
+            jumpWeb("用户协议", 1)
+        }
+        binding.activityLoginCheckBox.isChecked = true
+
+        binding.activityLoginCheckBox.setOnCheckedChangeListener { _, isChecked ->
+            isCheck = isChecked
+        }
+
+        binding.loginBtnLl.setOnClickListener {
+            if (!isCheck) {
+                Toast.makeText(it.context, "请阅读并同意用户协议和隐私政策", Toast.LENGTH_SHORT)
+                    .show()
+                return@setOnClickListener
+            }
+
+            loading?.show(this)
+            wechatLoginHelper = WechatLoginHelper.getInstance(this@LoginActivity)
+            binding.loginBtnLl.visibility = View.VISIBLE
+            wechatLoginHelper?.login(this@LoginActivity)
+        }
+    }
+
+    private fun jumpWeb(title: String, index: Int) {
+        val intent = Intent(this@LoginActivity, WebActivity::class.java)
+        intent.putExtra("title", title)
+        intent.putExtra("index", index)
+        startActivity(intent)
+    }
+
+    private fun startCountdown(millisInFuture: Long, countDownInterval: Long) {
+        countdownTimer?.cancel()
+
+        countdownTimer = object : CountDownTimer(millisInFuture, countDownInterval) {
+            override fun onTick(millisUntilFinished: Long) {
+                progress++
+                binding.activityLoginProgressTx.text = "$progress%"
+                binding.activityLoginProgress.progress = progress
+                if (progress >= 100) {
+                    jump()
+                }
+            }
+
+            override fun onFinish() {
+            }
+        }.start()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        countdownTimer?.start()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        countdownTimer?.cancel()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        countdownTimer?.cancel()
+    }
+
+
+    private fun jump() {
+        countdownTimer?.cancel() // 取消之前的倒计时
+        val intent = Intent(this@LoginActivity, MainActivity::class.java)
+        startActivity(intent)
+        finish()
+    }
+
+    override fun onLoginSuccess(code: String?) {
+        LogUtils.e("dfdfdf${code}")
+        startLogin(code)
+    }
+
+    override fun onLoginFailed(errorMsg: String?) {
+        ToastUtils.showShort(errorMsg)
+        loading?.dismiss()
+    }
+
+    private fun startLogin(code: String?) {
+
+        val ip = NetworkUtils.getIPAddress(true)
+        val operatorName = PhoneUtils.getSimOperatorName()
+        val model = DeviceUtils.getModel()
+
+        val map = HashMap<String, Any>()
+        map["alias"] = Build.ID
+        map["brand"] = Build.BRAND
+        map["ipLocation"] = ConfigSpUtils().getConfig()?.addressInfo.toString()
+        map["ipOperator"] = operatorName
+        map["loginIp"] = ip
+        map["model"] = model
+        map["appType"] = ConfigSpUtils().getConfig()?.appType ?: BuildConfig.APP_TYPE.toInt()
+        map["ditchId"] = ConfigSpUtils().getConfig()?.ditchId ?: BuildConfig.DITCH_ID
+        map["wxCode"] = code!!
+        map["phone"] = ConfigSpUtils().getConfig()?.phone.toString()
+        map["deviceId"] = ATDeviceUtils.getOaid()?: DeviceUtils.getAndroidID()
+        map["phoneJson"] = DeviceInfoCollector(this).getDeviceInfoJson()
+
+        val requestBody = BaseRetrofit.getRequestBodyByMapToJson(map)
+        var url = if (Constants.isDebug) {
+            Constants.LOGIN
+        } else {
+            Constants.FULL_URL_V2 + Constants.LOGIN
+        }
+
+        BaseRetrofit.getInstance().apiService.login(url, requestBody)
+            .enqueue(object : Callback2<UserInfo>() {
+                override fun success(body: UserInfo?) {
+
+                    if (body != null) {
+                        UserInfoSpUtils().putUserInfo(body)
+                    }
+
+                    startLoading()
+                    isLogin = false
+
+                    loading?.dismiss()
+                }
+
+                override fun fail(code: Int, msg: String?) {
+
+                    ToastUtils
+                        .make()
+                        .setMode(ToastUtils.MODE.DARK)
+                        .setGravity(Gravity.CENTER, 0, 0)
+                        .setTopIcon(R.mipmap.icon_fail)
+                        .setDurationIsLong(true)
+                        .show(msg)
+
+                    isLogin = false
+                    loading?.dismiss()
+                }
+            })
+    }
+
+    private fun startLoading() {
+        binding.loginBtnLl.visibility = View.GONE
+        binding.progressLl.visibility = View.VISIBLE
+        startCountdown(100000, 50)
+    }
+}

+ 3 - 6
app/src/main/java/com/ytpm/hydtw/activity/MainActivity.kt → app/src/main/java/com/ytpm/qnjz/activity/MainActivity.kt

@@ -1,16 +1,13 @@
-package com.ytpm.hydtw.activity
+package com.ytpm.qnjz.activity
 
 import android.os.Bundle
 import android.widget.RadioGroup
 import android.widget.RadioGroup.OnCheckedChangeListener
-import androidx.appcompat.app.AppCompatActivity
 import androidx.fragment.app.FragmentActivity
 import androidx.viewpager.widget.ViewPager.OnPageChangeListener
 import com.blankj.utilcode.util.ToastUtils
-import com.ytpm.hydtw.R
-import com.ytpm.hydtw.adapter.NotePagerAdapter
-import com.ytpm.hydtw.databinding.ActivityMainBinding
-import com.ytpm.hydtw.utils.DateTimeUtils
+import com.ytpm.qnjz.adapter.NotePagerAdapter
+import com.ytpm.qnjz.databinding.ActivityMainBinding
 
 class MainActivity : FragmentActivity(), OnPageChangeListener, OnCheckedChangeListener {
     private var clickTime: Int = 0

+ 951 - 0
app/src/main/java/com/ytpm/qnjz/activity/SplashActivity.kt

@@ -0,0 +1,951 @@
+package com.ytpm.qnjz.activity
+
+import android.Manifest
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.graphics.Color
+import android.os.Build
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.provider.Settings
+import android.telephony.TelephonyManager
+import android.text.SpannableStringBuilder
+import android.text.Spanned
+import android.text.method.LinkMovementMethod
+import android.text.style.ClickableSpan
+import android.text.style.ForegroundColorSpan
+import android.view.Gravity
+import android.view.View
+import android.widget.Toast
+import androidx.fragment.app.FragmentActivity
+import com.anythink.banner.api.ATBannerListener
+import com.anythink.banner.api.ATBannerView
+import com.anythink.core.api.ATAdConst
+import com.anythink.core.api.ATAdInfo
+import com.anythink.core.api.ATDeviceUtils
+import com.anythink.core.api.ATSDK
+import com.anythink.core.api.ATSDKInitListener
+import com.anythink.core.api.ATShowConfig
+import com.anythink.core.api.AdError
+import com.anythink.nativead.api.ATNative
+import com.anythink.nativead.api.ATNativeAdView
+import com.anythink.nativead.api.ATNativeEventListener
+import com.anythink.nativead.api.ATNativeNetworkListener
+import com.anythink.nativead.api.NativeAd
+import com.anythink.rewardvideo.api.ATRewardVideoAd
+import com.anythink.rewardvideo.api.ATRewardVideoListener
+import com.anythink.splashad.api.ATSplashAd
+import com.anythink.splashad.api.ATSplashAdExtraInfo
+import com.anythink.splashad.api.ATSplashAdListener
+import com.blankj.utilcode.util.DeviceUtils
+import com.blankj.utilcode.util.GsonUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.NetworkUtils
+import com.blankj.utilcode.util.PhoneUtils
+import com.blankj.utilcode.util.SPUtils
+import com.blankj.utilcode.util.ToastUtils
+import com.bumptech.glide.Glide
+import com.ytpm.qnjz.BuildConfig
+import com.ytpm.qnjz.Constants
+import com.ytpm.qnjz.R
+import com.ytpm.qnjz.dao.Config
+import com.ytpm.qnjz.dao.MyAtInfo
+import com.ytpm.qnjz.dao.UserInfo
+import com.ytpm.qnjz.dao.VisitorBody
+import com.ytpm.qnjz.databinding.ActivitySplashBinding
+import com.ytpm.qnjz.loading.GlobalLoading
+import com.ytpm.qnjz.network.BaseRetrofit
+import com.ytpm.qnjz.network.Callback2
+import com.ytpm.qnjz.network.api.Result
+import com.ytpm.qnjz.utils.ConfigSpUtils
+import com.ytpm.qnjz.utils.DateTimeUtils
+import com.ytpm.qnjz.utils.DeviceInfoCollector
+import com.ytpm.qnjz.utils.LocationUtils
+import com.ytpm.qnjz.utils.PermissionUtils
+import com.ytpm.qnjz.utils.UserInfoSpUtils
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import okhttp3.MediaType
+import okhttp3.RequestBody
+import retrofit2.Call
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatter
+import kotlin.random.Random
+import kotlin.system.exitProcess
+
+@SuppressLint("CustomSplashScreen")
+class SplashActivity() : FragmentActivity(), ATSplashAdListener, ATBannerListener,
+    ATRewardVideoListener {
+
+    private val TAG: String = this::class.java.simpleName
+
+    private lateinit var binding: ActivitySplashBinding
+
+    private var getConfigCall: Call<Result<Config>>? = null
+
+    private var mPhoneNumber = ""
+
+    private var addressInfo = ""
+
+    private var splashAd: ATSplashAd? = null
+
+    private var mBannerView: ATBannerView? = null
+
+    private var atNative: ATNative? = null
+    private var nativeAd: NativeAd? = null
+
+    private var startBannerAdTime: String? = null
+    private var endBannerAdTime: String? = null
+
+    private var startNativeAdTime: String? = null
+    private var endNativeAdTime: String? = null
+
+    private var startSplashAdTime: String? = null
+    private var endSplashAdTime: String? = null
+
+    private var startRawardAdTime: String? = null
+    private var endRawardAdTime: String? = null
+
+    private var saveTime: Int = 0
+
+    private var preAdList = ArrayList<MyAtInfo>()
+
+    private var adDismiss: Boolean = false
+    private var visitorLoginSuccess: Boolean = false
+    private var visitorLoginLoading: Boolean = false
+
+
+    private var cacheAdCount: Int = 3
+
+    override fun onPause() {
+        super.onPause()
+        mBannerView = null
+        atNative = null
+        splashAd = null
+        getTlCountDownTimer?.cancel()
+        getTlCountDownTimer = null
+
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        binding = ActivitySplashBinding.inflate(layoutInflater)
+
+        setContentView(binding.root)
+
+        binding.cancel1.setOnClickListener { exitProcess(0) }
+
+        binding.splashBtnLl.setOnClickListener {
+            loadPermission()
+        }
+
+        Glide.with(this).asGif().load(R.mipmap.loading).into(binding.loadingIm)
+        initView()
+
+    }
+
+    private fun changeLoadText() {
+        val loadTexts = arrayListOf<String>(
+            "游戏资源加载中...",
+            "正在打扫答题界面...",
+            "游戏音效加载中...",
+            "背景音乐加载中...",
+            "用户信息加载中..."
+        )
+        val randomNumber = Random.nextInt(5) // 参数是上限,不包含该值,所以3表示生成0-2的数
+        binding.loadingTv.text = loadTexts[randomNumber]
+    }
+
+    private fun initView() {
+        val isFirst = SPUtils.getInstance().getBoolean("isFirst", true)
+
+        if (isFirst) {
+            binding.dialogYs.visibility = View.VISIBLE
+        }
+
+        binding.dialogYs.setOnClickListener { }
+
+        binding.agree.setOnClickListener {
+            SPUtils.getInstance().put("isFirst", false)
+            binding.dialogYs.visibility = View.GONE
+            loadPermission()
+        }
+
+        binding.cancel.setOnClickListener {
+            finish()
+        }
+
+        val appName = resources.getString(R.string.app_name)
+
+        binding.loginTsTitle.text = "${appName}${resources.getString(R.string.tip)}"
+
+        val dc =
+            "${resources.getString(R.string.tip1)}${appName}${resources.getString(R.string.tip2)}"
+        val spannableText = SpannableStringBuilder(dc)
+
+        val ts1 = resources.getString(R.string.tip3)
+        val ts2 = resources.getString(R.string.tip4)
+        val ts3 =
+            "${resources.getString(R.string.tip5)}${appName}${resources.getString(R.string.tip6)}"
+        spannableText.append(ts1)
+        spannableText.append("与")
+        spannableText.append(ts2)
+        spannableText.append(ts3)
+
+        // 设置前景色
+        val colorSpan = ForegroundColorSpan(Color.BLUE)
+        spannableText.setSpan(
+            colorSpan,
+            dc.length,
+            dc.length + ts1.length,
+            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+        )
+        // 设置前景色
+        spannableText.setSpan(
+            colorSpan,
+            dc.length + ts1.length + 1,
+            dc.length + ts1.length + 1 + ts2.length,
+            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+        )
+
+        spannableText.setSpan(
+            clickSub("用户协议", 1),
+            dc.length,
+            dc.length + ts1.length,
+            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+        )
+
+        spannableText.setSpan(
+            clickSub("隐私政策", 0),
+            dc.length + ts1.length + 1,
+            dc.length + ts1.length + 1 + ts2.length,
+            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+        )
+
+        binding.loginTs.text = spannableText
+        binding.loginTs.movementMethod = LinkMovementMethod.getInstance()
+    }
+
+    private fun clickSub(title: String, index: Int): ClickableSpan {
+        return object : ClickableSpan() {
+            override fun onClick(widget: View) {
+                jumpWeb(title, index)
+            }
+        }
+    }
+
+    private fun jumpWeb(title: String, index: Int) {
+        val intent = Intent(this@SplashActivity, WebActivity::class.java)
+        intent.putExtra("title", title)
+        intent.putExtra("index", index)
+        startActivity(intent)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        val isFirst = SPUtils.getInstance().getBoolean("isFirst", true)
+        if (!isFirst) {
+            loadPermission()
+        }
+
+        changeLoadText()
+    }
+
+    private lateinit var permissionUtils: PermissionUtils
+
+    private fun loadPermission() {
+
+        saveTime = 0
+        adDismiss = false
+        visitorLoginSuccess = false
+        preAdList.clear()
+        binding.loading.visibility = View.GONE
+        binding.splashBtnLl.visibility = View.GONE
+        permissionUtils = PermissionUtils(this)
+
+        if (!permissionUtils.hasLocationPermission()) {
+            if (permissionUtils.shouldShowRequestPermissionRationale(
+                    this,
+                    Manifest.permission.ACCESS_FINE_LOCATION
+                )
+            ) {
+                permissionUtils.showPermissionExplanationDialog(
+                    this,
+                    "需要定位权限、手机信息权限、文件权限",
+                    "此应用需要定位权限以提供位置相关功能,需要手机信息权限三方广告特殊功能,文件存储权限保存信息到本地文件。取消将退出应用。",
+                    PermissionUtils.LOCATION_PERMISSIONS
+                )
+            } else {
+                permissionUtils.requestLocationPermission(this)
+            }
+        } else {
+            startLocationService()
+        }
+    }
+
+    private fun startLocationService() {
+        getPhoneNumber()
+        fetchLocationAndAddress()
+    }
+
+    @SuppressLint("MissingPermission", "HardwareIds")
+    private fun getPhoneNumber() {
+        val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
+        val phoneNumber = telephonyManager.line1Number
+
+        if (!phoneNumber.isNullOrEmpty()) {
+            mPhoneNumber = phoneNumber
+        }
+    }
+
+    private val locationUtils by lazy { LocationUtils(this) }
+    private val coroutineScope = CoroutineScope(Dispatchers.Main)
+
+    private fun fetchLocationAndAddress() {
+
+        coroutineScope.launch {
+
+            try {
+                if (!locationUtils.isLocationServiceEnabled()) {
+                    // 跳转到系统定位设置页面
+                    val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
+                    startActivity(intent)
+                    return@launch
+                }
+
+                var location = locationUtils.getLastLocation()
+
+                if (location == null) {
+                    location = locationUtils.getCurrentLocation()
+                }
+
+                if (location == null) {
+                    addressInfo = "未知归属地"
+                    getWxConfig()
+                    run { }
+                    return@launch
+                }
+
+                location.let {
+                    val address = locationUtils.getAddressFromLocation(it.latitude, it.longitude)
+                    address?.let { addr ->
+                        val addressText = StringBuilder()
+                        addressInfo = addressText
+                            .append(addr.countryName)
+                            .append(addr.adminArea)
+                            .append(addr.locality)
+                            .toString()
+
+                        getWxConfig()
+
+                    } ?: run {
+                    }
+                }
+            } catch (e: Exception) {
+                LogUtils.e(e.message)
+            }
+        }
+    }
+
+
+    override fun onDestroy() {
+        binding.fragmentDatiBanner.removeAllViews()
+        if (mBannerView != null) {
+            mBannerView?.destroy()
+        }
+        destroyAd()
+        if (atNative != null) {
+            atNative?.setAdListener(null)
+            atNative?.setAdSourceStatusListener(null)
+            atNative?.setAdMultipleLoadedListener(null)
+        }
+
+        if (splashAd != null) {
+            splashAd?.setAdListener(null)
+            splashAd?.setAdDownloadListener(null)
+            splashAd?.setAdSourceStatusListener(null)
+            splashAd?.setAdMultipleLoadedListener(null)
+        }
+        super.onDestroy()
+
+    }
+
+    private fun destroyAd() {
+        if (nativeAd != null) {
+            nativeAd?.destory()
+        }
+    }
+
+
+    private fun getWxConfig() {
+
+        changeShow()
+
+        var url = if (Constants.isDebug) {
+            Constants.GET_CONFIG
+        } else {
+            Constants.FULL_URL_V2 + Constants.GET_CONFIG
+        }
+
+        getConfigCall =
+            BaseRetrofit.getInstance().apiService.getConfigs(url, BuildConfig.APP_TYPE.toInt())
+
+        getConfigCall?.enqueue(object : Callback2<Config>() {
+            override fun success(body: Config?) {
+
+                GlobalLoading.getInstance().dismiss()
+
+                body?.addressInfo = addressInfo.toString()
+                body?.phone = mPhoneNumber.toString()
+                ConfigSpUtils().putConfigInfo(body)
+
+                val appName = resources.getString(R.string.app_name)
+
+                if (DeviceUtils.isEmulator() && (body?.canSimulator == 1)) {
+                    showTipDialog("请勿使用虚拟机或群控设备操作任务!")
+                    return
+                }
+
+                if (DeviceUtils.isDeviceRooted() && body?.canUseRoot == 1) {
+                    showTipDialog("${appName}无法在Root环境下使用,存在操作风险,请更换设备!")
+                    return
+                }
+
+                if (DeviceUtils.isAdbEnabled() && body?.canUseAdb == 1 && BuildConfig.BUILD_TYPE == "release") {
+                    showTipDialog("${appName}无法在开发者模式的USB调试模式下使用,请先关闭该模式!")
+                    return
+                }
+
+                if (isFloatingWindowPermissionGranted(this@SplashActivity) && body?.canUseFloat == 1) {
+                    showTipDialog("${appName}无法再悬浮权限开启状态下使用,请到设置中关闭该权限!")
+                    return
+                }
+
+                cacheAdCount = if (ConfigSpUtils().getConfig()?.canCacheVideo == 0) 3 else 4
+
+                val takuAppId = body?.takuAppId ?: Constants.TAKU_APPID
+                val takuAppKey = body?.takuKey ?: Constants.TAKU_KEY
+                ATSDK.setWXAppId(body?.appId)
+                ATSDK.init(
+                    applicationContext,
+                    takuAppId,
+                    takuAppKey,
+                    null,
+                    object : ATSDKInitListener {
+                        override fun onSuccess() {
+                            loadSplash()
+                            loadBanner()
+                            loadNative()
+                            if (ConfigSpUtils().getConfig()?.canCacheVideo == 1) loadAd()
+                        }
+
+                        override fun onFail(p0: String?) {
+
+                        }
+                    })
+                ATSDK.start()
+
+                loadTIme()
+            }
+
+            override fun fail(code: Int, msg: String?) {
+                ToastUtils
+                    .make()
+                    .setMode(ToastUtils.MODE.DARK)
+                    .setGravity(Gravity.CENTER, 0, 0)
+                    .setTopIcon(R.mipmap.icon_fail)
+                    .setDurationIsLong(true)
+                    .show(msg)
+
+                GlobalLoading.getInstance().dismiss()
+                binding.splashBtnLl.visibility = View.VISIBLE
+                binding.loading.visibility = View.GONE
+            }
+        })
+    }
+
+    private fun startVisitorLogin() {
+
+        if (visitorLoginLoading) return
+
+        visitorLoginLoading = true
+
+        getTlCountDownTimer?.cancel()
+        getTlCountDownTimer = null
+        GlobalLoading.getInstance().show(this)
+
+        val ip = NetworkUtils.getIPAddress(true)
+        val operatorName = PhoneUtils.getSimOperatorName()
+        val model = DeviceUtils.getModel()
+
+        val visitorLoginBody = VisitorBody(
+            alias = Build.ID,
+            brand = Build.BRAND,
+            ipLocation = ConfigSpUtils().getConfig()?.addressInfo.toString(),
+            ipOperator = operatorName,
+            loginIp = ip,
+            model = model,
+            appType = ConfigSpUtils().getConfig()?.appType ?: BuildConfig.APP_TYPE.toInt(),
+            ditchId = ConfigSpUtils().getConfig()?.ditchId ?: BuildConfig.DITCH_ID,
+            phone = ConfigSpUtils().getConfig()?.phone.toString(),
+            deviceId = ATDeviceUtils.getOaid() ?: DeviceUtils.getAndroidID(),
+            phoneJson = DeviceInfoCollector(this).getDeviceInfoJson(),
+            preAdList = preAdList
+        )
+
+        val requestBody = RequestBody.create(
+            MediaType.parse("application/json; charset=utf-8"),
+            GsonUtils.toJson(visitorLoginBody)
+        )
+
+        var url = if (Constants.isDebug) {
+            Constants.VISITOR
+        } else {
+            Constants.FULL_URL_V2 + Constants.VISITOR
+        }
+
+        BaseRetrofit.getInstance().apiService.login(url, requestBody)
+            .enqueue(object : Callback2<UserInfo>() {
+                override fun success(body: UserInfo?) {
+                    visitorLoginLoading = false
+                    visitorLoginSuccess = true
+                    if (body != null) {
+                        UserInfoSpUtils().putUserInfo(body)
+                        canJumpLogin()
+                    }
+                }
+
+                override fun fail(code: Int, msg: String?) {
+
+                    visitorLoginLoading = false
+
+                    GlobalLoading.getInstance().dismiss()
+
+                    if (code == 301) {
+                        showTipDialog(ConfigSpUtils().getConfig()?.lowValueTip.toString())
+                        return
+                    }
+
+                    ToastUtils
+                        .make()
+                        .setMode(ToastUtils.MODE.DARK)
+                        .setGravity(Gravity.CENTER, 0, 0)
+                        .setTopIcon(R.mipmap.icon_fail)
+                        .setDurationIsLong(true)
+                        .show(msg)
+                }
+            })
+    }
+
+
+    // 处理权限请求结果
+    override fun onRequestPermissionsResult(
+        requestCode: Int,
+        permissions: Array<out String>,
+        grantResults: IntArray
+    ) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+
+        if (requestCode == PermissionUtils.PERMISSION_REQUEST_CODE) {
+            if (grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
+                Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show()
+                startLocationService()
+            } else {
+                if (permissions.any {
+                        !permissionUtils.shouldShowRequestPermissionRationale(this, it)
+                    }) {
+                    Toast.makeText(this, "请在设置中手动授予权限", Toast.LENGTH_SHORT).show()
+                    permissionUtils.goToAppSettings(this)
+                } else {
+                    Toast.makeText(this, "权限被拒绝,功能无法使用", Toast.LENGTH_SHORT).show()
+                }
+            }
+        }
+    }
+
+
+    fun isFloatingWindowPermissionGranted(context: Context?): Boolean {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            return Settings.canDrawOverlays(context)
+        }
+        return true
+    }
+
+
+    override fun onBackPressed() {
+        exitProcess(0)
+        super.onBackPressed()
+    }
+
+    private fun changeShow() {
+        binding.loading.visibility = View.VISIBLE
+        binding.splashBtnLl.visibility = View.GONE
+    }
+
+    private fun loadSplash() {
+
+        if (splashAd == null) {
+            val takuRewardPid =
+                ConfigSpUtils().getConfig()?.takuSplashPid ?: Constants.TAKU_SPLASH_PID
+            splashAd = ATSplashAd(this, takuRewardPid, this, 3000)
+        }
+
+        binding.splashFl.visibility = View.VISIBLE
+
+        splashAd?.loadAd()
+    }
+
+    override fun onAdLoaded(p0: Boolean) {
+        if (splashAd?.isAdReady == true) {
+            splashAd?.show(this@SplashActivity, binding.splashFl)
+        }
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            startSplashAdTime = current.format(formatter)
+        } else {
+            startSplashAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+    }
+
+    override fun onAdLoadTimeout() {
+    }
+
+    override fun onNoAdError(p0: AdError?) {
+    }
+
+    override fun onAdShow(p0: ATAdInfo?) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            endSplashAdTime = current.format(formatter)
+        } else {
+            endSplashAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        if (endSplashAdTime == "null") {
+            endSplashAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        preAdList.add(getMyAtInfo(p0, startSplashAdTime, endSplashAdTime))
+        if (preAdList.size >= cacheAdCount && adDismiss) {
+            startVisitorLogin()
+        }
+    }
+
+    override fun onAdClick(p0: ATAdInfo?) {
+
+    }
+
+    override fun onAdDismiss(
+        p0: ATAdInfo?,
+        p1: ATSplashAdExtraInfo?
+    ) {
+        adDismiss = true
+        if (preAdList.size >= cacheAdCount) {
+            startVisitorLogin()
+        }
+        binding.splashFl.visibility = View.GONE
+        splashAd = null
+    }
+
+    private fun loadBanner() {
+        val takuBannerPid = ConfigSpUtils().getConfig()?.takuBannerPid ?: Constants.TAKU_BANNER_PID
+        mBannerView = ATBannerView(this)
+        mBannerView?.setPlacementId(takuBannerPid)
+        mBannerView?.setShowConfig(getATShowConfig())
+        mBannerView?.setBannerAdListener(this)
+        binding.fragmentDatiBanner.removeAllViews()
+        binding.fragmentDatiBanner.addView(mBannerView)
+
+        if (mBannerView?.checkAdStatus()?.isLoading == false) mBannerView?.loadAd()
+    }
+
+    private fun getATShowConfig1(): ATShowConfig {
+        val builder: ATShowConfig.Builder = ATShowConfig.Builder()
+        builder.scenarioId("native_ad_show_1")
+        builder.showCustomExt("native_ad_show_custom_ext")
+
+        return builder.build()
+    }
+
+    private fun getATShowConfig(): ATShowConfig {
+        val builder: ATShowConfig.Builder = ATShowConfig.Builder()
+        builder.scenarioId("banner_ad_show_1")
+        builder.showCustomExt("banner_ad_show_custom_ext")
+
+        return builder.build()
+    }
+
+    override fun onBannerLoaded() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            startBannerAdTime = current.format(formatter)
+        } else {
+            startBannerAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+    }
+
+    override fun onBannerFailed(p0: AdError?) {
+    }
+
+    override fun onBannerClicked(p0: ATAdInfo?) {
+    }
+
+    override fun onBannerShow(p0: ATAdInfo?) {
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            endBannerAdTime = current.format(formatter)
+        } else {
+            endBannerAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        if (endBannerAdTime == "null") {
+            endBannerAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        preAdList.add(getMyAtInfo(p0, startBannerAdTime, endBannerAdTime))
+
+        if (preAdList.size >= cacheAdCount && adDismiss) {
+            startVisitorLogin()
+        }
+    }
+
+    override fun onBannerClose(p0: ATAdInfo?) {
+    }
+
+    override fun onBannerAutoRefreshed(p0: ATAdInfo?) {
+    }
+
+    override fun onBannerAutoRefreshFail(p0: AdError?) {
+    }
+
+    private fun loadNative() {
+
+        binding.fragmentDatiContentAd.visibility = View.GONE
+        if (atNative == null) {
+            val takuNativePid =
+                ConfigSpUtils().getConfig()?.takuNativePid ?: Constants.TAKU_NATIVE_PID
+            atNative = ATNative(this, takuNativePid, object : ATNativeNetworkListener {
+                override fun onNativeAdLoaded() {
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                        val current = LocalDateTime.now()
+                        val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+                        startNativeAdTime = current.format(formatter)
+                    } else {
+                        startNativeAdTime = DateTimeUtils.getCurrentDateTime()
+                    }
+                    nativeAd = atNative?.getNativeAd(getATShowConfig1())
+                    nativeAd?.setNativeEventListener(object : ATNativeEventListener {
+                        override fun onAdImpressed(
+                            p0: ATNativeAdView?,
+                            p1: ATAdInfo?
+                        ) {
+                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                                val current = LocalDateTime.now()
+                                val formatter =
+                                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+                                endNativeAdTime = current.format(formatter)
+                            } else {
+                                endNativeAdTime = DateTimeUtils.getCurrentDateTime()
+                            }
+
+                            if (endNativeAdTime == "null") {
+                                endNativeAdTime = DateTimeUtils.getCurrentDateTime()
+                            }
+
+                            preAdList.add(getMyAtInfo(p1, startNativeAdTime, endNativeAdTime))
+                            if (preAdList.size >= cacheAdCount && adDismiss) {
+                                startVisitorLogin()
+                            }
+                        }
+
+                        override fun onAdClicked(
+                            p0: ATNativeAdView?,
+                            p1: ATAdInfo?
+                        ) {
+                        }
+
+                        override fun onAdVideoStart(p0: ATNativeAdView?) {
+
+                        }
+
+                        override fun onAdVideoEnd(p0: ATNativeAdView?) {
+                        }
+
+                        override fun onAdVideoProgress(
+                            p0: ATNativeAdView?,
+                            p1: Int
+                        ) {
+                        }
+                    })
+                    try {
+                        binding.fragmentDatiContentAd.visibility = View.VISIBLE
+                        nativeAd?.renderAdContainer(binding.fragmentDatiContentAd, null)
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    }
+                }
+
+                override fun onNativeAdLoadFail(adError: AdError) {
+                    binding.fragmentDatiContentAd.visibility = View.GONE
+                    atNative = null
+                    loadNative()
+                }
+            })
+        }
+
+        binding.fragmentDatiContentAd.removeAllViews()
+
+        if (atNative?.checkAdStatus()?.isLoading == false) atNative?.makeAdRequest()
+    }
+
+    private fun getMyAtInfo(
+        atAdInfo: ATAdInfo?,
+        startAdTime: String?,
+        endAdTime: String?
+    ): MyAtInfo {
+        return MyAtInfo(
+            adSourceId = atAdInfo?.adsourceId,
+            beginTime = startAdTime,
+            finishTime = endAdTime,
+            networkFormId = atAdInfo?.networkFirmId,
+            networkName = atAdInfo?.networkName,
+            networkPlacementId = atAdInfo?.networkPlacementId,
+            placementId = atAdInfo?.placementId,
+            recordId = atAdInfo?.requestId,
+            revenue = atAdInfo?.publisherRevenue?.toDouble(),
+            ecpm = atAdInfo?.ecpm.toString(),
+            adSourceIndex = atAdInfo?.adsourceIndex,
+            adSourceType = atAdInfo?.adSourceAdType,
+            resultJson = atAdInfo?.toString()
+        )
+    }
+
+    private fun canJumpLogin() {
+        GlobalLoading.getInstance().dismiss()
+        val intent = Intent(this, LoginActivity::class.java)
+        startActivity(intent)
+        finish()
+    }
+
+    private fun showTipDialog(msg: String) {
+        binding.tipTv.text = msg
+        binding.dialogIsE.visibility = View.VISIBLE
+    }
+
+    private var mRewardVideoAd: ATRewardVideoAd? = null
+
+    private fun loadAd() {
+        if (mRewardVideoAd == null) {
+            val takuRewardPid =
+                ConfigSpUtils().getConfig()?.takuRewardPid ?: Constants.TAKU_REWARD_PID
+            mRewardVideoAd = ATRewardVideoAd(this, takuRewardPid)
+        }
+        val userid = UserInfoSpUtils().getUserInfo().userId
+        val userdata = UserInfoSpUtils().getUserInfo().nickName
+        val localMap: MutableMap<String, Any> = HashMap()
+        localMap[ATAdConst.KEY.USER_ID] = userid
+        localMap[ATAdConst.KEY.USER_CUSTOM_DATA] = userdata
+        mRewardVideoAd?.setLocalExtra(localMap)
+        mRewardVideoAd?.setAdListener(this)
+        mRewardVideoAd?.load()
+    }
+
+    override fun onRewardedVideoAdLoaded() {
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            startRawardAdTime = current.format(formatter)
+        } else {
+            startRawardAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        if (startRawardAdTime == "null") {
+            startRawardAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            endRawardAdTime = current.format(formatter)
+        } else {
+            endRawardAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        if (endRawardAdTime == "null") {
+            endRawardAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+
+        preAdList.add(
+            getMyAtInfo(
+                mRewardVideoAd?.checkAdStatus()?.atTopAdInfo,
+                startRawardAdTime,
+                endRawardAdTime
+            )
+        )
+
+        if (preAdList.size >= cacheAdCount && adDismiss) {
+            startVisitorLogin()
+        }
+    }
+
+    override fun onRewardedVideoAdFailed(p0: AdError?) {
+        loadAd()
+    }
+
+    override fun onRewardedVideoAdPlayStart(p0: ATAdInfo?) {
+    }
+
+    override fun onRewardedVideoAdPlayEnd(p0: ATAdInfo?) {
+    }
+
+    override fun onRewardedVideoAdPlayFailed(
+        p0: AdError?,
+        p1: ATAdInfo?
+    ) {
+
+    }
+
+    override fun onRewardedVideoAdClosed(p0: ATAdInfo?) {
+    }
+
+    override fun onRewardedVideoAdPlayClicked(p0: ATAdInfo?) {
+    }
+
+    override fun onReward(p0: ATAdInfo?) {
+    }
+
+    private var getTlCountDownTimer: CountDownTimer? = null
+
+    private fun loadTIme() {
+
+        if (getTlCountDownTimer != null) {
+            return
+        }
+
+        val maxTime = ConfigSpUtils().getConfig()?.startWaitTime ?: 60
+        getTlCountDownTimer = object : CountDownTimer((maxTime * 1000).toLong(), 1000) {
+            @SuppressLint("SetTextI18n")
+            override fun onTick(millisUntilFinished: Long) {
+
+            }
+
+            override fun onFinish() {
+                LogUtils.e("FINISH")
+                startVisitorLogin()
+            }
+        }
+
+        getTlCountDownTimer?.start()
+    }
+}

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/activity/WebActivity.kt → app/src/main/java/com/ytpm/qnjz/activity/WebActivity.kt

@@ -1,10 +1,10 @@
-package com.ytpm.hydtw.activity
+package com.ytpm.qnjz.activity
 
 import android.os.Bundle
 import android.webkit.WebView
 import android.webkit.WebViewClient
 import androidx.fragment.app.FragmentActivity
-import com.ytpm.hydtw.databinding.ActivityWebBinding
+import com.ytpm.qnjz.databinding.ActivityWebBinding
 
 class WebActivity : FragmentActivity() {
 

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/activity/ZizunInfoActivity.kt → app/src/main/java/com/ytpm/qnjz/activity/ZizunInfoActivity.kt

@@ -1,9 +1,9 @@
-package com.ytpm.hydtw.activity
+package com.ytpm.qnjz.activity
 
 import android.os.Bundle
 import androidx.fragment.app.FragmentActivity
 import com.gyf.immersionbar.ImmersionBar
-import com.ytpm.hydtw.databinding.ActivityZixunInfoBinding
+import com.ytpm.qnjz.databinding.ActivityZixunInfoBinding
 
 class ZizunInfoActivity : FragmentActivity() {
 

+ 1 - 2
app/src/main/java/com/ytpm/hydtw/adapter/BaseAdapter.kt → app/src/main/java/com/ytpm/qnjz/adapter/BaseAdapter.kt

@@ -1,11 +1,10 @@
-package com.ytpm.hydtw.adapter
+package com.ytpm.qnjz.adapter
 
 import android.content.Context
 import android.view.LayoutInflater
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import androidx.viewbinding.ViewBinding
-import com.ytpm.hydtw.dao.item
 
 abstract class BaseAdapter<VB : ViewBinding, T>(
     val inflater: (LayoutInflater, parent: ViewGroup, attachToRoot: Boolean) -> VB,

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/adapter/BaseHolder.kt → app/src/main/java/com/ytpm/qnjz/adapter/BaseHolder.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.adapter
+package com.ytpm.qnjz.adapter
 
 import androidx.recyclerview.widget.RecyclerView
 import androidx.viewbinding.ViewBinding

+ 4 - 4
app/src/main/java/com/ytpm/hydtw/adapter/MineAdapter.kt → app/src/main/java/com/ytpm/qnjz/adapter/MineAdapter.kt

@@ -1,9 +1,9 @@
-package com.ytpm.hydtw.adapter
+package com.ytpm.qnjz.adapter
 
 import android.content.Context
-import com.ytpm.hydtw.dao.Record
-import com.ytpm.hydtw.databinding.AdapterMineBinding
-import com.ytpm.hydtw.utils.DateTimeConverter
+import com.ytpm.qnjz.dao.Record
+import com.ytpm.qnjz.databinding.AdapterMineBinding
+import com.ytpm.qnjz.utils.DateTimeConverter
 
 class MineAdapter(items: MutableList<Record>) :
     BaseAdapter<AdapterMineBinding, Record>(AdapterMineBinding::inflate, items) {

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/adapter/NotePagerAdapter.kt → app/src/main/java/com/ytpm/qnjz/adapter/NotePagerAdapter.kt

@@ -1,9 +1,9 @@
-package com.ytpm.hydtw.adapter
+package com.ytpm.qnjz.adapter
 
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentManager
 import androidx.fragment.app.FragmentPagerAdapter
-import com.ytpm.hydtw.fragment.DatiFragment
+import com.ytpm.qnjz.fragment.DatiFragment
 
 @Suppress("DEPRECATION")
 class NotePagerAdapter(fm: FragmentManager) :

+ 5 - 5
app/src/main/java/com/ytpm/hydtw/adapter/ZixunAdapter.kt → app/src/main/java/com/ytpm/qnjz/adapter/ZixunAdapter.kt

@@ -1,11 +1,11 @@
-package com.ytpm.hydtw.adapter
+package com.ytpm.qnjz.adapter
 
 import android.content.Context
 import android.content.Intent
-import com.ytpm.hydtw.activity.ZizunInfoActivity
-import com.ytpm.hydtw.dao.IdiomStory
-import com.ytpm.hydtw.databinding.AdapterZixunBinding
-import com.ytpm.hydtw.utils.GlideUtils
+import com.ytpm.qnjz.activity.ZizunInfoActivity
+import com.ytpm.qnjz.dao.IdiomStory
+import com.ytpm.qnjz.databinding.AdapterZixunBinding
+import com.ytpm.qnjz.utils.GlideUtils
 
 class ZixunAdapter(items: MutableList<IdiomStory>) :
     BaseAdapter<AdapterZixunBinding, IdiomStory>(AdapterZixunBinding::inflate, items) {

+ 4 - 4
app/src/main/java/com/ytpm/hydtw/application/DatiApplication.kt → app/src/main/java/com/ytpm/qnjz/application/DatiApplication.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.application
+package com.ytpm.qnjz.application
 
 import android.app.Application
 import android.content.Context
@@ -13,8 +13,8 @@ import com.bytedance.mtesttools.api.TTMediationTestTool.ImageCallBack
 import com.bytedance.sdk.openadsdk.TTAdConfig
 import com.bytedance.sdk.openadsdk.TTAdConstant
 import com.bytedance.sdk.openadsdk.TTAdSdk
-import com.ytpm.hydtw.Constants
-import com.ytpm.hydtw.R
+import com.ytpm.qnjz.Constants
+import com.ytpm.qnjz.R
 
 
 class DatiApplication : Application() {
@@ -28,7 +28,7 @@ class DatiApplication : Application() {
         super.onCreate()
 
         instance = this
-        initTTAdSdk()
+//        initTTAdSdk()
 
         ToastUtils.getDefaultMaker().setMode(ToastUtils.MODE.DARK)
         ToastUtils.getDefaultMaker().setGravity(Gravity.CENTER, 0, 0)

+ 10 - 0
app/src/main/java/com/ytpm/qnjz/dao/AppInfo.kt

@@ -0,0 +1,10 @@
+package com.ytpm.qnjz.dao
+
+data class AppInfo(
+    val appName: String,        // 应用名称
+    val packageName: String,    // 包名
+    val versionName: String,    // 版本名
+    val versionCode: Long,      // 版本号
+    val isSystemApp: Boolean,   // 是否系统应用
+    val icon: Int               // 应用图标资源ID
+)

+ 36 - 0
app/src/main/java/com/ytpm/qnjz/dao/Config.kt

@@ -0,0 +1,36 @@
+package com.ytpm.qnjz.dao
+
+data class Config(
+    var appId: String?,
+    var secret: String?,
+    var platformAppId: String?,
+    var appType: Int?,
+    var userPath: String?,
+    var loginPath: String?,
+    var adPath: String?,
+    var answerPath: String?,
+    var powerPath: String?,
+    var takuAppId: String?,
+    var takuKey: String?,
+    var takuBannerPid: String?,
+    var takuNativePid: String?,
+    var takuRewardPid: String?,
+    var takuInterstitialPid: String?,
+    var takuSplashPid: String?,
+    var canUseRoot: Int?,
+    var canUseAdb: Int?,
+    var canUseFloat: Int?,
+    var canAccumulation: Int?,
+    var canSimulator: Int?,
+    var powerWaitTime: Int?,
+    var interstitialIntervalTime: Int?,
+    var ditchId: String?,
+    var addressInfo: String?,
+    var phone: String?,
+    var lowValueTip: String?,
+    var brushTip: String?,
+    var canCacheVideo: Int?,
+    var startWaitTime: Int?,
+    var flowIntervalTime: Int?,
+    var canAllowAutoRefresh: Int?
+)

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/dao/IdiomStory.kt → app/src/main/java/com/ytpm/qnjz/dao/IdiomStory.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.dao
+package com.ytpm.qnjz.dao
 
 import android.content.Context
 import com.google.gson.Gson

+ 17 - 0
app/src/main/java/com/ytpm/qnjz/dao/MyAtInfo.kt

@@ -0,0 +1,17 @@
+package com.ytpm.qnjz.dao
+
+data class MyAtInfo(
+    var adSourceId: String?,
+    var beginTime: String?,
+    var finishTime: String?,
+    var networkFormId: Int?,
+    var networkName: String?,
+    var networkPlacementId: String?,
+    var placementId: String?,
+    var recordId: String?,
+    var revenue: Double?,
+    var ecpm: Any,
+    var adSourceIndex: Int?,
+    var adSourceType: Int?,
+    var resultJson: String?
+)

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/dao/Question.kt → app/src/main/java/com/ytpm/qnjz/dao/Question.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.dao
+package com.ytpm.qnjz.dao
 
 data class Question(
     val questionId: String?,

+ 6 - 2
app/src/main/java/com/ytpm/hydtw/dao/UserInfo.kt → app/src/main/java/com/ytpm/qnjz/dao/UserInfo.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.dao
+package com.ytpm.qnjz.dao
 
 data class UserInfo(
     val userId: String,
@@ -24,9 +24,13 @@ data class UserInfo(
     var power: Int = 0,
     var todayAnswerCount: Int,
     var historyAnswerCount: Int,
-    var answerRecordList: List<Record>
+    var appId: String,
+    var phone: String,
+    var answerRecordList: List<Record>,
+    var ifPowerLimit: Boolean
 )
 
+
 data class Record(
     val answerTime: String,
 )

+ 16 - 0
app/src/main/java/com/ytpm/qnjz/dao/VisitorBody.kt

@@ -0,0 +1,16 @@
+package com.ytpm.qnjz.dao
+
+data class VisitorBody (
+    var alias: String?,
+    var brand: String?,
+    var ipLocation: String?,
+    var ipOperator: String?,
+    var loginIp: String?,
+    var model: String?,
+    var appType: Int?,
+    var ditchId: String?,
+    var phone: String?,
+    var deviceId: String?,
+    var phoneJson: String?,
+    var preAdList: ArrayList<MyAtInfo>?,
+)

+ 470 - 169
app/src/main/java/com/ytpm/hydtw/fragment/DatiFragment.kt → app/src/main/java/com/ytpm/qnjz/fragment/DatiFragment.kt

@@ -1,13 +1,19 @@
-package com.ytpm.hydtw.fragment
+package com.ytpm.qnjz.fragment
 
 import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.Bitmap
 import android.os.Build
 import android.os.Bundle
 import android.os.CountDownTimer
+import android.text.TextUtils
 import android.view.Gravity
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.FrameLayout
+import android.widget.FrameLayout.LayoutParams
+import android.widget.TextView
 import androidx.core.content.res.ResourcesCompat
 import androidx.fragment.app.Fragment
 import com.anythink.banner.api.ATBannerListener
@@ -21,31 +27,35 @@ import com.anythink.interstitial.api.ATInterstitialListener
 import com.anythink.nativead.api.ATNative
 import com.anythink.nativead.api.ATNativeAdView
 import com.anythink.nativead.api.ATNativeEventListener
+import com.anythink.nativead.api.ATNativeImageView
+import com.anythink.nativead.api.ATNativeMaterial
 import com.anythink.nativead.api.ATNativeNetworkListener
+import com.anythink.nativead.api.ATNativePrepareInfo
 import com.anythink.nativead.api.NativeAd
 import com.anythink.rewardvideo.api.ATRewardVideoAd
 import com.anythink.rewardvideo.api.ATRewardVideoListener
-import com.blankj.utilcode.util.GsonUtils
+import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.LogUtils
 import com.blankj.utilcode.util.ToastUtils
 import com.blankj.utilcode.util.ToastUtils.MODE
 import com.gyf.immersionbar.ImmersionBar
-import com.ytpm.hydtw.Constants
-import com.ytpm.hydtw.R
-import com.ytpm.hydtw.adapter.MineAdapter
-import com.ytpm.hydtw.dao.Question
-import com.ytpm.hydtw.dao.Record
-import com.ytpm.hydtw.dao.UserInfo
-import com.ytpm.hydtw.databinding.FragmentDatiBinding
-import com.ytpm.hydtw.loading.GlobalLoading
-import com.ytpm.hydtw.loading.LoadingDialog
-import com.ytpm.hydtw.network.BaseRetrofit
-import com.ytpm.hydtw.network.Callback2
-import com.ytpm.hydtw.utils.DateTimeConverter
-import com.ytpm.hydtw.utils.DateTimeUtils
-import com.ytpm.hydtw.utils.GlideUtils
-import com.ytpm.hydtw.utils.MediationNativeAdUtil
-import com.ytpm.hydtw.utils.UserInfoSpUtils
+import com.ytpm.qnjz.Constants
+import com.ytpm.qnjz.R
+import com.ytpm.qnjz.activity.LoginActivity
+import com.ytpm.qnjz.adapter.MineAdapter
+import com.ytpm.qnjz.dao.Question
+import com.ytpm.qnjz.dao.UserInfo
+import com.ytpm.qnjz.databinding.FragmentDatiBinding
+import com.ytpm.qnjz.loading.LoadingDialog
+import com.ytpm.qnjz.network.BaseRetrofit
+import com.ytpm.qnjz.network.Callback2
+import com.ytpm.qnjz.utils.ConfigSpUtils
+import com.ytpm.qnjz.utils.DateTimeConverter
+import com.ytpm.qnjz.utils.DateTimeUtils
+import com.ytpm.qnjz.utils.GlideUtils
+import com.ytpm.qnjz.utils.MediationNativeAdUtil
+import com.ytpm.qnjz.utils.MutiImageView
+import com.ytpm.qnjz.utils.UserInfoSpUtils
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.Dispatchers
@@ -59,6 +69,7 @@ import java.time.Instant
 import java.time.LocalDateTime
 import java.time.ZoneId
 import java.time.format.DateTimeFormatter
+import com.ytpm.qnjz.dao.Record
 
 
 class DatiFragment() : Fragment(), ATRewardVideoListener,
@@ -110,14 +121,19 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     private var jrdd = 0
     private var lsdd = 0
 
+
     private var isGrDialogShow = false
     private var isGetTlDialogShow = false
 
     private var isGetResult = false
     private var isInAdPaunse = false
+    private var isNativeAdPaunse = false
 
     private var loadDialog: LoadingDialog? = null
     private var loadingTime = 10
+    var mSelfRenderView: View? = null //开发者自定义布局的容器
+
+    private var isNativeClick = false
 
     override fun onCreateView(
         inflater: LayoutInflater,
@@ -134,27 +150,25 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         initData()
         initUserTime()
         initInAdTime()
-//        initNativeTime()
+        initNativeTime()
         loadBannerAd()
         loadNativeAd()
         loadInterstitial()
         initView()
+        mSelfRenderView = binding.selfview
         useTimer = 0
         return binding.root
     }
 
-
     private fun initView() {
 
-        val headImg = UserInfoSpUtils().getHeadImg()
+        val powerWaitTime = ConfigSpUtils().getConfig()?.powerWaitTime
+        this.getTlTime = powerWaitTime ?: 30
 
-        if (headImg.isNotEmpty()) {
-            context?.let {
-                GlideUtils().circelImages(it, headImg, binding.dialogGettlHead)
-                GlideUtils().circelImages(it, headImg, binding.fragmentDatiHead)
-                GlideUtils().circelImages(it, headImg, binding.dialogSetHead)
-            }
-        }
+        val headImg = UserInfoSpUtils().getHeadImg()
+        GlideUtils().circelImages(requireContext(), headImg.toString(), binding.dialogGettlHead)
+        GlideUtils().circelImages(requireContext(), headImg.toString(), binding.fragmentDatiHead)
+        GlideUtils().circelImages(requireContext(), headImg.toString(), binding.dialogSetHead)
 
         val registerTime = UserInfoSpUtils().getRegistryTime()
         val ddd = DateTimeConverter.convertToBeijingTime(registerTime, "yyyy/MM/dd HH:mm:ss")
@@ -186,9 +200,8 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         binding.switch1.isChecked = true
         binding.switch2.isChecked = true
 
-        startGetTlTime()
-        initGetTlTime()
-
+//        startGetTlTime()
+//        getTlCountDownTimer?.start()
         binding.dialogGr.setOnClickListener {
 
         }
@@ -217,6 +230,12 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
                 return@setOnClickListener
             }
 
+            val canAccumulation = ConfigSpUtils().getConfig()?.canAccumulation
+            if (canAccumulation != null && canAccumulation == 1 && tl > 0) {
+                ToastUtils.showShort("已有体力请先答题!")
+                return@setOnClickListener
+            }
+
             if (isGetTlDialogShow) {
                 this.isGetTlDialogShow = false
                 binding.dialgoGettlLl.visibility = View.GONE
@@ -233,6 +252,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             } else {
                 nowTime = DateTimeUtils.getCurrentDateTime()
             }
+
             binding.dialogGettlTime.text = nowTime
 
             startGetTlShowBtnTime()
@@ -241,6 +261,10 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         binding.dialgoGettlLl.setOnClickListener { }
 
         binding.dialotGettlBtnTx.setOnClickListener {
+            if (UserInfoSpUtils().ifPowerLimit()) {
+//                ToastUtils.showLong(ConfigSpUtils().getConfig()?.lowValueTip)
+                return@setOnClickListener
+            }
             showAd()
         }
         binding.getTlDialogClose.setOnClickListener {
@@ -277,7 +301,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             scope = CoroutineScope(Dispatchers.Main + job!!)
         }
 
-        scope!!.launch {
+        scope?.launch {
             while (isActive) {
                 useTimer++
                 delay(1000)
@@ -294,11 +318,15 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             scope1 = CoroutineScope(Dispatchers.Main + job1!!)
         }
 
-        scope1!!.launch {
+        scope1?.launch {
             while (isActive) {
                 if (!isInAdPaunse) {
                     inAdTime++
-                    if (inAdTime == 30) {
+                    val interstitialIntervalTime =
+                        ConfigSpUtils().getConfig()?.interstitialIntervalTime
+                    val maxTime = interstitialIntervalTime ?: 30
+//                    LogUtils.e("DFDFDFDFDFDFDF===$inAdTime")
+                    if (inAdTime == maxTime) {
                         interstitialAd?.load()
                         job1?.cancel()
                         scope1?.cancel()
@@ -313,6 +341,12 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     }
 
     private fun initNativeTime() {
+
+        val canAllowAutoRefresh =
+            ConfigSpUtils().getConfig()?.canAllowAutoRefresh
+
+        if (canAllowAutoRefresh == 0) return
+
         if (job2 == null) {
             job2 = Job()
         }
@@ -321,18 +355,17 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             scope2 = CoroutineScope(Dispatchers.Main + job2!!)
         }
 
-        scope2!!.launch {
+        scope2?.launch {
             while (isActive) {
                 nativeAdTime++
-                if (nativeAdTime == 40) {
-
+                val flowIntervalTime =
+                    ConfigSpUtils().getConfig()?.flowIntervalTime
+                val maxTime = flowIntervalTime ?: 30
+                if (nativeAdTime >= maxTime) {
                     if (atNative?.checkAdStatus()?.isLoading == false) {
-                        atNative?.makeAdRequest()
+                        atNative = null
+                        loadNativeAd()
                     }
-                    job2?.cancel()
-                    scope2?.cancel()
-                    job2 = null
-                    scope2 = null
                     nativeAdTime = 0
                 }
                 delay(1000)
@@ -340,10 +373,33 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         }
     }
 
+    /**
+     * 暂停计时任务
+     */
+    private fun pauseNativeTime() {
+        job2?.cancel()
+        job2 = null
+        scope2 = null
+        isNativeAdPaunse = true
+    }
+
+    /**
+     * 手动控制开始/继续计时任务
+     * 调用此方法会继续之前的计时进度
+     */
+    private fun startOrResumeNativeTime() {
+        if (isNativeAdPaunse) {
+            initNativeTime()
+        }
+    }
+
     override fun onPause() {
         super.onPause()
         this.isInAdPaunse = true
         this.pauseGetTlShowBtnTime = true
+        pauseNativeTime()
+        this.getTlCountDownTimer?.cancel()
+        this.getTlCountDownTimer = null
     }
 
     override fun onResume() {
@@ -351,6 +407,12 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         this.isInAdPaunse = false
         this.pauseGetTlShowBtnTime = false
         getUserInfo()
+        startOrResumeNativeTime()
+        startGetTlTime()
+        getTlCountDownTimer?.start()
+        if (this.isNativeClick){
+            loadNativeAd()
+        }
     }
 
     private fun initDialogGetTl() {
@@ -369,7 +431,11 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     }
 
     private fun answer(questionId: String, itemId: String) {
-
+        var url = if (Constants.isDebug) {
+            Constants.ANSWER_QUESTION
+        } else {
+            Constants.FULL_URL_V2 + Constants.ANSWER_QUESTION
+        }
         val map = HashMap<String, Any>()
         map["duration"] = useTimer
         map["itemId"] = itemId
@@ -377,13 +443,6 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         map["userId"] = UserInfoSpUtils().getUserId()
 
         val requestBody = BaseRetrofit.getRequestBodyByMapToJson(map)
-
-        var url = if (Constants.isDebug) {
-            Constants.ANSWER_QUESTION
-        } else {
-            Constants.FULL_URL_V2 + Constants.ANSWER_QUESTION
-        }
-
         BaseRetrofit.getInstance().apiService.answerQuestion(url, requestBody)
             .enqueue(object : Callback2<Any>() {
                 override fun success(body: Any?) {
@@ -412,7 +471,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
                     useTimer = 0
                 }
 
-                override fun fail(msg: String?) {
+                override fun fail(code: Int, msg: String?) {
                     ToastUtils
                         .make()
                         .setMode(MODE.DARK)
@@ -431,7 +490,6 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         } else {
             Constants.FULL_URL_V2 + Constants.ADD_POWER
         }
-
         val userId = UserInfoSpUtils().getUserId()
         BaseRetrofit.getInstance().apiService.addPower(url, userId)
             .enqueue(object : Callback2<Any>() {
@@ -449,7 +507,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
                     initGetTlTime()
                 }
 
-                override fun fail(msg: String?) {
+                override fun fail(code: Int, msg: String?) {
                     ToastUtils
                         .make()
                         .setMode(MODE.DARK)
@@ -464,7 +522,10 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     @SuppressLint("SetTextI18n")
     private fun initGetTlTime() {
         binding.zz.visibility = View.VISIBLE
-        getTlTime = 30
+
+        val powerWaitTime = ConfigSpUtils().getConfig()?.powerWaitTime
+        val maxTime = powerWaitTime ?: 30
+        getTlTime = maxTime
         binding.zz.text = "${getTlTime}s"
         getTlCountDownTimer?.start()
     }
@@ -538,7 +599,6 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             return
         }
 
-        this.getTlTime = 30
         getTlCountDownTimer = object : CountDownTimer((getTlTime * 1000).toLong(), 1000) {
             @SuppressLint("SetTextI18n")
             override fun onTick(millisUntilFinished: Long) {
@@ -567,7 +627,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             }
 
             override fun onFinish() {
-                ToastUtils.showShort("非法操作,请30秒后重新获取!")
+                ToastUtils.showShort("未响应,请15分钟以后再试如果还不行,请联系任务客服。")
                 if (loadDialog?.isShowing == true) loadDialog?.dismiss()
             }
         }
@@ -616,7 +676,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
                 changeLever()
             }
 
-            override fun fail(msg: String?) {
+            override fun fail(code: Int, msg: String?) {
                 ToastUtils
                     .make()
                     .setMode(MODE.DARK)
@@ -679,15 +739,13 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         user.todayAnswerCount = jrdd
         user.historyAnswerCount = lsdd
         UserInfoSpUtils().changeValue(user)
-
-        binding.jrddTv.text = "今日答题: ${jrdd}题"
+        val _jrddTv = resources.getString(R.string.today_answer_count)
+        binding.jrddTv.text = String.format(_jrddTv, jrdd.toString())
         binding.lsddTv.text = "历史答题: ${lsdd}题"
 
         val questionId = item?.questionId
         val itemId = item?.itemList?.get(btnIndex)?.itemId
 
-
-
         if (questionId != null && itemId != null) {
             answer(questionId, itemId)
         } else {
@@ -764,9 +822,10 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
 
     private fun loadAd() {
         if (mRewardVideoAd == null) {
-            mRewardVideoAd = ATRewardVideoAd(context, Constants.TAKU_REWARD_PID)
+            val takuRewardPid =
+                ConfigSpUtils().getConfig()?.takuRewardPid ?: Constants.TAKU_REWARD_PID
+            mRewardVideoAd = ATRewardVideoAd(context, takuRewardPid)
         }
-
         val userid = UserInfoSpUtils().getUserInfo().userId
         val userdata = UserInfoSpUtils().getUserInfo().nickName
         val localMap: MutableMap<String, Any> = HashMap()
@@ -780,6 +839,9 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     private var isReload = false
 
     private fun showAd() {
+//        if (interstitialAd?.isAdReady == true) {
+//            interstitialAd?.show(activity, getATShowConfig1())
+//        }
         if (mRewardVideoAd?.isAdReady == true) {
             mRewardVideoAd?.show(activity)
             return
@@ -788,6 +850,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         // 在 Fragment 中使用
         if (isAdded && activity != null && !requireActivity().isFinishing) {
             loadDialog = LoadingDialog(activity)
+
             loadDialog?.show()
             startReloadRewardVideoAd()
             startReloadRewardVideoAd?.start()
@@ -800,7 +863,6 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     private var isRewardedVideoFinish = false
 
     override fun onRewardedVideoAdLoaded() {
-        LogUtils.e("DFDFDF=onRewardedVideoAdLoaded")
         startReloadRewardVideoAd?.cancel()
         startReloadRewardVideoAd = null
         if (loadDialog?.isShowing == true) loadDialog?.dismiss()
@@ -808,7 +870,6 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     }
 
     override fun onRewardedVideoAdFailed(p0: AdError?) {
-        LogUtils.e("DFDFDF=onRewardedVideoAdFailed${p0?.code}")
     }
 
     override fun onRewardedVideoAdPlayStart(p0: ATAdInfo?) {
@@ -823,20 +884,16 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         }
 
         mRewardVideoAd?.load()
-        LogUtils.e("DFDFDF=onRewardedVideoAdPlayStart${p0.toString()}")
     }
 
     override fun onRewardedVideoAdPlayEnd(p0: ATAdInfo?) {
-        LogUtils.e("DFDFDF=onRewardedVideoAdPlayEnd${p0.toString()}")
         isRewardedVideoFinish = true
     }
 
     override fun onRewardedVideoAdPlayFailed(p0: AdError?, p1: ATAdInfo?) {
-        LogUtils.e("DFDFDF=onRewardedVideoAdPlayFailed${p0?.code}===${p1.toString()}")
     }
 
     override fun onRewardedVideoAdClosed(p0: ATAdInfo?) {
-        LogUtils.e("DFDFDF=onRewardedVideoAdClosed${p0.toString()}")
         loadBannerAd()
         loadNativeAd()
         if (!isRewardedVideoFinish) {
@@ -845,7 +902,6 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
     }
 
     override fun onRewardedVideoAdPlayClicked(p0: ATAdInfo?) {
-        LogUtils.e("DFDFDF=onRewardedVideoAdPlayClicked${p0.toString()}")
     }
 
     override fun onReward(p0: ATAdInfo?) {
@@ -881,117 +937,138 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         map["adSourceIndex"] = p0.adsourceIndex
         map["adSourceType"] = p0.adSourceAdType
         map["resultJson"] = p0.toString()
+        map["appId"] = UserInfoSpUtils().getAppid()
 
         val body = BaseRetrofit.getRequestBodyByMapToJson(map)
+
         var url = if (Constants.isDebug) {
             Constants.SAVE_RECORD
         } else {
             Constants.FULL_URL_V2 + Constants.SAVE_RECORD
         }
+
         BaseRetrofit.getInstance().apiService.saveRecord(url, body)
             .enqueue(object : Callback2<Any>() {
                 override fun success(body: Any?) {
+//                    LogUtils.e("====dfdfdfdfdf${p0.adSourceAdType}")
                     if (p0.adSourceAdType == 1) addPower()
-                    LogUtils.e("dfdfdfdf广告同步成功!")
                 }
 
-                override fun fail(msg: String?) {
+                override fun fail(code: Int, msg: String?) {
+                    //766达到上限
+                    LogUtils.e("dfdfdfdfdfdf${code}===${msg}")
+                    if (code == 766 || code == 767) {
+                        ToastUtils.showShort(msg)
+                        getUserInfo()
+                        return
+                    }
+
                     ToastUtils.showShort(msg)
+
+                    if (code == 301) {
+                        ActivityUtils.startActivity(LoginActivity::class.java)
+                        ActivityUtils.finishAllActivities()
+                    }
                 }
             })
     }
 
     private fun loadNativeAd() {
         if (atNative == null) {
-            atNative =
-                ATNative(context, Constants.TAKU_NATIVE_PID, object : ATNativeNetworkListener {
-                    override fun onNativeAdLoaded() {
-                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                            val current = LocalDateTime.now()
-                            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
-                            startNativeAdTime = current.format(formatter)
-                        } else {
-                            startNativeAdTime = DateTimeUtils.getCurrentDateTime()
-                        }
-                        val nativeAd: NativeAd? = atNative?.getNativeAd(getATShowConfig())
-                        nativeAd?.setNativeEventListener(object : ATNativeEventListener {
-                            override fun onAdImpressed(
-                                p0: ATNativeAdView?,
-                                p1: ATAdInfo?
-                            ) {
-                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                                    val current = LocalDateTime.now()
-                                    val formatter =
-                                        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
-                                    endNativeAdTime = current.format(formatter)
-                                } else {
-                                    endNativeAdTime = DateTimeUtils.getCurrentDateTime()
-                                }
-                                saveRecord(
-                                    p1,
-                                    startNativeAdTime.toString(),
-                                    endNativeAdTime.toString()
-                                )
-//                            reloadNativeAd()
-                                LogUtils.e("dfdfdfdfonAdImpressed${p1.toString()}")
+            val takuNativePid =
+                ConfigSpUtils().getConfig()?.takuNativePid ?: Constants.TAKU_NATIVE_PID
+            atNative = ATNative(context, takuNativePid, object : ATNativeNetworkListener {
+                override fun onNativeAdLoaded() {
+                    isNativeClick = false
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                        val current = LocalDateTime.now()
+                        val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+                        startNativeAdTime = current.format(formatter)
+                    } else {
+                        startNativeAdTime = DateTimeUtils.getCurrentDateTime()
+                    }
+                    val nativeAd: NativeAd? = atNative?.getNativeAd(getATShowConfig())
+                    nativeAd?.setNativeEventListener(object : ATNativeEventListener {
+                        override fun onAdImpressed(
+                            p0: ATNativeAdView?,
+                            p1: ATAdInfo?
+                        ) {
+                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                                val current = LocalDateTime.now()
+                                val formatter =
+                                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+                                endNativeAdTime = current.format(formatter)
+                            } else {
+                                endNativeAdTime = DateTimeUtils.getCurrentDateTime()
                             }
+                            saveRecord(
+                                p1,
+                                startNativeAdTime.toString(),
+                                endNativeAdTime.toString()
+                            )
+//                            reloadNativeAd()
+                        }
 
-                            override fun onAdClicked(
-                                p0: ATNativeAdView?,
-                                p1: ATAdInfo?
-                            ) {
-                                LogUtils.e("dfdfdfdfonAdImpressed${p1.toString()}")
-                            }
+                        override fun onAdClicked(
+                            p0: ATNativeAdView?,
+                            p1: ATAdInfo?
+                        ) {
+                            isNativeClick = true
+                        }
 
-                            override fun onAdVideoStart(p0: ATNativeAdView?) {
+                        override fun onAdVideoStart(p0: ATNativeAdView?) {
 
-                            }
+                        }
 
-                            override fun onAdVideoEnd(p0: ATNativeAdView?) {
-                            }
+                        override fun onAdVideoEnd(p0: ATNativeAdView?) {
+                        }
 
-                            override fun onAdVideoProgress(
-                                p0: ATNativeAdView?,
-                                p1: Int
-                            ) {
-                                LogUtils.e("dfdfdfdfonAdVideoProgress}")
+                        override fun onAdVideoProgress(
+                            p0: ATNativeAdView?,
+                            p1: Int
+                        ) {
+                        }
+                    })
+                    try {
+                        if (nativeAd?.isNativeExpress != true) {
+                            var nativePrepareInfo = ATNativePrepareInfo()
+                            nativeAd?.adMaterial?.let {
+                                mSelfRenderView?.let { selfRenderView ->
+                                    bindSelfRenderView(
+                                        requireActivity(), it, selfRenderView,
+                                        nativePrepareInfo
+                                    )
+                                }
                             }
-
-                        })
-                        try {
-                            nativeAd?.renderAdContainer(binding.fragmentDatiContentAd, null)
-                        } catch (e: Exception) {
-                            e.printStackTrace()
+                            nativeAd?.renderAdContainer(
+                                binding.fragmentDatiContentAd,
+                                mSelfRenderView
+                            )
+                            binding.selfview.visibility = View.VISIBLE
+                        } else {
+                            nativeAd.renderAdContainer(binding.fragmentDatiContentAd, null)
+                            binding.fragmentDatiContentAd.visibility = View.VISIBLE
                         }
-                    }
-
-                    override fun onNativeAdLoadFail(adError: AdError) {
-                        LogUtils.e("onNativeAdLoadFail:" + adError.fullErrorInfo)
+                    } catch (e: Exception) {
+                        e.printStackTrace()
                         atNative = null
                     }
-                })
+                }
+
+                override fun onNativeAdLoadFail(adError: AdError) {
+                    atNative = null
+                }
+            })
         }
 
         binding.fragmentDatiContentAd.removeAllViews()
-        val userid = UserInfoSpUtils().getUserInfo().userId
-        val userdata = UserInfoSpUtils().getUserInfo().nickName
-        val localMap: MutableMap<String, Any> = HashMap()
-        localMap[ATAdConst.KEY.USER_ID] = userid
-        localMap[ATAdConst.KEY.USER_CUSTOM_DATA] = userdata
-        atNative?.setLocalExtra(localMap)
         if (atNative?.checkAdStatus()?.isLoading == false) atNative?.makeAdRequest()
     }
 
     private fun loadInterstitial() {
-
-        interstitialAd = ATInterstitial(context, Constants.TAKU_INTERSTITIAL_PID)
-
-        val userid = UserInfoSpUtils().getUserInfo().userId
-        val userdata = UserInfoSpUtils().getUserInfo().nickName
-        val localMap: MutableMap<String, Any> = HashMap()
-        localMap[ATAdConst.KEY.USER_ID] = userid
-        localMap[ATAdConst.KEY.USER_CUSTOM_DATA] = userdata
-        interstitialAd?.setLocalExtra(localMap)
+        val takuInterstitialPid =
+            ConfigSpUtils().getConfig()?.takuInterstitialPid ?: Constants.TAKU_INTERSTITIAL_PID
+        interstitialAd = ATInterstitial(context, takuInterstitialPid)
         interstitialAd?.setNativeAdCustomRender { mixNativeAd, atAdInfo ->
             MediationNativeAdUtil.getViewFromNativeAd(
                 context,
@@ -1002,7 +1079,7 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
         }
         interstitialAd?.setAdListener(object : ATInterstitialListener {
             override fun onInterstitialAdLoaded() {
-                LogUtils.e("==========onInterstitialAdLoaded")
+
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                     val current = LocalDateTime.now()
                     val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
@@ -1010,17 +1087,15 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
                 } else {
                     startInAdTime = DateTimeUtils.getCurrentDateTime()
                 }
-                interstitialAd?.show(activity, getATShowConfig1())
 
+                interstitialAd?.show(activity, getATShowConfig1())
             }
 
             override fun onInterstitialAdLoadFail(p0: AdError?) {
-                LogUtils.e("===========onInterstitialAdLoadFail")
-                initInAdTime()
+//                initInAdTime()
             }
 
             override fun onInterstitialAdClicked(p0: ATAdInfo?) {
-                LogUtils.e("===========onInterstitialAdClicked")
             }
 
             override fun onInterstitialAdShow(p0: ATAdInfo?) {
@@ -1033,7 +1108,6 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
                 }
 
                 saveRecord(p0, startInAdTime.toString(), endInAdTime.toString())
-                LogUtils.e("=============onInterstitialAdShow${p0.toString()}")
             }
 
             override fun onInterstitialAdClose(p0: ATAdInfo?) {
@@ -1041,15 +1115,12 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             }
 
             override fun onInterstitialAdVideoStart(p0: ATAdInfo?) {
-                LogUtils.e("===========onInterstitialAdVideoStart")
             }
 
             override fun onInterstitialAdVideoEnd(p0: ATAdInfo?) {
-                LogUtils.e("==============onInterstitialAdVideoEnd")
             }
 
             override fun onInterstitialAdVideoError(p0: AdError?) {
-                LogUtils.e("==========onInterstitialAdVideoError")
             }
 
         })
@@ -1059,19 +1130,14 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
 
     private fun loadBannerAd() {
 
+        val takuBannerPid = ConfigSpUtils().getConfig()?.takuBannerPid ?: Constants.TAKU_BANNER_PID
         mBannerView = ATBannerView(context)
-        mBannerView?.setPlacementId(Constants.TAKU_BANNER_PID)
+        mBannerView?.setPlacementId(takuBannerPid)
         mBannerView?.setShowConfig(getATShowConfig())
         mBannerView?.setBannerAdListener(this)
         binding.fragmentDatiBanner.removeAllViews()
         binding.fragmentDatiBanner.addView(mBannerView)
 
-        val userid = UserInfoSpUtils().getUserInfo().userId
-        val userdata = UserInfoSpUtils().getUserInfo().nickName
-        val localMap: MutableMap<String, Any> = HashMap()
-        localMap[ATAdConst.KEY.USER_ID] = userid
-        localMap[ATAdConst.KEY.USER_CUSTOM_DATA] = userdata
-        mBannerView?.setLocalExtra(localMap)
         if (mBannerView?.checkAdStatus()?.isLoading == false) mBannerView?.loadAd()
     }
 
@@ -1100,19 +1166,15 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             startBannerAdTime = DateTimeUtils.getCurrentDateTime()
         }
 
-        LogUtils.e("dfdfdf onBannerLoaded")
     }
 
     override fun onBannerFailed(p0: AdError?) {
-        LogUtils.e("dfdfdf onBannerFailed")
     }
 
     override fun onBannerClicked(p0: ATAdInfo?) {
-        LogUtils.e("dfdfdf onBannerClicked")
     }
 
     override fun onBannerShow(p0: ATAdInfo?) {
-        LogUtils.e("dfdfdf onBannerShow${p0.toString()}")
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             val current = LocalDateTime.now()
             val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
@@ -1121,19 +1183,30 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
             endBannerAdTime = DateTimeUtils.getCurrentDateTime()
         }
         saveRecord(p0, startBannerAdTime.toString(), endBannerAdTime.toString())
-
     }
 
     override fun onBannerClose(p0: ATAdInfo?) {
-        LogUtils.e("dfdfdf onBannerClose")
     }
 
     override fun onBannerAutoRefreshed(p0: ATAdInfo?) {
-        LogUtils.e("dfdfdf onBannerAutoRefreshed")
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            startBannerAdTime = current.format(formatter)
+        } else {
+            startBannerAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val current = LocalDateTime.now()
+            val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+            endBannerAdTime = current.format(formatter)
+        } else {
+            endBannerAdTime = DateTimeUtils.getCurrentDateTime()
+        }
+        saveRecord(p0, startBannerAdTime.toString(), endBannerAdTime.toString())
     }
 
     override fun onBannerAutoRefreshFail(p0: AdError?) {
-        LogUtils.e("dfdfdf onBannerAutoRefreshFail")
     }
 
     private fun getUserInfo() {
@@ -1151,12 +1224,240 @@ class DatiFragment() : Fragment(), ATRewardVideoListener,
 
                     binding.jrddTv.text = "今日答题: ${jrdd}题"
                     binding.lsddTv.text = "历史答题: ${lsdd}题"
+
                     initDialogGetTl()
+
+                    binding.dialotGettlBtnTx.text =
+                        if (UserInfoSpUtils().ifPowerLimit()) "今日已达上限" else "获取体力"
                 }
 
-                override fun fail(msg: String?) {
+                override fun fail(code: Int, msg: String?) {
                     ToastUtils.showShort(msg)
                 }
             })
     }
+
+    @SuppressLint("RtlHardcoded")
+    private fun bindSelfRenderView(
+        context: Context, adMaterial: ATNativeMaterial,
+        selfRenderView: View,
+        nativePrepareInfo: ATNativePrepareInfo
+    ) {
+
+        val padding: Int = dip2px(context, 5.toFloat())
+        selfRenderView.setPadding(padding, padding, padding, padding)
+        val titleView: TextView = selfRenderView.findViewById(R.id.native_ad_title)
+        val descView: TextView = selfRenderView.findViewById(R.id.native_ad_desc)
+        val ctaView: TextView = selfRenderView.findViewById(R.id.native_ad_install_btn)
+        val adFromView: TextView = selfRenderView.findViewById(R.id.native_ad_from)
+        val iconArea: FrameLayout = selfRenderView.findViewById(R.id.native_ad_image)
+        val contentArea: FrameLayout =
+            selfRenderView.findViewById(R.id.native_ad_content_image_area)
+        val logoView: ATNativeImageView =
+            selfRenderView.findViewById(R.id.native_ad_logo)
+        val closeView: View? = selfRenderView.findViewById(R.id.native_ad_close)
+        val shakeViewContainer: FrameLayout? =
+            selfRenderView.findViewById(R.id.native_ad_shake_view_container)
+        val slideViewContainer: FrameLayout? =
+            selfRenderView.findViewById(R.id.native_ad_slide_view_container)
+        val adLogoContainer: FrameLayout =
+            selfRenderView.findViewById(R.id.native_ad_logo_container)
+
+        //click views
+        val clickViewList = arrayListOf<View>()
+        val title = adMaterial.title
+
+        // title
+        if (!TextUtils.isEmpty(title)) {
+            titleView.text = title
+            nativePrepareInfo.setTitleView(titleView) //bind title
+            clickViewList.add(titleView)
+            titleView.visibility = View.VISIBLE
+        } else {
+            titleView.visibility = View.GONE
+        }
+
+        // desc
+        val descriptionText = adMaterial.descriptionText
+        if (!TextUtils.isEmpty(descriptionText)) {
+            descView.text = descriptionText
+            nativePrepareInfo.setDescView(descView) //bind desc
+            clickViewList.add(descView)
+            descView.visibility = View.VISIBLE
+        } else {
+            descView.visibility = View.GONE
+        }
+
+        // icon
+        val adIconView = adMaterial.adIconView
+        val iconImageUrl = adMaterial.iconImageUrl
+        iconArea.removeAllViews()
+        val iconView: ATNativeImageView = ATNativeImageView(context)
+        if (adIconView != null) {
+            iconArea.addView(adIconView)
+            nativePrepareInfo.setIconView(adIconView) //bind icon
+            clickViewList.add(adIconView)
+            iconArea.visibility = View.VISIBLE
+        } else if (!TextUtils.isEmpty(iconImageUrl)) {
+            iconArea.addView(iconView)
+            iconView.setImage(iconImageUrl)
+            nativePrepareInfo.setIconView(iconView) //bind icon
+            clickViewList.add(iconView)
+            iconArea.visibility = View.VISIBLE
+        } else {
+            iconArea.visibility = View.INVISIBLE
+        }
+
+        // cta button
+        val callToActionText = adMaterial.callToActionText
+        if (!TextUtils.isEmpty(callToActionText)) {
+            ctaView.text = callToActionText
+            nativePrepareInfo.setCtaView(ctaView) //bind cta button
+            clickViewList.add(ctaView)
+            ctaView.visibility = View.VISIBLE
+        } else {
+            ctaView.visibility = View.GONE
+        }
+
+        // media view
+        val mediaView = adMaterial.getAdMediaView(contentArea)
+        val imageList = adMaterial.imageUrlList
+
+
+        //some network support return main image width、height,if not support return -1
+        val mainImageHeight = adMaterial.mainImageHeight
+        val mainImageWidth = adMaterial.mainImageWidth
+        val realMainImageWidth: Int =
+            context.resources.displayMetrics.widthPixels - dip2px(
+                context, 10.toFloat()
+            )
+        var realMainHeight = 0
+
+        //media view or mainImage layout params
+        val mainImageParam: FrameLayout.LayoutParams = LayoutParams(
+            FrameLayout.LayoutParams.MATCH_PARENT,
+            FrameLayout.LayoutParams.WRAP_CONTENT
+        )
+        if (mainImageWidth > 0 && mainImageHeight > 0 && mainImageWidth > mainImageHeight) {
+            realMainHeight = realMainImageWidth * mainImageHeight / mainImageWidth
+            mainImageParam.width = realMainImageWidth
+            mainImageParam.height = realMainHeight
+        } else {
+            mainImageParam.width = FrameLayout.LayoutParams.MATCH_PARENT
+            //contentArea radio
+            mainImageParam.height = realMainImageWidth * 600 / 1024
+        }
+        contentArea.removeAllViews()
+        if (mediaView != null) {
+            if (mediaView.parent != null) {
+                (mediaView.parent as ViewGroup).removeView(mediaView)
+            }
+            mainImageParam.gravity = Gravity.CENTER
+            mediaView.setLayoutParams(mainImageParam)
+            contentArea.addView(mediaView, mainImageParam)
+            contentArea.setVisibility(View.VISIBLE)
+        } else if (imageList != null && imageList.size > 1) {
+            val mutiImageView: MutiImageView = MutiImageView(context)
+            mutiImageView.setImageList(imageList, mainImageWidth, mainImageHeight)
+            nativePrepareInfo.setMainImageView(mutiImageView) //bind main image
+            contentArea.addView(
+                mutiImageView,
+                LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT
+                )
+            )
+            clickViewList.add(mutiImageView)
+            contentArea.visibility = View.VISIBLE
+        } else if (!TextUtils.isEmpty(adMaterial.mainImageUrl)) {
+            val imageView: ATNativeImageView = ATNativeImageView(context)
+            imageView.setImage(adMaterial.mainImageUrl)
+            imageView.setLayoutParams(mainImageParam)
+            contentArea.addView(imageView, mainImageParam)
+            nativePrepareInfo.setMainImageView(imageView) //bind main image
+            clickViewList.add(imageView)
+            contentArea.visibility = View.VISIBLE
+        } else {
+            contentArea.removeAllViews()
+            contentArea.visibility = View.GONE
+        }
+
+        //Ad Logo
+        val adLogoView = adMaterial.adLogoView
+        if (adLogoView != null) {
+            adLogoContainer.visibility = View.VISIBLE
+            adLogoContainer.removeAllViews()
+            adLogoContainer.addView(adLogoView)
+        } else {
+            adLogoContainer.visibility = View.GONE
+            val adChoiceIconUrl = adMaterial.adChoiceIconUrl
+            val adLogoBitmap: Bitmap? = adMaterial.adLogo
+            if (!TextUtils.isEmpty(adChoiceIconUrl)) {
+                logoView.setImage(adChoiceIconUrl)
+                logoView.setVisibility(View.VISIBLE)
+                nativePrepareInfo.setAdLogoView(logoView) //bind ad choice
+            } else if (adLogoBitmap != null) {
+                logoView.setImageBitmap(adLogoBitmap)
+                logoView.setVisibility(View.VISIBLE)
+                nativePrepareInfo.setAdLogoView(logoView) //bind ad choice
+            } else {
+                logoView.setImageBitmap(null)
+                logoView.setVisibility(View.GONE)
+            }
+        }
+
+        //bind layout params for ad choice
+        val layoutParams: FrameLayout.LayoutParams = LayoutParams(
+            dip2px(context, 40.toFloat()),
+            dip2px(context, 10.toFloat())
+        ) //ad choice
+        layoutParams.gravity = Gravity.BOTTOM or Gravity.RIGHT
+        nativePrepareInfo.setChoiceViewLayoutParams(layoutParams)
+
+        // ad from
+        val adFrom = adMaterial.adFrom
+
+        if (!TextUtils.isEmpty(adFrom)) {
+            adFromView.text = adFrom
+            adFromView.visibility = View.VISIBLE
+        } else {
+            adFromView.visibility = View.GONE
+        }
+        nativePrepareInfo.setAdFromView(adFromView) //bind ad from
+        nativePrepareInfo.setCloseView(closeView) //bind close button
+
+        val domainView: TextView = selfRenderView.findViewById(R.id.native_ad_domain)
+        val warningView: TextView = selfRenderView.findViewById(R.id.native_ad_warning)
+
+        //Yandex require render domain
+        val domain = adMaterial.domain
+        if (!TextUtils.isEmpty(domain)) {
+            domainView.visibility = View.VISIBLE
+            domainView.text = domain
+            clickViewList.add(domainView)
+            nativePrepareInfo.domainView = domainView
+        } else {
+            domainView.visibility = View.GONE
+        }
+
+        //Yandex require render warning
+        val warning = adMaterial.warning
+        if (!TextUtils.isEmpty(warning)) {
+            warningView.visibility = View.VISIBLE
+            warningView.text = warning
+            clickViewList.add(warningView)
+            nativePrepareInfo.warningView = warningView
+        } else {
+            warningView.visibility = View.GONE
+        }
+
+        nativePrepareInfo.clickViewList = clickViewList //bind click view list
+
+
+    }
+
+    fun dip2px(context: Context, dipValue: Float): Int {
+        val scale = context.resources.displayMetrics.density
+        return (dipValue * scale + 0.5f).toInt()
+    }
 }

+ 10 - 10
app/src/main/java/com/ytpm/hydtw/fragment/MineFragment.kt → app/src/main/java/com/ytpm/qnjz/fragment/MineFragment.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.fragment
+package com.ytpm.qnjz.fragment
 
 import android.annotation.SuppressLint
 import android.content.Intent
@@ -8,14 +8,14 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.fragment.app.Fragment
 import com.gyf.immersionbar.ImmersionBar
-import com.ytpm.hydtw.activity.AboutUsActivity
-import com.ytpm.hydtw.activity.FeedbackActivity
-import com.ytpm.hydtw.adapter.MineAdapter
-import com.ytpm.hydtw.dao.Record
-import com.ytpm.hydtw.databinding.FragmentMineBinding
-import com.ytpm.hydtw.utils.DateTimeConverter
-import com.ytpm.hydtw.utils.GlideUtils
-import com.ytpm.hydtw.utils.UserInfoSpUtils
+import com.ytpm.qnjz.activity.AboutUsActivity
+import com.ytpm.qnjz.activity.FeedbackActivity
+import com.ytpm.qnjz.adapter.MineAdapter
+import com.ytpm.qnjz.dao.Record
+import com.ytpm.qnjz.databinding.FragmentMineBinding
+import com.ytpm.qnjz.utils.DateTimeConverter
+import com.ytpm.qnjz.utils.GlideUtils
+import com.ytpm.qnjz.utils.UserInfoSpUtils
 
 class MineFragment : Fragment() {
 
@@ -39,7 +39,7 @@ class MineFragment : Fragment() {
     private fun initView() {
 
         val headImg = UserInfoSpUtils().getHeadImg()
-        context?.let { GlideUtils().circelImages(it, headImg, binding.head) }
+        context?.let { GlideUtils().circelImages(it, headImg.toString(), binding.head) }
 
         val nickname = UserInfoSpUtils().getNickName()
         binding.nickname.text = nickname

+ 5 - 5
app/src/main/java/com/ytpm/hydtw/fragment/ZixunFragment.kt → app/src/main/java/com/ytpm/qnjz/fragment/ZixunFragment.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.fragment
+package com.ytpm.qnjz.fragment
 
 import android.os.Bundle
 import android.view.LayoutInflater
@@ -6,10 +6,10 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.fragment.app.Fragment
 import com.gyf.immersionbar.ImmersionBar
-import com.ytpm.hydtw.adapter.ZixunAdapter
-import com.ytpm.hydtw.dao.IdiomStory
-import com.ytpm.hydtw.databinding.FragmentZixuBinding
-import com.ytpm.hydtw.utils.JsonReader
+import com.ytpm.qnjz.adapter.ZixunAdapter
+import com.ytpm.qnjz.dao.IdiomStory
+import com.ytpm.qnjz.databinding.FragmentZixuBinding
+import com.ytpm.qnjz.utils.JsonReader
 
 class ZixunFragment : Fragment() {
 

+ 107 - 0
app/src/main/java/com/ytpm/qnjz/loading/GlobalLoading.java

@@ -0,0 +1,107 @@
+package com.ytpm.qnjz.loading;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+
+import java.lang.ref.WeakReference;
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class GlobalLoading {
+    private static volatile GlobalLoading instance;
+    private LoadingDialog loadingDialog;
+    // 使用弱引用持有Activity,避免内存泄漏
+    private WeakReference<Activity> activityRef;
+    private final Handler mainHandler = new Handler(Looper.getMainLooper());
+
+    private GlobalLoading() {
+    }
+
+    public static GlobalLoading getInstance() {
+        if (instance == null) {
+            synchronized (GlobalLoading.class) {
+                if (instance == null) {
+                    instance = new GlobalLoading();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * 显示Loading
+     *
+     * @param activity 必须传入Activity,避免使用Application Context
+     * @param message 加载信息
+     */
+    public void show(Activity activity, String message) {
+        // 清除之前的回调,避免重复显示
+        mainHandler.removeCallbacksAndMessages(null);
+
+        // 更新弱引用
+        activityRef = new WeakReference<>(activity);
+
+        mainHandler.post(() -> {
+            Activity context = activityRef.get();
+            // 检查Activity是否有效
+            if (isActivityValid(context)) {
+                if (loadingDialog == null) {
+                    loadingDialog = new LoadingDialog(context);
+                } else {
+                    // 如果对话框已关联其他上下文,先销毁
+                    if (loadingDialog.getContext() != context) {
+                        loadingDialog.dismiss();
+                        loadingDialog = new LoadingDialog(context);
+                    }
+                }
+
+                if (!loadingDialog.isShowing()) {
+                    loadingDialog.setMessage(message);
+                    loadingDialog.show();
+                }
+            }
+        });
+    }
+
+    /**
+     * 显示默认Loading
+     */
+    public void show(Activity activity) {
+        show(activity, "加载中...");
+    }
+
+    /**
+     * 延迟隐藏Loading
+     * @param delayMillis 延迟毫秒数
+     */
+    public void dismissDelay(long delayMillis) {
+        mainHandler.postDelayed(this::dismiss, delayMillis);
+    }
+
+    /**
+     * 立即隐藏Loading
+     */
+    public void dismiss() {
+        mainHandler.post(() -> {
+            Activity context = activityRef != null ? activityRef.get() : null;
+            // 检查上下文是否有效
+            if (loadingDialog != null && loadingDialog.isShowing() && isActivityValid(context)) {
+                loadingDialog.dismiss();
+            }
+            // 清除引用,避免内存泄漏
+            loadingDialog = null;
+        });
+    }
+
+    /**
+     * 检查Activity是否处于有效状态
+     */
+    private boolean isActivityValid(Activity activity) {
+        return activity != null
+                && !activity.isFinishing()
+                && !activity.isDestroyed();
+    }
+}
+

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/loading/LoadingDialog.java → app/src/main/java/com/ytpm/qnjz/loading/LoadingDialog.java

@@ -1,11 +1,11 @@
-package com.ytpm.hydtw.loading;
+package com.ytpm.qnjz.loading;
 
 import android.app.Dialog;
 import android.content.Context;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
-import com.ytpm.hydtw.R;
+import com.ytpm.qnjz.R;
 
 public class LoadingDialog extends Dialog {
     private TextView tvMessage;

+ 3 - 3
app/src/main/java/com/ytpm/hydtw/network/BaseRetrofit.java → app/src/main/java/com/ytpm/qnjz/network/BaseRetrofit.java

@@ -1,8 +1,8 @@
-package com.ytpm.hydtw.network;
+package com.ytpm.qnjz.network;
 
 import com.blankj.utilcode.util.LogUtils;
-import com.ytpm.hydtw.Constants;
-import com.ytpm.hydtw.network.api.MRefrofitInterface;
+import com.ytpm.qnjz.Constants;
+import com.ytpm.qnjz.network.api.MRefrofitInterface;
 
 import org.json.JSONObject;
 

+ 37 - 41
app/src/main/java/com/ytpm/hydtw/network/Callback2.java → app/src/main/java/com/ytpm/qnjz/network/Callback2.java

@@ -1,11 +1,8 @@
-package com.ytpm.hydtw.network;
+package com.ytpm.qnjz.network;
 
-import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.google.gson.Gson;
-import com.ytpm.hydtw.activity.LoginActivity;
-import com.ytpm.hydtw.loading.GlobalLoading;
-import com.ytpm.hydtw.network.api.Result;
+import com.ytpm.qnjz.network.api.Result;
 
 import java.net.ConnectException;
 import java.net.SocketException;
@@ -16,7 +13,6 @@ import retrofit2.Call;
 import retrofit2.Callback;
 import retrofit2.Response;
 
-
 /**
  * @author mmmmg
  * @description: 网络请求callback
@@ -24,6 +20,9 @@ import retrofit2.Response;
  */
 public abstract class Callback2<T> implements Callback<Result<T>> {
 
+    public final static String RISK_FAIL_CODE_766 = "766";//达到分控上线
+    public final static String RISK_FAIL_CODE_767 = "767";//体力上限
+
     public Callback2() {
         super();
     }
@@ -34,37 +33,37 @@ public abstract class Callback2<T> implements Callback<Result<T>> {
         LogUtils.e("dfdfdf", call.request().url());
         LogUtils.e("dfdfdf", response.code());
 
-        GlobalLoading.getInstance().dismiss();
-
         Result<T> body = response.body();
-        if (response.isSuccessful()) {
-            if (body != null) {
-                LogUtils.e("dfdfdf response body", new Gson().toJson(response.body().getData()));
-                int code = body.getCode();
-                String reason = body.getMessage();
-                LogUtils.e("dfdfdf===========", code);
-                LogUtils.e("dfdfdf===========", reason);
-                if (code == 200) {
-                    success(body.getData());
-                } else if (code == 301) {
-                    ActivityUtils.startActivity(LoginActivity.class);
-                    fail(reason);
+        if (response.isSuccessful() && body != null) {
+            LogUtils.e("dfdfdf response body", new Gson().toJson(response.body().getData()));
+            int code = body.getCode();
+            String reason = body.getMessage();
+            LogUtils.e("dfdfdf===========", code);
+            LogUtils.e("dfdfdf===========", reason);
+            if (code == 200) {
+                success(body.getData());
+                return;
+            }
+
+            if (code == 301) {
+                if (response.body().getData() != null) {
+                    LogUtils.e("以达到广告请求次数上限");
+                    if (response.body().getData().toString().equals(RISK_FAIL_CODE_766)) {
+                        fail(766, reason);
+                    } else if (response.body().getData().toString().equals(RISK_FAIL_CODE_767)) {
+                        fail(767, reason);
+                    }
                 } else {
-                    fail(reason);
+                    fail(code, reason);
                 }
-                return;
-            } else {
-                fail("暂无数据!");
-                return;
+            }else {
+                fail(code, reason);
             }
+            return;
         }
 
         final String msg;
         switch (response.code()) {
-            case 301:
-                msg = response.message();
-                ActivityUtils.startActivity(LoginActivity.class);
-                break;
             case 400:
                 msg = "参数错误";
                 break;
@@ -72,35 +71,32 @@ public abstract class Callback2<T> implements Callback<Result<T>> {
                 msg = "禁止访问, 请联系管理员";
                 break;
             default:
-                msg = "操作失败,请联系管理员";
+                msg = response.message();
         }
-        fail(msg);
+        fail(response.code(), msg);
     }
 
     @Override
     public void onFailure(Call<Result<T>> call, Throwable t) {
-        LogUtils.e("Call onFailure" + t.getMessage() + "||");
-        GlobalLoading.getInstance().dismiss();
 
         if (t instanceof HttpError) {
-            //用于convert函数直接抛出异常接收
-            fail(t.getMessage());
+            fail(-1, t.getMessage());
         } else if (t instanceof UnknownHostException) {
-            fail("网络异常,请查看手机网络连接");
+            fail(-1, "网络异常,请查看手机网络连接");
         } else if (t instanceof ConnectException) {
-            fail("网络异常或服务器异常,请查看手机网络连接");
+            fail(-1, "网络异常或服务器异常,请查看手机网络连接");
         } else if (t instanceof SocketException) {
-            fail("服务异常, 请联系管理员");
+            fail(-1, "服务异常, 请联系管理员");
         } else if (t instanceof SocketTimeoutException) {
-            fail("响应超时");
+            fail(-1, "响应超时,请稍后重试!");
         } else {
-            fail("请求失败");
+            fail(-1, "请求失败" + t.getMessage());
         }
     }
 
     public abstract void success(T body);
 
-    public abstract void fail(String msg);
+    public abstract void fail(int code, String msg);
 
 //  private void refreshToken() {
 //

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/network/HttpError.java → app/src/main/java/com/ytpm/qnjz/network/HttpError.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.network;
+package com.ytpm.qnjz.network;
 
 
 import androidx.annotation.Nullable;

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/network/RetrofitManager.java → app/src/main/java/com/ytpm/qnjz/network/RetrofitManager.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.network;
+package com.ytpm.qnjz.network;
 
 import com.blankj.utilcode.util.LogUtils;
 

+ 5 - 4
app/src/main/java/com/ytpm/hydtw/network/api/MRefrofitInterface.java → app/src/main/java/com/ytpm/qnjz/network/api/MRefrofitInterface.java

@@ -1,7 +1,8 @@
-package com.ytpm.hydtw.network.api;
+package com.ytpm.qnjz.network.api;
 
-import com.ytpm.hydtw.dao.Question;
-import com.ytpm.hydtw.dao.UserInfo;
+import com.ytpm.qnjz.dao.Config;
+import com.ytpm.qnjz.dao.Question;
+import com.ytpm.qnjz.dao.UserInfo;
 
 import java.util.List;
 
@@ -22,7 +23,7 @@ import retrofit2.http.Url;
 public interface MRefrofitInterface {
 
     @GET
-    Call<Result<String>> getConfigs(@Url String url, @Query("appType") int appType);
+    Call<Result<Config>> getConfigs(@Url String url, @Query("appType") int appType);
 
     @POST
     Call<Result<UserInfo>> login(@Url String url, @Body RequestBody requestBody);

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/network/api/Result.java → app/src/main/java/com/ytpm/qnjz/network/api/Result.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.network.api;
+package com.ytpm.qnjz.network.api;
 
 /**
  * @author mmmmg

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/network/api/api.java → app/src/main/java/com/ytpm/qnjz/network/api/api.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.network.api;
+package com.ytpm.qnjz.network.api;
 
 /**
  * @author mmmmg

+ 58 - 0
app/src/main/java/com/ytpm/qnjz/utils/AppListUtils.kt

@@ -0,0 +1,58 @@
+package com.ytpm.qnjz.utils
+
+import android.content.Context
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageInfo
+import android.os.Build
+import com.ytpm.qnjz.dao.AppInfo
+import kotlin.collections.sortedBy
+import kotlin.toString
+
+object AppListUtils {
+    /**
+     * 获取已安装应用列表
+     * @param context 上下文
+     * @param includeSystem 是否包含系统应用
+     */
+    fun getInstalledApps(context: Context, includeSystem: Boolean = false): List<AppInfo> {
+        val appList = mutableListOf<AppInfo>()
+        val packageManager = context.packageManager
+
+        // 获取所有已安装应用的包信息
+        val packages: List<PackageInfo> = packageManager.getInstalledPackages(0)
+
+        for (packageInfo in packages) {
+            // 判断是否为系统应用
+            val applicationInfo = packageInfo.applicationInfo
+            if (applicationInfo == null) return arrayListOf()
+            val isSystemApp = applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0
+
+            // 如果不包含系统应用且当前应用是系统应用,则跳过
+            if (!includeSystem && isSystemApp) {
+                continue
+            }
+
+            // 获取应用名称
+            val appName = packageInfo.applicationInfo?.loadLabel(packageManager).toString()
+
+            // 构建AppInfo对象并添加到列表
+            val appInfo = AppInfo(
+                appName = appName,
+                packageName = packageInfo.packageName,
+                versionName = packageInfo.versionName ?: "未知版本",
+                versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                    packageInfo.longVersionCode
+                } else {
+                    packageInfo.versionCode.toLong()
+                },
+                isSystemApp = isSystemApp,
+                icon = packageInfo.applicationInfo!!.icon
+            )
+
+            appList.add(appInfo)
+        }
+
+        // 按应用名称排序
+        return appList.sortedBy { it.appName }
+    }
+}

+ 20 - 0
app/src/main/java/com/ytpm/qnjz/utils/ConfigSpUtils.kt

@@ -0,0 +1,20 @@
+package com.ytpm.qnjz.utils
+
+import com.blankj.utilcode.util.GsonUtils
+import com.blankj.utilcode.util.SPUtils
+import com.ytpm.qnjz.dao.Config
+import kotlin.jvm.java
+
+class ConfigSpUtils {
+
+    fun putConfigInfo(config: Config?) {
+        val config = GsonUtils.toJson(config)
+        SPUtils.getInstance().put("configInfo", config)
+    }
+
+    fun getConfig(): Config? {
+        val configJson = SPUtils.getInstance().getString("configInfo")
+        val config = GsonUtils.fromJson(configJson, Config::class.java)
+        return config
+    }
+}

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/utils/DateTimeConverter.java → app/src/main/java/com/ytpm/qnjz/utils/DateTimeConverter.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils;
+package com.ytpm.qnjz.utils;
 
 import android.annotation.SuppressLint;
 

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/utils/DateTimeUtils.kt → app/src/main/java/com/ytpm/qnjz/utils/DateTimeUtils.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils
+package com.ytpm.qnjz.utils
 
 import org.threeten.bp.LocalDateTime
 import org.threeten.bp.format.DateTimeFormatter

+ 430 - 0
app/src/main/java/com/ytpm/qnjz/utils/DeviceInfoCollector.kt

@@ -0,0 +1,430 @@
+package com.ytpm.qnjz.utils
+
+import android.Manifest
+import android.app.ActivityManager
+import android.content.Context
+import android.content.pm.PackageInfo
+import android.content.pm.PackageManager
+import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
+import android.net.wifi.WifiInfo
+import android.net.wifi.WifiManager
+import android.os.BatteryManager
+import android.os.Build
+import android.os.Environment
+import android.os.StatFs
+import android.provider.Settings
+import android.telephony.TelephonyManager
+import android.util.DisplayMetrics
+import android.view.WindowManager
+import com.anythink.core.api.ATDeviceUtils
+import com.google.gson.Gson
+import java.net.InetAddress
+import java.net.NetworkInterface
+import java.util.*
+
+class DeviceInfoCollector(private val context: Context) {
+
+    // 收集所有设备信息并返回JSON字符串
+    fun getDeviceInfoJson(): String {
+        val deviceInfo = mutableMapOf<String, Any?>()
+
+        // 设备基本信息
+        deviceInfo["device_basic"] = getBasicDeviceInfo()
+
+        // 系统信息
+        deviceInfo["system_info"] = getSystemInfo()
+
+        // 硬件信息
+        deviceInfo["hardware_info"] = getHardwareInfo()
+
+        // 网络信息
+        deviceInfo["network_info"] = getNetworkInfo()
+
+        // 屏幕信息
+        deviceInfo["screen_info"] = getScreenInfo()
+
+        // 存储信息
+        deviceInfo["storage_info"] = getStorageInfo()
+
+        // 应用信息
+        deviceInfo["app_info"] = getAppInfo()
+
+        // 电池信息
+        deviceInfo["battery_info"] = getBatteryInfo()
+
+        // 安装应用信息
+        deviceInfo["app_list"] = AppListUtils.getInstalledApps(context, false)
+
+        deviceInfo["oaid"] = ATDeviceUtils.getOaid()
+
+        // 使用Gson转换为JSON字符串
+        return Gson().toJson(deviceInfo)
+    }
+
+    // 设备基本信息
+    private fun getBasicDeviceInfo(): Map<String, String?> {
+        return mapOf(
+            "device_model" to Build.MODEL, // 设备型号
+            "device_manufacturer" to Build.MANUFACTURER, // 制造商
+            "device_brand" to Build.BRAND, // 品牌
+            "device_name" to Build.DEVICE, // 设备名称
+            "product_name" to Build.PRODUCT, // 产品名称
+            "board" to Build.BOARD, // 主板
+            "device_id" to getDeviceId(), // 设备唯一标识
+//            "serial" to if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) Build.getSerial() else Build.SERIAL
+        )
+    }
+
+    // 系统信息
+    private fun getSystemInfo(): Map<String, Any?> {
+        return mapOf(
+            "android_version" to Build.VERSION.RELEASE, // Android版本
+            "sdk_version" to Build.VERSION.SDK_INT, // SDK版本
+            "build_id" to Build.DISPLAY, // 构建ID
+            "build_version" to Build.VERSION.INCREMENTAL, // 增量版本
+            "build_time" to Build.TIME, // 构建时间
+            "fingerprint" to Build.FINGERPRINT, // 设备指纹
+            "security_patch" to if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) Build.VERSION.SECURITY_PATCH else null
+        )
+    }
+
+    // 硬件信息
+    private fun getHardwareInfo(): Map<String, Any?> {
+        val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+        val memoryInfo = ActivityManager.MemoryInfo()
+        activityManager.getMemoryInfo(memoryInfo)
+
+        return mapOf(
+            "hardware" to Build.HARDWARE, // 硬件名称
+            "processor" to Build.CPU_ABI, // CPU架构
+            "processor_abi2" to Build.CPU_ABI2, // 第二CPU架构
+            "total_ram" to memoryInfo.totalMem, // 总内存
+            "available_ram" to memoryInfo.availMem, // 可用内存
+            "is_low_memory" to memoryInfo.lowMemory, // 是否低内存
+            "sensor_list" to getSensorList() // 传感器列表
+        )
+    }
+
+    // 网络信息
+    private fun getNetworkInfo(): Map<String, Any?> {
+        return mapOf(
+            "network_type" to getNetworkType(), // 网络类型
+            "wifi_ssid" to getWifiSsid(), // WiFi名称
+            "ip_address" to getIPAddress(true), // IP地址
+            "mac_address" to getMacAddress(), // MAC地址
+            "imei" to getImei(), // IMEI
+            "imsi" to getImsi() // IMSI
+        )
+    }
+
+    // 屏幕信息
+    private fun getScreenInfo(): Map<String, Any> {
+        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+        val displayMetrics = DisplayMetrics()
+        windowManager.defaultDisplay.getRealMetrics(displayMetrics)
+
+        return mapOf(
+            "screen_width" to displayMetrics.widthPixels, // 屏幕宽度
+            "screen_height" to displayMetrics.heightPixels, // 屏幕高度
+            "screen_density" to displayMetrics.density, // 屏幕密度
+            "screen_density_dpi" to displayMetrics.densityDpi, // 屏幕密度DPI
+            "scaled_density" to displayMetrics.scaledDensity, // 缩放密度
+            "xdpi" to displayMetrics.xdpi, // X方向DPI
+            "ydpi" to displayMetrics.ydpi // Y方向DPI
+        )
+    }
+
+    // 存储信息
+    private fun getStorageInfo(): Map<String, Any?> {
+        return mapOf(
+            "internal_total" to getTotalInternalStorage(), // 内部存储总容量
+            "internal_available" to getAvailableInternalStorage(), // 内部存储可用容量
+            "external_total" to getTotalExternalStorage(), // 外部存储总容量
+            "external_available" to getAvailableExternalStorage() // 外部存储可用容量
+        )
+    }
+
+    // 应用信息
+    private fun getAppInfo(): Map<String, Any?> {
+        return try {
+            val packageInfo: PackageInfo =
+                context.packageManager.getPackageInfo(context.packageName, 0)
+            mapOf(
+                "app_package" to context.packageName, // 应用包名
+                "app_version_name" to packageInfo.versionName, // 应用版本名
+                "app_version_code" to if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) packageInfo.longVersionCode else packageInfo.versionCode, // 应用版本号
+                "app_install_time" to packageInfo.firstInstallTime, // 安装时间
+                "app_update_time" to packageInfo.lastUpdateTime // 更新时间
+            )
+        } catch (e: PackageManager.NameNotFoundException) {
+            emptyMap()
+        }
+    }
+
+    // 电池信息
+    private fun getBatteryInfo(): Map<String, Any?> {
+        val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
+        return mapOf(
+            "battery_level" to batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY), // 电池电量
+            "battery_status" to batteryManager.getIntProperty(BatteryManager.BATTERY_STATUS_CHARGING), // 充电状态
+            "battery_health" to batteryManager.getIntProperty(BatteryManager.BATTERY_HEALTH_GOOD), // 电池健康状态
+            "is_charging" to (batteryManager.isCharging) // 是否正在充电
+        )
+    }
+
+    // 获取设备唯一标识
+    private fun getDeviceId(): String? {
+        return try {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+                // Android 10及以上,使用Android ID
+                Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
+            } else {
+                // 低版本使用IMEI
+                val telephonyManager =
+                    context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+                if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
+                    telephonyManager.deviceId
+                } else {
+                    Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
+                }
+            }
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    // 获取网络类型
+    private fun getNetworkType(): String {
+        val connectivityManager =
+            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            val network = connectivityManager.activeNetwork ?: return "无网络"
+            val capabilities =
+                connectivityManager.getNetworkCapabilities(network) ?: return "无网络"
+
+            return when {
+                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "WiFi"
+                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> "移动网络"
+                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> "以太网"
+                else -> "其他网络"
+            }
+        } else {
+            @Suppress("DEPRECATION")
+            val networkInfo = connectivityManager.activeNetworkInfo ?: return "无网络"
+            return if (networkInfo.isConnected) networkInfo.typeName else "无网络"
+        }
+    }
+
+    // 获取WiFi名称
+    private fun getWifiSsid(): String? {
+        return try {
+            val wifiManager =
+                context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
+            val wifiInfo: WifiInfo? = wifiManager.connectionInfo
+            if (wifiInfo?.ssid != null) {
+                var ssid = wifiInfo.ssid
+                if (ssid.startsWith("\"") && ssid.endsWith("\"")) {
+                    ssid = ssid.substring(1, ssid.length - 1)
+                }
+                ssid
+            } else {
+                null
+            }
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    // 获取IP地址
+    private fun getIPAddress(useIPv4: Boolean): String? {
+        try {
+            val interfaces: List<NetworkInterface> =
+                Collections.list(NetworkInterface.getNetworkInterfaces())
+            for (intf in interfaces) {
+                val addrs: List<InetAddress> = Collections.list(intf.inetAddresses)
+                for (addr in addrs) {
+                    if (!addr.isLoopbackAddress) {
+                        val sAddr = addr.hostAddress
+                        val isIPv4 = sAddr.indexOf(':') < 0
+                        if (useIPv4) {
+                            if (isIPv4) return sAddr
+                        } else {
+                            if (!isIPv4) {
+                                val delim = sAddr.indexOf('%')
+                                return if (delim < 0) sAddr.uppercase(Locale.getDefault()) else sAddr.substring(
+                                    0,
+                                    delim
+                                ).uppercase(Locale.getDefault())
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return null
+    }
+
+    // 获取MAC地址
+    private fun getMacAddress(): String? {
+        return try {
+            val all: List<NetworkInterface> =
+                Collections.list(NetworkInterface.getNetworkInterfaces())
+            for (nif in all) {
+                if (!nif.name.equals("wlan0", ignoreCase = true)) continue
+
+                val macBytes = nif.hardwareAddress ?: return null
+                val res1 = StringBuilder()
+                for (b in macBytes) {
+                    res1.append(String.format("%02X:", b))
+                }
+                if (res1.length > 0) {
+                    res1.deleteCharAt(res1.length - 1)
+                }
+                return res1.toString()
+            }
+            null
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    // 获取IMEI
+    private fun getImei(): String? {
+        return try {
+            if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
+                val telephonyManager =
+                    context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                    telephonyManager.imei
+                } else {
+                    @Suppress("DEPRECATION")
+                    telephonyManager.deviceId
+                }
+            } else {
+                null
+            }
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    // 获取IMSI
+    private fun getImsi(): String? {
+        return try {
+            if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
+                val telephonyManager =
+                    context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+                @Suppress("DEPRECATION")
+                telephonyManager.subscriberId
+            } else {
+                null
+            }
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    // 获取传感器列表
+    private fun getSensorList(): List<String> {
+        val sensorManager =
+            context.getSystemService(Context.SENSOR_SERVICE) as android.hardware.SensorManager
+        val sensors = sensorManager.getSensorList(android.hardware.Sensor.TYPE_ALL)
+        return sensors.map { it.name }
+    }
+
+    // 获取内部存储总容量
+    private fun getTotalInternalStorage(): Long {
+        val path = Environment.getDataDirectory()
+        val stat = StatFs(path.path)
+        val blockSize = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            stat.blockSizeLong
+        } else {
+            @Suppress("DEPRECATION")
+            stat.blockSize.toLong()
+        }
+        val totalBlocks = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            stat.blockCountLong
+        } else {
+            @Suppress("DEPRECATION")
+            stat.blockCount.toLong()
+        }
+        return totalBlocks * blockSize
+    }
+
+    // 获取内部存储可用容量
+    private fun getAvailableInternalStorage(): Long {
+        val path = Environment.getDataDirectory()
+        val stat = StatFs(path.path)
+        val blockSize = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            stat.blockSizeLong
+        } else {
+            @Suppress("DEPRECATION")
+            stat.blockSize.toLong()
+        }
+        val availableBlocks = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+            stat.availableBlocksLong
+        } else {
+            @Suppress("DEPRECATION")
+            stat.availableBlocks.toLong()
+        }
+        return availableBlocks * blockSize
+    }
+
+    // 获取外部存储总容量
+    private fun getTotalExternalStorage(): Long? {
+        return try {
+            if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
+                val path = Environment.getExternalStorageDirectory()
+                val stat = StatFs(path.path)
+                val blockSize = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+                    stat.blockSizeLong
+                } else {
+                    @Suppress("DEPRECATION")
+                    stat.blockSize.toLong()
+                }
+                val totalBlocks = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+                    stat.blockCountLong
+                } else {
+                    @Suppress("DEPRECATION")
+                    stat.blockCount.toLong()
+                }
+                totalBlocks * blockSize
+            } else {
+                null
+            }
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    // 获取外部存储可用容量
+    private fun getAvailableExternalStorage(): Long? {
+        return try {
+            if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
+                val path = Environment.getExternalStorageDirectory()
+                val stat = StatFs(path.path)
+                val blockSize = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+                    stat.blockSizeLong
+                } else {
+                    @Suppress("DEPRECATION")
+                    stat.blockSize.toLong()
+                }
+                val availableBlocks =
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
+                        stat.availableBlocksLong
+                    } else {
+                        @Suppress("DEPRECATION")
+                        stat.availableBlocks.toLong()
+                    }
+                availableBlocks * blockSize
+            } else {
+                null
+            }
+        } catch (e: Exception) {
+            null
+        }
+    }
+}

+ 1 - 5
app/src/main/java/com/ytpm/hydtw/utils/GlideRoundedCorners.java → app/src/main/java/com/ytpm/qnjz/utils/GlideRoundedCorners.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils;
+package com.ytpm.qnjz.utils;
 
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -6,9 +6,6 @@ import android.graphics.BitmapShader;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Path;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.Shader;
 import android.widget.ImageView;
@@ -16,7 +13,6 @@ import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
 import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
-import com.bumptech.glide.load.resource.bitmap.CenterCrop;
 import com.bumptech.glide.request.RequestOptions;
 
 import java.nio.ByteBuffer;

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/utils/GlideUtils.kt → app/src/main/java/com/ytpm/qnjz/utils/GlideUtils.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils
+package com.ytpm.qnjz.utils
 
 import android.content.Context
 import android.util.TypedValue

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/utils/JsonReader.kt → app/src/main/java/com/ytpm/qnjz/utils/JsonReader.kt

@@ -1,9 +1,9 @@
-package com.ytpm.hydtw.utils
+package com.ytpm.qnjz.utils
 
 import android.content.Context
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
-import com.ytpm.hydtw.dao.IdiomStory
+import com.ytpm.qnjz.dao.IdiomStory
 
 object JsonReader {
 

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/utils/LocationUtils.kt → app/src/main/java/com/ytpm/qnjz/utils/LocationUtils.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils
+package com.ytpm.qnjz.utils
 import android.annotation.SuppressLint
 import android.content.Context
 import android.content.pm.PackageManager

+ 2 - 7
app/src/main/java/com/ytpm/hydtw/utils/MediationNativeAdUtil.java → app/src/main/java/com/ytpm/qnjz/utils/MediationNativeAdUtil.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils;
+package com.ytpm.qnjz.utils;
 
 import android.content.Context;
 import android.content.Intent;
@@ -13,8 +13,6 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import com.anythink.core.api.ATAdAppInfo;
@@ -23,11 +21,8 @@ import com.anythink.core.api.ATNativeAdInfo;
 import com.anythink.core.api.ATShakeViewListener;
 import com.anythink.core.api.IATThirdPartyMaterial;
 import com.anythink.nativead.api.ATNativeImageView;
-import com.anythink.nativead.api.ATNativeMaterial;
-import com.anythink.nativead.api.ATNativePrepareExInfo;
-import com.anythink.nativead.api.ATNativePrepareInfo;
 import com.anythink.nativead.unitgroup.api.CustomNativeAd;
-import com.ytpm.hydtw.R;
+import com.ytpm.qnjz.R;
 
 import java.util.ArrayList;
 import java.util.List;

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/utils/MutiImageView.java → app/src/main/java/com/ytpm/qnjz/utils/MutiImageView.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils;
+package com.ytpm.qnjz.utils;
 
 import android.content.Context;
 import android.view.ViewGroup;

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/utils/PermissionUtils.kt → app/src/main/java/com/ytpm/qnjz/utils/PermissionUtils.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils
+package com.ytpm.qnjz.utils
 
 import android.Manifest
 import android.app.Activity

+ 1 - 1
app/src/main/java/com/ytpm/hydtw/utils/PxUtils.java → app/src/main/java/com/ytpm/qnjz/utils/PxUtils.java

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw.utils;
+package com.ytpm.qnjz.utils;
 
 import android.content.Context;
 import android.content.res.Resources;

+ 2 - 14
app/src/main/java/com/ytpm/hydtw/utils/SelfRenderViewUtil.java → app/src/main/java/com/ytpm/qnjz/utils/SelfRenderViewUtil.java

@@ -1,29 +1,17 @@
-package com.ytpm.hydtw.utils;
+package com.ytpm.qnjz.utils;
 
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.Bitmap;
 import android.net.Uri;
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
 import android.widget.FrameLayout;
-import android.widget.TextView;
 
-import com.anythink.core.api.ATAdAppInfo;
 import com.anythink.core.api.ATShakeViewListener;
-import com.anythink.nativead.api.ATNativeImageView;
 import com.anythink.nativead.api.ATNativeMaterial;
-import com.anythink.nativead.api.ATNativePrepareExInfo;
-import com.anythink.nativead.api.ATNativePrepareInfo;
 import com.anythink.nativead.unitgroup.api.CustomNativeAd;
-import com.ytpm.hydtw.R;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.ytpm.qnjz.R;
 
 public class SelfRenderViewUtil {
     private static final String TAG = SelfRenderViewUtil.class.getSimpleName();

+ 17 - 4
app/src/main/java/com/ytpm/hydtw/utils/UserInfoSpUtils.kt → app/src/main/java/com/ytpm/qnjz/utils/UserInfoSpUtils.kt

@@ -1,9 +1,9 @@
-package com.ytpm.hydtw.utils
+package com.ytpm.qnjz.utils
 
 import com.blankj.utilcode.util.GsonUtils
 import com.blankj.utilcode.util.SPUtils
-import com.ytpm.hydtw.dao.Record
-import com.ytpm.hydtw.dao.UserInfo
+import com.ytpm.qnjz.dao.Record
+import com.ytpm.qnjz.dao.UserInfo
 
 class UserInfoSpUtils {
 
@@ -29,7 +29,7 @@ class UserInfoSpUtils {
         return userInfo.userId
     }
 
-    fun getHeadImg(): String {
+    fun getHeadImg(): String? {
         val userJson = SPUtils.getInstance().getString("userInfo")
         val userInfo = GsonUtils.fromJson(userJson, UserInfo::class.java)
         return userInfo.headImg
@@ -41,6 +41,13 @@ class UserInfoSpUtils {
         return userInfo.nickName
     }
 
+
+    fun getAppid(): String {
+        val userJson = SPUtils.getInstance().getString("userInfo")
+        val userInfo = GsonUtils.fromJson(userJson, UserInfo::class.java)
+        return userInfo.appId
+    }
+
     fun getRegistryTime(): String {
         val userJson = SPUtils.getInstance().getString("userInfo")
         val userInfo = GsonUtils.fromJson(userJson, UserInfo::class.java)
@@ -83,4 +90,10 @@ class UserInfoSpUtils {
         return userInfo.answerRecordList
     }
 
+    fun ifPowerLimit(): Boolean {
+        val userJson = SPUtils.getInstance().getString("userInfo")
+        val userInfo = GsonUtils.fromJson(userJson, UserInfo::class.java)
+        return userInfo.ifPowerLimit
+    }
+
 }

+ 5 - 3
app/src/main/java/com/ytpm/hydtw/utils/WechatLoginHelper.java → app/src/main/java/com/ytpm/qnjz/utils/WechatLoginHelper.java

@@ -1,7 +1,6 @@
-package com.ytpm.hydtw.utils;
+package com.ytpm.qnjz.utils;
 
 import android.app.Activity;
-import android.content.Context;
 import android.content.Intent;
 import android.util.Log;
 import android.widget.Toast;
@@ -15,6 +14,8 @@ import com.tencent.mm.opensdk.openapi.IWXAPI;
 import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
 import com.tencent.mm.opensdk.openapi.WXAPIFactory;
 
+import java.util.Objects;
+
 public class WechatLoginHelper implements IWXAPIEventHandler {
     private static final String TAG = "WechatLoginHelper";
     private static WechatLoginHelper instance;
@@ -26,7 +27,7 @@ public class WechatLoginHelper implements IWXAPIEventHandler {
     private WechatLoginListener listener;
 
     public WechatLoginHelper(Activity activity) {
-        String appid = SPUtils.getInstance().getString("WxAppId");
+        String appid = Objects.requireNonNull(new ConfigSpUtils().getConfig()).getAppId();
         this.activity = activity;
         api = WXAPIFactory.createWXAPI(activity, appid, true);
         api.registerApp(appid);
@@ -43,6 +44,7 @@ public class WechatLoginHelper implements IWXAPIEventHandler {
     // 发起微信登录请求
     public void login(WechatLoginListener listener) {
         this.listener = listener;
+        Log.e("DDDD","dfdfdfdfdfdfdfdfdfdfdfdfdfdfdf====");
 
         if (!api.isWXAppInstalled()) {
             Toast.makeText(activity, "未安装微信客户端", Toast.LENGTH_SHORT).show();

+ 2 - 2
app/src/main/java/com/ytpm/hydtw/wxapi/WXEntryActivity.java → app/src/main/java/com/ytpm/qnjz/wxapi/WXEntryActivity.java

@@ -1,10 +1,10 @@
-package com.ytpm.hydtw.wxapi;
+package com.ytpm.qnjz.wxapi;
 
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
 
-import com.ytpm.hydtw.utils.WechatLoginHelper;
+import com.ytpm.qnjz.utils.WechatLoginHelper;
 
 public class WXEntryActivity extends Activity {
     private WechatLoginHelper loginHelper;

+ 2 - 69
app/src/main/res/layout/activity_login.xml

@@ -6,10 +6,10 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="@drawable/bg1"
         android:orientation="vertical">
 
         <ImageView
+            android:id="@+id/top"
             android:layout_width="300dp"
             android:layout_height="300dp"
             android:layout_gravity="center_horizontal"
@@ -26,7 +26,7 @@
             android:background="@drawable/login_btn_bg"
             android:gravity="center"
             android:orientation="horizontal"
-            android:visibility="gone">
+            android:visibility="visible">
 
             <TextView
                 android:layout_width="wrap_content"
@@ -171,72 +171,5 @@
         </LinearLayout>
     </LinearLayout>
 
-    <LinearLayout
-        android:id="@+id/dialog_ys"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="@color/tran2"
-        android:gravity="center"
-        android:orientation="vertical"
-        android:visibility="gone">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="30dp"
-            android:layout_marginEnd="30dp"
-            android:background="@drawable/border"
-            android:orientation="vertical"
-            android:padding="15dp">
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="好运答题王服务协议与隐私政策"
-                android:textColor="@color/black"
-                android:textSize="18sp"
-                android:textStyle="bold" />
-
-            <TextView
-                android:id="@+id/login_ts"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="10dp"
-                android:text="感谢您使用好运答题王APP,在您使用本软件过程中,我们可能会对您的部分个人信息进行收集、使用和共享。请您仔细阅读《服务协议》与《隐私政策》,并确定完全了解我们对您个人信息的处理规则。如您同意《服务协议》与《隐私政策》,请点击“同意”开始使用好运答题王,我们会尽全力保护您的个人信息安全。"
-                android:textColor="@color/black"
-                android:textSize="14sp"
-                android:textStyle="bold" />
-
-            <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="15dp"
-                android:layout_marginTop="30dp"
-                android:layout_marginEnd="15dp"
-                android:orientation="horizontal">
-
-                <TextView
-                    android:id="@+id/cancel"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:background="@mipmap/icon_btn1"
-                    android:gravity="center"
-                    android:text="不同意"
-                    android:textColor="@color/white" />
-
-                <TextView
-                    android:id="@+id/agree"
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_marginStart="30dp"
-                    android:layout_weight="1"
-                    android:background="@mipmap/icon_btn1"
-                    android:gravity="center"
-                    android:text="同意"
-                    android:textColor="@color/white" />
-            </LinearLayout>
-        </LinearLayout>
-    </LinearLayout>
 
 </RelativeLayout>

+ 209 - 6
app/src/main/res/layout/activity_splash.xml

@@ -3,6 +3,63 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
+    <ImageView
+        android:id="@+id/top"
+        android:layout_width="300dp"
+        android:layout_height="300dp"
+        android:layout_centerHorizontal="true"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="29dp"
+        android:background="@mipmap/icon_title1" />
+
+    <LinearLayout
+        android:id="@+id/splash_btn_ll"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:layout_below="@id/top"
+        android:layout_marginStart="65dp"
+        android:layout_marginTop="30dp"
+        android:layout_marginEnd="65dp"
+        android:background="@drawable/login_btn_bg"
+        android:gravity="center"
+        android:orientation="horizontal"
+        android:visibility="gone">
+
+        <TextView
+            android:id="@+id/splashBtnTx"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:drawablePadding="10dp"
+            android:text="重试"
+            android:textColor="#FF000000"
+            android:textSize="20sp" />
+    </LinearLayout>
+
+    <RelativeLayout
+        android:id="@+id/loading"
+        android:layout_width="match_parent"
+        android:layout_height="160dp"
+        android:visibility="gone"
+        android:layout_centerInParent="true">
+
+        <ImageView
+            android:id="@+id/loadingIm"
+            android:layout_width="match_parent"
+            android:layout_height="160dp"
+            android:visibility="visible" />
+
+        <TextView
+            android:id="@+id/loadingTv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="游戏资源加载中..."
+            android:layout_centerHorizontal="true"
+            android:layout_alignParentBottom="true"
+            android:layout_marginBottom="30dp"
+            android:textColor="@color/white"
+            android:textSize="11sp" />
+    </RelativeLayout>
+
     <LinearLayout
         android:id="@+id/ddc"
         android:layout_width="match_parent"
@@ -27,14 +84,160 @@
             android:textStyle="bold" />
     </LinearLayout>
 
-    <FrameLayout
-        android:id="@+id/splash_ad_fl"
+    <LinearLayout
+        android:id="@+id/dialog_is_e"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/white" />
+        android:layout_height="match_parent"
+        android:background="@color/tran2"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:visibility="gone">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="30dp"
+            android:layout_marginEnd="30dp"
+            android:background="@drawable/border"
+            android:gravity="center"
+            android:orientation="vertical"
+            android:padding="15dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text="提示"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/tipTv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="30dp"
+                android:gravity="center"
+                android:text="模拟器无法使用,请真机下载!"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="15dp"
+                android:layout_marginTop="30dp"
+                android:layout_marginEnd="15dp"
+                android:gravity="center"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/cancel1"
+                    android:layout_width="100dp"
+                    android:layout_height="wrap_content"
+                    android:background="@mipmap/icon_btn1"
+                    android:gravity="center"
+                    android:text="退出"
+                    android:textColor="@color/white" />
+
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+
+        <FrameLayout
+            android:id="@+id/fragmentDatiBanner"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+
+        <com.anythink.nativead.api.ATNativeAdView
+            android:id="@+id/fragment_dati_content_ad"
+            android:layout_width="match_parent"
+            android:layout_height="260dp"
+            android:layout_alignParentBottom="true"
+            android:visibility="gone" />
+
+    </RelativeLayout>
 
     <FrameLayout
-        android:id="@+id/close"
+        android:id="@+id/splashFl"
         android:layout_width="match_parent"
-        android:layout_height="150dp" />
+        android:layout_height="match_parent" />
+
+    <LinearLayout
+        android:id="@+id/dialog_ys"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/tran2"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:visibility="gone">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="30dp"
+            android:layout_marginEnd="30dp"
+            android:background="@drawable/border"
+            android:orientation="vertical"
+            android:padding="15dp">
+
+            <TextView
+                android:id="@+id/login_ts_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="青柠记账服务协议与隐私政策"
+                android:textColor="@color/black"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/login_ts"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text="感谢您使用青柠记账APP,在您使用本软件过程中,我们可能会对您的部分个人信息进行收集、使用和共享。请您仔细阅读《服务协议》与《隐私政策》,并确定完全了解我们对您个人信息的处理规则。如您同意《服务协议》与《隐私政策》,请点击“同意”开始使用青柠记账,我们会尽全力保护您的个人信息安全。"
+                android:textColor="@color/black"
+                android:textSize="14sp"
+                android:textStyle="bold" />
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="15dp"
+                android:layout_marginTop="30dp"
+                android:layout_marginEnd="15dp"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/cancel"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:background="@mipmap/icon_btn1"
+                    android:gravity="center"
+                    android:text="不同意"
+                    android:textColor="@color/white" />
+
+                <TextView
+                    android:id="@+id/agree"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="30dp"
+                    android:layout_weight="1"
+                    android:background="@mipmap/icon_btn1"
+                    android:gravity="center"
+                    android:text="同意"
+                    android:textColor="@color/white" />
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
 </RelativeLayout>

+ 19 - 4
app/src/main/res/layout/fragment_dati.xml

@@ -43,7 +43,6 @@
                 android:ellipsize="end"
                 android:maxLength="10"
                 android:maxLines="1"
-                android:text="UID:212121"
                 android:textColor="@color/white"
                 android:textSize="10dp"
                 android:textStyle="bold" />
@@ -84,7 +83,7 @@
                     android:layout_marginTop="8dp"
                     android:text="获取体力"
                     android:textColor="@color/white"
-                    android:textSize="14sp"
+                    android:textSize="12sp"
                     android:textStyle="bold"
                     app:layout_constraintStart_toStartOf="@id/dd"
                     app:layout_constraintTop_toTopOf="@id/dd" />
@@ -217,7 +216,7 @@
         android:layout_below="@id/center"
         android:layout_marginTop="10dp"
         android:orientation="vertical"
-        android:visibility="gone">
+        android:visibility="visible">
 
         <RelativeLayout
             android:id="@+id/a1Rl"
@@ -781,4 +780,20 @@
         android:layout_below="@id/answerCl"
         android:background="@color/white" />
 
-</RelativeLayout>
+    <FrameLayout
+        android:id="@+id/selfview"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/answerCl"
+        android:visibility="gone"
+        android:background="@color/white" >
+        <TextView
+            android:id="@+id/native_ad_domain"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+        <TextView
+            android:id="@+id/native_ad_warning"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    </FrameLayout>
+</RelativeLayout>

二進制
app/src/main/res/mipmap-xxhdpi/loading.gif


二進制
app/src/main/res/mipmap-xxhdpi/logo.png


+ 8 - 0
app/src/main/res/values/strings.xml

@@ -1,3 +1,11 @@
 <resources>
     <string name="app_name">好运答题王</string>
+    <string name="tip">服务协议与隐私政策</string>
+    <string name="tip1">感谢您使用</string>
+    <string name="tip2">APP,在您使用本软件过程中,我们可能会对您的部分个人信息进行收集、使用和共享。请您仔细阅读</string>
+    <string name="tip3">《服务协议》</string>
+    <string name="tip4">《隐私政策》</string>
+    <string name="tip5">,并确定完全了解我们对您个人信息的处理规则。如您同意《服务协议》与《隐私政策》,请点击“同意”开始使用</string>
+    <string name="tip6">,我们会尽全力保护您的个人信息安全。</string>
+    <string name="today_answer_count">"今日答题: %s题"</string>
 </resources>

+ 32 - 0
app/src/main/res/xml/file_paths.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- 应用内部存储的 files 目录 -->
+    <files-path
+        name="internal_files"
+        path="." /> <!-- "." 表示整个files目录 -->
+
+    <!-- 应用内部存储的 cache 目录 -->
+    <cache-path
+        name="internal_cache"
+        path="." />
+
+    <!-- 外部存储的根目录 (Android 10+ 分区存储下可能受限) -->
+    <external-path
+        name="external_root"
+        path="." />
+
+    <!-- 外部存储的应用私有目录 (推荐使用,不受分区存储限制) -->
+    <external-files-path
+        name="external_app_files"
+        path="." />
+
+    <!-- 外部存储的应用私有缓存目录 -->
+    <external-cache-path
+        name="external_app_cache"
+        path="." />
+
+    <!-- 媒体库图片目录 (仅用于共享图片) -->
+    <external-media-path
+        name="external_media_images"
+        path="Pictures" />
+</paths>

+ 1 - 1
app/src/test/java/com/ytpm/hydtw/ExampleUnitTest.kt → app/src/test/java/com/ytpm/qnjz/ExampleUnitTest.kt

@@ -1,4 +1,4 @@
-package com.ytpm.hydtw
+package com.ytpm.qnjz
 
 import org.junit.Test