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() - 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt index c18c6cf..8ce40fe 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,9 +41,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt index c18c6cf..8ce40fe 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,9 +41,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt index 99077e1..85cafec 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt @@ -30,9 +30,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) loadState.value = LoadState.Fail it.printStackTrace() }) 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt index c18c6cf..8ce40fe 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,9 +41,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt index 99077e1..85cafec 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt @@ -30,9 +30,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) loadState.value = LoadState.Fail it.printStackTrace() }) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index dd1f190..f7a17f7 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -4,39 +4,86 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.CommonResultModel +import com.casic.smart.town.sanxi.model.LoginResultModel import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.LocaleConstant import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val userDetailModel = MutableLiveData() + val loginResult = MutableLiveData() + val userDetail = MutableLiveData() + val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() + val outResult = MutableLiveData() - fun obtainUserDetail() = launch({ - val response = RetrofitServiceManager.obtainUserDetail() + fun enter(sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { - val userDetail = gson.fromJson( - response, object : TypeToken() {}.type + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) - userDetailModel.value = userDetail - SaveKeyValues.putValue(LocaleConstant.USER_DETAIL_MODEL, gson.toJson(userDetail.data)) } else { - val errorModel = UserDetailModel() - errorModel.code = responseCode - userDetailModel.value = errorModel - //如果此次获取不到用户信息,那么就清空之前的用户缓存,然后让用户重新登录 - SaveKeyValues.removeKey(LocaleConstant.USER_DETAIL_MODEL) + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getUserDetail() = launch({ + val response = RetrofitServiceManager.getUserDetail() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetail.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -46,12 +93,31 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt index c18c6cf..8ce40fe 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,9 +41,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt index 99077e1..85cafec 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt @@ -30,9 +30,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) loadState.value = LoadState.Fail it.printStackTrace() }) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index dd1f190..f7a17f7 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -4,39 +4,86 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.CommonResultModel +import com.casic.smart.town.sanxi.model.LoginResultModel import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.LocaleConstant import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val userDetailModel = MutableLiveData() + val loginResult = MutableLiveData() + val userDetail = MutableLiveData() + val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() + val outResult = MutableLiveData() - fun obtainUserDetail() = launch({ - val response = RetrofitServiceManager.obtainUserDetail() + fun enter(sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { - val userDetail = gson.fromJson( - response, object : TypeToken() {}.type + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) - userDetailModel.value = userDetail - SaveKeyValues.putValue(LocaleConstant.USER_DETAIL_MODEL, gson.toJson(userDetail.data)) } else { - val errorModel = UserDetailModel() - errorModel.code = responseCode - userDetailModel.value = errorModel - //如果此次获取不到用户信息,那么就清空之前的用户缓存,然后让用户重新登录 - SaveKeyValues.removeKey(LocaleConstant.USER_DETAIL_MODEL) + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getUserDetail() = launch({ + val response = RetrofitServiceManager.getUserDetail() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetail.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -46,12 +93,31 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 4f9e68f..1434bb5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -29,10 +29,11 @@ ).data } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt index c18c6cf..8ce40fe 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,9 +41,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt index 99077e1..85cafec 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt @@ -30,9 +30,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) loadState.value = LoadState.Fail it.printStackTrace() }) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index dd1f190..f7a17f7 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -4,39 +4,86 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.CommonResultModel +import com.casic.smart.town.sanxi.model.LoginResultModel import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.LocaleConstant import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val userDetailModel = MutableLiveData() + val loginResult = MutableLiveData() + val userDetail = MutableLiveData() + val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() + val outResult = MutableLiveData() - fun obtainUserDetail() = launch({ - val response = RetrofitServiceManager.obtainUserDetail() + fun enter(sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { - val userDetail = gson.fromJson( - response, object : TypeToken() {}.type + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) - userDetailModel.value = userDetail - SaveKeyValues.putValue(LocaleConstant.USER_DETAIL_MODEL, gson.toJson(userDetail.data)) } else { - val errorModel = UserDetailModel() - errorModel.code = responseCode - userDetailModel.value = errorModel - //如果此次获取不到用户信息,那么就清空之前的用户缓存,然后让用户重新登录 - SaveKeyValues.removeKey(LocaleConstant.USER_DETAIL_MODEL) + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getUserDetail() = launch({ + val response = RetrofitServiceManager.getUserDetail() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetail.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -46,12 +93,31 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 4f9e68f..1434bb5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -29,10 +29,11 @@ ).data } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt index 63b29ff..c0f2bee 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt @@ -24,9 +24,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt index c18c6cf..8ce40fe 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,9 +41,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt index 99077e1..85cafec 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt @@ -30,9 +30,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) loadState.value = LoadState.Fail it.printStackTrace() }) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index dd1f190..f7a17f7 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -4,39 +4,86 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.CommonResultModel +import com.casic.smart.town.sanxi.model.LoginResultModel import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.LocaleConstant import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val userDetailModel = MutableLiveData() + val loginResult = MutableLiveData() + val userDetail = MutableLiveData() + val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() + val outResult = MutableLiveData() - fun obtainUserDetail() = launch({ - val response = RetrofitServiceManager.obtainUserDetail() + fun enter(sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { - val userDetail = gson.fromJson( - response, object : TypeToken() {}.type + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) - userDetailModel.value = userDetail - SaveKeyValues.putValue(LocaleConstant.USER_DETAIL_MODEL, gson.toJson(userDetail.data)) } else { - val errorModel = UserDetailModel() - errorModel.code = responseCode - userDetailModel.value = errorModel - //如果此次获取不到用户信息,那么就清空之前的用户缓存,然后让用户重新登录 - SaveKeyValues.removeKey(LocaleConstant.USER_DETAIL_MODEL) + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getUserDetail() = launch({ + val response = RetrofitServiceManager.getUserDetail() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetail.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -46,12 +93,31 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 4f9e68f..1434bb5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -29,10 +29,11 @@ ).data } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt index 63b29ff..c0f2bee 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt @@ -24,9 +24,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index bf214a5..bd75dae 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -37,9 +37,10 @@ map["total"] = convertString(data.getString("total")) countResultModel.value = map } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -62,10 +63,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -80,10 +81,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -98,10 +99,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ 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/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6974d3d..81de949 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -4,6 +4,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub @@ -11,7 +12,6 @@ import com.casic.smart.town.sanxi.vm.OrderViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -23,7 +23,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class CompletedDetailActivity : KotlinBaseActivity() { +class CompletedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index 6705670..fe13615 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -11,6 +11,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -29,7 +30,6 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.adapter.ReadOnlyImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class InHandleDetailActivity : KotlinBaseActivity() { +class InHandleDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt index cc5c388..561f298 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotConfirmedDetailActivity.kt @@ -9,6 +9,7 @@ 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.extensions.combineImagePath import com.casic.smart.town.sanxi.extensions.compressImage import com.casic.smart.town.sanxi.extensions.reformat @@ -26,7 +27,6 @@ import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.adapter.EditableImageAdapter -import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show @@ -42,7 +42,7 @@ import kotlinx.android.synthetic.main.include_base_title.* import java.io.File -class NotConfirmedDetailActivity : KotlinBaseActivity() { +class NotConfirmedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt index 43b94cb..7be8bb8 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/NotProcessedDetailActivity.kt @@ -4,12 +4,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.extensions.toChinese import com.casic.smart.town.sanxi.util.LoadingDialogHub import com.casic.smart.town.sanxi.vm.OperationViewModel import com.casic.smart.town.sanxi.vm.OrderViewModel 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.Constant @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.include_base_order_detail.* import kotlinx.android.synthetic.main.include_base_title.* -class NotProcessedDetailActivity : KotlinBaseActivity() { +class NotProcessedDetailActivity : ApplicationBaseActivity() { private lateinit var jobId: String private lateinit var orderViewModel: OrderViewModel diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt index f159635..1cbf36d 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/AuthenticateViewModel.kt @@ -11,7 +11,6 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState class AuthenticateViewModel : BaseViewModel() { @@ -19,17 +18,17 @@ val keyModel = MutableLiveData() fun obtainPublicKey() = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.authenticate() + val response = RetrofitServiceManager.getPublicKey() val responseCode = response.separateResponseCode() if (responseCode == 200) { keyModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt index 37f1268..d018b0c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/DeviceViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt index 140c0a3..1dd794c 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/InfrastructureViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -47,10 +48,11 @@ loadState.value = LoadState.Success } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt deleted file mode 100644 index 1bff381..0000000 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/LoginViewModel.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.casic.smart.town.sanxi.vm - -import androidx.lifecycle.MutableLiveData -import com.casic.smart.town.sanxi.base.BaseApplication -import com.casic.smart.town.sanxi.extensions.separateResponseCode -import com.casic.smart.town.sanxi.extensions.toErrorMessage -import com.casic.smart.town.sanxi.model.CommonResultModel -import com.casic.smart.town.sanxi.model.LoginResultModel -import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.vm.BaseViewModel -import com.pengxh.kt.lite.vm.LoadState - -class LoginViewModel : BaseViewModel() { - - private val gson by lazy { Gson() } - val enterResultModel = MutableLiveData() - val outResultModel = MutableLiveData() - - fun enter(sid: String, account: String, secretKey: String) = launch({ - val response = RetrofitServiceManager.login(sid, account, secretKey) - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - loadState.value = LoadState.Success - "登录成功".show(BaseApplication.obtainInstance()) - enterResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - loadState.value = LoadState.Fail - it.printStackTrace() - }) - - fun out() = launch({ - val response = RetrofitServiceManager.loginOut() - val responseCode = response.separateResponseCode() - if (responseCode == 200) { - outResultModel.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) - } - }, { - it.printStackTrace() - }) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt index 9286485..f7fc5de 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OperationViewModel.kt @@ -20,13 +20,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "接单成功".show(BaseApplication.obtainInstance()) + "接单成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,13 +41,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单确认成功".show(BaseApplication.obtainInstance()) + "工单确认成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -56,13 +58,14 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success - "工单处理成功".show(BaseApplication.obtainInstance()) + "工单处理成功".show(BaseApplication.get()) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt index ebd687b..12e2f95 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderListViewModel.kt @@ -25,9 +25,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt index ce3b262..1cbf6d9 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/OrderViewModel.kt @@ -29,10 +29,11 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt index c18c6cf..8ce40fe 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/PipeViewModel.kt @@ -26,9 +26,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -40,9 +41,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt index 99077e1..85cafec 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UploadImageViewModel.kt @@ -30,9 +30,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) loadState.value = LoadState.Fail it.printStackTrace() }) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt index dd1f190..f7a17f7 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/UserViewModel.kt @@ -4,39 +4,86 @@ import com.casic.smart.town.sanxi.base.BaseApplication import com.casic.smart.town.sanxi.extensions.separateResponseCode import com.casic.smart.town.sanxi.extensions.toErrorMessage +import com.casic.smart.town.sanxi.model.CommonResultModel +import com.casic.smart.town.sanxi.model.LoginResultModel import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.LocaleConstant import com.casic.smart.town.sanxi.util.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState class UserViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val userDetailModel = MutableLiveData() + val loginResult = MutableLiveData() + val userDetail = MutableLiveData() + val updateResult = MutableLiveData() + val changePwdResult = MutableLiveData() + val outResult = MutableLiveData() - fun obtainUserDetail() = launch({ - val response = RetrofitServiceManager.obtainUserDetail() + fun enter(sid: String, account: String, secretKey: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { - val userDetail = gson.fromJson( - response, object : TypeToken() {}.type + loadState.value = LoadState.Success + loginResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) - userDetailModel.value = userDetail - SaveKeyValues.putValue(LocaleConstant.USER_DETAIL_MODEL, gson.toJson(userDetail.data)) } else { - val errorModel = UserDetailModel() - errorModel.code = responseCode - userDetailModel.value = errorModel - //如果此次获取不到用户信息,那么就清空之前的用户缓存,然后让用户重新登录 - SaveKeyValues.removeKey(LocaleConstant.USER_DETAIL_MODEL) + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) } }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun getUserDetail() = launch({ + val response = RetrofitServiceManager.getUserDetail() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetail.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + roleid: String, + avatar: String, + sex: String, + birthday: String, + phone: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, roleid, avatar, sex, birthday, phone + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -46,12 +93,31 @@ val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success + changePwdResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt index 4f9e68f..1434bb5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VersionViewModel.kt @@ -29,10 +29,11 @@ ).data } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt index 63b29ff..c0f2bee 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/VideoViewModel.kt @@ -24,9 +24,10 @@ response, object : TypeToken() {}.type ) } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt index bf214a5..bd75dae 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/vm/WellViewModel.kt @@ -37,9 +37,10 @@ map["total"] = convertString(data.getString("total")) countResultModel.value = map } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) + response.toErrorMessage().show(BaseApplication.get()) } }, { + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -62,10 +63,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -80,10 +81,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) @@ -98,10 +99,10 @@ ) } else { loadState.value = LoadState.Fail - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) it.printStackTrace() }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/widgets/GlobeAlertDialog.kt b/app/src/main/java/com/casic/smart/town/sanxi/widgets/GlobeAlertDialog.kt new file mode 100644 index 0000000..55a9fab --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/widgets/GlobeAlertDialog.kt @@ -0,0 +1,51 @@ +package com.casic.smart.town.sanxi.widgets + +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.Button +import androidx.fragment.app.DialogFragment +import com.casic.smart.town.sanxi.R +import com.pengxh.kt.lite.extensions.obtainScreenWidth + + +class GlobeAlertDialog(private val listener: OnDialogButtonClickListener) : DialogFragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + val window = dialog?.window + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params = window?.attributes + params?.width = ((context?.obtainScreenWidth()!! * 0.8f).toInt()) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + + val view = inflater.inflate(R.layout.dialog_globe_alert, container, false) + + view.findViewById