Skip to content

Commit

Permalink
fix: zip解压缩 在低版本Android兼容问题
Browse files Browse the repository at this point in the history
  • Loading branch information
jing332 committed Jul 25, 2023
1 parent 93f09f0 commit dd583a0
Show file tree
Hide file tree
Showing 5 changed files with 128 additions and 22 deletions.
10 changes: 5 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
implementation 'androidx.legacy:legacy-support-v4:1.0.0'

implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.6.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.6.0'
Expand All @@ -153,7 +153,7 @@ dependencies {
implementation 'com.google.android.material:material:1.9.0-beta01'

implementation 'androidx.preference:preference-ktx:1.2.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.2'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0'

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
Expand All @@ -180,7 +180,7 @@ dependencies {

// IO & NET
implementation 'com.squareup.okio:okio:3.3.0'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.squareup.okhttp3:okhttp:4.11.0'
implementation 'com.github.liangjingkanji:Net:3.5.8'

implementation 'me.rosuh:AndroidFilePicker:0.8.3'
Expand All @@ -192,8 +192,8 @@ dependencies {
implementation 'cn.hutool:hutool-crypto:5.8.17'

// Media
implementation 'com.google.android.exoplayer:exoplayer-core:2.18.7'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.18.7'
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.0'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.0'

// Logcat (Debug)
debugImplementation 'com.github.getActivity:Logcat:11.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.drake.net.utils.withIO
import com.drake.net.utils.withMain
import com.github.jing332.tts_server_android.R
import com.github.jing332.tts_server_android.app
import com.github.jing332.tts_server_android.ui.AppActivityResultContracts
Expand Down Expand Up @@ -71,18 +72,22 @@ class BackupRestoreFragment : PreferenceFragmentCompat() {
}
}
.setPositiveButton(android.R.string.ok) { _, _ ->
val bytes = vm.backup(
checkedItems.mapIndexed { index, b ->
if (b) Type.typeList[index] else null
}.filterNot { it == null }.map { it!! }
)
filePicker.launch(
FilePickerActivity.RequestSaveFile(
fileName = "ttsrv-backup.zip",
fileMime = "application/zip",
fileBytes = bytes
lifecycleScope.launch {
val bytes = vm.backup(
checkedItems.mapIndexed { index, b ->
if (b) Type.typeList[index] else null
}.filterNot { it == null }.map { it!! }
)
)
withMain {
filePicker.launch(
FilePickerActivity.RequestSaveFile(
fileName = "ttsrv-backup.zip",
fileMime = "application/zip",
fileBytes = bytes
)
)
}
}
}
.show()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,21 @@ import android.app.Application
import androidx.lifecycle.AndroidViewModel
import cn.hutool.core.io.FileUtil
import cn.hutool.core.util.ZipUtil
import com.drake.net.utils.withIO
import com.github.jing332.tts_server_android.constant.AppConst
import com.github.jing332.tts_server_android.data.appDb
import com.github.jing332.tts_server_android.data.entities.SpeechRule
import com.github.jing332.tts_server_android.data.entities.plugin.Plugin
import com.github.jing332.tts_server_android.data.entities.replace.GroupWithReplaceRule
import com.github.jing332.tts_server_android.data.entities.systts.GroupWithSystemTts
import com.github.jing332.tts_server_android.utils.FileUtils
import com.github.jing332.tts_server_android.utils.ZipUtils
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import java.io.ByteArrayInputStream
import java.io.File
import java.nio.charset.Charset
import java.util.zip.ZipInputStream

class BackupRestoreViewModel(application: Application) : AndroidViewModel(application) {
// ... /cache/backupRestore
Expand All @@ -39,10 +42,10 @@ class BackupRestoreViewModel(application: Application) : AndroidViewModel(applic
}


fun restore(bytes: ByteArray): Boolean {
suspend fun restore(bytes: ByteArray): Boolean {
var isRestart = false
val outFileDir = File(restorePath)
ZipUtil.unzip(ByteArrayInputStream(bytes), outFileDir, Charset.defaultCharset())
ZipUtils.unzipFile(ZipInputStream(ByteArrayInputStream(bytes)), outFileDir)
if (outFileDir.exists()) {
// shared_prefs
val restorePrefsFile = File(restorePrefsPath)
Expand Down Expand Up @@ -76,10 +79,9 @@ class BackupRestoreViewModel(application: Application) : AndroidViewModel(applic
val list: List<Plugin> = AppConst.jsonBuilder.decodeFromString(jsonStr)
appDb.pluginDao.insertOrUpdate(*list.toTypedArray())
}
File("").toPath()
}

fun backup(_types: List<Type>): ByteArray {
suspend fun backup(_types: List<Type>): ByteArray = withIO {
File(tmpZipPath).deleteRecursively()
File(tmpZipPath).mkdirs()

Expand All @@ -89,7 +91,12 @@ class BackupRestoreViewModel(application: Application) : AndroidViewModel(applic
createConfigFile(it)
}

return ZipUtil.zip(tmpZipPath).readBytes()
val zipFile = File(tmpZipFile)
zipFile.delete()
zipFile.createNewFile()

ZipUtils.zipFolder(File(tmpZipPath), zipFile)
return@withIO zipFile.readBytes()
}

override fun onCleared() {
Expand All @@ -102,6 +109,10 @@ class BackupRestoreViewModel(application: Application) : AndroidViewModel(applic
backupRestorePath + File.separator + "backup"
}

private val tmpZipFile by lazy {
backupRestorePath + File.separator + "backup.zip"
}

private fun createConfigFile(type: Type) {
when (type) {
is Type.Preference -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
import java.net.URLConnection
import java.util.zip.ZipFile


object FileUtils {
Expand All @@ -19,7 +20,6 @@ object FileUtils {
*/
fun copyFilesFromDir(src: File, target: File, overwrite: Boolean = true) {
target.mkdirs()

src.listFiles()?.forEach {
val newFile = File(target.absolutePath + File.separator + it.name)
it.copyTo(newFile, overwrite)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.github.jing332.tts_server_android.utils

import kotlinx.coroutines.isActive
import java.io.BufferedInputStream
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.util.zip.Deflater
import java.util.zip.ZipEntry
import java.util.zip.ZipInputStream
import java.util.zip.ZipOutputStream
import kotlin.coroutines.coroutineContext


object ZipUtils {
const val TAG = "ZipUtils"

suspend fun zipFolder(sourceFolder: File, zipFile: File) {
try {
val fos = FileOutputStream(zipFile)
val zos = ZipOutputStream(BufferedOutputStream(fos))

zos.setLevel(Deflater.DEFAULT_COMPRESSION)
zipFolder(sourceFolder, zos, "")
zos.closeEntry()
zos.close()
} catch (e: Exception) {
e.printStackTrace()
}
}

@Throws(IOException::class)
private suspend fun zipFolder(folder: File, zos: ZipOutputStream, parentPath: String) {
val files = folder.listFiles()
val buffer = ByteArray(4096)
var bytesRead: Int

for (file in files!!) {
if (coroutineContext.isActive) break

if (file.isDirectory) {
zipFolder(file, zos, parentPath + file.name + "/")
} else {
val fis = FileInputStream(file)
val bis = BufferedInputStream(fis)
val entryPath = parentPath + file.name
val entry = ZipEntry(entryPath)
zos.putNextEntry(entry)
while (bis.read(buffer).also { bytesRead = it } != -1) {
if (coroutineContext.isActive) break
zos.write(buffer, 0, bytesRead)
}
bis.close()
fis.close()
}
}
}

suspend fun unzipFile(zis: ZipInputStream, destFolder: File) {
val buffer = ByteArray(4096)
var bytesRead: Int
var entry: ZipEntry? = zis.nextEntry
while (coroutineContext.isActive && entry != null) {
val entryName = entry.name
val entryPath = destFolder.absolutePath + File.separator + entryName

if (entry.isDirectory) {
val dir = File(entryPath)
dir.mkdirs()
} else {
val file = File(entryPath)
file.parentFile?.mkdirs()
file.delete()
file.createNewFile()
val fos = FileOutputStream(entryPath)
val bos = BufferedOutputStream(fos)
while (zis.read(buffer).also { bytesRead = it } != -1) {
bos.write(buffer, 0, bytesRead)
}
bos.close()
}
zis.closeEntry()

entry = zis.nextEntry
}
zis.close()
}
}

0 comments on commit dd583a0

Please sign in to comment.