Przeglądaj źródła

1、登录功能完成,对应接口及JSON解析完成
2、更改AppId,首页底部内容完善

不会爬树的猴 2 lat temu
rodzic
commit
c5b9b01344
88 zmienionych plików z 571 dodań i 59 usunięć
  1. 1 1
      app/build.gradle
  2. 1 1
      app/src/main/AndroidManifest.xml
  3. 47 27
      app/src/main/java/com/cr/cruav/AvLogin.kt
  4. 12 1
      app/src/main/java/com/cr/cruav/AvMain.kt
  5. 40 1
      app/src/main/java/com/cr/cruav/CrActivity.kt
  6. 16 0
      app/src/main/java/com/cr/data/CrConfig.kt
  7. 13 2
      app/src/main/java/com/cr/data/utils.kt
  8. 75 0
      app/src/main/java/com/cr/dialog/DialogLoadingUtil.kt
  9. 18 11
      app/src/main/java/com/cr/models/UserModel.kt
  10. 17 0
      app/src/main/java/com/cr/models/iJSONModel.kt
  11. 5 4
      app/src/main/java/com/cr/models/iNetDataModel.kt
  12. 86 9
      app/src/main/java/com/cr/network/TCPDataTask.kt
  13. 7 0
      app/src/main/res/drawable/back_loading.xml
  14. 17 0
      app/src/main/res/drawable/btn_tools_normal.xml
  15. 17 0
      app/src/main/res/drawable/btn_tools_select.xml
  16. 5 0
      app/src/main/res/drawable/btn_tools_selector.xml
  17. BIN
      app/src/main/res/drawable/ico_user.png
  18. BIN
      app/src/main/res/drawable/tools_addwaypoint.png
  19. BIN
      app/src/main/res/drawable/tools_air.png
  20. BIN
      app/src/main/res/drawable/tools_back.png
  21. BIN
      app/src/main/res/drawable/tools_back1.png
  22. BIN
      app/src/main/res/drawable/tools_camera_other.png
  23. BIN
      app/src/main/res/drawable/tools_camera_photoshop.png
  24. BIN
      app/src/main/res/drawable/tools_camera_startvideo.png
  25. BIN
      app/src/main/res/drawable/tools_camera_stopvideo.png
  26. BIN
      app/src/main/res/drawable/tools_compass_ico.png
  27. BIN
      app/src/main/res/drawable/tools_deleteall.png
  28. BIN
      app/src/main/res/drawable/tools_download.png
  29. BIN
      app/src/main/res/drawable/tools_downloadnetwork.png
  30. BIN
      app/src/main/res/drawable/tools_gohome.png
  31. BIN
      app/src/main/res/drawable/tools_info.png
  32. BIN
      app/src/main/res/drawable/tools_ip_set.png
  33. BIN
      app/src/main/res/drawable/tools_layer.png
  34. BIN
      app/src/main/res/drawable/tools_mession.png
  35. BIN
      app/src/main/res/drawable/tools_querymedia.png
  36. BIN
      app/src/main/res/drawable/tools_savety.png
  37. BIN
      app/src/main/res/drawable/tools_set.png
  38. BIN
      app/src/main/res/drawable/tools_startico.png
  39. BIN
      app/src/main/res/drawable/tools_startty.png
  40. BIN
      app/src/main/res/drawable/tools_stopty.png
  41. BIN
      app/src/main/res/drawable/tools_tools.png
  42. BIN
      app/src/main/res/drawable/tools_ty.png
  43. BIN
      app/src/main/res/drawable/tools_update_no.png
  44. BIN
      app/src/main/res/drawable/tools_upload.png
  45. BIN
      app/src/main/res/drawable/tools_upload1.png
  46. BIN
      app/src/main/res/drawable/tools_upload2.png
  47. BIN
      app/src/main/res/drawable/tools_weixin_close.png
  48. BIN
      app/src/main/res/drawable/tools_weixin_start.png
  49. BIN
      app/src/main/res/drawable/tools_window.png
  50. BIN
      app/src/main/res/drawable/top_back.png
  51. BIN
      app/src/main/res/drawable/top_back_center.png
  52. BIN
      app/src/main/res/drawable/top_back_left.png
  53. BIN
      app/src/main/res/drawable/top_back_right.png
  54. BIN
      app/src/main/res/drawable/ty_clear.png
  55. BIN
      app/src/main/res/drawable/ty_delete.png
  56. BIN
      app/src/main/res/drawable/ty_save.png
  57. BIN
      app/src/main/res/drawable/upload_server.png
  58. 61 2
      app/src/main/res/layout/av_main.xml
  59. 29 0
      app/src/main/res/layout/dig_loading.xml
  60. 48 0
      app/src/main/res/layout/tools_top.xml
  61. BIN
      app/src/main/res/mipmap-hdpi/loading.png
  62. 1 0
      app/src/main/res/values-sw1024dp/dimens.xml
  63. 1 0
      app/src/main/res/values-sw1280dp/dimens.xml
  64. 1 0
      app/src/main/res/values-sw1365dp/dimens.xml
  65. 1 0
      app/src/main/res/values-sw240dp/dimens.xml
  66. 1 0
      app/src/main/res/values-sw320dp/dimens.xml
  67. 1 0
      app/src/main/res/values-sw384dp/dimens.xml
  68. 1 0
      app/src/main/res/values-sw392dp/dimens.xml
  69. 1 0
      app/src/main/res/values-sw400dp/dimens.xml
  70. 1 0
      app/src/main/res/values-sw410dp/dimens.xml
  71. 1 0
      app/src/main/res/values-sw411dp/dimens.xml
  72. 1 0
      app/src/main/res/values-sw432dp/dimens.xml
  73. 1 0
      app/src/main/res/values-sw480dp/dimens.xml
  74. 1 0
      app/src/main/res/values-sw533dp/dimens.xml
  75. 1 0
      app/src/main/res/values-sw592dp/dimens.xml
  76. 1 0
      app/src/main/res/values-sw600dp/dimens.xml
  77. 1 0
      app/src/main/res/values-sw640dp/dimens.xml
  78. 1 0
      app/src/main/res/values-sw662dp/dimens.xml
  79. 1 0
      app/src/main/res/values-sw720dp/dimens.xml
  80. 1 0
      app/src/main/res/values-sw768dp/dimens.xml
  81. 1 0
      app/src/main/res/values-sw800dp/dimens.xml
  82. 1 0
      app/src/main/res/values-sw811dp/dimens.xml
  83. 1 0
      app/src/main/res/values-sw820dp/dimens.xml
  84. 1 0
      app/src/main/res/values-sw960dp/dimens.xml
  85. 1 0
      app/src/main/res/values-sw961dp/dimens.xml
  86. 1 0
      app/src/main/res/values/colors.xml
  87. 1 0
      app/src/main/res/values/dimens.xml
  88. 30 0
      app/src/main/res/values/themes.xml

