pull/83/head
kunfei 6 years ago
parent 95ef2d9a03
commit 5407cd5f3b
  1. 4
      app/src/main/java/io/legado/app/base/BaseActivity.kt
  2. 10
      app/src/main/java/io/legado/app/help/BookHelp.kt
  3. 58
      app/src/main/java/io/legado/app/help/FileHelp.kt
  4. 22
      app/src/main/java/io/legado/app/help/storage/Backup.kt
  5. 21
      app/src/main/java/io/legado/app/help/storage/Restore.kt
  6. 8
      app/src/main/java/io/legado/app/help/storage/WebDavHelp.kt
  7. 10
      app/src/main/java/io/legado/app/service/HttpReadAloudService.kt
  8. 3
      app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt
  9. 3
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt
  10. 4
      app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleViewModel.kt
  11. 6
      app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt
  12. 15
      app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt
  13. 1
      app/src/main/java/io/legado/app/utils/ACache.kt
  14. 100
      app/src/main/java/io/legado/app/utils/FileUtils.kt
  15. 5
      app/src/main/java/io/legado/app/utils/LogUtils.kt
  16. 2
      app/src/main/java/io/legado/app/utils/StringUtils.kt

@ -52,8 +52,8 @@ abstract class BaseActivity(
} ?: super.onCreateOptionsMenu(menu)
}
override fun onMenuOpened(featureId: Int, menu: Menu?): Boolean {
menu?.applyOpenTint(this)
override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
menu.applyOpenTint(this)
return super.onMenuOpened(featureId, menu)
}

