ソースを参照

1、配置文件下载搞定
2、下载文件的BUG修复完成

不会爬树的猴 2 年 前
コミット
dcc9ba5973

+ 2 - 0
app/src/main/java/com/cr/adapter/CrAdapter.kt

@@ -1,6 +1,8 @@
 package com.cr.adapter
 
 import android.content.Context
+import android.os.Handler
+import android.os.Looper
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup

+ 45 - 19
app/src/main/java/com/cr/adapter/DownloadDataAdapter.kt

@@ -10,8 +10,13 @@ import android.view.ViewGroup
 import android.widget.ImageView
 import android.widget.ProgressBar
 import android.widget.TextView
+import com.cr.common.FileManager
 import com.cr.cruav.R
+import com.cr.data.CrUtil
+import com.cr.dialog.DialogNormal
 import com.cr.models.DownloadDataModel
+import com.cr.network.NetManager
+import com.cr.network.TCPDataTask
 
 /**
  * 操作系统:MAC系统
@@ -23,10 +28,6 @@ class DownloadDataAdapter @JvmOverloads constructor(
     context: Context,
     dataList: MutableList<DownloadDataModel>
 ) : CrAdapter<DownloadDataModel>(context, dataList),View.OnClickListener {
-    private val DOWNLOAD_START = 9001
-    private val DOWNLOAD_PROGRESS = 9002
-    private val DOWNLOAD_FAILURE = 9003
-    private val DOWNLOAD_SUCCESS = 9004
     // todo: 2023/4/11 多线程
     private val handler:Handler = object:Handler(Looper.getMainLooper()){
         override fun handleMessage(msg: Message) {
@@ -60,14 +61,15 @@ class DownloadDataAdapter @JvmOverloads constructor(
             viewHolder.lblIsDownload = view?.findViewById(R.id.item_down_state)
             viewHolder.btnDownload = view?.findViewById(R.id.item_down_down)
             viewHolder.progressBar = view?.findViewById(R.id.item_down_bar)
-            // todo: 2023/4/11 设置最大值
-            viewHolder.progressBar?.max = 100
             view?.tag = viewHolder
         }else{
             viewHolder = view?.tag as ViewHolder
         }
         // todo: 2023/4/11 初始化数据
         var model:DownloadDataModel = dataList!![position]
+        // todo: 2023/4/12 判断文件是否存在
+        var fullName = CrUtil.CONFIG_PATH + model.fileName
+        model.isDownload = FileManager.isExists(fullName)
         model.let {
             viewHolder.lblTitle?.text = it.title
             viewHolder.lblIsDownload?.text = if (model.isDownload) "已下载" else "未下载"
@@ -79,6 +81,9 @@ class DownloadDataAdapter @JvmOverloads constructor(
                     255
                 ) else Color.argb(255, 255, 0, 0)
             )
+            // todo: 2023/4/11 设置最大值
+            viewHolder.progressBar?.max = 100
+            viewHolder.progressBar?.progress = 0
             viewHolder.model = model
             viewHolder.btnDownload?.tag = viewHolder
             viewHolder.btnDownload?.setOnClickListener(this)
@@ -87,18 +92,6 @@ class DownloadDataAdapter @JvmOverloads constructor(
     }
 
     /**
-     * 发送多线程消息
-     * @param obj Object 消息体
-     * @param what Int 标识
-     */
-    private fun sendThreadMessage(obj:Object,what:Int){
-        var message = Message()
-        message.what = what
-        message.obj = obj
-        handler.sendMessage(message)
-    }
-
-    /**
      * 视图点击事件
      * @param view View
      */
