feat: 添加Realm-Java依赖

This commit is contained in:
2023-03-31 11:37:33 +08:00
18 changed files with 386 additions and 75 deletions

View File

@@ -2,12 +2,16 @@ package com.navinfo.omqs.ui.activity.login
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.databinding.DataBindingUtil
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.ActivityLoginBinding
import com.navinfo.omqs.ui.activity.map.MainActivity
import com.navinfo.omqs.ui.activity.PermissionsActivity
import com.navinfo.omqs.ui.activity.map.MainActivity
/**
* 登陆页面
@@ -16,18 +20,71 @@ class LoginActivity : PermissionsActivity() {
private lateinit var binding: ActivityLoginBinding
private val viewModel by viewModels<LoginViewModel>()
private var loginDialog: AlertDialog? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_login)
binding.loginUserModel = viewModel
binding.lifecycleOwner = this
binding.activity = this
initView()
}
private fun initView() {
//登录校验,初始化成功
viewModel.loginStatus.observe(this) {
when (it) {
LoginStatus.LOGIN_STATUS_NET_LOADING -> {
loginDialog("验证用户信息...")
}
LoginStatus.LOGIN_STATUS_FOLDER_INIT -> {
loginDialog("检查本地数据...")
}
LoginStatus.LOGIN_STATUS_FOLDER_FAILURE -> {
Toast.makeText(this, "文件夹初始化失败", Toast.LENGTH_SHORT).show()
loginDialog?.dismiss()
loginDialog = null
}
LoginStatus.LOGIN_STATUS_NET_FAILURE -> {
Toast.makeText(this, "网络访问失败", Toast.LENGTH_SHORT).show()
loginDialog?.dismiss()
loginDialog = null
}
LoginStatus.LOGIN_STATUS_SUCCESS -> {
val intent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)
// finish()
loginDialog?.dismiss()
loginDialog = null
}
LoginStatus.LOGIN_STATUS_CANCEL -> {
loginDialog?.dismiss()
loginDialog = null
}
}
}
}
/**
* 登录dialog
*/
private fun loginDialog(message: String) {
if (loginDialog == null) {
loginDialog = MaterialAlertDialogBuilder(
this, com.google.android.material.R.style.MaterialAlertDialog_Material3
).setTitle("登录").setMessage(message).show()
loginDialog!!.setCanceledOnTouchOutside(true)
loginDialog!!.setOnCancelListener {
viewModel.cancelLogin()
}
} else {
loginDialog!!.setMessage(message)
}
}
//进应用根本不调用,待查
override fun onPermissionsGranted() {
// 获取权限后初始化Realm设置
viewModel
Log.e("jingo","调用了吗")
}
override fun onPermissionsDenied() {
@@ -37,8 +94,8 @@ class LoginActivity : PermissionsActivity() {
* 处理登录按钮
*/
fun onClickLoginButton() {
val intent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)
// finish()
viewModel.onClickLoginBtn(
this, binding.loginUsername.text.toString(), binding.loginPassword.text.toString()
)
}
}
}

View File

