fixed copy issues.
authorTrillGates <williamtrillgates@gmail.com>
Fri, 29 Jan 2021 06:11:01 +0000 (14:11 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Fri, 29 Jan 2021 06:11:01 +0000 (14:11 +0800)
app/src/main/java/com/ic/icfotaclient/presenter/OtaViewModel.kt
app/src/main/java/com/ic/icfotaclient/repository/CarOtaRepository.kt
app/src/main/java/com/ic/icfotaclient/repository/ICOtaRepository.kt
app/src/main/java/com/ic/icfotaclient/repository/IOtaRepositoryCallback.kt
app/src/main/java/com/ic/icfotaclient/utils/ICOtaApiUtils.kt
app/src/main/java/com/ic/icfotaclient/utils/MD5.java [new file with mode: 0644]
app/src/main/java/com/ic/icfotaclient/utils/UpdateActionState.kt
app/src/main/java/com/ic/icfotaclient/utils/VersionInfoUtils.kt
app/src/main/java/com/ic/icfotaclient/view/SystemUpdateActivity.kt
app/src/main/res/layout/activity_main.xml
app/src/main/res/values/strings.xml

index e77de84..3352323 100644 (file)
@@ -133,7 +133,7 @@ class OtaViewModel : ViewModel() {
         }
     }
 
-    val downInfoResult = MutableLiveData<DownloadInfo>()
+    private val downInfoResult = MutableLiveData<DownloadInfo>()
 
 
     /**
@@ -222,6 +222,11 @@ class OtaViewModel : ViewModel() {
             }
         }
 
+        override fun onVerify() {
+            //校验中
+            currentActionState.postValue(UpdateActionState.VERIFY)
+        }
+
         override fun onDownloadSuccess() {
             Log.d(TAG, "onDownloadSuccess...")
             //下载完成了
index a63ecd3..801067b 100644 (file)
@@ -8,6 +8,8 @@ import com.ic.icfotaclient.bean.DownloadInfo
 import com.ic.icfotaclient.bean.OtaInfo
 import com.ic.icfotaclient.presenter.OtaViewModel
 import com.ic.icfotaclient.utils.CarOtaApiUtils
+import com.ic.icfotaclient.utils.MD5.checkMd5
+import com.ic.icfotaclient.utils.MD5.createMd5
 import com.ic.icfotaclient.utils.VersionInfoUtils
 import com.ota.fw.IDownloadEvent
 import com.ota.fw.SysInfo
@@ -25,7 +27,7 @@ class CarOtaRepository : AbstractOtaRepository() {
 
     private var mCallback: IOtaRepositoryCallback? = null
 
-    override suspend fun checkHasNewVersion(): OtaInfo? {
+    override fun checkHasNewVersion(): OtaInfo? {
         val systemInfo = SysInfo(
             BuildConfig.token,
             VersionInfoUtils.getIMEI(),
@@ -55,7 +57,9 @@ class CarOtaRepository : AbstractOtaRepository() {
 
             override fun onDownloaded(extra: Bundle?) {
                 Log.d(TAG, "onDownloaded...$extra")
-                mCallback?.onDownloadSuccess()
+                //mCallback?.onDownloadSuccess()
+                //下载完就校验的,内部校验
+                mCallback?.onVerify()
             }
 
             override fun onError(errCode: Int, extra: Bundle?) {
@@ -92,28 +96,38 @@ class CarOtaRepository : AbstractOtaRepository() {
         Log.d(OtaViewModel.TAG, "copy finished to target path == > $targetFile")
         val downloadInfo = DownloadInfo(download.file.path, 0L)
         downloadInfo.path = targetFile
+        //校验一下,如果一样,说明复制成功了否则就是错误了
+        val createMd5 = createMd5(sourceFile.path)
+        val checkMd5 = checkMd5(createMd5, targetFile)
+        Log.d(TAG, "cp checkMd5 == > $checkMd5")
+        if (!checkMd5) {
+            mCallback?.onDownloadError(-5, "校验失败")
+        } else {
+            //处理完了,可以通知成功了
+            mCallback?.onDownloadSuccess()
+        }
         return downloadInfo
     }
 
-    override suspend fun reportInstallResult(isSuccess: Boolean) {
+    override fun reportInstallResult(isSuccess: Boolean) {
         CarOtaApiUtils.mClient.reportUpdateResult(isSuccess, 0)
         Log.d(TAG, "report result == isSuccess == > $isSuccess")
     }
 
-    override suspend fun reportResult(versionCode: String) {
+    override fun reportResult(versionCode: String) {
         CarOtaApiUtils.mClient.reportUpdateResultByVersion(versionCode)
         Log.d(TAG, "report == versionCode == > $versionCode")
     }
 
-    override suspend fun getPackagePath(): String? {
+    override fun getPackagePath(): String? {
         return null
     }
 
-    override suspend fun deletePackage() {
+    override fun deletePackage() {
         //传说他们自己会删除的,通报了成功以后
     }
 
-    override suspend fun pauseDownload() {
+    override fun pauseDownload() {
         Log.d(TAG, "pauseDownload...")
         CarOtaApiUtils.mClient.stopDownload()
     }
index af4edbb..5a02dd1 100644 (file)
@@ -38,7 +38,7 @@ class ICOtaRepository : AbstractOtaRepository() {
     }
 
 
-    override  fun pauseDownload() {
+    override fun pauseDownload() {
         if (checkIcVersion != null) {
             Toast.makeText(
                 App.sContext,
index 0eab794..12eb63f 100644 (file)
@@ -12,6 +12,13 @@ interface IOtaRepositoryCallback {
      */
     fun onDownloadError(errorCode: Int, msg: String)
 