@@ -106,7 +99,40 @@ class DownloadDataAdapter @JvmOverloads constructor(
         when(view?.id){
             R.id.item_down_down->{
                 var holder = view.tag as ViewHolder
-                holder.progressBar?.progress = 50
+                var url = "${NetManager.getServerUrl()}/resource/download/${holder.model?.fileName}"
+                var fullName = CrUtil.CONFIG_PATH + holder.model?.fileName
+                TCPDataTask.getInstance().sendDownloadFile(context!!,fullName,url,object:TCPDataTask.OnDownloadListener{
+                    // todo: 2023/4/12 开始下载
+                    override fun onStart() {
+                        holder.progressBar?.progress = 0
+                    }
+
+                    // todo: 2023/4/12 下载错误
+                    override fun onFailed(message: String) {
+                        DialogNormal(context!!,"警告",message).show()
+                    }
+
+                    // todo: 2023/4/12 下载进度
+                    override fun onProgress(progress: Int, total: Int) {
+                        holder.progressBar?.max = total
+                        holder.progressBar?.progress = progress
+                    }
+
+                    // todo: 2023/4/12 下载完成
+                    override fun onComplete() {
+                        holder.model?.isDownload = FileManager.isExists(fullName)
+                        holder.lblIsDownload?.text = if (holder.model!!.isDownload) "已下载" else "未下载"
+                        holder.lblIsDownload?.setTextColor(
+                            if (holder.model!!.isDownload) Color.argb(
+                                255,
+                                255,
+                                255,
+                                255
+                            ) else Color.argb(255, 255, 0, 0)
+                        )
+                    }
+
+                })
             }
         }
     }

+ 5 - 2
app/src/main/java/com/cr/cruav/AvMain.kt

@@ -70,7 +70,7 @@ class AvMain : CrActivity(), View.OnClickListener {
         // todo: 2023/4/11 挂载控件
         joinControls()
         // todo: 2023/4/11 初始化
-        init()
+//        init()
         // todo: 2023/4/3 订阅事件
         CrApplication.getEventBus().register(this)
     }
@@ -216,12 +216,15 @@ class AvMain : CrActivity(), View.OnClickListener {
     }
 
     /**
-     * 重新激活
+     * App可见
      */
     override fun onResume() {
         super.onResume()
+        init()
     }
 
+
+
     /**
      * 订阅Fragment管理事件
      * @param event EventFragmentBarAction

+ 9 - 0
app/src/main/java/com/cr/network/NetManager.kt

@@ -20,5 +20,14 @@ class NetManager {
             var model:IPAndComModel = DataManager.getNetworkLinkInfo()
             return "http://${model.ip}:${model.com}/${model.serverName}/${urlName}"
         }
+
+        /**
+         * 获取完整的网络服务地址
+         * @return String
+         */
+        fun getServerUrl():String{
+            var model:IPAndComModel = DataManager.getNetworkLinkInfo()
+            return "http://${model.ip}:${model.com}/${model.serverName}/"
+        }
     }
 }

+ 10 - 1
app/src/main/java/com/cr/network/TCPDataTask.kt

@@ -14,6 +14,8 @@ import okhttp3.RequestBody.Companion.toRequestBody
 import org.json.JSONArray
 import org.json.JSONException
 import org.json.JSONObject
+import java.io.File
+import java.io.FileOutputStream
 import java.io.IOException
 import java.io.InputStream
 import java.net.ConnectException
@@ -196,7 +198,7 @@ class TCPDataTask {
         })
     }
 
