package com.cr.cruav import android.Manifest import android.app.Activity import android.content.Context import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.util.DisplayMetrics import android.util.Log import android.view.View import android.view.View.OnClickListener import android.widget.Switch import android.widget.TextView import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.cr.common.DataManager import com.cr.common.DatabaseManager import com.cr.common.FileManager import com.cr.data.CrConfig import com.cr.data.CrUtil import com.cr.data.CrUtil.Companion.onStart import com.cr.dialog.DialogNormal import com.cr.dialog.DialogNormal.DialogNormalListener import com.cr.event.EventFragmentBarAction import com.cr.models.UserModel import com.cr.network.NetManager import com.cr.network.TCPDataTask import com.cr.pages.FragmentSetIpAndCom import com.cr.widget.CrEditTextWidget import com.squareup.otto.Subscribe import kotlinx.android.synthetic.main.av_login.* import org.json.JSONArray class AvLogin : CrActivity(), OnClickListener { // define: 2023/3/31 权限列表 val REQUIRED_PERMISSION_LIST = arrayOf( Manifest.permission.VIBRATE, // VARIABLE: 4/8/21 Manifest.permission.INTERNET, // VARIABLE: 4/8/21 网路权限 Manifest.permission.ACCESS_WIFI_STATE, // VARIABLE: 4/8/21 监测WIFI状态权限 Manifest.permission.ACCESS_COARSE_LOCATION, // Maps Manifest.permission.ACCESS_NETWORK_STATE, // VARIABLE: 4/8/21 检测网络状态权限 Manifest.permission.ACCESS_FINE_LOCATION, // VARIABLE: 4/8/21 定位权限 Manifest.permission.CHANGE_WIFI_STATE, // VARIABLE: 4/8/21 检测Wifi或USB的连接 Manifest.permission.WRITE_EXTERNAL_STORAGE, // Log files Manifest.permission.BLUETOOTH, // VARIABLE: 4/8/21 蓝牙权限 Manifest.permission.BLUETOOTH_ADMIN, // VARIABLE: 4/8/21 蓝牙权限 Manifest.permission.READ_EXTERNAL_STORAGE, // Log files Manifest.permission.READ_PHONE_STATE, // VARIABLE: 4/8/21 读取手机状态权限 Manifest.permission.RECORD_AUDIO // VARIABLE: 4/8/21 录音权限 ) // define: 2023/3/31 动态权限列表 private val missingPermission = arrayListOf() // define: 2023/3/31 权限检测返回码 private val REQUEST_PERMISSION_CODE: Int = 12345 // define: 2023/3/30 设置页面 var fragIpAndCom: FragmentSetIpAndCom? = null // define: 2023/4/6 初始化控件 var lblVersion: TextView? = null var txtUserName: CrEditTextWidget? = null var txtPassword: CrEditTextWidget? = null var switchSavePassword: Switch? = null /** * 创建视图 * @param savedInstanceState Bundle? */ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.av_login) // todo: 2023/4/10 初始化上下文 this.context = this // todo: 2023/3/30 初始化页面 fragIpAndCom = FragmentSetIpAndCom() fragIpAndCom?.let { addFragment(it, R.id.av_frm_left_panel) hideFragment(it) } // todo: 2023/4/6 初始化控件 joinControls() // todo: 2023/3/30 注册事件 registerListener(); // todo: 2023/3/31 检测权限 checkAndRequestPermissions() // var displayMetrics = DisplayMetrics() // var windowManager: WindowManager = // this.getSystemService(Context.WINDOW_SERVICE) as WindowManager // windowManager.defaultDisplay.getMetrics(displayMetrics) // var screenWidth = this.convertPixelsToDp(displayMetrics.widthPixels.toFloat()) // var screenHeight = this.convertPixelsToDp(displayMetrics.heightPixels.toFloat()) // // CrUtil.print("---w:$screenWidth---h:$screenHeight") // todo: 2023/4/3 订阅事件 CrApplication.getEventBus().register(this) } fun Context.convertPixelsToDp(px: Float): Float { val resources = this.resources val metrics = resources.displayMetrics return px / (metrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT) } /** * 重写挂载控件事件 */ override fun joinControls() { super.joinControls() // todo: 2023/4/6 初始化版本信息 lblVersion = findViewById(R.id.login_version) lblVersion?.text = "{${CrUtil.getVersionName(this)}}" // todo: 2023/4/6 初始化账号密码 txtUserName = findViewById(R.id.login_username) txtPassword = findViewById(R.id.login_password) txtPassword?.setIsPassword(true) switchSavePassword = findViewById(R.id.switch_password) } /** * 页面初始化 */ private fun initPage() { // todo: 2023/4/6 获取存储的用户并显示 var user: UserModel = DataManager.getUser() txtUserName?.setContent(user.userId!!) txtPassword?.setContent(user.userPwd!!) } /** * 重写注册事件 */ override fun registerListener() { super.registerListener() // todo: 2023/3/30 挂在开关事件 switch_password.setOnCheckedChangeListener { compoundButton, b -> Log.i(compoundButton.toString(), b.toString()); switch_password.setSwitchTextAppearance(this, R.style.switch_text_on); } // todo: 2023/3/30 注册登录事件 login_btn_login.setOnClickListener(this) // todo: 2023/3/30 注册设置事件 login_btn_set.setOnClickListener(this) } /** * 覆写点击事件 * @param p0 View */ override fun onClick(p0: View?) { when (p0!!.id) { R.id.login_btn_login -> { var userName: String? = txtUserName?.checkBlank("请输入账号!") ?: return var passWord: String? = txtPassword?.checkBlank("请输入密码!") ?: return var isSave: Boolean? = switchSavePassword?.isChecked checkUserInfo(userName!!, passWord!!, isSave!!) } R.id.login_btn_set -> { fragIpAndCom?.let { showFragment(it) } } } } /** * 登录验证 * @param userName String 账号 * @param password String 密码 * @param isSave Boolean 是否保存 */ private fun checkUserInfo(userName: String, password: String, isSave: Boolean) { if (isSave) { if (DataManager.saveUser(userName, password)) { // todo: 2023/4/10 登录系统 login(userName, password) } } else { if (DataManager.deleteUser()) // todo: 2023/4/10 登录系统 login(userName, password) } } /** * 登录系统 * @param userName String 账号Id * @param password String 密码 */ private fun login(userName: String, password: String) { var user = UserModel(userName, password) // todo: 2023/4/10 向服务器发起认证消息 TCPDataTask.getInstance().sendJSON( NetManager.getServerUrl("appQueryUser"), user, object : TCPDataTask.OnChangeListener { // todo: 2023/4/10 成功 override fun onSuccess(jsonArray: JSONArray) { CrConfig.user = UserModel.toModel(jsonArray.optString(0)) context!!.onStart() } // todo: 2023/4/10 失败 override fun onFailed(message: String) { showError(message) } },context,"认证中...") } /** * 检测权限 */ private fun checkAndRequestPermissions() { for (eachPermission in REQUIRED_PERMISSION_LIST) { if (ContextCompat.checkSelfPermission( this, eachPermission ) != PackageManager.PERMISSION_GRANTED ) { missingPermission.add(eachPermission) } } // TODO: 4/8/21 请求缺少的权限 if (missingPermission.isEmpty()) { init() } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions( (this as Activity?)!!, missingPermission.toTypedArray(), REQUEST_PERMISSION_CODE ) // todo: 2023/3/31 权限不足 重启App DialogNormal(this, "操作提示", "权限检测异常,请手动开启后重启App!", object : DialogNormalListener { override fun completion() { checkAndRequestPermissions() } override fun close() { } }).show() } } /** * 初始化 */ private fun init() { // todo: 2023/3/31 检查并创建工程文件夹 if (!FileManager.isExists(CrUtil.PROJECT_PATH)) { if (!FileManager.createFolder(CrUtil.PROJECT_PATH)) { CrUtil.showMessage("工程文件夹创建失败,请检查权限!") } } // todo: 2023/3/31 检查并创建资源文件夹 if (!FileManager.isExists(CrUtil.IMAGE_PATH)) { if (!FileManager.createFolder(CrUtil.IMAGE_PATH)) { CrUtil.showMessage("资源文件夹创建失败,请检查权限!") } } // todo: 2023/3/31 检查并创建缓存文件夹 if (!FileManager.isExists(CrUtil.PROJECT_CACHE_PATH)) { if (!FileManager.createFolder(CrUtil.PROJECT_CACHE_PATH)) { CrUtil.showMessage("缓存文件夹创建失败,请检查权限!") } } // todo: 2023/3/31 检查并创建配置文件夹 if (!FileManager.isExists(CrUtil.CONFIG_PATH)) { if (!FileManager.createFolder(CrUtil.CONFIG_PATH)) { CrUtil.showMessage("配置文件夹创建失败,请检查权限!") } } // todo: 2023/4/3 拷贝配置库 FileManager.MoveDataBase(this) // todo: 2023/4/3 判断数据库是否存在 存在则启动 var databaseIsOpen: Boolean = DatabaseManager.getInstance().openConfigDatabase() // todo: 2023/4/3 最终判断是否可以正常使用App if (FileManager.isExists(CrUtil.PROJECT_PATH) && FileManager.isExists(CrUtil.IMAGE_PATH) && FileManager.isExists( CrUtil.PROJECT_CACHE_PATH ) && FileManager.isExists(CrUtil.CONFIG_PATH) && FileManager.isExists(CrUtil.DATABASE_PATH) && databaseIsOpen ) { // todo: 2023/4/3 自检通过 可正常使用 DialogNormal(this, "操作提示", "系统自检通过,可正常使用!").show() // todo: 2023/4/6 页面初始化显示 initPage() } else { // todo: 2023/4/3 自检异常 重启App自检 DialogNormal(this, "操作提示", "系统自检异常,请重启App!", object : DialogNormalListener { override fun completion() { init() } override fun close() { } }).show() } } /** * 订阅Fragment管理事件 * @param event EventFragmentBarAction */ @Subscribe fun onFragmentBar(event: EventFragmentBarAction) { hideFragment(fragIpAndCom!!) } // todo: 2023/4/3 生命周期相关方法 /** * 销毁 */ override fun onDestroy() { CrApplication.getEventBus().unregister(this) super.onDestroy() } /** * 重新激活 */ override fun onResume() { super.onResume() } }