@ -41,8 +41,8 @@ object BookHelp {
}
fun clearCache() {
FileHelp.deleteFile(getBookCachePath())
FileHelp.getFolder(getBookCachePath())
FileUtils.deleteFile(getBookCachePath())
FileUtils.getFolder(getBookCachePath())
}
@Synchronized
@ -57,20 +57,20 @@ object BookHelp {
)
}
} else {
FileHelp.getFolder(getBookFolder(book)).listFiles()?.forEach {
FileUtils.getFolder(getBookFolder(book)).listFiles()?.forEach {
if (it.name.startsWith(String.format("%05d", bookChapter.index))) {
it.delete()
return@forEach
}
}
val filePath = getChapterPath(book, bookChapter)
val file = FileHelp.getFile(filePath)
val file = FileUtils.getFile(filePath)
file.writeText(content)
}
}
fun getChapterCount(book: Book): Int {
return FileHelp.getFolder(getBookFolder(book)).list()?.size ?: 0
return FileUtils.getFolder(getBookFolder(book)).list()?.size ?: 0
}
fun hasContent(book: Book, bookChapter: BookChapter): Boolean {

@ -1,58 +0,0 @@
package io.legado.app.help
import io.legado.app.App
import java.io.File
import java.io.IOException
object FileHelp {
//获取文件夹
fun getFolder(filePath: String): File {
val file = File(filePath)
//如果文件夹不存在,就创建它
if (!file.exists()) {
file.mkdirs()
}
return file
}
//获取文件
@Synchronized
fun getFile(filePath: String): File {
val file = File(filePath)
try {
if (!file.exists()) {
//创建父类文件夹
getFolder(file.parent)
//创建文件
file.createNewFile()
}
} catch (e: IOException) {
e.printStackTrace()
}
return file
}
fun getCachePath(): String {
return App.INSTANCE.externalCacheDir?.absolutePath
?: App.INSTANCE.cacheDir.absolutePath
}
//递归删除文件夹下的数据
@Synchronized
fun deleteFile(filePath: String) {
val file = File(filePath)
if (!file.exists()) return
if (file.isDirectory) {
val files = file.listFiles()
files?.forEach { subFile ->
val path = subFile.path
deleteFile(path)
}
}
//删除文件
file.delete()
}
}

@ -4,7 +4,6 @@ import android.content.Context
import android.net.Uri
import androidx.documentfile.provider.DocumentFile
import io.legado.app.App
import io.legado.app.help.FileHelp
import io.legado.app.help.ReadBookConfig
import io.legado.app.utils.DocumentUtils
import io.legado.app.utils.FileUtils
@ -48,37 +47,40 @@ object Backup {
App.db.bookDao().allBooks.let {
if (it.isNotEmpty()) {
val json = GSON.toJson(it)
FileHelp.getFile(backupPath + File.separator + "bookshelf.json").writeText(json)
FileUtils.getFile(backupPath + File.separator + "bookshelf.json")
.writeText(json)
}
}
App.db.bookGroupDao().all().let {
if (it.isNotEmpty()) {
val json = GSON.toJson(it)
FileHelp.getFile(backupPath + File.separator + "bookGroup.json").writeText(json)
FileUtils.getFile(backupPath + File.separator + "bookGroup.json")
.writeText(json)
}
}
App.db.bookSourceDao().all.let {
if (it.isNotEmpty()) {
val json = GSON.toJson(it)
FileHelp.getFile(backupPath + File.separator + "bookSource.json")
FileUtils.getFile(backupPath + File.separator + "bookSource.json")
.writeText(json)
}
}
App.db.rssSourceDao().all.let {
if (it.isNotEmpty()) {
val json = GSON.toJson(it)
FileHelp.getFile(backupPath + File.separator + "rssSource.json").writeText(json)
FileUtils.getFile(backupPath + File.separator + "rssSource.json")
.writeText(json)
}
}
App.db.replaceRuleDao().all.let {
if (it.isNotEmpty()) {
val json = GSON.toJson(it)
FileHelp.getFile(backupPath + File.separator + "replaceRule.json")
FileUtils.getFile(backupPath + File.separator + "replaceRule.json")
.writeText(json)
}
}
GSON.toJson(ReadBookConfig.configList)?.let {
FileHelp.getFile(backupPath + File.separator + ReadBookConfig.readConfigFileName)
FileUtils.getFile(backupPath + File.separator + ReadBookConfig.readConfigFileName)
.writeText(it)
}
Preferences.getSharedPreferences(App.INSTANCE, backupPath, "config")?.let { sp ->
@ -111,7 +113,7 @@ object Backup {
doc?.let {
DocumentUtils.writeText(
context,
FileHelp.getFile(backupPath + File.separator + fileName).readText(),
FileUtils.getFile(backupPath + File.separator + fileName).readText(),
doc.uri
)
}
@ -122,8 +124,8 @@ object Backup {
private fun copyBackup() {
try {
for (fileName in backupFileNames) {
FileHelp.getFile(backupPath + File.separator + "bookshelf.json")
.copyTo(FileHelp.getFile(legadoPath + File.separator + "bookshelf.json"), true)
FileUtils.getFile(backupPath + File.separator + "bookshelf.json")
.copyTo(FileUtils.getFile(legadoPath + File.separator + "bookshelf.json"), true)
}
} catch (e: Exception) {
e.printStackTrace()

@ -11,7 +11,6 @@ import com.jayway.jsonpath.ParseContext
import io.legado.app.App
import io.legado.app.constant.AppConst
import io.legado.app.data.entities.*
import io.legado.app.help.FileHelp
import io.legado.app.help.ReadBookConfig
import io.legado.app.utils.*
import kotlinx.coroutines.Dispatchers.IO
@ -38,7 +37,7 @@ object Restore {
for (fileName in Backup.backupFileNames) {
if (doc.name == fileName) {
DocumentUtils.readText(context, doc.uri)?.let {
FileHelp.getFile(Backup.backupPath + File.separator + fileName)
FileUtils.getFile(Backup.backupPath + File.separator + fileName)
.writeText(it)
}
}
@ -51,7 +50,7 @@ object Restore {
suspend fun restore(path: String) {
withContext(IO) {
try {
val file = FileHelp.getFile(path + File.separator + "bookshelf.json")
val file = FileUtils.getFile(path + File.separator + "bookshelf.json")
val json = file.readText()
GSON.fromJsonArray<Book>(json)?.let {
App.db.bookDao().insert(*it.toTypedArray())
@ -60,7 +59,7 @@ object Restore {
e.printStackTrace()
}
try {
val file = FileHelp.getFile(path + File.separator + "bookGroup.json")
val file = FileUtils.getFile(path + File.separator + "bookGroup.json")
val json = file.readText()
GSON.fromJsonArray<BookGroup>(json)?.let {
App.db.bookGroupDao().insert(*it.toTypedArray())
@ -69,7 +68,7 @@ object Restore {
e.printStackTrace()
}
try {
val file = FileHelp.getFile(path + File.separator + "bookSource.json")
val file = FileUtils.getFile(path + File.separator + "bookSource.json")
val json = file.readText()
GSON.fromJsonArray<BookSource>(json)?.let {
App.db.bookSourceDao().insert(*it.toTypedArray())
@ -78,7 +77,7 @@ object Restore {
e.printStackTrace()
}
try {
val file = FileHelp.getFile(path + File.separator + "rssSource.json")
val file = FileUtils.getFile(path + File.separator + "rssSource.json")
val json = file.readText()
GSON.fromJsonArray<RssSource>(json)?.let {
App.db.rssSourceDao().insert(*it.toTypedArray())
@ -87,7 +86,7 @@ object Restore {
e.printStackTrace()
}
try {
val file = FileHelp.getFile(path + File.separator + "replaceRule.json")
val file = FileUtils.getFile(path + File.separator + "replaceRule.json")
val json = file.readText()
GSON.fromJsonArray<ReplaceRule>(json)?.let {
App.db.replaceRuleDao().insert(*it.toTypedArray())
@ -97,7 +96,7 @@ object Restore {
}
try {
val file =
FileHelp.getFile(path + File.separator + ReadBookConfig.readConfigFileName)
FileUtils.getFile(path + File.separator + ReadBookConfig.readConfigFileName)
val configFile =
File(App.INSTANCE.filesDir.absolutePath + File.separator + ReadBookConfig.readConfigFileName)
if (file.exists()) {
@ -126,7 +125,7 @@ object Restore {
GlobalScope.launch(IO) {
try {// 导入书架
val shelfFile =
FileHelp.getFile(Backup.defaultPath + File.separator + "myBookShelf.json")
FileUtils.getFile(Backup.defaultPath + File.separator + "myBookShelf.json")
val json = shelfFile.readText()
val importCount = importOldBookshelf(json)
withContext(Main) {
@ -140,7 +139,7 @@ object Restore {
try {// Book source
val sourceFile =
FileHelp.getFile(Backup.defaultPath + File.separator + "myBookSource.json")
FileUtils.getFile(Backup.defaultPath + File.separator + "myBookSource.json")
val json = sourceFile.readText()
val importCount = importOldSource(json)
withContext(Main) {
@ -154,7 +153,7 @@ object Restore {
try {// Replace rules
val ruleFile =
FileHelp.getFile(Backup.defaultPath + File.separator + "myBookReplaceRule.json")
FileUtils.getFile(Backup.defaultPath + File.separator + "myBookReplaceRule.json")
val json = ruleFile.readText()
val importCount = importOldReplaceRule(json)
withContext(Main) {

@ -2,10 +2,10 @@ package io.legado.app.help.storage
import android.content.Context
import io.legado.app.App
import io.legado.app.help.FileHelp
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.webdav.WebDav
import io.legado.app.lib.webdav.http.HttpAuth
import io.legado.app.utils.FileUtils
import io.legado.app.utils.ZipUtils
import io.legado.app.utils.getPrefString
import kotlinx.coroutines.Dispatchers.IO
@ -17,9 +17,9 @@ import java.util.*
import kotlin.math.min
object WebDavHelp {
private val zipFilePath = FileHelp.getCachePath() + "/backup" + ".zip"
private val zipFilePath = FileUtils.getCachePath() + "/backup" + ".zip"
private val unzipFilesPath by lazy {
FileHelp.getCachePath()
FileUtils.getCachePath()
}
private fun getWebDavUrl(): String? {
@ -86,7 +86,7 @@ object WebDavHelp {
for (i in 0 until paths.size) {
paths[i] = path + File.separator + paths[i]
}
FileHelp.deleteFile(zipFilePath)
FileUtils.deleteFile(zipFilePath)
if (ZipUtils.zipFiles(paths, zipFilePath)) {
WebDav(getWebDavUrl() + "legado").makeAsDir()
val putUrl = getWebDavUrl() + "legado/backup" +

@ -4,14 +4,10 @@ import android.app.PendingIntent
import android.media.MediaPlayer
import io.legado.app.constant.Bus
import io.legado.app.data.api.IHttpPostApi
import io.legado.app.help.FileHelp
import io.legado.app.help.IntentHelp
import io.legado.app.help.http.HttpHelper
import io.legado.app.service.help.ReadBook
import io.legado.app.utils.LogUtils
import io.legado.app.utils.getPrefInt
import io.legado.app.utils.getPrefString
import io.legado.app.utils.postEvent
import io.legado.app.utils.*
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
import kotlinx.coroutines.isActive
@ -65,7 +61,7 @@ class HttpReadAloudService : BaseReadAloudService(),
private fun downloadAudio() {
job = launch(IO) {
FileHelp.deleteFile(ttsFolder)
FileUtils.deleteFile(ttsFolder)
for (index in 0 until contentList.size) {
if (isActive) {
val bytes = HttpHelper.getByteRetrofit("http://tts.baidu.com")
@ -104,7 +100,7 @@ class HttpReadAloudService : BaseReadAloudService(),
}
private fun getSpeakFile(index: Int = nowSpeak): File {
return FileHelp.getFile("${ttsFolder}${File.separator}${index}.mp3")
return FileUtils.getFile("${ttsFolder}${File.separator}${index}.mp3")
}
private fun getAudioBody(content: String): Map<String, String> {

@ -21,7 +21,6 @@ import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.constant.Bus
import io.legado.app.help.FileHelp
import io.legado.app.help.ImageLoader
import io.legado.app.help.ReadBookConfig
import io.legado.app.help.permission.Permissions
@ -174,7 +173,7 @@ class BgTextConfigDialog : DialogFragment() {
var file = requireContext().getExternalFilesDir(null)
?: requireContext().filesDir
file =
FileHelp.getFile(file.absolutePath + File.separator + "bg" + File.separator + doc.name)
FileUtils.getFile(file.absolutePath + File.separator + "bg" + File.separator + doc.name)
DocumentUtils.readBytes(requireContext(), uri)?.let {
file.writeBytes(it)
ReadBookConfig.getConfig().setBg(2, file.absolutePath)

@ -7,7 +7,6 @@ import io.legado.app.App
import io.legado.app.base.BaseViewModel
import io.legado.app.data.api.IHttpGetApi
import io.legado.app.data.entities.BookSource
import io.legado.app.help.FileHelp
import io.legado.app.help.http.HttpHelper
import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.OldRule
@ -92,7 +91,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
}.let {
val json = GSON.toJson(it)
val file =
FileHelp.getFile(Backup.exportPath + File.separator + "exportBookSource.json")
FileUtils.getFile(Backup.exportPath + File.separator + "exportBookSource.json")
file.writeText(json)
}
}.onSuccess {

@ -6,9 +6,9 @@ import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseViewModel
import io.legado.app.data.entities.ReplaceRule
import io.legado.app.help.FileHelp
import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.Restore
import io.legado.app.utils.FileUtils
import io.legado.app.utils.GSON
import io.legado.app.utils.splitNotBlank
import org.jetbrains.anko.toast
@ -80,7 +80,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
}.let {
val json = GSON.toJson(it)
val file =
FileHelp.getFile(Backup.exportPath + File.separator + "exportReplaceRule.json")
FileUtils.getFile(Backup.exportPath + File.separator + "exportReplaceRule.json")
file.writeText(json)
}
}.onSuccess {

@ -4,10 +4,10 @@ import android.app.Application
import android.text.TextUtils
import com.jayway.jsonpath.JsonPath
import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseViewModel
import io.legado.app.data.api.IHttpGetApi
import io.legado.app.data.entities.RssSource
import io.legado.app.help.FileHelp
import io.legado.app.help.http.HttpHelper
import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.Restore.jsonPath
@ -65,7 +65,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
App.db.rssSourceDao().getRssSources(*ids.toTypedArray()).let {
val json = GSON.toJson(it)
val file =
FileHelp.getFile(Backup.exportPath + File.separator + "exportRssSource.json")
FileUtils.getFile(Backup.exportPath + File.separator + "exportRssSource.json")
file.writeText(json)
}
}.onSuccess {
@ -123,6 +123,8 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
App.db.rssSourceDao().insert(*it.toTypedArray())
}
}
}.onSuccess {
finally.invoke(context.getString(R.string.success))
}
}

@ -5,7 +5,6 @@ import android.app.Activity.RESULT_OK
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.util.DisplayMetrics
import android.view.LayoutInflater
import android.view.MenuItem
@ -18,13 +17,9 @@ import androidx.recyclerview.widget.LinearLayoutManager
import io.legado.app.App
import io.legado.app.R
import io.legado.app.constant.PreferKey
import io.legado.app.help.FileHelp
import io.legado.app.help.permission.Permissions
import io.legado.app.help.permission.PermissionsCompat
import io.legado.app.utils.DocumentUtils
import io.legado.app.utils.getPrefString
import io.legado.app.utils.putPrefString
import io.legado.app.utils.toast
import io.legado.app.utils.*
import kotlinx.android.synthetic.main.dialog_font_select.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers.IO
@ -127,11 +122,11 @@ class FontSelectDialog : DialogFragment(),
@SuppressLint("DefaultLocale")
private fun getFontFiles(uri: Uri) {
launch(IO) {
FileHelp.deleteFile(fontCacheFolder)
FileUtils.deleteFile(fontCacheFolder)
DocumentFile.fromTreeUri(App.INSTANCE, uri)?.listFiles()?.forEach { file ->
if (file.name?.toLowerCase()?.matches(".*\\.[ot]tf".toRegex()) == true) {
DocumentUtils.readBytes(App.INSTANCE, file.uri)?.let {
FileHelp.getFile(fontCacheFolder + file.name).writeBytes(it)
FileUtils.getFile(fontCacheFolder + file.name).writeBytes(it)
}
}
}
@ -154,7 +149,7 @@ class FontSelectDialog : DialogFragment(),
private fun getFontFilesOld() {
try {
val file =
File(Environment.getExternalStorageDirectory().absolutePath + File.separator + "Fonts")
File(FileUtils.getSdCardPath() + File.separator + "Fonts")
file.listFiles { pathName ->
pathName.name.toLowerCase().matches(".*\\.[ot]tf".toRegex())
}?.let {
@ -167,7 +162,7 @@ class FontSelectDialog : DialogFragment(),
override fun onClick(file: File) {
launch(IO) {
file.copyTo(FileHelp.getFile(fontFolder + file.name), true).absolutePath.let { path ->
file.copyTo(FileUtils.getFile(fontFolder + file.name), true).absolutePath.let { path ->
val cb = (parentFragment as? CallBack) ?: (activity as? CallBack)
cb?.let {
if (it.curFontPath != path) {

@ -597,6 +597,7 @@ class ACache private constructor(cacheDir: File, max_size: Long, max_count: Int)
val w = drawable.intrinsicWidth
val h = drawable.intrinsicHeight
// 取 drawable 的颜色格式
@Suppress("DEPRECATION")
val config = if (drawable.opacity != PixelFormat.OPAQUE)
Bitmap.Config.ARGB_8888
else

@ -4,86 +4,76 @@ import android.content.ContentUris
import android.content.Context
import android.net.Uri
import android.os.Environment
import android.os.storage.StorageManager
import android.provider.DocumentsContract
import android.provider.MediaStore
import android.util.Log
import androidx.core.content.ContextCompat
import io.legado.app.App
import java.io.File
import java.io.IOException
import java.lang.reflect.Array
import java.util.*
object FileUtils {
fun getFileByPath(filePath: String): File? {
return if (filePath.isBlank()) null else File(filePath)
fun getCachePath(): String {
return App.INSTANCE.externalCacheDir?.absolutePath
?: App.INSTANCE.cacheDir.absolutePath
}
fun getSdCardPath(): String {
var sdCardDirectory = Environment.getExternalStorageDirectory().absolutePath
try {
sdCardDirectory = File(sdCardDirectory).canonicalPath
} catch (ioe: IOException) {
ioe.printStackTrace()
//获取文件夹
fun getFolder(filePath: String): File {
val file = File(filePath)
//如果文件夹不存在,就创建它
if (!file.exists()) {
file.mkdirs()
}
return sdCardDirectory
return file
}
fun getStorageData(pContext: Context): ArrayList<String>? {
val storageManager = pContext.getSystemService(Context.STORAGE_SERVICE) as StorageManager
//获取文件
@Synchronized
fun getFile(filePath: String): File {
val file = File(filePath)
try {
val getVolumeList = storageManager.javaClass.getMethod("getVolumeList")
val storageVolumeClazz = Class.forName("android.os.storage.StorageVolume")
val getPath = storageVolumeClazz.getMethod("getPath")
val invokeVolumeList = getVolumeList.invoke(storageManager) ?: return null
val length = Array.getLength(invokeVolumeList)
val list = ArrayList<String>()
for (i in 0 until length) {
val storageVolume = Array.get(invokeVolumeList, i)//得到StorageVolume对象
val path = getPath.invoke(storageVolume) as String
list.add(path)
if (!file.exists()) {
//创建父类文件夹
file.parent?.let {
getFolder(it)
}
return list
} catch (e: Exception) {
//创建文件
file.createNewFile()
}
} catch (e: IOException) {
e.printStackTrace()
}
return null
return file
}
//递归删除文件夹下的数据
@Synchronized
fun deleteFile(filePath: String) {
val file = File(filePath)
if (!file.exists()) return
fun getExtSdCardPaths(con: Context): ArrayList<String> {
val paths = ArrayList<String>()
val files = ContextCompat.getExternalFilesDirs(con, "external")
val firstFile = files[0]
for (file in files) {
if (file != null && file != firstFile) {
val index = file.absolutePath.lastIndexOf("/Android/data")
if (index < 0) {
Log.w("", "Unexpected external file dir: " + file.absolutePath)
} else {
var path = file.absolutePath.substring(0, index)
try {
path = File(path).canonicalPath
} catch (e: IOException) {
// Keep non-canonical path.
if (file.isDirectory) {
val files = file.listFiles()
files?.forEach { subFile ->
val path = subFile.path
deleteFile(path)
}
paths.add(path)
}
//删除文件
file.delete()
}
fun getSdCardPath(): String {
@Suppress("DEPRECATION")
var sdCardDirectory = Environment.getExternalStorageDirectory().absolutePath
try {
sdCardDirectory = File(sdCardDirectory).canonicalPath
} catch (ioe: IOException) {
ioe.printStackTrace()
}
return paths
return sdCardDirectory
}
fun getPath(context: Context, uri: Uri): String? {

@ -2,7 +2,6 @@ package io.legado.app.utils
import android.annotation.SuppressLint
import io.legado.app.App
import io.legado.app.help.FileHelp
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
@ -30,8 +29,8 @@ object LogUtils {
}
private val fileHandler by lazy {
val logFolder = FileHelp.getCachePath() + File.separator + "logs"
FileHelp.getFolder(logFolder)
val logFolder = FileUtils.getCachePath() + File.separator + "logs"
FileUtils.getFolder(logFolder)
FileHandler(
logFolder + File.separator + "app.log",
10240,

@ -250,7 +250,7 @@ object StringUtils {
val m = p.matcher(data)
val buf = StringBuffer(data.length)
while (m.find()) {
val ch = Integer.parseInt(m.group(1), 16).toChar().toString()
val ch = Integer.parseInt(m.group(1)!!, 16).toChar().toString()
m.appendReplacement(buf, Matcher.quoteReplacement(ch))
}
m.appendTail(buf)

Loading…
Cancel
Save