-    fun sendDownloadFile(context: Context,fileName:String,url:String,callBack:OnDownloadListener){
+    fun sendDownloadFile(context: Context, fullName:String, url: String, callBack:OnDownloadListener){
         if(callBack != null) callBack.onStart()
         // todo: 2023/4/12 上下文
         this.context = context
@@ -219,24 +221,31 @@ class TCPDataTask {
                 var inputStream:InputStream? = null
                 var buf = ByteArray(2048)
                 var len:Int
+                var fos:FileOutputStream?=null
                 try{
                     inputStream = response.body!!.byteStream()
                     var total:Long = response.body!!.contentLength()
                     var sum:Long = 0
+                    // todo: 2023/4/12 创建文件
+                    var file:File = File(fullName)
+                    fos = FileOutputStream(file)
                     while (true){
                         len = inputStream.read(buf)
                         if(len == -1) break
+                        fos.write(buf,0,len)
                         sum += len
                         handler.post(Runnable {
                             if(callBack != null) callBack.onProgress(sum.toInt(), total.toInt())
                         })
                     }
+                    fos.flush()
                 }catch (e: IOException){
                     handler.post(Runnable {
                         if(callBack!= null) callBack.onFailed(e.message!!)
                     })
                 }finally {
                     inputStream!!.close()
+                    fos!!.close()
                     handler.post(Runnable {
                         if(callBack != null) callBack.onComplete()
                     })

+ 3 - 0
app/src/main/java/com/cr/pages/FragmentSet.kt

@@ -102,8 +102,11 @@ class FragmentSet : CrNavigationFragment() {
             if(fragments?.get(i) == fragment){
                 fragment.nvBar?.visibility = View.GONE
                 viewPager?.currentItem = i
+//                fragment?.initPage()
+                break
             }
         }
+
     }
 
     /**

+ 12 - 10
app/src/main/java/com/cr/pages/FragmentSetDataDownload.kt

@@ -39,8 +39,6 @@ class FragmentSetDataDownload:CrNavigationFragment() {
         mainView = inflater.inflate(R.layout.frag_set_data_download,null)
         // todo: 2023/4/11 挂载控件
         joinControls()
-        // todo: 2023/4/11 初始化页面
-        initPage()
         return mainView
     }
 
@@ -50,6 +48,9 @@ class FragmentSetDataDownload:CrNavigationFragment() {
     override fun joinControls() {
         // todo: 2023/4/11 挂载列表控件
         listView = mainView?.findViewById(R.id.list_view)
+        // todo: 2023/4/12 初始化
+        downloadAdapter = DownloadDataAdapter(context!!,dataList)
+        listView?.adapter = downloadAdapter
     }
 
     /**
@@ -61,15 +62,16 @@ class FragmentSetDataDownload:CrNavigationFragment() {
         dataList.add(DownloadDataModel("编辑地图集", "map.geodatabase", false))
         dataList.add(DownloadDataModel("飞行数据库", "data.sqlite", false))
         dataList.add(DownloadDataModel("基础配置库", "config.sqlite", false))
-        downloadAdapter = DownloadDataAdapter(context!!,dataList)
-        listView?.adapter = downloadAdapter
+        downloadAdapter?.notifyUpdate(dataList)
     }
 
-    override fun onHiddenChanged(hidden: Boolean) {
-        CrUtil.showMessage(hidden.toString())
-        super.onHiddenChanged(hidden)
-        if(!hidden){
-            initPage()
-        }
+    // todo: 2023/4/12 Fragment 生命周期
+
+    /**
+     * 重新显示 由后台到前台
+     */
+    override fun onResume() {
+        super.onResume()
+        initPage()
     }
 }

+ 7 - 0
app/src/main/java/com/cr/pages/FragmentTopInfo.kt

@@ -83,6 +83,13 @@ open class FragmentTopInfo : Fragment() {
      */
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
+    }
+
+    /**
+     * 由后台转前台显示
+     */
+    override fun onResume() {
+        super.onResume()
         // todo: 2023/3/9 初始化订阅
         initObserver()
     }

+ 1 - 1
app/src/main/java/com/cr/viewmodel/CrLinkVM.kt

@@ -25,7 +25,7 @@ class CrLinkVM :CrViewModel(){
      * 初始化
      */
     init {
-        linkInfo.value = CrLinkInfo(false)
+        linkInfo.postValue(CrLinkInfo(false))
         linkInfo.value?.signalQuality = 0
         linkInfo.value?.frequencyBand = DEFAULT_STR
     }

+ 1 - 1
app/src/main/java/com/cr/viewmodel/CrMSDKInfoVM.kt

@@ -27,7 +27,7 @@ class CrMSDKInfoVM : CrViewModel() {
      */
     init {
         // TODO: 初始化MSDK版本信息
-        msdkInfo.value = CrMSDKInfo(msdkInfoModel.getSDKVersion())
+        msdkInfo.postValue(CrMSDKInfo(msdkInfoModel.getSDKVersion()))
         // TODO: 初始化编译版本信息
         msdkInfo.value?.buildVer = msdkInfoModel.getBuildVersion()
         // TODO: 是否启用调试

+ 2 - 2
app/src/main/java/com/cr/viewmodel/CrRemoteControlVM.kt

@@ -23,8 +23,8 @@ class CrRemoteControlVM : CrViewModel(){
      * 初始化
      */
     init {
-       remoteControlInfo.value = CrRemoteControlInfo(StringUtils.getResStr(ContextUtil.getContext(),
-           R.string.value_product_remote_controller))
+       remoteControlInfo.postValue(CrRemoteControlInfo(StringUtils.getResStr(ContextUtil.getContext(),
+           R.string.value_product_remote_controller)))
         remoteControlInfo.value?.isConnection = false;
         remoteControlInfo.value?.batteryPercent = 0;
     }