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. 106
      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) } ?: super.onCreateOptionsMenu(menu)
} }
override fun onMenuOpened(featureId: Int, menu: Menu?): Boolean { override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
menu?.applyOpenTint(this) menu.applyOpenTint(this)
return super.onMenuOpened(featureId, menu) return super.onMenuOpened(featureId, menu)
} }

@ -41,8 +41,8 @@ object BookHelp {
} }
fun clearCache() { fun clearCache() {
FileHelp.deleteFile(getBookCachePath()) FileUtils.deleteFile(getBookCachePath())
FileHelp.getFolder(getBookCachePath()) FileUtils.getFolder(getBookCachePath())
} }
@Synchronized @Synchronized
@ -57,20 +57,20 @@ object BookHelp {
) )
} }
} else { } else {
FileHelp.getFolder(getBookFolder(book)).listFiles()?.forEach { FileUtils.getFolder(getBookFolder(book)).listFiles()?.forEach {
if (it.name.startsWith(String.format("%05d", bookChapter.index))) { if (it.name.startsWith(String.format("%05d", bookChapter.index))) {
it.delete() it.delete()
return@forEach return@forEach
} }
} }
val filePath = getChapterPath(book, bookChapter) val filePath = getChapterPath(book, bookChapter)
val file = FileHelp.getFile(filePath) val file = FileUtils.getFile(filePath)
file.writeText(content) file.writeText(content)
} }
} }
fun getChapterCount(book: Book): Int { 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 { 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 android.net.Uri
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import io.legado.app.App import io.legado.app.App
import io.legado.app.help.FileHelp
import io.legado.app.help.ReadBookConfig import io.legado.app.help.ReadBookConfig
import io.legado.app.utils.DocumentUtils import io.legado.app.utils.DocumentUtils
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
@ -48,37 +47,40 @@ object Backup {
App.db.bookDao().allBooks.let { App.db.bookDao().allBooks.let {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
val json = GSON.toJson(it) 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 { App.db.bookGroupDao().all().let {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
val json = GSON.toJson(it) 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 { App.db.bookSourceDao().all.let {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
val json = GSON.toJson(it) val json = GSON.toJson(it)
FileHelp.getFile(backupPath + File.separator + "bookSource.json") FileUtils.getFile(backupPath + File.separator + "bookSource.json")
.writeText(json) .writeText(json)
} }
} }
App.db.rssSourceDao().all.let { App.db.rssSourceDao().all.let {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
val json = GSON.toJson(it) 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 { App.db.replaceRuleDao().all.let {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
val json = GSON.toJson(it) val json = GSON.toJson(it)
FileHelp.getFile(backupPath + File.separator + "replaceRule.json") FileUtils.getFile(backupPath + File.separator + "replaceRule.json")
.writeText(json) .writeText(json)
} }
} }
GSON.toJson(ReadBookConfig.configList)?.let { GSON.toJson(ReadBookConfig.configList)?.let {
FileHelp.getFile(backupPath + File.separator + ReadBookConfig.readConfigFileName) FileUtils.getFile(backupPath + File.separator + ReadBookConfig.readConfigFileName)
.writeText(it) .writeText(it)
} }
Preferences.getSharedPreferences(App.INSTANCE, backupPath, "config")?.let { sp -> Preferences.getSharedPreferences(App.INSTANCE, backupPath, "config")?.let { sp ->
@ -111,7 +113,7 @@ object Backup {
doc?.let { doc?.let {
DocumentUtils.writeText( DocumentUtils.writeText(
context, context,
FileHelp.getFile(backupPath + File.separator + fileName).readText(), FileUtils.getFile(backupPath + File.separator + fileName).readText(),
doc.uri doc.uri
) )
} }
@ -122,8 +124,8 @@ object Backup {
private fun copyBackup() { private fun copyBackup() {
try { try {
for (fileName in backupFileNames) { for (fileName in backupFileNames) {
FileHelp.getFile(backupPath + File.separator + "bookshelf.json") FileUtils.getFile(backupPath + File.separator + "bookshelf.json")
.copyTo(FileHelp.getFile(legadoPath + File.separator + "bookshelf.json"), true) .copyTo(FileUtils.getFile(legadoPath + File.separator + "bookshelf.json"), true)
} }
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()

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

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

@ -4,14 +4,10 @@ import android.app.PendingIntent
import android.media.MediaPlayer import android.media.MediaPlayer
import io.legado.app.constant.Bus import io.legado.app.constant.Bus
import io.legado.app.data.api.IHttpPostApi import io.legado.app.data.api.IHttpPostApi
import io.legado.app.help.FileHelp
import io.legado.app.help.IntentHelp import io.legado.app.help.IntentHelp
import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.HttpHelper
import io.legado.app.service.help.ReadBook import io.legado.app.service.help.ReadBook
import io.legado.app.utils.LogUtils import io.legado.app.utils.*
import io.legado.app.utils.getPrefInt
import io.legado.app.utils.getPrefString
import io.legado.app.utils.postEvent
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive
@ -65,7 +61,7 @@ class HttpReadAloudService : BaseReadAloudService(),
private fun downloadAudio() { private fun downloadAudio() {
job = launch(IO) { job = launch(IO) {
FileHelp.deleteFile(ttsFolder) FileUtils.deleteFile(ttsFolder)
for (index in 0 until contentList.size) { for (index in 0 until contentList.size) {
if (isActive) { if (isActive) {
val bytes = HttpHelper.getByteRetrofit("http://tts.baidu.com") val bytes = HttpHelper.getByteRetrofit("http://tts.baidu.com")
@ -104,7 +100,7 @@ class HttpReadAloudService : BaseReadAloudService(),
} }
private fun getSpeakFile(index: Int = nowSpeak): File { 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> { 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.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.constant.Bus import io.legado.app.constant.Bus
import io.legado.app.help.FileHelp
import io.legado.app.help.ImageLoader import io.legado.app.help.ImageLoader
import io.legado.app.help.ReadBookConfig import io.legado.app.help.ReadBookConfig
import io.legado.app.help.permission.Permissions import io.legado.app.help.permission.Permissions
@ -174,7 +173,7 @@ class BgTextConfigDialog : DialogFragment() {
var file = requireContext().getExternalFilesDir(null) var file = requireContext().getExternalFilesDir(null)
?: requireContext().filesDir ?: requireContext().filesDir
file = 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 { DocumentUtils.readBytes(requireContext(), uri)?.let {
file.writeBytes(it) file.writeBytes(it)
ReadBookConfig.getConfig().setBg(2, file.absolutePath) 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.base.BaseViewModel
import io.legado.app.data.api.IHttpGetApi import io.legado.app.data.api.IHttpGetApi
import io.legado.app.data.entities.BookSource 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.http.HttpHelper
import io.legado.app.help.storage.Backup import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.OldRule import io.legado.app.help.storage.OldRule
@ -92,7 +91,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
}.let { }.let {
val json = GSON.toJson(it) val json = GSON.toJson(it)
val file = val file =
FileHelp.getFile(Backup.exportPath + File.separator + "exportBookSource.json") FileUtils.getFile(Backup.exportPath + File.separator + "exportBookSource.json")
file.writeText(json) file.writeText(json)
} }
}.onSuccess { }.onSuccess {

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

@ -4,10 +4,10 @@ import android.app.Application
import android.text.TextUtils import android.text.TextUtils
import com.jayway.jsonpath.JsonPath import com.jayway.jsonpath.JsonPath
import io.legado.app.App import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.data.api.IHttpGetApi import io.legado.app.data.api.IHttpGetApi
import io.legado.app.data.entities.RssSource 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.http.HttpHelper
import io.legado.app.help.storage.Backup import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.Restore.jsonPath 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 { App.db.rssSourceDao().getRssSources(*ids.toTypedArray()).let {
val json = GSON.toJson(it) val json = GSON.toJson(it)
val file = val file =
FileHelp.getFile(Backup.exportPath + File.separator + "exportRssSource.json") FileUtils.getFile(Backup.exportPath + File.separator + "exportRssSource.json")
file.writeText(json) file.writeText(json)
} }
}.onSuccess { }.onSuccess {
@ -123,6 +123,8 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
App.db.rssSourceDao().insert(*it.toTypedArray()) 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.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
@ -18,13 +17,9 @@ import androidx.recyclerview.widget.LinearLayoutManager
import io.legado.app.App import io.legado.app.App
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.PreferKey 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.Permissions
import io.legado.app.help.permission.PermissionsCompat import io.legado.app.help.permission.PermissionsCompat
import io.legado.app.utils.DocumentUtils import io.legado.app.utils.*
import io.legado.app.utils.getPrefString
import io.legado.app.utils.putPrefString
import io.legado.app.utils.toast
import kotlinx.android.synthetic.main.dialog_font_select.* import kotlinx.android.synthetic.main.dialog_font_select.*
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
@ -127,11 +122,11 @@ class FontSelectDialog : DialogFragment(),
@SuppressLint("DefaultLocale") @SuppressLint("DefaultLocale")
private fun getFontFiles(uri: Uri) { private fun getFontFiles(uri: Uri) {
launch(IO) { launch(IO) {
FileHelp.deleteFile(fontCacheFolder) FileUtils.deleteFile(fontCacheFolder)
DocumentFile.fromTreeUri(App.INSTANCE, uri)?.listFiles()?.forEach { file -> DocumentFile.fromTreeUri(App.INSTANCE, uri)?.listFiles()?.forEach { file ->
if (file.name?.toLowerCase()?.matches(".*\\.[ot]tf".toRegex()) == true) { if (file.name?.toLowerCase()?.matches(".*\\.[ot]tf".toRegex()) == true) {
DocumentUtils.readBytes(App.INSTANCE, file.uri)?.let { 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() { private fun getFontFilesOld() {
try { try {
val file = val file =
File(Environment.getExternalStorageDirectory().absolutePath + File.separator + "Fonts") File(FileUtils.getSdCardPath() + File.separator + "Fonts")
file.listFiles { pathName -> file.listFiles { pathName ->
pathName.name.toLowerCase().matches(".*\\.[ot]tf".toRegex()) pathName.name.toLowerCase().matches(".*\\.[ot]tf".toRegex())
}?.let { }?.let {
@ -167,7 +162,7 @@ class FontSelectDialog : DialogFragment(),
override fun onClick(file: File) { override fun onClick(file: File) {
launch(IO) { 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) val cb = (parentFragment as? CallBack) ?: (activity as? CallBack)
cb?.let { cb?.let {
if (it.curFontPath != path) { 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 w = drawable.intrinsicWidth
val h = drawable.intrinsicHeight val h = drawable.intrinsicHeight
// 取 drawable 的颜色格式 // 取 drawable 的颜色格式
@Suppress("DEPRECATION")
val config = if (drawable.opacity != PixelFormat.OPAQUE) val config = if (drawable.opacity != PixelFormat.OPAQUE)
Bitmap.Config.ARGB_8888 Bitmap.Config.ARGB_8888
else else

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

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

@ -250,7 +250,7 @@ object StringUtils {
val m = p.matcher(data) val m = p.matcher(data)
val buf = StringBuffer(data.length) val buf = StringBuffer(data.length)
while (m.find()) { 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.appendReplacement(buf, Matcher.quoteReplacement(ch))
} }
m.appendTail(buf) m.appendTail(buf)

Loading…
Cancel
Save