diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
index 92fd858..46c0099 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
@@ -2,96 +2,92 @@
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.extensions.initLayoutImmersionBar
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.AuthenticateViewModel
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*
-class LoginActivity : KotlinBaseActivity() {
+class LoginActivity : ApplicationBaseActivity() {
private lateinit var authenticateViewModel: AuthenticateViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var userViewModel: UserViewModel
override fun initLayoutView(): Int = R.layout.activity_login
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
}
override fun initData() {
+ PageNavigationManager.addActivity(this)
+
// 设置默认账号密码
- userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
+ userAccountView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String)
+
authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
-
- authenticateViewModel.keyModel.observe(this) {
- if (it.code == 200) {//用code判断,别的判断可能有坑
- val keyString = it.data!!.publicKey!!
- /**
- * 修改密码需要用到key,先存着
- * */
- AuthenticationHelper.savePublicKey(keyString)
- val publicKey = RSAUtils.keyStrToPublicKey(keyString)
-
- val account = userNameView.text.toString()
- val userPassword = userPasswordView.text.toString()
- val dataByPublicKey =
- RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
- //登录并获取Token,POST请求
- loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
- loginViewModel.enterResultModel.observe(this) { loginResult ->
- if (loginResult.code == 200) {
- AuthenticationHelper.saveToken(loginResult.data!!.token!!)
- /**
- * 获取token之后保存用户信息
- * */
- userViewModel.obtainUserDetail()
- //验证成功登录
- navigatePageTo()
- finish()
- }
- }
- }
- }
}
override fun observeRequestState() {
- authenticateViewModel.loadState.observe(this) {
- LoadingDialogHub.show(this, "登录中,请稍后")
- }
-
- loginViewModel.loadState.observe(this) {
- LoadingDialogHub.dismiss()
+ userViewModel.loadState.observe(this) {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后")
+ else -> LoadingDialogHub.dismiss()
+ }
}
}
override fun initEvent() {
loginButton.setOnClickListener {
- val account = userNameView.text.toString().trim()
- val userPassword = userPasswordView.text.toString().trim()
- if (account.isBlank()) {
- "用户名不能为空".show(this)
+ val userAccount = userAccountView.text.toString()
+ if (userAccount.isBlank()) {
+ "请输入账号".show(this)
return@setOnClickListener
}
+ val userPassword = userPasswordView.text.toString()
if (userPassword.isBlank()) {
- "密码不能为空".show(this)
+ "请输入密码".show(this)
return@setOnClickListener
}
- SaveKeyValues.putValue(LocaleConstant.ACCOUNT, account)
+ SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userAccount)
SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword)
+
authenticateViewModel.obtainPublicKey()
+ authenticateViewModel.keyModel.observe(this) { keyModel ->
+ if (keyModel.code == 200) {
+ val keyString = keyModel.data!!.publicKey!!
+ /**
+ * 修改密码需要用到key,先存着
+ * */
+ AuthenticationHelper.savePublicKey(keyString)
+ val publicKey = RSAUtils.keyStrToPublicKey(keyString)
+
+ val dataByPublicKey = RSAUtils.encryptDataByPublicKey(
+ userPassword.toByteArray(), publicKey!!
+ )
+ userViewModel.enter(keyModel.data!!.sid!!, userAccount, dataByPublicKey)
+ userViewModel.loginResult.observe(this) {
+ if (it.code == 200) {
+ AuthenticationHelper.saveToken(it.data!!.token!!)
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
index 92fd858..46c0099 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
@@ -2,96 +2,92 @@
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.extensions.initLayoutImmersionBar
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.AuthenticateViewModel
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*
-class LoginActivity : KotlinBaseActivity() {
+class LoginActivity : ApplicationBaseActivity() {
private lateinit var authenticateViewModel: AuthenticateViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var userViewModel: UserViewModel
override fun initLayoutView(): Int = R.layout.activity_login
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
}
override fun initData() {
+ PageNavigationManager.addActivity(this)
+
// 设置默认账号密码
- userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
+ userAccountView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String)
+
authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
-
- authenticateViewModel.keyModel.observe(this) {
- if (it.code == 200) {//用code判断,别的判断可能有坑
- val keyString = it.data!!.publicKey!!
- /**
- * 修改密码需要用到key,先存着
- * */
- AuthenticationHelper.savePublicKey(keyString)
- val publicKey = RSAUtils.keyStrToPublicKey(keyString)
-
- val account = userNameView.text.toString()
- val userPassword = userPasswordView.text.toString()
- val dataByPublicKey =
- RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
- //登录并获取Token,POST请求
- loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
- loginViewModel.enterResultModel.observe(this) { loginResult ->
- if (loginResult.code == 200) {
- AuthenticationHelper.saveToken(loginResult.data!!.token!!)
- /**
- * 获取token之后保存用户信息
- * */
- userViewModel.obtainUserDetail()
- //验证成功登录
- navigatePageTo()
- finish()
- }
- }
- }
- }
}
override fun observeRequestState() {
- authenticateViewModel.loadState.observe(this) {
- LoadingDialogHub.show(this, "登录中,请稍后")
- }
-
- loginViewModel.loadState.observe(this) {
- LoadingDialogHub.dismiss()
+ userViewModel.loadState.observe(this) {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后")
+ else -> LoadingDialogHub.dismiss()
+ }
}
}
override fun initEvent() {
loginButton.setOnClickListener {
- val account = userNameView.text.toString().trim()
- val userPassword = userPasswordView.text.toString().trim()
- if (account.isBlank()) {
- "用户名不能为空".show(this)
+ val userAccount = userAccountView.text.toString()
+ if (userAccount.isBlank()) {
+ "请输入账号".show(this)
return@setOnClickListener
}
+ val userPassword = userPasswordView.text.toString()
if (userPassword.isBlank()) {
- "密码不能为空".show(this)
+ "请输入密码".show(this)
return@setOnClickListener
}
- SaveKeyValues.putValue(LocaleConstant.ACCOUNT, account)
+ SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userAccount)
SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword)
+
authenticateViewModel.obtainPublicKey()
+ authenticateViewModel.keyModel.observe(this) { keyModel ->
+ if (keyModel.code == 200) {
+ val keyString = keyModel.data!!.publicKey!!
+ /**
+ * 修改密码需要用到key,先存着
+ * */
+ AuthenticationHelper.savePublicKey(keyString)
+ val publicKey = RSAUtils.keyStrToPublicKey(keyString)
+
+ val dataByPublicKey = RSAUtils.encryptDataByPublicKey(
+ userPassword.toByteArray(), publicKey!!
+ )
+ userViewModel.enter(keyModel.data!!.sid!!, userAccount, dataByPublicKey)
+ userViewModel.loginResult.observe(this) {
+ if (it.code == 200) {
+ AuthenticationHelper.saveToken(it.data!!.token!!)
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
index 8d97579..36e712f 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
@@ -6,26 +6,24 @@
import androidx.viewpager.widget.ViewPager
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter
-import com.casic.smart.town.sanxi.fragment.MonitorPageFragment
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.fragment.HomePageFragment
import com.casic.smart.town.sanxi.fragment.MorePageFragment
import com.casic.smart.town.sanxi.fragment.OrderPageFragment
import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.show
-import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_main.*
-class MainActivity : KotlinBaseActivity() {
+class MainActivity : ApplicationBaseActivity() {
private var menuItem: MenuItem? = null
private var fragmentPages: ArrayList = ArrayList()
private var clickTime: Long = 0
init {
+ fragmentPages.add(HomePageFragment())
fragmentPages.add(StatisticsPageFragment())
-// fragmentPages.add(MonitorPageFragment())
fragmentPages.add(OrderPageFragment())
fragmentPages.add(MorePageFragment())
}
@@ -33,8 +31,7 @@
override fun initLayoutView(): Int = R.layout.activity_main
override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this))
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
}
override fun initData() {
@@ -49,18 +46,18 @@
bottomNavigation.itemIconTintList = null
bottomNavigation.setOnNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
- R.id.nav_statistics -> {
+ R.id.nav_home -> {
mainViewPager.currentItem = 0
}
-// R.id.nav_monitor -> {
-// mainViewPager.currentItem = 1
-// }
- R.id.nav_order -> {
+ R.id.nav_statistics -> {
mainViewPager.currentItem = 1
}
- R.id.nav_more -> {
+ R.id.nav_order -> {
mainViewPager.currentItem = 2
}
+ R.id.nav_more -> {
+ mainViewPager.currentItem = 3
+ }
}
false
}
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
index 92fd858..46c0099 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
@@ -2,96 +2,92 @@
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.extensions.initLayoutImmersionBar
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.AuthenticateViewModel
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*
-class LoginActivity : KotlinBaseActivity() {
+class LoginActivity : ApplicationBaseActivity() {
private lateinit var authenticateViewModel: AuthenticateViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var userViewModel: UserViewModel
override fun initLayoutView(): Int = R.layout.activity_login
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
}
override fun initData() {
+ PageNavigationManager.addActivity(this)
+
// 设置默认账号密码
- userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
+ userAccountView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String)
+
authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
-
- authenticateViewModel.keyModel.observe(this) {
- if (it.code == 200) {//用code判断,别的判断可能有坑
- val keyString = it.data!!.publicKey!!
- /**
- * 修改密码需要用到key,先存着
- * */
- AuthenticationHelper.savePublicKey(keyString)
- val publicKey = RSAUtils.keyStrToPublicKey(keyString)
-
- val account = userNameView.text.toString()
- val userPassword = userPasswordView.text.toString()
- val dataByPublicKey =
- RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
- //登录并获取Token,POST请求
- loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
- loginViewModel.enterResultModel.observe(this) { loginResult ->
- if (loginResult.code == 200) {
- AuthenticationHelper.saveToken(loginResult.data!!.token!!)
- /**
- * 获取token之后保存用户信息
- * */
- userViewModel.obtainUserDetail()
- //验证成功登录
- navigatePageTo()
- finish()
- }
- }
- }
- }
}
override fun observeRequestState() {
- authenticateViewModel.loadState.observe(this) {
- LoadingDialogHub.show(this, "登录中,请稍后")
- }
-
- loginViewModel.loadState.observe(this) {
- LoadingDialogHub.dismiss()
+ userViewModel.loadState.observe(this) {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后")
+ else -> LoadingDialogHub.dismiss()
+ }
}
}
override fun initEvent() {
loginButton.setOnClickListener {
- val account = userNameView.text.toString().trim()
- val userPassword = userPasswordView.text.toString().trim()
- if (account.isBlank()) {
- "用户名不能为空".show(this)
+ val userAccount = userAccountView.text.toString()
+ if (userAccount.isBlank()) {
+ "请输入账号".show(this)
return@setOnClickListener
}
+ val userPassword = userPasswordView.text.toString()
if (userPassword.isBlank()) {
- "密码不能为空".show(this)
+ "请输入密码".show(this)
return@setOnClickListener
}
- SaveKeyValues.putValue(LocaleConstant.ACCOUNT, account)
+ SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userAccount)
SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword)
+
authenticateViewModel.obtainPublicKey()
+ authenticateViewModel.keyModel.observe(this) { keyModel ->
+ if (keyModel.code == 200) {
+ val keyString = keyModel.data!!.publicKey!!
+ /**
+ * 修改密码需要用到key,先存着
+ * */
+ AuthenticationHelper.savePublicKey(keyString)
+ val publicKey = RSAUtils.keyStrToPublicKey(keyString)
+
+ val dataByPublicKey = RSAUtils.encryptDataByPublicKey(
+ userPassword.toByteArray(), publicKey!!
+ )
+ userViewModel.enter(keyModel.data!!.sid!!, userAccount, dataByPublicKey)
+ userViewModel.loginResult.observe(this) {
+ if (it.code == 200) {
+ AuthenticationHelper.saveToken(it.data!!.token!!)
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
index 8d97579..36e712f 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
@@ -6,26 +6,24 @@
import androidx.viewpager.widget.ViewPager
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter
-import com.casic.smart.town.sanxi.fragment.MonitorPageFragment
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.fragment.HomePageFragment
import com.casic.smart.town.sanxi.fragment.MorePageFragment
import com.casic.smart.town.sanxi.fragment.OrderPageFragment
import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.show
-import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_main.*
-class MainActivity : KotlinBaseActivity() {
+class MainActivity : ApplicationBaseActivity() {
private var menuItem: MenuItem? = null
private var fragmentPages: ArrayList = ArrayList()
private var clickTime: Long = 0
init {
+ fragmentPages.add(HomePageFragment())
fragmentPages.add(StatisticsPageFragment())
-// fragmentPages.add(MonitorPageFragment())
fragmentPages.add(OrderPageFragment())
fragmentPages.add(MorePageFragment())
}
@@ -33,8 +31,7 @@
override fun initLayoutView(): Int = R.layout.activity_main
override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this))
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
}
override fun initData() {
@@ -49,18 +46,18 @@
bottomNavigation.itemIconTintList = null
bottomNavigation.setOnNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
- R.id.nav_statistics -> {
+ R.id.nav_home -> {
mainViewPager.currentItem = 0
}
-// R.id.nav_monitor -> {
-// mainViewPager.currentItem = 1
-// }
- R.id.nav_order -> {
+ R.id.nav_statistics -> {
mainViewPager.currentItem = 1
}
- R.id.nav_more -> {
+ R.id.nav_order -> {
mainViewPager.currentItem = 2
}
+ R.id.nav_more -> {
+ mainViewPager.currentItem = 3
+ }
}
false
}
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
index e79b646..7283066 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
@@ -2,13 +2,13 @@
import android.content.Context
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.include_base_title.*
-class MonitorRecordActivity : KotlinBaseActivity() {
+class MonitorRecordActivity : ApplicationBaseActivity() {
private val context: Context = this@MonitorRecordActivity
private var dataBeans: MutableList = ArrayList()
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
index 92fd858..46c0099 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
@@ -2,96 +2,92 @@
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.extensions.initLayoutImmersionBar
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.AuthenticateViewModel
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*
-class LoginActivity : KotlinBaseActivity() {
+class LoginActivity : ApplicationBaseActivity() {
private lateinit var authenticateViewModel: AuthenticateViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var userViewModel: UserViewModel
override fun initLayoutView(): Int = R.layout.activity_login
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
}
override fun initData() {
+ PageNavigationManager.addActivity(this)
+
// 设置默认账号密码
- userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
+ userAccountView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String)
+
authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
-
- authenticateViewModel.keyModel.observe(this) {
- if (it.code == 200) {//用code判断,别的判断可能有坑
- val keyString = it.data!!.publicKey!!
- /**
- * 修改密码需要用到key,先存着
- * */
- AuthenticationHelper.savePublicKey(keyString)
- val publicKey = RSAUtils.keyStrToPublicKey(keyString)
-
- val account = userNameView.text.toString()
- val userPassword = userPasswordView.text.toString()
- val dataByPublicKey =
- RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
- //登录并获取Token,POST请求
- loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
- loginViewModel.enterResultModel.observe(this) { loginResult ->
- if (loginResult.code == 200) {
- AuthenticationHelper.saveToken(loginResult.data!!.token!!)
- /**
- * 获取token之后保存用户信息
- * */
- userViewModel.obtainUserDetail()
- //验证成功登录
- navigatePageTo()
- finish()
- }
- }
- }
- }
}
override fun observeRequestState() {
- authenticateViewModel.loadState.observe(this) {
- LoadingDialogHub.show(this, "登录中,请稍后")
- }
-
- loginViewModel.loadState.observe(this) {
- LoadingDialogHub.dismiss()
+ userViewModel.loadState.observe(this) {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后")
+ else -> LoadingDialogHub.dismiss()
+ }
}
}
override fun initEvent() {
loginButton.setOnClickListener {
- val account = userNameView.text.toString().trim()
- val userPassword = userPasswordView.text.toString().trim()
- if (account.isBlank()) {
- "用户名不能为空".show(this)
+ val userAccount = userAccountView.text.toString()
+ if (userAccount.isBlank()) {
+ "请输入账号".show(this)
return@setOnClickListener
}
+ val userPassword = userPasswordView.text.toString()
if (userPassword.isBlank()) {
- "密码不能为空".show(this)
+ "请输入密码".show(this)
return@setOnClickListener
}
- SaveKeyValues.putValue(LocaleConstant.ACCOUNT, account)
+ SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userAccount)
SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword)
+
authenticateViewModel.obtainPublicKey()
+ authenticateViewModel.keyModel.observe(this) { keyModel ->
+ if (keyModel.code == 200) {
+ val keyString = keyModel.data!!.publicKey!!
+ /**
+ * 修改密码需要用到key,先存着
+ * */
+ AuthenticationHelper.savePublicKey(keyString)
+ val publicKey = RSAUtils.keyStrToPublicKey(keyString)
+
+ val dataByPublicKey = RSAUtils.encryptDataByPublicKey(
+ userPassword.toByteArray(), publicKey!!
+ )
+ userViewModel.enter(keyModel.data!!.sid!!, userAccount, dataByPublicKey)
+ userViewModel.loginResult.observe(this) {
+ if (it.code == 200) {
+ AuthenticationHelper.saveToken(it.data!!.token!!)
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
index 8d97579..36e712f 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
@@ -6,26 +6,24 @@
import androidx.viewpager.widget.ViewPager
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter
-import com.casic.smart.town.sanxi.fragment.MonitorPageFragment
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.fragment.HomePageFragment
import com.casic.smart.town.sanxi.fragment.MorePageFragment
import com.casic.smart.town.sanxi.fragment.OrderPageFragment
import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.show
-import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_main.*
-class MainActivity : KotlinBaseActivity() {
+class MainActivity : ApplicationBaseActivity() {
private var menuItem: MenuItem? = null
private var fragmentPages: ArrayList = ArrayList()
private var clickTime: Long = 0
init {
+ fragmentPages.add(HomePageFragment())
fragmentPages.add(StatisticsPageFragment())
-// fragmentPages.add(MonitorPageFragment())
fragmentPages.add(OrderPageFragment())
fragmentPages.add(MorePageFragment())
}
@@ -33,8 +31,7 @@
override fun initLayoutView(): Int = R.layout.activity_main
override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this))
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
}
override fun initData() {
@@ -49,18 +46,18 @@
bottomNavigation.itemIconTintList = null
bottomNavigation.setOnNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
- R.id.nav_statistics -> {
+ R.id.nav_home -> {
mainViewPager.currentItem = 0
}
-// R.id.nav_monitor -> {
-// mainViewPager.currentItem = 1
-// }
- R.id.nav_order -> {
+ R.id.nav_statistics -> {
mainViewPager.currentItem = 1
}
- R.id.nav_more -> {
+ R.id.nav_order -> {
mainViewPager.currentItem = 2
}
+ R.id.nav_more -> {
+ mainViewPager.currentItem = 3
+ }
}
false
}
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
index e79b646..7283066 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
@@ -2,13 +2,13 @@
import android.content.Context
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.include_base_title.*
-class MonitorRecordActivity : KotlinBaseActivity() {
+class MonitorRecordActivity : ApplicationBaseActivity() {
private val context: Context = this@MonitorRecordActivity
private var dataBeans: MutableList = ArrayList()
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
index 3238f3c..8de52c7 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
@@ -1,39 +1,48 @@
package com.casic.smart.town.sanxi.view
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
+import android.os.CountDownTimer
import com.amap.api.maps.MapsInitializer
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.gyf.immersionbar.ImmersionBar
import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.SaveKeyValues
import pub.devrel.easypermissions.EasyPermissions
-import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
-class PermissionActivity : AppCompatActivity(), PermissionCallbacks {
+class PermissionActivity : ApplicationBaseActivity(), EasyPermissions.PermissionCallbacks {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- ImmersionBar.with(this).statusBarDarkFont(true).init()
- //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
- if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
- startSplashScreenActivity()
- } else {
- EasyPermissions.requestPermissions(
- this@PermissionActivity,
- resources.getString(R.string.app_name) + "需要获取相关权限",
- LocaleConstant.PERMISSIONS_CODE,
- *LocaleConstant.USER_PERMISSIONS
- )
+ private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean
+ private val countDownTimer = object : CountDownTimer(2000, 500) {
+ override fun onFinish() {
+ navigatePageTo()
+ finish()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+
}
}
- private fun startSplashScreenActivity() {
- //先把导航隐私政策声明,后面导航会用到
- MapsInitializer.updatePrivacyAgree(this, true)
- MapsInitializer.updatePrivacyShow(this, true, true)
- this.navigatePageTo()
- finish()
+ override fun initData() {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_permission
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
}
override fun onRequestPermissionsResult(
@@ -46,7 +55,16 @@
}
override fun onPermissionsGranted(requestCode: Int, perms: List) {
- startSplashScreenActivity()
+ if (isFirstEnter) {
+ SaveKeyValues.putValue("isFirstEnter", false)
+ //先把导航隐私政策声明,后面导航会用到
+ MapsInitializer.updatePrivacyAgree(this, true)
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ navigatePageTo()
+ finish()
+ } else {
+ countDownTimer.start()
+ }
}
override fun onPermissionsDenied(requestCode: Int, perms: List) {
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
index 92fd858..46c0099 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
@@ -2,96 +2,92 @@
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.extensions.initLayoutImmersionBar
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.AuthenticateViewModel
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*
-class LoginActivity : KotlinBaseActivity() {
+class LoginActivity : ApplicationBaseActivity() {
private lateinit var authenticateViewModel: AuthenticateViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var userViewModel: UserViewModel
override fun initLayoutView(): Int = R.layout.activity_login
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
}
override fun initData() {
+ PageNavigationManager.addActivity(this)
+
// 设置默认账号密码
- userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
+ userAccountView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String)
+
authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
-
- authenticateViewModel.keyModel.observe(this) {
- if (it.code == 200) {//用code判断,别的判断可能有坑
- val keyString = it.data!!.publicKey!!
- /**
- * 修改密码需要用到key,先存着
- * */
- AuthenticationHelper.savePublicKey(keyString)
- val publicKey = RSAUtils.keyStrToPublicKey(keyString)
-
- val account = userNameView.text.toString()
- val userPassword = userPasswordView.text.toString()
- val dataByPublicKey =
- RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
- //登录并获取Token,POST请求
- loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
- loginViewModel.enterResultModel.observe(this) { loginResult ->
- if (loginResult.code == 200) {
- AuthenticationHelper.saveToken(loginResult.data!!.token!!)
- /**
- * 获取token之后保存用户信息
- * */
- userViewModel.obtainUserDetail()
- //验证成功登录
- navigatePageTo()
- finish()
- }
- }
- }
- }
}
override fun observeRequestState() {
- authenticateViewModel.loadState.observe(this) {
- LoadingDialogHub.show(this, "登录中,请稍后")
- }
-
- loginViewModel.loadState.observe(this) {
- LoadingDialogHub.dismiss()
+ userViewModel.loadState.observe(this) {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后")
+ else -> LoadingDialogHub.dismiss()
+ }
}
}
override fun initEvent() {
loginButton.setOnClickListener {
- val account = userNameView.text.toString().trim()
- val userPassword = userPasswordView.text.toString().trim()
- if (account.isBlank()) {
- "用户名不能为空".show(this)
+ val userAccount = userAccountView.text.toString()
+ if (userAccount.isBlank()) {
+ "请输入账号".show(this)
return@setOnClickListener
}
+ val userPassword = userPasswordView.text.toString()
if (userPassword.isBlank()) {
- "密码不能为空".show(this)
+ "请输入密码".show(this)
return@setOnClickListener
}
- SaveKeyValues.putValue(LocaleConstant.ACCOUNT, account)
+ SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userAccount)
SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword)
+
authenticateViewModel.obtainPublicKey()
+ authenticateViewModel.keyModel.observe(this) { keyModel ->
+ if (keyModel.code == 200) {
+ val keyString = keyModel.data!!.publicKey!!
+ /**
+ * 修改密码需要用到key,先存着
+ * */
+ AuthenticationHelper.savePublicKey(keyString)
+ val publicKey = RSAUtils.keyStrToPublicKey(keyString)
+
+ val dataByPublicKey = RSAUtils.encryptDataByPublicKey(
+ userPassword.toByteArray(), publicKey!!
+ )
+ userViewModel.enter(keyModel.data!!.sid!!, userAccount, dataByPublicKey)
+ userViewModel.loginResult.observe(this) {
+ if (it.code == 200) {
+ AuthenticationHelper.saveToken(it.data!!.token!!)
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
index 8d97579..36e712f 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
@@ -6,26 +6,24 @@
import androidx.viewpager.widget.ViewPager
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter
-import com.casic.smart.town.sanxi.fragment.MonitorPageFragment
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.fragment.HomePageFragment
import com.casic.smart.town.sanxi.fragment.MorePageFragment
import com.casic.smart.town.sanxi.fragment.OrderPageFragment
import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.show
-import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_main.*
-class MainActivity : KotlinBaseActivity() {
+class MainActivity : ApplicationBaseActivity() {
private var menuItem: MenuItem? = null
private var fragmentPages: ArrayList = ArrayList()
private var clickTime: Long = 0
init {
+ fragmentPages.add(HomePageFragment())
fragmentPages.add(StatisticsPageFragment())
-// fragmentPages.add(MonitorPageFragment())
fragmentPages.add(OrderPageFragment())
fragmentPages.add(MorePageFragment())
}
@@ -33,8 +31,7 @@
override fun initLayoutView(): Int = R.layout.activity_main
override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this))
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
}
override fun initData() {
@@ -49,18 +46,18 @@
bottomNavigation.itemIconTintList = null
bottomNavigation.setOnNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
- R.id.nav_statistics -> {
+ R.id.nav_home -> {
mainViewPager.currentItem = 0
}
-// R.id.nav_monitor -> {
-// mainViewPager.currentItem = 1
-// }
- R.id.nav_order -> {
+ R.id.nav_statistics -> {
mainViewPager.currentItem = 1
}
- R.id.nav_more -> {
+ R.id.nav_order -> {
mainViewPager.currentItem = 2
}
+ R.id.nav_more -> {
+ mainViewPager.currentItem = 3
+ }
}
false
}
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
index e79b646..7283066 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
@@ -2,13 +2,13 @@
import android.content.Context
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.include_base_title.*
-class MonitorRecordActivity : KotlinBaseActivity() {
+class MonitorRecordActivity : ApplicationBaseActivity() {
private val context: Context = this@MonitorRecordActivity
private var dataBeans: MutableList = ArrayList()
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
index 3238f3c..8de52c7 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
@@ -1,39 +1,48 @@
package com.casic.smart.town.sanxi.view
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
+import android.os.CountDownTimer
import com.amap.api.maps.MapsInitializer
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.gyf.immersionbar.ImmersionBar
import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.SaveKeyValues
import pub.devrel.easypermissions.EasyPermissions
-import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
-class PermissionActivity : AppCompatActivity(), PermissionCallbacks {
+class PermissionActivity : ApplicationBaseActivity(), EasyPermissions.PermissionCallbacks {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- ImmersionBar.with(this).statusBarDarkFont(true).init()
- //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
- if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
- startSplashScreenActivity()
- } else {
- EasyPermissions.requestPermissions(
- this@PermissionActivity,
- resources.getString(R.string.app_name) + "需要获取相关权限",
- LocaleConstant.PERMISSIONS_CODE,
- *LocaleConstant.USER_PERMISSIONS
- )
+ private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean
+ private val countDownTimer = object : CountDownTimer(2000, 500) {
+ override fun onFinish() {
+ navigatePageTo()
+ finish()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+
}
}
- private fun startSplashScreenActivity() {
- //先把导航隐私政策声明,后面导航会用到
- MapsInitializer.updatePrivacyAgree(this, true)
- MapsInitializer.updatePrivacyShow(this, true, true)
- this.navigatePageTo()
- finish()
+ override fun initData() {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_permission
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
}
override fun onRequestPermissionsResult(
@@ -46,7 +55,16 @@
}
override fun onPermissionsGranted(requestCode: Int, perms: List) {
- startSplashScreenActivity()
+ if (isFirstEnter) {
+ SaveKeyValues.putValue("isFirstEnter", false)
+ //先把导航隐私政策声明,后面导航会用到
+ MapsInitializer.updatePrivacyAgree(this, true)
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ navigatePageTo()
+ finish()
+ } else {
+ countDownTimer.start()
+ }
}
override fun onPermissionsDenied(requestCode: Int, perms: List) {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/SplashScreenActivity.kt
deleted file mode 100644
index 637a8a7..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/SplashScreenActivity.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.casic.smart.town.sanxi.view
-
-import android.annotation.SuppressLint
-import android.os.CountDownTimer
-import androidx.lifecycle.ViewModelProvider
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.vm.UserViewModel
-import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.navigatePageTo
-
-@SuppressLint("CustomSplashScreen")
-class SplashScreenActivity : KotlinBaseActivity() {
-
- private lateinit var userDetailViewModel: UserViewModel
- private val countDownTimer = object : CountDownTimer(1000, 500) {
- override fun onFinish() {
- /**
- * 获取token之后保存用户信息
- * */
- userDetailViewModel.obtainUserDetail()
- userDetailViewModel.userDetailModel.observe(this@SplashScreenActivity) {
- if (it.code == 200) {
- navigatePageTo()
- } else {
- navigatePageTo()
- }
- finish()
- }
- }
-
- override fun onTick(millisUntilFinished: Long) {
-
- }
- }
-
- override fun initLayoutView(): Int = R.layout.activity_splash
-
- override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- }
-
- override fun initData() {
- userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
- }
-
- override fun observeRequestState() {
-
- }
-
- override fun initEvent() {
- countDownTimer.start()
- }
-}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
index 92fd858..46c0099 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
@@ -2,96 +2,92 @@
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.extensions.initLayoutImmersionBar
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.AuthenticateViewModel
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*
-class LoginActivity : KotlinBaseActivity() {
+class LoginActivity : ApplicationBaseActivity() {
private lateinit var authenticateViewModel: AuthenticateViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var userViewModel: UserViewModel
override fun initLayoutView(): Int = R.layout.activity_login
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
}
override fun initData() {
+ PageNavigationManager.addActivity(this)
+
// 设置默认账号密码
- userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
+ userAccountView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String)
+
authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
-
- authenticateViewModel.keyModel.observe(this) {
- if (it.code == 200) {//用code判断,别的判断可能有坑
- val keyString = it.data!!.publicKey!!
- /**
- * 修改密码需要用到key,先存着
- * */
- AuthenticationHelper.savePublicKey(keyString)
- val publicKey = RSAUtils.keyStrToPublicKey(keyString)
-
- val account = userNameView.text.toString()
- val userPassword = userPasswordView.text.toString()
- val dataByPublicKey =
- RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
- //登录并获取Token,POST请求
- loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
- loginViewModel.enterResultModel.observe(this) { loginResult ->
- if (loginResult.code == 200) {
- AuthenticationHelper.saveToken(loginResult.data!!.token!!)
- /**
- * 获取token之后保存用户信息
- * */
- userViewModel.obtainUserDetail()
- //验证成功登录
- navigatePageTo()
- finish()
- }
- }
- }
- }
}
override fun observeRequestState() {
- authenticateViewModel.loadState.observe(this) {
- LoadingDialogHub.show(this, "登录中,请稍后")
- }
-
- loginViewModel.loadState.observe(this) {
- LoadingDialogHub.dismiss()
+ userViewModel.loadState.observe(this) {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后")
+ else -> LoadingDialogHub.dismiss()
+ }
}
}
override fun initEvent() {
loginButton.setOnClickListener {
- val account = userNameView.text.toString().trim()
- val userPassword = userPasswordView.text.toString().trim()
- if (account.isBlank()) {
- "用户名不能为空".show(this)
+ val userAccount = userAccountView.text.toString()
+ if (userAccount.isBlank()) {
+ "请输入账号".show(this)
return@setOnClickListener
}
+ val userPassword = userPasswordView.text.toString()
if (userPassword.isBlank()) {
- "密码不能为空".show(this)
+ "请输入密码".show(this)
return@setOnClickListener
}
- SaveKeyValues.putValue(LocaleConstant.ACCOUNT, account)
+ SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userAccount)
SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword)
+
authenticateViewModel.obtainPublicKey()
+ authenticateViewModel.keyModel.observe(this) { keyModel ->
+ if (keyModel.code == 200) {
+ val keyString = keyModel.data!!.publicKey!!
+ /**
+ * 修改密码需要用到key,先存着
+ * */
+ AuthenticationHelper.savePublicKey(keyString)
+ val publicKey = RSAUtils.keyStrToPublicKey(keyString)
+
+ val dataByPublicKey = RSAUtils.encryptDataByPublicKey(
+ userPassword.toByteArray(), publicKey!!
+ )
+ userViewModel.enter(keyModel.data!!.sid!!, userAccount, dataByPublicKey)
+ userViewModel.loginResult.observe(this) {
+ if (it.code == 200) {
+ AuthenticationHelper.saveToken(it.data!!.token!!)
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
index 8d97579..36e712f 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
@@ -6,26 +6,24 @@
import androidx.viewpager.widget.ViewPager
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter
-import com.casic.smart.town.sanxi.fragment.MonitorPageFragment
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.fragment.HomePageFragment
import com.casic.smart.town.sanxi.fragment.MorePageFragment
import com.casic.smart.town.sanxi.fragment.OrderPageFragment
import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.show
-import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_main.*
-class MainActivity : KotlinBaseActivity() {
+class MainActivity : ApplicationBaseActivity() {
private var menuItem: MenuItem? = null
private var fragmentPages: ArrayList = ArrayList()
private var clickTime: Long = 0
init {
+ fragmentPages.add(HomePageFragment())
fragmentPages.add(StatisticsPageFragment())
-// fragmentPages.add(MonitorPageFragment())
fragmentPages.add(OrderPageFragment())
fragmentPages.add(MorePageFragment())
}
@@ -33,8 +31,7 @@
override fun initLayoutView(): Int = R.layout.activity_main
override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this))
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
}
override fun initData() {
@@ -49,18 +46,18 @@
bottomNavigation.itemIconTintList = null
bottomNavigation.setOnNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
- R.id.nav_statistics -> {
+ R.id.nav_home -> {
mainViewPager.currentItem = 0
}
-// R.id.nav_monitor -> {
-// mainViewPager.currentItem = 1
-// }
- R.id.nav_order -> {
+ R.id.nav_statistics -> {
mainViewPager.currentItem = 1
}
- R.id.nav_more -> {
+ R.id.nav_order -> {
mainViewPager.currentItem = 2
}
+ R.id.nav_more -> {
+ mainViewPager.currentItem = 3
+ }
}
false
}
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
index e79b646..7283066 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
@@ -2,13 +2,13 @@
import android.content.Context
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.include_base_title.*
-class MonitorRecordActivity : KotlinBaseActivity() {
+class MonitorRecordActivity : ApplicationBaseActivity() {
private val context: Context = this@MonitorRecordActivity
private var dataBeans: MutableList = ArrayList()
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
index 3238f3c..8de52c7 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
@@ -1,39 +1,48 @@
package com.casic.smart.town.sanxi.view
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
+import android.os.CountDownTimer
import com.amap.api.maps.MapsInitializer
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.gyf.immersionbar.ImmersionBar
import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.SaveKeyValues
import pub.devrel.easypermissions.EasyPermissions
-import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
-class PermissionActivity : AppCompatActivity(), PermissionCallbacks {
+class PermissionActivity : ApplicationBaseActivity(), EasyPermissions.PermissionCallbacks {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- ImmersionBar.with(this).statusBarDarkFont(true).init()
- //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
- if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
- startSplashScreenActivity()
- } else {
- EasyPermissions.requestPermissions(
- this@PermissionActivity,
- resources.getString(R.string.app_name) + "需要获取相关权限",
- LocaleConstant.PERMISSIONS_CODE,
- *LocaleConstant.USER_PERMISSIONS
- )
+ private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean
+ private val countDownTimer = object : CountDownTimer(2000, 500) {
+ override fun onFinish() {
+ navigatePageTo()
+ finish()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+
}
}
- private fun startSplashScreenActivity() {
- //先把导航隐私政策声明,后面导航会用到
- MapsInitializer.updatePrivacyAgree(this, true)
- MapsInitializer.updatePrivacyShow(this, true, true)
- this.navigatePageTo()
- finish()
+ override fun initData() {
+ EasyPermissions.requestPermissions(
+ this, resources.getString(R.string.app_name) + "需要获取必要权限",
+ LocaleConstant.PERMISSIONS_CODE, *LocaleConstant.USER_PERMISSIONS
+ )
+ }
+
+ override fun initEvent() {
+
+ }
+
+ override fun initLayoutView(): Int = R.layout.activity_permission
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+ ImmersionBar.with(this).statusBarDarkFont(false).init()
}
override fun onRequestPermissionsResult(
@@ -46,7 +55,16 @@
}
override fun onPermissionsGranted(requestCode: Int, perms: List) {
- startSplashScreenActivity()
+ if (isFirstEnter) {
+ SaveKeyValues.putValue("isFirstEnter", false)
+ //先把导航隐私政策声明,后面导航会用到
+ MapsInitializer.updatePrivacyAgree(this, true)
+ MapsInitializer.updatePrivacyShow(this, true, true)
+ navigatePageTo()
+ finish()
+ } else {
+ countDownTimer.start()
+ }
}
override fun onPermissionsDenied(requestCode: Int, perms: List) {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/SplashScreenActivity.kt
deleted file mode 100644
index 637a8a7..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/SplashScreenActivity.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.casic.smart.town.sanxi.view
-
-import android.annotation.SuppressLint
-import android.os.CountDownTimer
-import androidx.lifecycle.ViewModelProvider
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.vm.UserViewModel
-import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.navigatePageTo
-
-@SuppressLint("CustomSplashScreen")
-class SplashScreenActivity : KotlinBaseActivity() {
-
- private lateinit var userDetailViewModel: UserViewModel
- private val countDownTimer = object : CountDownTimer(1000, 500) {
- override fun onFinish() {
- /**
- * 获取token之后保存用户信息
- * */
- userDetailViewModel.obtainUserDetail()
- userDetailViewModel.userDetailModel.observe(this@SplashScreenActivity) {
- if (it.code == 200) {
- navigatePageTo()
- } else {
- navigatePageTo()
- }
- finish()
- }
- }
-
- override fun onTick(millisUntilFinished: Long) {
-
- }
- }
-
- override fun initLayoutView(): Int = R.layout.activity_splash
-
- override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- }
-
- override fun initData() {
- userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
- }
-
- override fun observeRequestState() {
-
- }
-
- override fun initEvent() {
- countDownTimer.start()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/UpdateDataActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/UpdateDataActivity.kt
index 3c21d30..80dcf17 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/UpdateDataActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/UpdateDataActivity.kt
@@ -3,6 +3,7 @@
import android.graphics.Color
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.InfrastructureModel
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
@@ -10,7 +11,6 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.show
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.activity_update_data.*
import kotlinx.android.synthetic.main.include_base_title.*
-class UpdateDataActivity : KotlinBaseActivity() {
+class UpdateDataActivity : ApplicationBaseActivity() {
private val gson by lazy { Gson() }
private var dataBeans: MutableList = ArrayList()
diff --git a/app/build.gradle b/app/build.gradle
index 71947d2..f912023 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -110,4 +110,6 @@
//图片压缩
implementation 'top.zibin:Luban:1.1.8'
// implementation project(path: ':hatom-video-player')
+ //绕过Android 11反射限制
+ implementation 'com.github.tiann:FreeReflection:3.1.0'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6de45fa..766b62a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,6 @@
-
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
new file mode 100644
index 0000000..ab7fd9f
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/ApplicationBaseActivity.kt
@@ -0,0 +1,68 @@
+package com.casic.smart.town.sanxi.base
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.casic.smart.town.sanxi.view.LoginActivity
+import com.casic.smart.town.sanxi.widgets.GlobeAlertDialog
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.PageNavigationManager
+import com.pengxh.kt.lite.utils.WeakReferenceHandler
+
+abstract class ApplicationBaseActivity : AppCompatActivity() {
+
+ companion object {
+ lateinit var weakReferenceHandler: WeakReferenceHandler
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(initLayoutView())
+ PageNavigationManager.addActivity(this)
+ setupTopBarLayout()
+ initData()
+ observeRequestState()
+ initEvent()
+
+ weakReferenceHandler = WeakReferenceHandler { msg ->
+ if (msg.what == LocaleConstant.OUT) {
+ GlobeAlertDialog(object : GlobeAlertDialog.OnDialogButtonClickListener {
+ override fun onConfirmClick() {
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+
+ override fun onCancelClick() {
+ PageNavigationManager.finishAllActivity()
+ }
+ }).show(supportFragmentManager, "GlobeAlertDialog")
+ }
+ true
+ }
+ }
+
+ /**
+ * 初始化xml布局
+ */
+ abstract fun initLayoutView(): Int
+
+ /**
+ * 特定页面定制沉浸式状态栏
+ */
+ abstract fun setupTopBarLayout()
+
+ /**
+ * 初始化默认数据
+ */
+ abstract fun initData()
+
+ /**
+ * 数据请求状态监听
+ */
+ abstract fun observeRequestState()
+
+ /**
+ * 初始化业务逻辑
+ */
+ abstract fun initEvent()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
index 46b5da9..93b2384 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/base/BaseApplication.kt
@@ -1,7 +1,9 @@
package com.casic.smart.town.sanxi.base
import android.app.Application
+import android.content.Context
import com.pengxh.kt.lite.utils.SaveKeyValues
+import me.weishu.reflection.Reflection
import kotlin.properties.Delegates
class BaseApplication : Application() {
@@ -9,18 +11,24 @@
private val kTag = "BaseApplication"
companion object {
- private var instance: BaseApplication by Delegates.notNull()
+ private var application: BaseApplication by Delegates.notNull()
- fun obtainInstance() = instance
+ fun get() = application
}
override fun onCreate() {
super.onCreate()
- instance = this
+ application = this
SaveKeyValues.initSharedPreferences(this)
// ArcGISRuntimeEnvironment.setLicense(getString(R.string.arcgis_license)) //去掉开发版水印
// ArcGISRuntimeEnvironment.setApiKey(getString(R.string.arcgis_key))
//appKey 为保留字段,目前只需传入null或空字符串即可。
// HatomPlayerSDK.init(this, "", true)
}
+
+ //绕过Android 11以上反射限制
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ Reflection.unseal(base)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
new file mode 100644
index 0000000..4b38feb
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/Context.kt
@@ -0,0 +1,16 @@
+package com.casic.smart.town.sanxi.extensions
+
+import android.content.Context
+import android.view.ViewGroup
+import com.casic.smart.town.sanxi.base.BaseApplication
+import com.pengxh.kt.lite.extensions.dp2px
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+
+fun Context.initLayoutImmersionBar(rootView: ViewGroup) {
+ var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this)
+ if (statusBarHeight == 0) {
+ statusBarHeight = 40f.dp2px(BaseApplication.get())
+ }
+ rootView.setPadding(0, statusBarHeight, 0, 0)
+ rootView.requestLayout()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
index a763c56..1cf6177 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/String.kt
@@ -1,6 +1,7 @@
package com.casic.smart.town.sanxi.extensions
import android.content.Context
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.model.ErrorMessageModel
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.OnImageCompressListener
@@ -18,7 +19,11 @@
if (this.isBlank()) {
return 404
}
- return JSONObject(this).getInt("code")
+ val responseCode = JSONObject(this).getInt("code")
+ if (responseCode == 401) {
+ ApplicationBaseActivity.weakReferenceHandler.sendEmptyMessage(LocaleConstant.OUT)
+ }
+ return responseCode
}
fun String.toErrorMessage(): String {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
new file mode 100644
index 0000000..5493bed
--- /dev/null
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/HomePageFragment.kt
@@ -0,0 +1,22 @@
+package com.casic.smart.town.sanxi.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.casic.smart.town.sanxi.R
+
+
+class HomePageFragment : Fragment() {
+
+ private val kTag = "HomePageFragment"
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ val monitorView = inflater.inflate(R.layout.fragment_home, container, false)
+
+ return monitorView
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
deleted file mode 100644
index 01288a9..0000000
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MonitorPageFragment.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package com.casic.smart.town.sanxi.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.amap.api.location.CoordinateConverter
-import com.casic.smart.town.sanxi.R
-import com.casic.smart.town.sanxi.model.VideoModel
-import com.casic.smart.town.sanxi.view.MonitorRecordActivity
-import com.casic.smart.town.sanxi.vm.VideoViewModel
-import com.pengxh.kt.lite.extensions.navigatePageTo
-import kotlinx.android.synthetic.main.fragment_monitor.view.*
-
-
-class MonitorPageFragment : Fragment() {
-
- private val kTag = "MonitorPageFragment"
- private lateinit var monitorView: View
- private lateinit var videoViewModel: VideoViewModel
-
- /**
- * 所有视频设备列表信息集合
- * */
- private var videoModels: MutableList = ArrayList()
-
- /**
- * 所有的marker
- */
-// private var allMarkerOptions: MutableList = ArrayList()
-//
-// private lateinit var graphics: ListenableList
-// private lateinit var graphicsOverlays: ListenableList
-
- override fun onCreateView(
- inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
- ): View {
- monitorView = inflater.inflate(R.layout.fragment_monitor, container, false)
- //地图初始化
- initMap()
-
- monitorView.rightOperateView.setOnClickListener {
- requireContext().navigatePageTo()
- }
-
- videoViewModel = ViewModelProvider(this)[VideoViewModel::class.java]
- videoViewModel.queryVideoCameraList()
- videoViewModel.resultModel.observe(requireActivity(), {
- if (it.code == 200) {
- val latitudeList: MutableList = ArrayList()
- val longitudeList: MutableList = ArrayList()
-
- it.data?.forEach { video ->
- val lat = video.latitude.toString()
- val lng = video.longitude.toString()
- if (lat.isNotBlank() && lng.isNotBlank()) {
- //返回true代表当前位置在大陆、港澳地区,反之不在
- val latitude = lat.toDouble()
- val longitude = lng.toDouble()
- if (CoordinateConverter.isAMapDataAvailable(latitude, longitude)) {
- //缓存所有设备详情,点击Marker时候需要
- videoModels.add(video)
- //分别缓存经、纬度
- latitudeList.add(latitude)
- longitudeList.add(longitude)
- //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
- }
- }
- }
-
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- }
- })
-
-// val data = requireContext().readAssetsFile("TestLatLng.json")
-// val testData = Gson().fromJson(
-// data, object : TypeToken() {}.type
-// )
-//
-// testData.data.forEach { video ->
-// val lat = video.latitude.toString()
-// val lng = video.longitude.toString()
-// val latitude = lat.toDouble()
-// val longitude = lng.toDouble()
-// //将所有设备信息转化缓存为Marker点
-// allMarkerOptions.add(
-// Point(longitude, latitude, TianDiTuMethods.SRID_2000)
-// )
-// }
-//
-// allMarkerOptions.forEach { p ->
-// val pinDrawable = BitmapDrawable(
-// resources, BitmapFactory.decodeResource(resources, R.mipmap.map_pin)
-// )
-// val pictureMarker = PictureMarkerSymbol(pinDrawable)
-// pictureMarker.height = 24f
-// pictureMarker.width = 24f
-// pictureMarker.loadAsync() //异步加载Marker,防止阻塞
-//
-//
-// val graphicsOverlay = GraphicsOverlay()
-// graphics = graphicsOverlay.graphics
-// graphics.add(Graphic(p, pictureMarker))
-// graphicsOverlays.add(graphicsOverlay)
-// }
- return monitorView
- }
-
- private fun initMap() {
-// //创建底图、并设置底图图层
-// val baseMapLayer = TianDiTuMethods.createTianDiTuTiledLayer(LayerType.TIANDITU_IMAGE_2000)
-// val baseLayerMap = Basemap(baseMapLayer)
-// val chineseAnnotationLayer = TianDiTuMethods.createTianDiTuTiledLayer(
-// LayerType.TIANDITU_IMAGE_ANNOTATION_CHINESE_2000
-// )
-// baseLayerMap.baseLayers.add(chineseAnnotationLayer)
-//
-// val arcGISMap = ArcGISMap(baseLayerMap)
-// //添加自定义arcgis图层
-// val layers = ArrayList()
-// LocaleConstant.LAYER.forEach {
-// layers.add(ArcGISHelper.createFeatureLayer(it))
-// }
-// arcGISMap.operationalLayers.addAll(layers)
-// monitorView.mapView.map = arcGISMap
-// monitorView.mapView.isAttributionTextVisible = false //去掉左下角属性标识
-// monitorView.mapView.setViewpoint(Viewpoint(22.29334127, 113.4937572, 6400.0))
-//
-// //Marker相关Layer
-// graphicsOverlays = monitorView.mapView.graphicsOverlays
- }
-
- private fun clearPictureMarker() {
-// graphics.clear()
-// graphicsOverlays.clear()
- }
-
- /***以下是地图生命周期管理************************************************************************/
- override fun onResume() {
- super.onResume()
-// monitorView.mapView.resume()
- }
-
- override fun onPause() {
- super.onPause()
-// monitorView.mapView.pause()
- }
-
- override fun onDestroy() {
- super.onDestroy()
-// monitorView.mapView.dispose()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
index 107f919..465a05a 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt
@@ -5,6 +5,7 @@
import android.net.Uri
import android.os.Build
import android.os.CountDownTimer
+import android.widget.LinearLayout
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.BuildConfig
@@ -18,7 +19,6 @@
import com.casic.smart.town.sanxi.view.ChangePasswordActivity
import com.casic.smart.town.sanxi.view.LoginActivity
import com.casic.smart.town.sanxi.view.UpdateDataActivity
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.casic.smart.town.sanxi.vm.VersionViewModel
import com.google.gson.Gson
@@ -30,6 +30,7 @@
import com.pengxh.kt.lite.utils.SaveKeyValues
import com.pengxh.kt.lite.vm.LoadState
import com.pengxh.kt.lite.widget.dialog.AlertControlDialog
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_more.*
import java.io.File
@@ -37,19 +38,21 @@
private lateinit var userData: UserDetailModel.Data
private lateinit var userViewModel: UserViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var versionViewModel: VersionViewModel
private lateinit var progressDialog: ProgressDialog
override fun initLayoutView(): Int = R.layout.fragment_more
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java]
//初始化下载对话框
@@ -66,12 +69,12 @@
}
override fun observeRequestState() {
- versionViewModel.loadState.observe(this, {
+ versionViewModel.loadState.observe(this) {
when (it) {
is LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "检查版本中,请稍后")
else -> LoadingDialogHub.dismiss()
}
- })
+ }
}
override fun initEvent() {
@@ -81,7 +84,7 @@
updateUserButton.setOnClickListener {
LoadingDialogHub.show(requireActivity(), "同步中,请稍后...")
- userViewModel.obtainUserDetail()
+ userViewModel.getUserDetail()
}
updateDataLayout.setOnClickListener {
@@ -126,7 +129,7 @@
.setOnDialogButtonClickListener(object :
AlertControlDialog.OnDialogButtonClickListener {
override fun onConfirmClick() {
- loginViewModel.out()
+ userViewModel.out()
}
override fun onCancelClick() {}
@@ -135,16 +138,16 @@
}
private fun dataObserve() {
- userViewModel.userDetailModel.observe(this, {
+ userViewModel.userDetail.observe(this) {
if (it.code == 200) {
LoadingDialogHub.dismiss()
"同步完成".show(requireContext())
userData = it.data
updateUserInfo()
}
- })
+ }
- versionViewModel.versionResultModel.observe(this, {
+ versionViewModel.versionResultModel.observe(this) {
if (BuildConfig.VERSION_NAME == it.version) {
"已是最新版本,无需更新".show(requireContext())
} else {
@@ -165,15 +168,15 @@
}
}).build().show()
}
- })
+ }
- loginViewModel.outResultModel.observe(this, {
+ userViewModel.outResult.observe(this) {
if (it.code == 200) {
AuthenticationHelper.removeToken()
requireContext().navigatePageTo()
PageNavigationManager.finishAllActivity()
}
- })
+ }
}
private fun collectApplicationCache(): Long {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
index 48e029e..bb6a7d8 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.TopViewPagerAdapter
@@ -9,8 +10,8 @@
import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_order.*
-import java.util.*
class OrderPageFragment : KotlinBaseFragment() {
@@ -26,7 +27,11 @@
override fun initLayoutView(): Int = R.layout.fragment_order
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
index 895c56b..23648cb 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt
@@ -1,5 +1,6 @@
package com.casic.smart.town.sanxi.fragment
+import android.widget.LinearLayout
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import com.casic.smart.town.sanxi.R
@@ -24,6 +25,7 @@
import com.pengxh.kt.lite.extensions.timestampToLastWeekDate
import com.pengxh.kt.lite.extensions.toJson
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
import kotlinx.android.synthetic.main.fragment_statistics.*
class StatisticsPageFragment : KotlinBaseFragment() {
@@ -40,7 +42,11 @@
}
override fun setupTopBarLayout() {
-
+ //根据不同设备状态栏高度设置statusBarView高度
+ val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext())
+ val params = statusBarView.layoutParams as LinearLayout.LayoutParams
+ params.height = statusBarHeight
+ statusBarView.requestLayout()
}
override fun initData() {
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
index 18f0652..97b1b6e 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/LocaleConstant.kt
@@ -16,6 +16,7 @@
const val PERMISSIONS_CODE = 999
const val PAGE_LIMIT = 20
+ const val OUT = 2023010101
const val DEFAULT_SERVER_CONFIG = "defaultServerConfig"
const val DEFAULT_SERVER = "http://36.133.189.112:8085"
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
index 2c38ce7..0e561a6 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitService.kt
@@ -36,7 +36,17 @@
* 获取用户信息
*/
@GET("/sys/user/info")
- suspend fun obtainUserDetail(@Header("token") token: String): String
+ suspend fun getUserDetail(@Header("token") token: String): String
+
+ /**
+ * 更新用户信息
+ */
+ @POST("/sys/mgr/update")
+ suspend fun updateUserInfo(
+ @Header("token") token: String,
+ @Body requestBody: RequestBody
+ ): String
+
/**
* 修改密码
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
index 7fcad83..8d8f7fc 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/util/retrofit/RetrofitServiceManager.kt
@@ -2,6 +2,7 @@
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LocaleConstant
+import com.google.gson.JsonObject
import com.pengxh.kt.lite.utils.RetrofitFactory
import com.pengxh.kt.lite.utils.SaveKeyValues
import okhttp3.MediaType.Companion.toMediaType
@@ -33,7 +34,7 @@
/**
* 验证PublicKey
*/
- suspend fun authenticate(): String {
+ suspend fun getPublicKey(): String {
return api.obtainPublicKey()
}
@@ -54,8 +55,38 @@
/**
* 获取用户信息
*/
- suspend fun obtainUserDetail(): String {
- return api.obtainUserDetail(AuthenticationHelper.token!!)
+ suspend fun getUserDetail(): String {
+ return api.getUserDetail(AuthenticationHelper.token!!)
+ }
+
+ /**
+ * 更新用户信息
+ */
+ suspend fun updateUserInfo(
+ id: String,
+ account: String,
+ name: String,
+ deptid: String,
+ roleid: String,
+ avatar: String,
+ sex: String,
+ birthday: String,
+ phone: String
+ ): String {
+ val param = JsonObject()
+ param.addProperty("id", id)
+ param.addProperty("account", account)
+ param.addProperty("name", name)
+ param.addProperty("deptid", deptid)
+ param.addProperty("roleid", roleid)
+ param.addProperty("avatar", avatar)
+ param.addProperty("sex", sex)
+ param.addProperty("birthday", birthday)
+ param.addProperty("phone", phone)
+ val requestBody = param.toString().toRequestBody(
+ "application/json;charset=UTF-8".toMediaType()
+ )
+ return api.updateUserInfo(AuthenticationHelper.token!!, requestBody)
}
/**
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
index 7e43c47..c0d4ef3 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/AboutUsActivity.kt
@@ -2,14 +2,14 @@
import com.casic.smart.town.sanxi.BuildConfig
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_about_us.*
import kotlinx.android.synthetic.main.include_base_title.*
-class AboutUsActivity : KotlinBaseActivity() {
+class AboutUsActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_about_us
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
index a1df629..a4bc829 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/BigImageActivity.kt
@@ -10,14 +10,13 @@
import androidx.viewpager.widget.ViewPager
import com.bumptech.glide.Glide
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.luck.picture.lib.photoview.PhotoView
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.utils.Constant
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_big_image.*
-import java.util.*
-class BigImageActivity : KotlinBaseActivity() {
+class BigImageActivity : ApplicationBaseActivity() {
override fun initLayoutView(): Int = R.layout.activity_big_image
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
index c4468cc..57a954b 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/ChangePasswordActivity.kt
@@ -3,12 +3,12 @@
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.isLetterAndDigit
import com.pengxh.kt.lite.extensions.navigatePageTo
@@ -20,7 +20,7 @@
import kotlinx.android.synthetic.main.include_base_title.*
import java.nio.charset.StandardCharsets
-class ChangePasswordActivity : KotlinBaseActivity() {
+class ChangePasswordActivity : ApplicationBaseActivity() {
private lateinit var userViewModel: UserViewModel
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
index 92fd858..46c0099 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/LoginActivity.kt
@@ -2,96 +2,92 @@
import androidx.lifecycle.ViewModelProvider
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.extensions.initLayoutImmersionBar
import com.casic.smart.town.sanxi.util.AuthenticationHelper
import com.casic.smart.town.sanxi.util.LoadingDialogHub
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.casic.smart.town.sanxi.util.RSAUtils
import com.casic.smart.town.sanxi.vm.AuthenticateViewModel
-import com.casic.smart.town.sanxi.vm.LoginViewModel
import com.casic.smart.town.sanxi.vm.UserViewModel
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.navigatePageTo
import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.PageNavigationManager
import com.pengxh.kt.lite.utils.SaveKeyValues
+import com.pengxh.kt.lite.vm.LoadState
import kotlinx.android.synthetic.main.activity_login.*
-class LoginActivity : KotlinBaseActivity() {
+class LoginActivity : ApplicationBaseActivity() {
private lateinit var authenticateViewModel: AuthenticateViewModel
- private lateinit var loginViewModel: LoginViewModel
private lateinit var userViewModel: UserViewModel
override fun initLayoutView(): Int = R.layout.activity_login
override fun setupTopBarLayout() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
+ initLayoutImmersionBar(rootView)
}
override fun initData() {
+ PageNavigationManager.addActivity(this)
+
// 设置默认账号密码
- userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
+ userAccountView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String)
userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String)
+
authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java]
- loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
-
- authenticateViewModel.keyModel.observe(this) {
- if (it.code == 200) {//用code判断,别的判断可能有坑
- val keyString = it.data!!.publicKey!!
- /**
- * 修改密码需要用到key,先存着
- * */
- AuthenticationHelper.savePublicKey(keyString)
- val publicKey = RSAUtils.keyStrToPublicKey(keyString)
-
- val account = userNameView.text.toString()
- val userPassword = userPasswordView.text.toString()
- val dataByPublicKey =
- RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!)
- //登录并获取Token,POST请求
- loginViewModel.enter(it.data!!.sid!!, account, dataByPublicKey)
- loginViewModel.enterResultModel.observe(this) { loginResult ->
- if (loginResult.code == 200) {
- AuthenticationHelper.saveToken(loginResult.data!!.token!!)
- /**
- * 获取token之后保存用户信息
- * */
- userViewModel.obtainUserDetail()
- //验证成功登录
- navigatePageTo()
- finish()
- }
- }
- }
- }
}
override fun observeRequestState() {
- authenticateViewModel.loadState.observe(this) {
- LoadingDialogHub.show(this, "登录中,请稍后")
- }
-
- loginViewModel.loadState.observe(this) {
- LoadingDialogHub.dismiss()
+ userViewModel.loadState.observe(this) {
+ when (it) {
+ LoadState.Loading -> LoadingDialogHub.show(this, "登录中,请稍后")
+ else -> LoadingDialogHub.dismiss()
+ }
}
}
override fun initEvent() {
loginButton.setOnClickListener {
- val account = userNameView.text.toString().trim()
- val userPassword = userPasswordView.text.toString().trim()
- if (account.isBlank()) {
- "用户名不能为空".show(this)
+ val userAccount = userAccountView.text.toString()
+ if (userAccount.isBlank()) {
+ "请输入账号".show(this)
return@setOnClickListener
}
+ val userPassword = userPasswordView.text.toString()
if (userPassword.isBlank()) {
- "密码不能为空".show(this)
+ "请输入密码".show(this)
return@setOnClickListener
}
- SaveKeyValues.putValue(LocaleConstant.ACCOUNT, account)
+ SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userAccount)
SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword)
+
authenticateViewModel.obtainPublicKey()
+ authenticateViewModel.keyModel.observe(this) { keyModel ->
+ if (keyModel.code == 200) {
+ val keyString = keyModel.data!!.publicKey!!
+ /**
+ * 修改密码需要用到key,先存着
+ * */
+ AuthenticationHelper.savePublicKey(keyString)
+ val publicKey = RSAUtils.keyStrToPublicKey(keyString)
+
+ val dataByPublicKey = RSAUtils.encryptDataByPublicKey(
+ userPassword.toByteArray(), publicKey!!
+ )
+ userViewModel.enter(keyModel.data!!.sid!!, userAccount, dataByPublicKey)
+ userViewModel.loginResult.observe(this) {
+ if (it.code == 200) {
+ AuthenticationHelper.saveToken(it.data!!.token!!)
+ PageNavigationManager.finishAllActivity()
+ navigatePageTo()
+ }
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
index 8d97579..36e712f 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MainActivity.kt
@@ -6,26 +6,24 @@
import androidx.viewpager.widget.ViewPager
import com.casic.smart.town.sanxi.R
import com.casic.smart.town.sanxi.adapter.ViewPagerAdapter
-import com.casic.smart.town.sanxi.fragment.MonitorPageFragment
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
+import com.casic.smart.town.sanxi.fragment.HomePageFragment
import com.casic.smart.town.sanxi.fragment.MorePageFragment
import com.casic.smart.town.sanxi.fragment.OrderPageFragment
import com.casic.smart.town.sanxi.fragment.StatisticsPageFragment
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
-import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.extensions.show
-import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.activity_main.*
-class MainActivity : KotlinBaseActivity() {
+class MainActivity : ApplicationBaseActivity() {
private var menuItem: MenuItem? = null
private var fragmentPages: ArrayList = ArrayList()
private var clickTime: Long = 0
init {
+ fragmentPages.add(HomePageFragment())
fragmentPages.add(StatisticsPageFragment())
-// fragmentPages.add(MonitorPageFragment())
fragmentPages.add(OrderPageFragment())
fragmentPages.add(MorePageFragment())
}
@@ -33,8 +31,7 @@
override fun initLayoutView(): Int = R.layout.activity_main
override fun setupTopBarLayout() {
- ImmersionBar.with(this).statusBarDarkFont(false).init()
- ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this))
+ ImmersionBar.with(this).statusBarDarkFont(true).init()
}
override fun initData() {
@@ -49,18 +46,18 @@
bottomNavigation.itemIconTintList = null
bottomNavigation.setOnNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
- R.id.nav_statistics -> {
+ R.id.nav_home -> {
mainViewPager.currentItem = 0
}
-// R.id.nav_monitor -> {
-// mainViewPager.currentItem = 1
-// }
- R.id.nav_order -> {
+ R.id.nav_statistics -> {
mainViewPager.currentItem = 1
}
- R.id.nav_more -> {
+ R.id.nav_order -> {
mainViewPager.currentItem = 2
}
+ R.id.nav_more -> {
+ mainViewPager.currentItem = 3
+ }
}
false
}
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
index e79b646..7283066 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/MonitorRecordActivity.kt
@@ -2,13 +2,13 @@
import android.content.Context
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.gyf.immersionbar.ImmersionBar
-import com.pengxh.kt.lite.base.KotlinBaseActivity
import com.pengxh.kt.lite.extensions.convertColor
import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil
import kotlinx.android.synthetic.main.include_base_title.*
-class MonitorRecordActivity : KotlinBaseActivity() {
+class MonitorRecordActivity : ApplicationBaseActivity() {
private val context: Context = this@MonitorRecordActivity
private var dataBeans: MutableList = ArrayList()
diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
index 3238f3c..8de52c7 100644
--- a/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
+++ b/app/src/main/java/com/casic/smart/town/sanxi/view/PermissionActivity.kt
@@ -1,39 +1,48 @@
package com.casic.smart.town.sanxi.view
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
+import android.os.CountDownTimer
import com.amap.api.maps.MapsInitializer
import com.casic.smart.town.sanxi.R
+import com.casic.smart.town.sanxi.base.ApplicationBaseActivity
import com.casic.smart.town.sanxi.util.LocaleConstant
import com.gyf.immersionbar.ImmersionBar
import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.utils.SaveKeyValues
import pub.devrel.easypermissions.EasyPermissions
-import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
-class PermissionActivity : AppCompatActivity(), PermissionCallbacks {
+class PermissionActivity : ApplicationBaseActivity(), EasyPermissions.PermissionCallbacks {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- ImmersionBar.with(this).statusBarDarkFont(true).init()
- //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。
- if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) {
- startSplashScreenActivity()
- } else {
- EasyPermissions.requestPermissions(
- this@PermissionActivity,
- resources.getString(R.string.app_name) + "需要获取相关权限",
- LocaleConstant.PERMISSIONS_CODE,
- *LocaleConstant.USER_PERMISSIONS
- )
+ private val isFirstEnter = SaveKeyValues.getValue("isFirstEnter", true) as Boolean
+ private val countDownTimer = object : CountDownTimer(2000, 500) {
+ override fun onFinish() {
+ navigatePageTo()
+ finish()
+ }
+
+ override fun onTick(millisUntilFinished: Long) {
+
}
}
- private fun startSplashScreenActivity() {
- //先把导航隐私政策声明,后面导航会用到
- MapsInitializer.updatePrivacyAgree(this, true)
- MapsInitializer.updatePrivacyShow(this, true, true)
- this.navigatePageTo