+
+    /**
+     * 正在校验中
+     */
+    fun onVerify()
+
+
     /**
      * 下载成功
      */
index 1e20ae3..ab031cf 100644 (file)
@@ -168,7 +168,7 @@ object ICOtaApiUtils {
                 val bis = BufferedInputStream(inputStream)
                 val bos = BufferedOutputStream(outPutStream)
                 val buf = ByteArray(1024)
-                var len = 0;
+                var len: Int
                 var current = 0;
                 while (true) {
                     len = bis.read(buf)
@@ -179,9 +179,16 @@ object ICOtaApiUtils {
                 }
                 inputStream?.close()
                 outPutStream.close()
+                //校验文件下载是否正确
+                callback?.onVerify()
+                val checkMd5 = MD5.checkMd5(otaInfo!!.md5sum, VersionInfoUtils.getFlashPath())
+                Log.d(TAG, "checkMd5 =+++= > $checkMd5")
+                if (!checkMd5) {
+                    callback?.onDownloadError(-5, "校验失败")
+                }
+                callback?.onDownloadSuccess()
+                return DownloadInfo(VersionInfoUtils.getFlashPath(), total.toLong())
             }
-            callback?.onDownloadSuccess()
-            return DownloadInfo(VersionInfoUtils.getFlashPath(), total.toLong())
         } catch (e: Exception) {
             e.printStackTrace()
             callback?.onDownloadError(0, App.sContext.getString(R.string.error_tips_text))
diff --git a/app/src/main/java/com/ic/icfotaclient/utils/MD5.java b/app/src/main/java/com/ic/icfotaclient/utils/MD5.java
new file mode 100644 (file)
index 0000000..01d3c67
--- /dev/null
@@ -0,0 +1,47 @@
+package com.ic.icfotaclient.utils;
+
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+
+public class MD5 {
+    static String TAG = "MD5";
+
+    public static String createMd5(String str) {
+        MessageDigest mMDigest;
+        FileInputStream Input;
+        File file = new File(str);
+        byte[] buffer = new byte[1024];
+        int len;
+        if (!file.exists())
+            return null;
+        try {
+            mMDigest = MessageDigest.getInstance("MD5");
+            Input = new FileInputStream(file);
+            while ((len = Input.read(buffer, 0, 1024)) != -1) {
+                mMDigest.update(buffer, 0, len);
+            }
+            Input.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        BigInteger mBInteger = new BigInteger(1, mMDigest.digest());
+        Log.v(TAG, "create_MD5=" + mBInteger.toString(16));
+        return mBInteger.toString(16);
+
+    }
+
+    public static boolean checkMd5(String Md5, String file) {
+        if (Md5!=null) {
+            String str = createMd5(file);
+            Log.d(TAG, "web file MD5 = "+ Md5+", "+file+" md5sum = " + str);
+            return Md5.compareTo(str) == 0;
+        }else {
+            return true;
+        }
+    }
+}
index cafcb33..557f71e 100644 (file)
@@ -7,6 +7,7 @@ enum class UpdateActionState {
     LAST_VERSION,/*显示:已是最新版本,isEnable =  false*/
     DOWNLOADING,/*显示暂停下载 isEnable = true*/
     DOWNLOADED,/*显示:安装,isEnable = true*/
+    VERIFY,/*显示:正在校验升级包,isEnable = false*/
     DOWNLOAD_PAUSE,/*显示继续下载,isEnable=true*/
     NO_NETWORK,/*显示无网络,isEnable=false*/
     ERROR,/*恢复默认,显示检查更新 isEnable=false*/
index e7b21b4..1f07ae6 100644 (file)
@@ -79,12 +79,11 @@ object VersionInfoUtils {
     }
 
 
-    var flash_root =
-        "/data" //Environment.getExternalStorageDirectory().getAbsolutePath();
+    var flash_root = "/data"
 
     var DATA_ROOT = "/data/media/0"
 
-    private const val updateFileName = "update.zip"
+    private const val updateFileName = "update_pkg"
 
 
     fun getFlashPath(): String {
index 4c8ea59..fc0e662 100644 (file)
@@ -144,6 +144,10 @@ class SystemUpdateActivity : AppCompatActivity() {
                         checkUpdate.text = getString(R.string.error_tips_text)
                         checkUpdate.isEnabled = false
                     }
+                    UpdateActionState.VERIFY -> {
+                        checkUpdate.text = getString(R.string.verify_package_text)
+                        checkUpdate.isEnabled = false
+                    }
                     else -> {
                         //NONE
                     }
index c668824..b94e12d 100644 (file)
@@ -80,6 +80,6 @@
         android:padding="10dp"
         android:text="@string/check_has_update_text"
         android:textColor="@color/white"
-        android:textSize="24sp" />
+        android:textSize="20sp" />
 
 </LinearLayout>
\ No newline at end of file
index 598c92a..3d3f34f 100644 (file)
@@ -8,6 +8,7 @@
     <string name="no_network_text">无法触及到服务器</string>
     <string name="battery_level_tips_text">请确保电量50%以上</string>
     <string name="error_tips_text">资源准备失败,请重启尝试</string>
+    <string name="verify_package_text">正在校验升级包</string>
     <string name="last_version_text">已经是最新版本</string>
     <string name="download_package">下载更新包</string>
     <string name="try_to_downloading">正在玩命下载中…</string>