+ 1 - 1
app/build.gradle

@@ -10,7 +10,7 @@ android {
     buildToolsVersion "30.0.2"
 
     defaultConfig {
-        applicationId "com.cr.uavapp"
+        applicationId "com.cr.cruav"
         minSdkVersion 24
         targetSdkVersion 30
         versionCode 1

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -46,7 +46,7 @@
 
         <meta-data
             android:name="com.dji.sdk.API_KEY"
-            android:value="90d645c7234f497ebd32cd6a" />
+            android:value="9ca142bd221858778ce319da" />
 
         <activity android:name=".AvLogin">
             <intent-filter>

+ 47 - 27
app/src/main/java/com/cr/cruav/AvLogin.kt

@@ -2,9 +2,7 @@ package com.cr.cruav
 
 import android.Manifest
 import android.app.Activity
-import android.app.ActivityManager
 import android.content.Context
-import android.content.Intent
 import android.content.pm.PackageManager
 import android.os.Build
 import android.os.Bundle
@@ -12,16 +10,16 @@ import android.util.DisplayMetrics
 import android.util.Log
 import android.view.View
 import android.view.View.OnClickListener
-import android.view.WindowManager
 import android.widget.Switch
 import android.widget.TextView
 import androidx.core.app.ActivityCompat
 import androidx.core.content.ContextCompat
-import androidx.core.content.PermissionChecker
 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
@@ -53,10 +51,10 @@ class AvLogin : CrActivity(), OnClickListener {
     )
 
     // define: 2023/3/31 动态权限列表
-    val missingPermission = arrayListOf<String>()
+    private val missingPermission = arrayListOf<String>()
 
     // define: 2023/3/31 权限检测返回码
-    val REQUEST_PERMISSION_CODE: Int = 12345
+    private val REQUEST_PERMISSION_CODE: Int = 12345
 
     // define: 2023/3/30 设置页面
     var fragIpAndCom: FragmentSetIpAndCom? = null
@@ -65,7 +63,7 @@ class AvLogin : CrActivity(), OnClickListener {
     var lblVersion: TextView? = null
     var txtUserName: CrEditTextWidget? = null
     var txtPassword: CrEditTextWidget? = null
-    var switchSavePassword :Switch? = null
+    var switchSavePassword: Switch? = null
 
     /**
      * 创建视图
@@ -74,6 +72,8 @@ class AvLogin : CrActivity(), OnClickListener {
     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 {
@@ -117,15 +117,16 @@ class AvLogin : CrActivity(), OnClickListener {
         // 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(){
+    private fun initPage() {
         // todo: 2023/4/6 获取存储的用户并显示
-        var user:UserModel = DataManager.getUser()
+        var user: UserModel = DataManager.getUser()
         txtUserName?.setContent(user.userId!!)
         txtPassword?.setContent(user.userPwd!!)
     }
@@ -155,8 +156,8 @@ class AvLogin : CrActivity(), OnClickListener {
             R.id.login_btn_login -> {
                 var userName: String? = txtUserName?.checkBlank("请输入账号!") ?: return
                 var passWord: String? = txtPassword?.checkBlank("请输入密码!") ?: return
-                var isSave:Boolean? = switchSavePassword?.isChecked
-                login(userName!!,passWord!!,isSave!!)
+                var isSave: Boolean? = switchSavePassword?.isChecked
+                checkUserInfo(userName!!, passWord!!, isSave!!)
             }
             R.id.login_btn_set -> {
                 fragIpAndCom?.let {
@@ -173,27 +174,46 @@ class AvLogin : CrActivity(), OnClickListener {
      * @param password String 密码
      * @param isSave Boolean 是否保存
      */
-    private fun login(userName:String,password:String,isSave:Boolean){
-        if(isSave){
-            if(DataManager.saveUser(userName,password)) {
-                CrUtil.showMessage("登录成功并保存")
-                var user:UserModel = UserModel(userName, password)
-                TCPDataTask.getInstance().sendJSON(NetManager.getServerUrl("appQueryUser"),user,object :TCPDataTask.OnChangeListener{
-                    override fun onSuccess(jsonArray: JSONArray) {
-                        CrUtil.print(jsonArray.optString(0))
-                    }
-                    override fun onFailed(message: String) {
-                        CrUtil.print(message)
-                    }
-                })
+    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())
-                CrUtil.showMessage("登录成功不保存")
+        } 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<AvMain>()
+                }
+
+                // todo: 2023/4/10 失败
+                override fun onFailed(message: String) {
+                    showError(message)
+                }
+            },context,"认证中...")
+    }
+
+
+    /**
      * 检测权限
      */
     private fun checkAndRequestPermissions() {

+ 12 - 1
app/src/main/java/com/cr/cruav/AvMain.kt

@@ -3,6 +3,7 @@ package com.cr.cruav
 import android.annotation.SuppressLint
 import android.os.Bundle
 import android.widget.FrameLayout
+import android.widget.TextView
 import androidx.activity.viewModels
 
 import androidx.appcompat.app.AppCompatActivity
@@ -11,6 +12,7 @@ import androidx.constraintlayout.widget.ConstraintLayout.LayoutParams
 import androidx.fragment.app.FragmentTransaction
 import androidx.fragment.app.commit
 import androidx.fragment.app.commitNow
+import com.cr.data.CrConfig
 import com.cr.data.CrUtil
 import com.cr.pages.FragmentFPV
 import com.cr.pages.FragmentMap
@@ -50,7 +52,6 @@ class AvMain : AppCompatActivity() {
     // define: 2023/3/14 图传窗口是不是小窗口
     private var isFpvSmallWindow:Boolean = true
 
-    private var viewLayoutParams:ConstraintLayout.LayoutParams? = null
 
     /**
      * 入口函数
@@ -69,6 +70,16 @@ class AvMain : AppCompatActivity() {
         registerApp();
         // todo: 2023/3/11 初始化视图
         initView()
+        // todo: 2023/4/10 初始化页面
+        initPage()
+    }
+
+    /**
+     * 初始化页面
+     */
+    private fun initPage(){
+        // todo: 2023/4/10 显示登录账号
+        av_main_lbl_user.text = CrConfig.user?.userName
     }
 
     /**

+ 40 - 1
app/src/main/java/com/cr/cruav/CrActivity.kt

@@ -1,12 +1,15 @@
 package com.cr.cruav
 
+import android.content.Context
 import android.os.Handler
 import android.os.Looper
+import android.os.Message
 import androidx.appcompat.app.AppCompatActivity
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
 import androidx.fragment.app.FragmentManager
 import androidx.fragment.app.FragmentTransaction
+import com.cr.dialog.DialogNormal
 
 /**
  * 操作系统:MAC系统
@@ -15,8 +18,22 @@ import androidx.fragment.app.FragmentTransaction
  * 描述:窗体基类
  */
 open class CrActivity : AppCompatActivity() {
+    // define: 2023/4/10 信息标识符号
+    val MSG_INFO_SHOW_DIALOG:Int = 1
+    val MSG_ERROR_SHOW_DIALOG:Int =2
     // define: 2023/3/10 创建主线程Looper
-    private var mainHandler = Handler(Looper.getMainLooper())
+    private var mainHandler = object:Handler(Looper.getMainLooper()){
+        // todo: 2023/4/10 接收消息
+        override fun handleMessage(msg: Message) {
+            if(msg.what == MSG_INFO_SHOW_DIALOG){
+                DialogNormal(context!!,"提示",msg.obj.toString()).show()
+            }else if(msg.what == MSG_ERROR_SHOW_DIALOG){
+                DialogNormal(context!!,"错误",msg.obj.toString()).show()
+            }
+        }
+    }
+    // define: 2023/4/10 上下文
+    protected var context:Context?= null
 
     /**
      * 扩展函数
@@ -81,6 +98,28 @@ open class CrActivity : AppCompatActivity() {
     }
 
     /**
+     * 显示提示消息(用于多线程)
+     * @param message String 消息内容
+     */
+    fun showMessage(message:String){
+        var msg:Message = Message()
+        msg.what = MSG_INFO_SHOW_DIALOG
+        msg.obj = message
+        mainHandler.sendMessage(msg)
+    }
+
+    /**
+     * 显示错误消息(用于多线程)
+     * @param error String 错误内容
+     */
+    fun showError(error:String){
+        var msg:Message = Message()
+        msg.what = MSG_INFO_SHOW_DIALOG
+        msg.obj = error
+        mainHandler.sendMessage(msg)
+    }
+
+    /**
      * 挂载控件
      */
     open fun joinControls() {

+ 16 - 0
app/src/main/java/com/cr/data/CrConfig.kt

@@ -0,0 +1,16 @@
+package com.cr.data
+
+import com.cr.models.UserModel
+
+/**
+ * 操作系统:MAC系统
+ * 创建者:王成
+ * 创建日期:2023/4/10 14:38
+ * 描述:全局配置信息
+ */
+class CrConfig {
+    companion object{
+        // define: 2023/4/10 全局用户
+        var user:UserModel? = null
+    }
+}

+ 13 - 2
app/src/main/java/com/cr/data/utils.kt

@@ -1,6 +1,8 @@
 package com.cr.data
 
+import android.app.Activity
 import android.content.Context
+import android.content.Intent
 import android.content.pm.PackageInfo
 import android.content.pm.PackageManager
 import android.graphics.Typeface
@@ -33,8 +35,8 @@ const val RES_ERR_FLAG = "RES_ERR"
 const val RES_NULL_FLAG = "RES_NO"
 const val RES_SUCCESS_FLAG = "RES_OK"
 const val RES_CONTENT = "data"
-const val RES_ERR_DES = "errDes"
-const val RES_ERR_CODE = "errCode"
+const val RES_ERR_DES = "msg"
+const val RES_ERR_CODE = "code"
 const val RES_HEAD = "res"
 
 /**
@@ -240,6 +242,15 @@ class CrUtil {
                 return text
             }
         }
+
+        /**
+         * 扩展函数
+         * 启动窗体
+         * @receiver Context
+         */
+        inline fun <reified T: Activity> Context.onStart(){
+            startActivity(Intent(this,T::class.java))
+        }
     }
 }
 

+ 75 - 0
app/src/main/java/com/cr/dialog/DialogLoadingUtil.kt

@@ -0,0 +1,75 @@
+package com.cr.dialog
+
+import android.app.Activity
+import android.app.AlertDialog
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.WindowManager
+import android.widget.TextView
+import com.cr.cruav.R
+import java.lang.ref.WeakReference
+
+/**
+ * 操作系统:MAC系统
+ * 创建者:王成
+ * 创建日期:2023/4/10 14:59
+ * 描述:等待框
+ */
+class DialogLoadingUtil {
+    companion object{
+        // define: 2023/4/10 对话框
+        var loadingDialog:AlertDialog?=null
+
+        /**
+         * 初始化
+         * @param context Context 上下文
+         * @param res Int 资源Id
+         * @param message String 消息内容
+         */
+        private fun init(context:Context,res:Int,message:String){
+            if(loadingDialog == null){
+                loadingDialog = AlertDialog.Builder(context).create()
+                if(res>0){
+                    // todo: 2023/4/10 创建视图
+                    var view: View = LayoutInflater.from(context).inflate(res,null)
+                    // todo: 2023/4/10 挂载控件显示文本
+                    var lblMessage:TextView = view.findViewById(R.id.load_message)
+                    lblMessage.text = message
+                    // todo: 2023/4/10 设置视图
+                    loadingDialog?.setView(view)
+                    // todo: 2023/4/10 设置对话框背景
+                    loadingDialog?.window?.setBackgroundDrawableResource(android.R.color.transparent)
+                    // todo: 2023/4/10 去掉阴影
+                    loadingDialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
+                }else{
+                    loadingDialog?.setMessage("加载中...")
+                }
+                // todo: 2023/4/10 禁止点击外部关闭
+                loadingDialog?.setCancelable(false)
+            }
+        }
+
+        /**
+         * 显示等待框
+         * @param context Context 上下文
+         * @param message String 消息内容
+         */
+        fun show(context: Context,message:String){
+            init(context, R.layout.dig_loading,message)
+            loadingDialog?.show()
+            loadingDialog?.setCancelable(false);
+        }
+
+        /**
+         * 关闭等待框
+         */
+        fun dismiss(){
+            if(loadingDialog != null && loadingDialog?.isShowing == true){
+                loadingDialog?.dismiss()
+                loadingDialog = null
+            }
+        }
+
+    }
+}

+ 18 - 11
app/src/main/java/com/cr/models/UserModel.kt

@@ -9,7 +9,7 @@ import org.json.JSONObject
  * 创建日期:2023/4/6 11:29
  * 描述:账户模型
  */
-class UserModel constructor(): iNetDataModel<UserModel> {
+class UserModel constructor():iNetDataModel<UserModel>{
     var userId: String? = ""   // define: 2023/4/6 账号Id
     var userPwd: String? = ""   // define: 2023/4/6 密码
     var userName: String? = ""   // define: 2023/4/6 账号名称
@@ -20,11 +20,27 @@ class UserModel constructor(): iNetDataModel<UserModel> {
      * @param userPwd String 密码
      * @constructor
      */
-    constructor(userId:String,userPwd:String):this(){
+    constructor(userId: String, userPwd: String) : this() {
         this.userId = userId
         this.userPwd = userPwd
     }
 
+    companion object:iJSONModel<UserModel>{
+        /**
+         * 转换为模型
+         * @param json String JSON字符串
+         * @return UserModel?
+         */
+        override fun toModel(json: String): UserModel? {
+            var obj = JSONObject(json)
+            var model = UserModel()
+            model.userId = obj.getString("userId")
+            model.userPwd = obj.getString("userPwd")
+            model.userName = obj.getString("userName")
+            return model
+        }
+    }
+
     /**
      * 转换为JSON字符串
      * @return String
@@ -33,13 +49,4 @@ class UserModel constructor(): iNetDataModel<UserModel> {
         var jsonObj: JSONObject = ClassManager.fieldsToJSONObject(this)
         return jsonObj.toString()
     }
-
-    /**
-     * 通过JSON字符串初始化
-     * @param json String
-     * @return UserModel
-     */
-    override fun toModel(json: String): UserModel? {
-        return null
-    }
 }

+ 17 - 0
app/src/main/java/com/cr/models/iJSONModel.kt

@@ -0,0 +1,17 @@
+package com.cr.models
+
+/**
+ * 操作系统:MAC系统
+ * 创建者:王成
+ * 创建日期:2023/4/6 11:31
+ * 描述:网路传输数据接口
+ */
+interface iJSONModel<T> {
+    /**
+     * 通过JSON字符串初始化
+     * @param json String
+     * @return T?
+     */
+    fun toModel(json:String): T?
+
+}

+ 5 - 4
app/src/main/java/com/cr/models/iNetDataModel.kt

@@ -1,7 +1,5 @@
 package com.cr.models
 
-import org.json.JSONObject
-
 /**
  * 操作系统:MAC系统
  * 创建者:王成
@@ -9,6 +7,9 @@ import org.json.JSONObject
  * 描述:网路传输数据接口
  */
 interface iNetDataModel<T> {
-    fun toJSON():String
-    fun toModel(json:String):T?
+    /**
+     * 转换为JSON字符串
+     * @return String?
+     */
+    fun toJSON(): String
 }

+ 86 - 9
app/src/main/java/com/cr/network/TCPDataTask.kt

@@ -1,7 +1,13 @@
 package com.cr.network
 
+import android.content.Context
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
 import com.cr.data.*
+import com.cr.dialog.DialogLoadingUtil
 import com.cr.models.iNetDataModel
+import dji.v5.utils.common.ContextUtil
 import okhttp3.*
 import okhttp3.MediaType.Companion.toMediaType
 import okhttp3.RequestBody.Companion.toRequestBody
@@ -9,6 +15,7 @@ import org.json.JSONArray
 import org.json.JSONException
 import org.json.JSONObject
 import java.io.IOException
+import java.net.ConnectException
 import java.util.concurrent.TimeUnit
 
 /**
@@ -18,6 +25,27 @@ import java.util.concurrent.TimeUnit
  * 描述:网络通信
  */
 class TCPDataTask {
+    // define: 2023/4/10 定义显示或关闭等待条
+    val PROGRESS_SHOW:Int = 1001
+    val PROGRESS_CLOSE:Int = 1002
+
+    // define: 2023/4/10 定义变量
+    var context:Context? = null
+
+    /**
+     * 多线程管理器
+     */
+    private var handler: Handler = object:Handler(Looper.getMainLooper()){
+        // todo: 2023/4/10 处理消息
+        override fun handleMessage(msg: Message) {
+            if(msg.what == PROGRESS_SHOW){
+                DialogLoadingUtil.show(context!!,msg.obj.toString())
+            }else if(msg.what == PROGRESS_CLOSE){
+                DialogLoadingUtil.dismiss()
+            }
+        }
+    }
+
     /**
      * 对外接口
      */
@@ -48,33 +76,78 @@ class TCPDataTask {
          * 初始化连接
          */
         okHttp = OkHttpClient.Builder()
-            .connectTimeout(6000,TimeUnit.MINUTES)
-            .readTimeout(6000,TimeUnit.MINUTES)
-            .writeTimeout(6000,TimeUnit.MINUTES)
+            .connectTimeout(6*1000,TimeUnit.MILLISECONDS)
+            .readTimeout(6*1000,TimeUnit.MILLISECONDS)
+            .writeTimeout(6*1000,TimeUnit.MILLISECONDS)
             .build()
     }
 
     /**
+     * 显示等待框
+     * @param message String 等待提示内容
+     */
+    private fun showLoading(message:String){
+        var msg:Message = Message();
+        msg.what = PROGRESS_SHOW
+        msg.obj = message
+        handler.sendMessage(msg)
+    }
+
+    /**
+     * 关闭等待框
+     */
+    private fun dismissLoading(){
+        var msg:Message = Message();
+        msg.what = PROGRESS_CLOSE
+        handler.sendMessage(msg)
+    }
+
+    /**
+     *
+     * @param url String 服务地址
+     * @param iModel iNetDataModel<T> 发送数据
+     * @param callback OnChangeListener 回调
+     */
+    fun<T> sendJSON(url:String, iModel:iNetDataModel<T>, callback:OnChangeListener){
+        sendJSON(url,iModel,callback,null,null)
+    }
+
+    /**
      * 发送JSON数据
      * @param url String 服务地址
      * @param iModel iNetDataModel<T> 发送数据
-     * @param callback OnChangeListener 监听
+     * @param callback OnChangeListener 回调
+     * @param context Context 上下文  如果不显示等待框 可以传null
+     * @param loadingMessage String 等待消息内容
      */
-    fun<T> sendJSON(url:String,iModel:iNetDataModel<T>,callback:OnChangeListener){
+    fun<T> sendJSON(url:String, iModel:iNetDataModel<T>, callback:OnChangeListener,context:Context?,loadingMessage:String?){
+        this.context = context
         // todo: 2023/4/8 确定传输类型
         var mediaType:MediaType = "application/json;charset=utf-8".toMediaType()
         // todo: 2023/4/8 创建数据传输内容
         var requestBody:RequestBody = iModel.toJSON().toRequestBody(mediaType)
         var request:Request = Request.Builder().url(url).post(requestBody).build()
+        // todo: 2023/4/10 判断是否需要显示等待框
+        if(loadingMessage != null){
+            showLoading(loadingMessage)
+        }
         // todo: 2023/4/8 连接发送
         okHttp?.newCall(request)?.enqueue(object :Callback{
             // todo: 2023/4/8 失败
             override fun onFailure(call: Call, e: IOException) {
-                var errMessage: String? = e.message
-                if(callback != null) callback.onFailed(errMessage!!)
+                // todo: 2023/4/10 关闭等待框
+                dismissLoading()
+                if(e is ConnectException){
+                    if(callback != null) callback.onFailed("服务器异常,连接超时!")
+                }else{
+                    var errMessage: String? = e.message
+                    if(callback != null) callback.onFailed(errMessage!!)
+                }
             }
             // todo: 2023/4/8 成功
             override fun onResponse(call: Call, response: Response) {
+                // todo: 2023/4/10 关闭等待框
+                dismissLoading()
                 if(response.code == 200){
                     try{
                         var successMessage:String = response.body!!.string()
@@ -96,22 +169,26 @@ class TCPDataTask {
         val jsonObject: JSONObject
         try {
             jsonObject = JSONObject(JSON)
-            val res = jsonObject.optString("res")
+            val res = jsonObject.optString(RES_HEAD)
             if (res == RES_ERR_FLAG) {
+                // todo: 2023/4/10 服务器返回错误消息
                 val resObj = jsonObject.getJSONArray(RES_CONTENT)
                 if (callback != null) callback.onFailed(
                     resObj.getJSONObject(0).optString(RES_ERR_DES)
                 )
             } else if (res == RES_NULL_FLAG) {
+                // todo: 2023/4/10 未获取到任何服务条件的数据
                 val resObj = jsonObject.getJSONArray(RES_CONTENT)
                 if (callback != null) callback.onFailed(
                     resObj.getJSONObject(0).optString(RES_ERR_DES)
                 )
             } else if (res == RES_SUCCESS_FLAG) {
+                // todo: 2023/4/10 正确返回
                 val resObj = jsonObject.getJSONArray(RES_CONTENT)
                 if (callback != null) callback.onSuccess(resObj)
             } else {
-                if (callback != null) callback.onFailed("未知错误!")
+                // todo: 2023/4/10 服务器返回类型未知
+                if (callback != null) callback.onFailed("服务器返回数据错误!")
             }
         } catch (ex: JSONException) {
             if (callback != null) callback.onFailed("数据解析错误!")

+ 7 - 0
app/src/main/res/drawable/back_loading.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@mipmap/loading"
+    android:fromDegrees="0"
+    android:pivotX="50%"
+    android:pivotY="50%"
+    android:toDegrees="1080"/>

+ 17 - 0
app/src/main/res/drawable/btn_tools_normal.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <!--填充色-->
+    <solid android:color="@color/tools_button_back" />
+    <!--描边-->
+    <stroke
+        android:width="0dp"
+        android:color="#df4249" />
+    <!-- 圆角 -->
+    <corners
+        android:radius="@dimen/cr_100_dp"/>
+    <padding
+        android:left="0dp"
+        android:right="0dp"
+        android:top="0dp"
+        android:bottom="0dp"/>
+</shape>

+ 17 - 0
app/src/main/res/drawable/btn_tools_select.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <!--填充色-->
+    <solid android:color="#000000" />
+    <!--描边-->
+    <stroke
+        android:width="0dp"
+        android:color="#736864" />
+    <!-- 圆角 -->
+    <corners
+        android:radius="@dimen/cr_100_dp"/>
+    <padding
+        android:left="0dp"
+        android:right="0dp"
+        android:top="0dp"
+        android:bottom="0dp"/>
+</shape>

+ 5 - 0
app/src/main/res/drawable/btn_tools_selector.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true" android:drawable="@drawable/btn_tools_select"/>
+    <item android:state_pressed="false" android:drawable="@drawable/btn_tools_normal"/>
+</selector>

BIN
app/src/main/res/drawable/ico_user.png


BIN
app/src/main/res/drawable/tools_addwaypoint.png


BIN
app/src/main/res/drawable/tools_air.png


BIN
app/src/main/res/drawable/tools_back.png


BIN
app/src/main/res/drawable/tools_back1.png


BIN
app/src/main/res/drawable/tools_camera_other.png


BIN
app/src/main/res/drawable/tools_camera_photoshop.png


BIN
app/src/main/res/drawable/tools_camera_startvideo.png


BIN
app/src/main/res/drawable/tools_camera_stopvideo.png


BIN
app/src/main/res/drawable/tools_compass_ico.png


BIN
app/src/main/res/drawable/tools_deleteall.png


BIN
app/src/main/res/drawable/tools_download.png


BIN
app/src/main/res/drawable/tools_downloadnetwork.png


BIN
app/src/main/res/drawable/tools_gohome.png


BIN
app/src/main/res/drawable/tools_info.png


BIN
app/src/main/res/drawable/tools_ip_set.png


BIN
app/src/main/res/drawable/tools_layer.png


BIN
app/src/main/res/drawable/tools_mession.png


BIN
app/src/main/res/drawable/tools_querymedia.png


BIN
app/src/main/res/drawable/tools_savety.png


BIN
app/src/main/res/drawable/tools_set.png


BIN
app/src/main/res/drawable/tools_startico.png


BIN
app/src/main/res/drawable/tools_startty.png


BIN
app/src/main/res/drawable/tools_stopty.png


BIN
app/src/main/res/drawable/tools_tools.png


BIN
app/src/main/res/drawable/tools_ty.png


BIN
app/src/main/res/drawable/tools_update_no.png


BIN
app/src/main/res/drawable/tools_upload.png


BIN
app/src/main/res/drawable/tools_upload1.png


BIN
app/src/main/res/drawable/tools_upload2.png


BIN
app/src/main/res/drawable/tools_weixin_close.png


BIN
app/src/main/res/drawable/tools_weixin_start.png


BIN
app/src/main/res/drawable/tools_window.png


BIN
app/src/main/res/drawable/top_back.png


BIN
app/src/main/res/drawable/top_back_center.png


BIN
app/src/main/res/drawable/top_back_left.png


BIN
app/src/main/res/drawable/top_back_right.png


BIN
app/src/main/res/drawable/ty_clear.png


BIN
app/src/main/res/drawable/ty_delete.png


BIN
app/src/main/res/drawable/ty_save.png


BIN
app/src/main/res/drawable/upload_server.png


+ 61 - 2
app/src/main/res/layout/av_main.xml

@@ -9,7 +9,7 @@
     <FrameLayout
         android:id="@+id/av_fragment_top"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/cr_44_dp"
+        android:layout_height="@dimen/cr_36_dp"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
@@ -22,7 +22,7 @@
         android:orientation="vertical"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/av_fragment_top"
-        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintBottom_toBottomOf="@id/av_main_panel_bottom"
         android:background="@color/cardview_shadow_start_color"/>
     <!--FPV容器-->
     <FrameLayout
@@ -34,4 +34,63 @@
         android:layout_marginBottom="@dimen/cr_6_dp"
         android:layout_marginRight="@dimen/cr_6_dp"
         android:background="@color/black"/>
+    <!--底部信息栏-->
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/common_height"
+        android:background="@color/black"
+        android:id="@+id/av_main_panel_bottom"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:orientation="horizontal">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:gravity="center_vertical">
+            <ImageView
+                android:layout_width="@dimen/common_height"
+                android:layout_height="@dimen/common_height"
+                android:src="@drawable/ico_user"
+                android:padding="@dimen/common_padding"/>
+            <TextView
+                style="@style/lbl_title_main_bottom"
+                android:text="@string/cr_string_default_value"
+                android:textStyle="bold"
+                android:id="@+id/av_main_lbl_user"/>
+        </LinearLayout>
+        <TextView
+            style="@style/lbl_title_v"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:text="@string/login_technical_support"/>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:gravity="center_vertical">
+            <ImageView
+                android:layout_width="@dimen/common_height"
+                android:layout_height="@dimen/common_height"
+                android:src="@drawable/upload_server"
+                android:padding="@dimen/common_padding"/>
+            <TextView
+                style="@style/lbl_title_main_bottom"
+                android:text="@string/cr_string_default_value"
+                android:textStyle="bold"
+                android:id="@+id/av_main_lbl_server"/>
+        </LinearLayout>
+    </LinearLayout>
+    <!--顶部工具-->
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="@dimen/common_padding"
+        android:layout_marginTop="@dimen/common_padding"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/av_fragment_top">
+        <include layout="@layout/tools_top"/>
+    </LinearLayout>
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 29 - 0
app/src/main/res/layout/dig_loading.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center">
+    <LinearLayout
+        android:layout_width="@dimen/cr_160_dp"
+        android:layout_height="@dimen/cr_100_dp"
+        android:background="@drawable/shape_back_dialog_normal"
+        android:orientation="vertical"
+        android:padding="@dimen/cr_8_dp">
+        <ProgressBar
+            android:layout_width="@dimen/cr_50_dp"
+            android:layout_height="@dimen/cr_50_dp"
+            android:layout_gravity="center"
+            android:indeterminateDrawable="@drawable/back_loading"/>
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/dig_normal_default_message"
+            android:gravity="center"
+            android:textSize="@dimen/sp_12"
+            android:layout_margin="@dimen/common_margin"
+            android:layout_weight="1"
+            android:id="@+id/load_message"
+            android:textColor="@color/white"/>
+    </LinearLayout>
+</LinearLayout>

+ 48 - 0
app/src/main/res/layout/tools_top.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+    <LinearLayout
+        style="@style/tools_top_panel"
+        android:id="@+id/tools_wx">
+        <ImageView
+            style="@style/tools_image"
+            android:src="@drawable/tools_weixin_close"/>
+    </LinearLayout>
+    <LinearLayout
+        style="@style/tools_top_panel"
+        android:id="@+id/tools_tools">
+        <ImageView
+            style="@style/tools_image"
+            android:src="@drawable/tools_tools"/>
+    </LinearLayout>
+    <LinearLayout
+        style="@style/tools_top_panel"
+        android:id="@+id/tools_ty">
+        <ImageView
+            style="@style/tools_image"
+            android:src="@drawable/tools_ty"/>
+    </LinearLayout>
+    <LinearLayout
+        style="@style/tools_top_panel"
+        android:id="@+id/tools_ico">
+        <ImageView
+            style="@style/tools_image"
+            android:src="@drawable/tools_startico"/>
+    </LinearLayout>
+    <LinearLayout
+        style="@style/tools_top_panel"
+        android:id="@+id/tools_layer">
+        <ImageView
+            style="@style/tools_image"
+            android:src="@drawable/tools_layer"/>
+    </LinearLayout>
+    <LinearLayout
+        style="@style/tools_top_panel"
+        android:id="@+id/tools_set">
+        <ImageView
+            style="@style/tools_image"
+            android:src="@drawable/tools_set"/>
+    </LinearLayout>
+</LinearLayout>

BIN
app/src/main/res/mipmap-hdpi/loading.png


+ 1 - 0
app/src/main/res/values-sw1024dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">8.5333dp</dimen>
 	<dimen name="common_button_height">73.9556dp</dimen>
 	<dimen name="common_radius">14.2222dp</dimen>
+	<dimen name="common_height">68.2667dp</dimen>
 	<dimen name="cr_0_6_dp">1.7067dp</dimen>
 	<dimen name="cr_0_5_dp">1.4222dp</dimen>
 	<dimen name="cr_1000_dp">2844.4444dp</dimen>

+ 1 - 0
app/src/main/res/values-sw1280dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">10.6667dp</dimen>
 	<dimen name="common_button_height">92.4444dp</dimen>
 	<dimen name="common_radius">17.7778dp</dimen>
+	<dimen name="common_height">85.3333dp</dimen>
 	<dimen name="cr_0_6_dp">2.1333dp</dimen>
 	<dimen name="cr_0_5_dp">1.7778dp</dimen>
 	<dimen name="cr_1000_dp">3555.5556dp</dimen>

+ 1 - 0
app/src/main/res/values-sw1365dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">11.3750dp</dimen>
 	<dimen name="common_button_height">98.5833dp</dimen>
 	<dimen name="common_radius">18.9583dp</dimen>
+	<dimen name="common_height">91.0000dp</dimen>
 	<dimen name="cr_0_6_dp">2.2750dp</dimen>
 	<dimen name="cr_0_5_dp">1.8958dp</dimen>
 	<dimen name="cr_1000_dp">3791.6667dp</dimen>

+ 1 - 0
app/src/main/res/values-sw240dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">2.0000dp</dimen>
 	<dimen name="common_button_height">17.3333dp</dimen>
 	<dimen name="common_radius">3.3333dp</dimen>
+	<dimen name="common_height">16.0000dp</dimen>
 	<dimen name="cr_0_6_dp">0.4000dp</dimen>
 	<dimen name="cr_0_5_dp">0.3333dp</dimen>
 	<dimen name="cr_1000_dp">666.6667dp</dimen>

+ 1 - 0
app/src/main/res/values-sw320dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">2.6667dp</dimen>
 	<dimen name="common_button_height">23.1111dp</dimen>
 	<dimen name="common_radius">4.4444dp</dimen>
+	<dimen name="common_height">21.3333dp</dimen>
 	<dimen name="cr_0_6_dp">0.5333dp</dimen>
 	<dimen name="cr_0_5_dp">0.4444dp</dimen>
 	<dimen name="cr_1000_dp">888.8889dp</dimen>

+ 1 - 0
app/src/main/res/values-sw384dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">3.2000dp</dimen>
 	<dimen name="common_button_height">27.7333dp</dimen>
 	<dimen name="common_radius">5.3333dp</dimen>
+	<dimen name="common_height">25.6000dp</dimen>
 	<dimen name="cr_0_6_dp">0.6400dp</dimen>
 	<dimen name="cr_0_5_dp">0.5333dp</dimen>
 	<dimen name="cr_1000_dp">1066.6667dp</dimen>

+ 1 - 0
app/src/main/res/values-sw392dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">3.2667dp</dimen>
 	<dimen name="common_button_height">28.3111dp</dimen>
 	<dimen name="common_radius">5.4444dp</dimen>
+	<dimen name="common_height">26.1333dp</dimen>
 	<dimen name="cr_0_6_dp">0.6533dp</dimen>
 	<dimen name="cr_0_5_dp">0.5444dp</dimen>
 	<dimen name="cr_1000_dp">1088.8889dp</dimen>

+ 1 - 0
app/src/main/res/values-sw400dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">3.3333dp</dimen>
 	<dimen name="common_button_height">28.8889dp</dimen>
 	<dimen name="common_radius">5.5556dp</dimen>
+	<dimen name="common_height">26.6667dp</dimen>
 	<dimen name="cr_0_6_dp">0.6667dp</dimen>
 	<dimen name="cr_0_5_dp">0.5556dp</dimen>
 	<dimen name="cr_1000_dp">1111.1111dp</dimen>

+ 1 - 0
app/src/main/res/values-sw410dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">3.4167dp</dimen>
 	<dimen name="common_button_height">29.6111dp</dimen>
 	<dimen name="common_radius">5.6944dp</dimen>
+	<dimen name="common_height">27.3333dp</dimen>
 	<dimen name="cr_0_6_dp">0.6833dp</dimen>
 	<dimen name="cr_0_5_dp">0.5694dp</dimen>
 	<dimen name="cr_1000_dp">1138.8889dp</dimen>

+ 1 - 0
app/src/main/res/values-sw411dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">3.4250dp</dimen>
 	<dimen name="common_button_height">29.6833dp</dimen>
 	<dimen name="common_radius">5.7083dp</dimen>
+	<dimen name="common_height">27.4000dp</dimen>
 	<dimen name="cr_0_6_dp">0.6850dp</dimen>
 	<dimen name="cr_0_5_dp">0.5708dp</dimen>
 	<dimen name="cr_1000_dp">1141.6667dp</dimen>

+ 1 - 0
app/src/main/res/values-sw432dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">3.6000dp</dimen>
 	<dimen name="common_button_height">31.2000dp</dimen>
 	<dimen name="common_radius">6.0000dp</dimen>
+	<dimen name="common_height">28.8000dp</dimen>
 	<dimen name="cr_0_6_dp">0.7200dp</dimen>
 	<dimen name="cr_0_5_dp">0.6000dp</dimen>
 	<dimen name="cr_1000_dp">1200.0000dp</dimen>

+ 1 - 0
app/src/main/res/values-sw480dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">4.0000dp</dimen>
 	<dimen name="common_button_height">34.6667dp</dimen>
 	<dimen name="common_radius">6.6667dp</dimen>
+	<dimen name="common_height">32.0000dp</dimen>
 	<dimen name="cr_0_6_dp">0.8000dp</dimen>
 	<dimen name="cr_0_5_dp">0.6667dp</dimen>
 	<dimen name="cr_1000_dp">1333.3333dp</dimen>

+ 1 - 0
app/src/main/res/values-sw533dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">4.4417dp</dimen>
 	<dimen name="common_button_height">38.4944dp</dimen>
 	<dimen name="common_radius">7.4028dp</dimen>
+	<dimen name="common_height">35.5333dp</dimen>
 	<dimen name="cr_0_6_dp">0.8883dp</dimen>
 	<dimen name="cr_0_5_dp">0.7403dp</dimen>
 	<dimen name="cr_1000_dp">1480.5556dp</dimen>

+ 1 - 0
app/src/main/res/values-sw592dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">4.9333dp</dimen>
 	<dimen name="common_button_height">42.7556dp</dimen>
 	<dimen name="common_radius">8.2222dp</dimen>
+	<dimen name="common_height">39.4667dp</dimen>
 	<dimen name="cr_0_6_dp">0.9867dp</dimen>
 	<dimen name="cr_0_5_dp">0.8222dp</dimen>
 	<dimen name="cr_1000_dp">1644.4444dp</dimen>

+ 1 - 0
app/src/main/res/values-sw600dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">5.0000dp</dimen>
 	<dimen name="common_button_height">43.3333dp</dimen>
 	<dimen name="common_radius">8.3333dp</dimen>
+	<dimen name="common_height">40.0000dp</dimen>
 	<dimen name="cr_0_6_dp">1.0000dp</dimen>
 	<dimen name="cr_0_5_dp">0.8333dp</dimen>
 	<dimen name="cr_1000_dp">1666.6667dp</dimen>

+ 1 - 0
app/src/main/res/values-sw640dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">5.3333dp</dimen>
 	<dimen name="common_button_height">46.2222dp</dimen>
 	<dimen name="common_radius">8.8889dp</dimen>
+	<dimen name="common_height">42.6667dp</dimen>
 	<dimen name="cr_0_6_dp">1.0667dp</dimen>
 	<dimen name="cr_0_5_dp">0.8889dp</dimen>
 	<dimen name="cr_1000_dp">1777.7778dp</dimen>

+ 1 - 0
app/src/main/res/values-sw662dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">5.5167dp</dimen>
 	<dimen name="common_button_height">47.8111dp</dimen>
 	<dimen name="common_radius">9.1944dp</dimen>
+	<dimen name="common_height">44.1333dp</dimen>
 	<dimen name="cr_0_6_dp">1.1033dp</dimen>
 	<dimen name="cr_0_5_dp">0.9194dp</dimen>
 	<dimen name="cr_1000_dp">1838.8889dp</dimen>

+ 1 - 0
app/src/main/res/values-sw720dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">6.0000dp</dimen>
 	<dimen name="common_button_height">52.0000dp</dimen>
 	<dimen name="common_radius">10.0000dp</dimen>
+	<dimen name="common_height">48.0000dp</dimen>
 	<dimen name="cr_0_6_dp">1.2000dp</dimen>
 	<dimen name="cr_0_5_dp">1.0000dp</dimen>
 	<dimen name="cr_1000_dp">2000.0000dp</dimen>

+ 1 - 0
app/src/main/res/values-sw768dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">6.4000dp</dimen>
 	<dimen name="common_button_height">55.4667dp</dimen>
 	<dimen name="common_radius">10.6667dp</dimen>
+	<dimen name="common_height">51.2000dp</dimen>
 	<dimen name="cr_0_6_dp">1.2800dp</dimen>
 	<dimen name="cr_0_5_dp">1.0667dp</dimen>
 	<dimen name="cr_1000_dp">2133.3333dp</dimen>

+ 1 - 0
app/src/main/res/values-sw800dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">6.6667dp</dimen>
 	<dimen name="common_button_height">57.7778dp</dimen>
 	<dimen name="common_radius">11.1111dp</dimen>
+	<dimen name="common_height">53.3333dp</dimen>
 	<dimen name="cr_0_6_dp">1.3333dp</dimen>
 	<dimen name="cr_0_5_dp">1.1111dp</dimen>
 	<dimen name="cr_1000_dp">2222.2222dp</dimen>

+ 1 - 0
app/src/main/res/values-sw811dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">6.7583dp</dimen>
 	<dimen name="common_button_height">58.5722dp</dimen>
 	<dimen name="common_radius">11.2639dp</dimen>
+	<dimen name="common_height">54.0667dp</dimen>
 	<dimen name="cr_0_6_dp">1.3517dp</dimen>
 	<dimen name="cr_0_5_dp">1.1264dp</dimen>
 	<dimen name="cr_1000_dp">2252.7778dp</dimen>

+ 1 - 0
app/src/main/res/values-sw820dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">6.8333dp</dimen>
 	<dimen name="common_button_height">59.2222dp</dimen>
 	<dimen name="common_radius">11.3889dp</dimen>
+	<dimen name="common_height">54.6667dp</dimen>
 	<dimen name="cr_0_6_dp">1.3667dp</dimen>
 	<dimen name="cr_0_5_dp">1.1389dp</dimen>
 	<dimen name="cr_1000_dp">2277.7778dp</dimen>

+ 1 - 0
app/src/main/res/values-sw960dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">8.0000dp</dimen>
 	<dimen name="common_button_height">69.3333dp</dimen>
 	<dimen name="common_radius">13.3333dp</dimen>
+	<dimen name="common_height">64.0000dp</dimen>
 	<dimen name="cr_0_6_dp">1.6000dp</dimen>
 	<dimen name="cr_0_5_dp">1.3333dp</dimen>
 	<dimen name="cr_1000_dp">2666.6667dp</dimen>

+ 1 - 0
app/src/main/res/values-sw961dp/dimens.xml

@@ -7,6 +7,7 @@
 	<dimen name="common_margin">8.0083dp</dimen>
 	<dimen name="common_button_height">69.4056dp</dimen>
 	<dimen name="common_radius">13.3472dp</dimen>
+	<dimen name="common_height">64.0667dp</dimen>
 	<dimen name="cr_0_6_dp">1.6017dp</dimen>
 	<dimen name="cr_0_5_dp">1.3347dp</dimen>
 	<dimen name="cr_1000_dp">2669.4444dp</dimen>

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -5,6 +5,7 @@
     <color name="purple_700">#FF3700B3</color>
     <color name="teal_200">#FF03DAC5</color>
     <color name="teal_700">#FF018786</color>
+    <color name="tools_button_back">#99000000</color>
     
     <color name="title">#FFd4f12c</color>
 

+ 1 - 0
app/src/main/res/values/dimens.xml

@@ -9,6 +9,7 @@
     <dimen name="common_margin">3dp</dimen>
     <dimen name="common_button_height">26dp</dimen>
     <dimen name="common_radius">5dp</dimen>
+    <dimen name="common_height">24dp</dimen>
 
     <dimen name="cr_0_6_dp">0.6dp</dimen>
     <dimen name="cr_0_5_dp">0.5dp</dimen>

+ 30 - 0
app/src/main/res/values/themes.xml

@@ -185,6 +185,36 @@
         <item name="android:textColor">@color/yellow</item>
     </style>
 
+    <!--主页面底部信息框文字样式-->
+    <style name="lbl_title_main_bottom" parent="lbl_title_common">
+        <item name="android:textSize">@dimen/cr_10_dp</item>
+    </style>
+
+    <!--垂直布局的标签-->
+    <style name="lbl_title_v" parent="lbl_title_main_bottom">
+        <item name="android:layout_margin">@dimen/common_padding</item>
+    </style>
+
+    <!--工具外框样式-->
+    <style name="tools_left_panel">
+        <item name="android:layout_width">@dimen/cr_26_dp</item>
+        <item name="android:layout_height">@dimen/cr_26_dp</item>
+        <item name="android:padding">8dp</item>
+        <item name="android:background">@drawable/btn_tools_selector</item>
+        <item name="android:layout_marginTop">@dimen/common_padding</item>
+        <item name="android:gravity">center</item>
+    </style>
+    <!--工具外框样式-->
+    <style name="tools_top_panel" parent="tools_left_panel">
+        <item name="android:layout_marginLeft">@dimen/common_padding</item>
+    </style>
+    <!--工具图片样式-->
+    <style name="tools_image">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:scaleType">fitCenter</item>
+    </style>
+
     <!--自定义文本框属性-->
     <declare-styleable name="ViewEditTextProperty">
         <attr name="crHint"></attr>