@@ -1,23 +1,79 @@
package com.navinfo.omqs.ui.activity.login
import android.content.Context
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.LoginUserBean
import com.navinfo.omqs.bean.OfflineMapCityBean
import io.realm.kotlin.RealmConfiguration
import com.navinfo.omqs.bean.OfflineMapCityRealmObject
import io.realm.Realm
import io.realm.RealmConfiguration
import kotlinx.coroutines.*
import okio.ByteString.Companion.toByteString
import okio.IOException
import java.io.File
import java.math.BigInteger
class LoginViewModel : ViewModel() {
enum class LoginStatus {
/**
* 访问服务器登陆中
*/
LOGIN_STATUS_NET_LOADING,
/**
* 初始化文件夹
*/
LOGIN_STATUS_FOLDER_INIT,
/**
* 创建文件夹失败
*/
LOGIN_STATUS_FOLDER_FAILURE,
/**
* 网络访问失败
*/
LOGIN_STATUS_NET_FAILURE,
/**
* 成功
*/
LOGIN_STATUS_SUCCESS,
/**
* 取消
*/
LOGIN_STATUS_CANCEL,
}
class LoginViewModel(
) : ViewModel() {
//用户信息
val loginUser: MutableLiveData<LoginUserBean> = MutableLiveData()
//是不是登录成功
val loginStatus: MutableLiveData<LoginStatus> = MutableLiveData()
var jobLogin: Job? = null;
init {
loginUser.value = LoginUserBean(username = "admin", password = "123456")
}
fun initRealm() {
val config = RealmConfiguration.Builder(schema = setOf(OfflineMapCityBean::class)).directory(
)
val password = "password".encodeToByteArray().copyInto(ByteArray(64))
// 1110000011000010111001101110011011101110110111101110010011001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Log.d("", "密码是: ${BigInteger(1, password).toString(2).padStart(64, '0')}")
val config = RealmConfiguration.Builder()
.directory(File(Constant.DATA_PATH))
.name("HDData")
// .encryptionKey(password)
.build()
Constant.realm = Realm.getInstance(config)
}
/**
@@ -27,4 +83,87 @@ class LoginViewModel : ViewModel() {
loginUser.value!!.username = "admin2"
loginUser.postValue(loginUser.value)
}
/**
* 点击
*/
fun onClickLoginBtn(context: Context, userName: String, password: String) {
if (userName.isEmpty()) {
Toast.makeText(context, "请输入用户名", Toast.LENGTH_SHORT).show()
}
if (password.isEmpty()) {
Toast.makeText(context, "请输入密码", Toast.LENGTH_SHORT).show()
}
//不指定IO会在主线程里运行
jobLogin = viewModelScope.launch(Dispatchers.IO) {
loginCheck(context, userName, password)
Log.e("jingo", "运行完了1${Thread.currentThread().name}")
}
}
/**
* 如果不用挂起函数的方式直接把下面这段代码替换到上面在delay之后线程和delay之前不是同一个有啥影响未知。。。
*/
private suspend fun loginCheck(context: Context, userName: String, password: String) {
Log.e("jingo", "我在哪个线程里?${Thread.currentThread().name}")
//上面调用了线程切换,这里不用调用,即使调用了还是在同一个线程中,除非自定义协程域?(待验证)
// withContext(Dispatchers.IO) {
Log.e("jingo", "delay之前${Thread.currentThread().name}")
//网络访问
loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_LOADING)
//假装网络访问等待3秒
delay(3000)
//文件夹初始化
try {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT)
createRootFolder(context)
// 初始化Realm
initRealm()
} catch (e: IOException) {
loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE)
}
//假装解压文件等
delay(1000)
loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS)
Log.e("jingo", "delay之后${Thread.currentThread().name}")
// }
}
@Throws(IOException::class)
private fun createRootFolder(context: Context) {
// 在SD卡创建项目目录
val sdCardPath = context.getExternalFilesDir(null)
sdCardPath?.let {
Constant.ROOT_PATH = sdCardPath.absolutePath
Constant.MAP_PATH = Constant.ROOT_PATH + "/map/"
Constant.DATA_PATH = Constant.ROOT_PATH + "/data/"
with(File(Constant.MAP_PATH)) {
if(!this.exists()) this.mkdirs()
}
with(File(Constant.DATA_PATH)) {
if(!this.exists()) this.mkdirs()
}
}
}
/**
* 取消登录
*/
fun cancelLogin() {
Log.e("jingo", "取消了?${Thread.currentThread().name}")
jobLogin?.let {
it.cancel()
loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL)
}
}
override fun onCleared() {
super.onCleared()
cancelLogin()
}
}

View File

@@ -1,12 +1,14 @@
package com.navinfo.omqs.ui.activity.map
import android.os.Bundle
import android.provider.ContactsContract.Contacts
import android.util.Log
import androidx.activity.viewModels
import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.viewModelScope
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.omqs.Constant
import com.navinfo.omqs.R
import com.navinfo.omqs.databinding.ActivityMainBinding
import com.navinfo.omqs.ui.activity.BaseActivity
@@ -32,7 +34,12 @@ class MainActivity : BaseActivity() {
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
//初始化地图
mapController.init(this, binding.mapView.mainActivityMap)
mapController.init(
this,
binding.mapView.mainActivityMap,
null,
Constant.ROOT_PATH + "/map/"
)
//关联生命周期
binding.lifecycleOwner = this
//给xml转递对象
@@ -59,7 +66,7 @@ class MainActivity : BaseActivity() {
super.onDestroy()
mapController.mMapView.onDestroy()
mapController.locationLayerHandler.stopLocation()
Log.e("jingo","MainActivity 销毁")
Log.e("jingo", "MainActivity 销毁")
}
override fun onResume() {