From 3444922861fcbe151f0293bffa2adde09f6cb705 Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Tue, 26 May 2020 11:13:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV4.0.1-?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96=E6=B1=87?= =?UTF-8?q?=E6=80=BB(6,7)https://gitlab.ghzs.com/pm/halo-app-issues/-/issu?= =?UTF-8?q?es/866?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/MD5Utils.java | 64 +++++++++++++++++++ .../com/gh/gamecenter/room/AppDatabase.java | 12 +++- .../com/gh/gamecenter/room/dao/UploadDao.kt | 8 +-- .../gamecenter/video/upload/UploadEntity.kt | 1 + .../gamecenter/video/upload/UploadManager.kt | 13 +++- .../video/upload/view/UploadVideoActivity.kt | 1 + 6 files changed, 91 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/MD5Utils.java b/app/src/main/java/com/gh/common/util/MD5Utils.java index bb36c6b225..b060845690 100644 --- a/app/src/main/java/com/gh/common/util/MD5Utils.java +++ b/app/src/main/java/com/gh/common/util/MD5Utils.java @@ -1,6 +1,13 @@ package com.gh.common.util; +import android.text.TextUtils; + +import com.lightgame.utils.Utils; + import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; import java.math.BigInteger; import java.security.MessageDigest; @@ -75,4 +82,61 @@ public class MD5Utils { return bigInt.toString(16); } + + public static boolean checkMD5(String md5, File updateFile) { + if (TextUtils.isEmpty(md5) || updateFile == null) { + Utils.log("MD5 string empty or updateFile null"); + return false; + } + + String calculatedDigest = calculateMD5(updateFile); + if (calculatedDigest == null) { + Utils.log("calculatedDigest null"); + return false; + } + + Utils.log("Calculated digest: " + calculatedDigest); + Utils.log("Provided digest: " + md5); + return calculatedDigest.equalsIgnoreCase(md5); + } + + public static String calculateMD5(File updateFile) { + MessageDigest digest; + try { + digest = MessageDigest.getInstance("MD5"); + } catch (Exception e) { + Utils.log("Exception while getting digest", e); + return null; + } + + InputStream is; + try { + is = new FileInputStream(updateFile); + } catch (Exception e) { + Utils.log("Exception while getting FileInputStream", e); + return null; + } + + byte[] buffer = new byte[8192]; + int read; + try { + while ((read = is.read(buffer)) > 0) { + digest.update(buffer, 0, read); + } + byte[] md5sum = digest.digest(); + BigInteger bigInt = new BigInteger(1, md5sum); + String output = bigInt.toString(16); + // Fill to 32 chars + output = String.format("%32s", output).replace(' ', '0'); + return output; + } catch (Exception e) { + throw new RuntimeException("Unable to process file for MD5", e); + } finally { + try { + is.close(); + } catch (Exception e) { + Utils.log("Exception on closing MD5 input stream", e); + } + } + } } diff --git a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java index e0bd08111e..400472af1d 100644 --- a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java +++ b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java @@ -30,7 +30,7 @@ import com.gh.gamecenter.video.upload.UploadEntity; SignEntity.class, AnswerEntity.class, UploadEntity.class, - CommentDraft.class}, version = 13, exportSchema = false) + CommentDraft.class}, version = 14, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { public abstract AnswerDao answerDao(); @@ -138,6 +138,13 @@ public abstract class AppDatabase extends RoomDatabase { } }; + static final Migration MIGRATION_13_14 = new Migration(13, 14) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("Alter TABLE UploadEntity add fileMD5 TEXT"); + } + }; + private static AppDatabase buildDatabase(Context context) { return Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME) .addMigrations( @@ -150,7 +157,8 @@ public abstract class AppDatabase extends RoomDatabase { MIGRATION_9_10, MIGRATION_10_11, MIGRATION_11_12, - MIGRATION_12_13) + MIGRATION_12_13, + MIGRATION_13_14) // 不允许主线程查询 .allowMainThreadQueries() // // 提供db升级的策略而不是强行销毁 diff --git a/app/src/main/java/com/gh/gamecenter/room/dao/UploadDao.kt b/app/src/main/java/com/gh/gamecenter/room/dao/UploadDao.kt index 199a9baf52..b8190885c3 100644 --- a/app/src/main/java/com/gh/gamecenter/room/dao/UploadDao.kt +++ b/app/src/main/java/com/gh/gamecenter/room/dao/UploadDao.kt @@ -1,9 +1,6 @@ package com.gh.gamecenter.room.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query +import androidx.room.* import com.gh.gamecenter.video.upload.UploadEntity @Dao @@ -14,4 +11,7 @@ interface UploadDao { @Query("select * from UploadEntity where uploadFilePath = :uploadFilePath") fun getUploadByFilePath(uploadFilePath: String): UploadEntity? + + @Query("delete from UploadEntity WHERE uploadFilePath = :uploadFilePath") + fun deleteUploadByPath(uploadFilePath: String) } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/UploadEntity.kt b/app/src/main/java/com/gh/gamecenter/video/upload/UploadEntity.kt index 91f612b9cc..54a9f44701 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/UploadEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/UploadEntity.kt @@ -9,6 +9,7 @@ import androidx.room.PrimaryKey data class UploadEntity( @PrimaryKey val uploadFilePath: String, + val fileMD5: String?, val domain: String, // url = domain + key val key: String, var success: Boolean diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt b/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt index cebe9c82d7..2368c0861a 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/UploadManager.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.video.upload import android.annotation.SuppressLint import com.alibaba.sdk.android.oss.common.OSSLog +import com.gh.common.util.MD5Utils import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.entity.OssEntity @@ -12,6 +13,7 @@ import com.halo.assistant.HaloApp import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import java.io.File import java.util.* @@ -51,9 +53,10 @@ object UploadManager : OnUploadListener { fun createUploadTask(uploadFilePath: String, uploadListener: OnUploadListener) { mUploadListenerMap[uploadFilePath] = uploadListener + val fileMD5 = MD5Utils.calculateMD5(File(uploadFilePath)) val uploadEntity = mUploadDao.getUploadByFilePath(uploadFilePath) - if (uploadEntity?.success == true) { + if (uploadEntity?.success == true && fileMD5 == uploadEntity.fileMD5) { onUploadSuccess(uploadFilePath, uploadEntity.domain + uploadEntity.key) return } @@ -73,7 +76,7 @@ object UploadManager : OnUploadListener { data.domain = uploadEntity.domain data.key = uploadEntity.key } else { - mUploadDao.addUpload(UploadEntity(uploadFilePath, data.domain, data.key, false)) + mUploadDao.addUpload(UploadEntity(uploadFilePath, fileMD5, data.domain, data.key, false)) } val uploadThread = UploadThread(data, this@UploadManager) @@ -97,4 +100,10 @@ object UploadManager : OnUploadListener { uploadThread?.cancel() mUploadThreadMap.remove(uploadFilePath) } + + fun deleteUploadData(filePath: String?) { + filePath?.let { + mUploadDao.deleteUploadByPath(it) + } + } } diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt b/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt index c401fbaa9c..df9be89f2a 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt @@ -219,6 +219,7 @@ class UploadVideoActivity : ToolBarActivity() { NotificationHelper.showNotificationHintDialog(NotificationUgc.VIDEO) }, 1000) LogUtils.logVideoStreamingUpload("提交成功", mPath, mEntranceLink, it.data) + UploadManager.deleteUploadData(mVideoFileEntity?.path) } else if (it.status == Status.ERROR) { ErrorHelper.handleError(this@UploadVideoActivity, it.exception?.response()?.errorBody()?.string()) }