diff --git a/README.md b/README.md index d38454320..0db8d3622 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## 阅读3.0 * [书源规则](https://alanskycn.gitee.io/teachme/) * [更新日志](/app/src/main/assets/updateLog.md) -* [帮助文档](/app/src/main/assets/help/help.md) +* [帮助文档](/app/src/main/assets/help/appHelp.md) ![image](https://github.com/gedoor/gedoor.github.io/blob/master/images/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B1.jpg) ![image](https://github.com/gedoor/gedoor.github.io/blob/master/images/%E9%98%85%E8%AF%BB%E7%AE%80%E4%BB%8B2.jpg) diff --git a/app/build.gradle b/app/build.gradle index 827a987af..d012826b9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -111,7 +111,7 @@ kapt { } dependencies { - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.0' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' implementation fileTree(dir: 'libs', include: ['*.jar']) testImplementation 'junit:junit:4.13.1' androidTestImplementation 'androidx.test:runner:1.3.0' @@ -122,7 +122,7 @@ dependencies { //fireBase implementation 'com.google.firebase:firebase-analytics-ktx:18.0.0' - implementation 'com.google.firebase:firebase-crashlytics-ktx:17.2.2' + implementation 'com.google.firebase:firebase-crashlytics-ktx:17.3.0' //androidX implementation 'androidx.core:core-ktx:1.3.2' diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 70bf0a2c6..da8aa319c 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,16 @@ * 关注合作公众号 **[小说拾遗]()** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2020/11/18** +* 优化导航栏 +* js添加java.log(msg: String)用于调试时输出消息 +* js添加cookie变量,方法见io.legado.app.help.http.api.CookieManager +* js添加cache变量,可以用来存储token之类的临时值,可以设置保存时间,方法见io.legado.app.help.CacheManager +* 需要token的网站可以用js来写了,比如阿里tts + +**2020/11/16** +* 修复导出添加替换净化引起的bug + **2020/11/15** * 正文规则添加字体规则,返回ByteArray * js添加方法: diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index db6b657f4..e43ce9ac7 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -34,8 +34,7 @@ class App : MultiDexApplication() { lateinit var androidId: String var versionCode = 0 var versionName = "" - - + var navigationBarHeight = 0 } override fun onCreate() { diff --git a/app/src/main/java/io/legado/app/base/BaseActivity.kt b/app/src/main/java/io/legado/app/base/BaseActivity.kt index d156c294a..53d2f860a 100644 --- a/app/src/main/java/io/legado/app/base/BaseActivity.kt +++ b/app/src/main/java/io/legado/app/base/BaseActivity.kt @@ -10,6 +10,7 @@ import android.view.MenuItem import android.view.View import android.widget.FrameLayout import androidx.appcompat.app.AppCompatActivity +import io.legado.app.App import io.legado.app.R import io.legado.app.constant.AppConst import io.legado.app.constant.Theme @@ -71,6 +72,13 @@ abstract class BaseActivity( observeLiveBus() } + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + if (hasFocus) { + App.navigationBarHeight = navigationBarHeight + } + } + override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean, newConfig: Configuration?) { super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig) findViewById(R.id.title_bar) diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index 706d08094..7888cb7f9 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -17,8 +17,8 @@ import java.util.* entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, RssSource::class, Bookmark::class, RssArticle::class, RssReadRecord::class, - RssStar::class, TxtTocRule::class, ReadRecord::class, HttpTTS::class], - version = 23, + RssStar::class, TxtTocRule::class, ReadRecord::class, HttpTTS::class, Cache::class], + version = 24, exportSchema = true ) abstract class AppDatabase : RoomDatabase() { @@ -38,6 +38,7 @@ abstract class AppDatabase : RoomDatabase() { abstract fun txtTocRule(): TxtTocRuleDao abstract fun readRecordDao(): ReadRecordDao abstract fun httpTTSDao(): HttpTTSDao + abstract fun cacheDao(): CacheDao companion object { @@ -58,7 +59,8 @@ abstract class AppDatabase : RoomDatabase() { migration_19_20, migration_20_21, migration_21_22, - migration_22_23 + migration_22_23, + migration_23_24 ) .allowMainThreadQueries() .addCallback(dbCallback) @@ -201,6 +203,13 @@ abstract class AppDatabase : RoomDatabase() { database.execSQL("ALTER TABLE chapters ADD baseUrl TEXT NOT NULL DEFAULT ''") } } + + private val migration_23_24 = object : Migration(23, 24) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `caches` (`key` TEXT NOT NULL, `value` TEXT, `deadline` INTEGER NOT NULL, PRIMARY KEY(`key`))") + database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_caches_key` ON `caches` (`key`)") + } + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/dao/CacheDao.kt b/app/src/main/java/io/legado/app/data/dao/CacheDao.kt new file mode 100644 index 000000000..863199b75 --- /dev/null +++ b/app/src/main/java/io/legado/app/data/dao/CacheDao.kt @@ -0,0 +1,24 @@ +package io.legado.app.data.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import io.legado.app.data.entities.Cache + +@Dao +interface CacheDao { + + @Query("select value from caches where `key` = :key and (deadline = 0 or deadline > :now)") + fun get(key: String, now: Long): String? + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg cache: Cache) + + @Query("delete from caches where `key` = :key") + fun delete(key: String) + + @Query("delete from caches where deadline > 0 and deadline < :now") + fun clearDeadline(now: Long) + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index 1169ba690..5d82ec2f5 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -8,7 +8,9 @@ import io.legado.app.constant.AppConst import io.legado.app.constant.BookType import io.legado.app.data.entities.rule.* import io.legado.app.help.AppConfig +import io.legado.app.help.CacheManager import io.legado.app.help.JsExtensions +import io.legado.app.help.http.CookieStore import io.legado.app.utils.ACache import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject @@ -109,6 +111,8 @@ data class BookSource( val bindings = SimpleBindings() bindings["baseUrl"] = bookSourceUrl bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager a = AppConst.SCRIPT_ENGINE.eval( it.substring(4, it.lastIndexOf("<")), bindings @@ -136,6 +140,8 @@ data class BookSource( private fun evalJS(jsStr: String): Any { val bindings = SimpleBindings() bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager return AppConst.SCRIPT_ENGINE.eval(jsStr, bindings) } diff --git a/app/src/main/java/io/legado/app/data/entities/Cache.kt b/app/src/main/java/io/legado/app/data/entities/Cache.kt new file mode 100644 index 000000000..f9687dea7 --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/Cache.kt @@ -0,0 +1,13 @@ +package io.legado.app.data.entities + +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity(tableName = "caches", indices = [(Index(value = ["key"], unique = true))]) +data class Cache( + @PrimaryKey + val key: String = "", + var value: String? = null, + var deadline: Long = 0L +) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/RssSource.kt b/app/src/main/java/io/legado/app/data/entities/RssSource.kt index 0b40b3f13..b61d8baa3 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssSource.kt @@ -6,7 +6,9 @@ import androidx.room.Index import androidx.room.PrimaryKey import io.legado.app.constant.AppConst import io.legado.app.help.AppConfig +import io.legado.app.help.CacheManager import io.legado.app.help.JsExtensions +import io.legado.app.help.http.CookieStore import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import kotlinx.android.parcel.Parcelize @@ -76,6 +78,8 @@ data class RssSource( private fun evalJS(jsStr: String): Any? { val bindings = SimpleBindings() bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager return AppConst.SCRIPT_ENGINE.eval(jsStr, bindings) } diff --git a/app/src/main/java/io/legado/app/help/CacheManager.kt b/app/src/main/java/io/legado/app/help/CacheManager.kt new file mode 100644 index 000000000..53039d4cc --- /dev/null +++ b/app/src/main/java/io/legado/app/help/CacheManager.kt @@ -0,0 +1,39 @@ +package io.legado.app.help + +import io.legado.app.App +import io.legado.app.data.entities.Cache + +@Suppress("unused") +object CacheManager { + + /** + * saveTime 单位为秒 + */ + @JvmOverloads + fun put(key: String, value: Any, saveTime: Int = 0) { + val deadline = if (saveTime == 0) 0 else System.currentTimeMillis() + saveTime * 1000 + val cache = Cache(key, value.toString(), deadline) + App.db.cacheDao().insert(cache) + } + + fun get(key: String): String? { + return App.db.cacheDao().get(key, System.currentTimeMillis()) + } + + fun getInt(key: String): Int? { + return get(key)?.toIntOrNull() + } + + fun getLong(key: String): Long? { + return get(key)?.toLongOrNull() + } + + fun getDouble(key: String): Double? { + return get(key)?.toDoubleOrNull() + } + + fun getFloat(key: String): Float? { + return get(key)?.toFloatOrNull() + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 642905691..c692be75e 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -5,6 +5,7 @@ import androidx.annotation.Keep import io.legado.app.constant.AppConst.dateFormat import io.legado.app.help.http.CookieStore import io.legado.app.help.http.SSLHelper +import io.legado.app.model.Debug import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.utils.* import org.jsoup.Connection @@ -206,4 +207,7 @@ interface JsExtensions { return Base64.decode(str, flags) } + fun log(msg: String) { + Debug.log(msg) + } } diff --git a/app/src/main/java/io/legado/app/help/http/CookieStore.kt b/app/src/main/java/io/legado/app/help/http/CookieStore.kt index a565560b7..17bcc7695 100644 --- a/app/src/main/java/io/legado/app/help/http/CookieStore.kt +++ b/app/src/main/java/io/legado/app/help/http/CookieStore.kt @@ -7,19 +7,17 @@ import com.franmontiel.persistentcookiejar.persistence.CookiePersistor import com.franmontiel.persistentcookiejar.persistence.SerializableCookie import io.legado.app.App import io.legado.app.data.entities.Cookie -import io.legado.app.help.coroutine.Coroutine +import io.legado.app.help.http.api.CookieManager import io.legado.app.utils.NetworkUtils -object CookieStore : CookiePersistor { +object CookieStore : CookiePersistor, CookieManager { - fun setCookie(url: String, cookie: String?) { - Coroutine.async { - val cookieBean = Cookie(NetworkUtils.getSubDomain(url), cookie ?: "") - App.db.cookieDao().insert(cookieBean) - } + override fun setCookie(url: String, cookie: String?) { + val cookieBean = Cookie(NetworkUtils.getSubDomain(url), cookie ?: "") + App.db.cookieDao().insert(cookieBean) } - fun replaceCookie(url: String, cookie: String) { + override fun replaceCookie(url: String, cookie: String) { if (TextUtils.isEmpty(url) || TextUtils.isEmpty(cookie)) { return } @@ -34,16 +32,16 @@ object CookieStore : CookiePersistor { } } - fun getCookie(url: String): String { + override fun getCookie(url: String): String { val cookieBean = App.db.cookieDao().get(NetworkUtils.getSubDomain(url)) return cookieBean?.cookie ?: "" } - fun removeCookie(url: String) { + override fun removeCookie(url: String) { App.db.cookieDao().delete(NetworkUtils.getSubDomain(url)) } - fun cookieToMap(cookie: String): MutableMap { + override fun cookieToMap(cookie: String): MutableMap { val cookieMap = mutableMapOf() if (cookie.isBlank()) { return cookieMap @@ -63,7 +61,7 @@ object CookieStore : CookiePersistor { return cookieMap } - fun mapToCookie(cookieMap: Map?): String? { + override fun mapToCookie(cookieMap: Map?): String? { if (cookieMap == null || cookieMap.isEmpty()) { return null } diff --git a/app/src/main/java/io/legado/app/help/http/api/CookieManager.kt b/app/src/main/java/io/legado/app/help/http/api/CookieManager.kt new file mode 100644 index 000000000..525aa712d --- /dev/null +++ b/app/src/main/java/io/legado/app/help/http/api/CookieManager.kt @@ -0,0 +1,28 @@ +package io.legado.app.help.http.api + +interface CookieManager { + + /** + * 保存cookie + */ + fun setCookie(url: String, cookie: String?) + + /** + * 替换cookie + */ + fun replaceCookie(url: String, cookie: String) + + /** + * 获取cookie + */ + fun getCookie(url: String): String + + /** + * 移除cookie + */ + fun removeCookie(url: String) + + fun cookieToMap(cookie: String): MutableMap + + fun mapToCookie(cookieMap: Map?): String? +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/lib/theme/ATH.kt b/app/src/main/java/io/legado/app/lib/theme/ATH.kt index 87dd199c1..45e3fec18 100644 --- a/app/src/main/java/io/legado/app/lib/theme/ATH.kt +++ b/app/src/main/java/io/legado/app/lib/theme/ATH.kt @@ -126,10 +126,8 @@ object ATH { activity: Activity, color: Int = ThemeStore.navigationBarColor(activity) ) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - activity.window.navigationBarColor = color - setLightNavigationBar(activity, ColorUtils.isColorLight(color)) - } + activity.window.navigationBarColor = color + setLightNavigationBar(activity, ColorUtils.isColorLight(color)) } fun setLightNavigationBar(activity: Activity, enabled: Boolean) { @@ -170,18 +168,15 @@ object ATH { } fun setTaskDescriptionColor(activity: Activity, @ColorInt color: Int) { - val color1: Int - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - color1 = ColorUtils.stripAlpha(color) - @Suppress("DEPRECATION") - activity.setTaskDescription( - ActivityManager.TaskDescription( - activity.title as String, - null, - color1 - ) + val color1: Int = ColorUtils.stripAlpha(color) + @Suppress("DEPRECATION") + activity.setTaskDescription( + ActivityManager.TaskDescription( + activity.title as String, + null, + color1 ) - } + ) } fun setTint( diff --git a/app/src/main/java/io/legado/app/model/Debug.kt b/app/src/main/java/io/legado/app/model/Debug.kt index 4e419bef4..cfd64d6ee 100644 --- a/app/src/main/java/io/legado/app/model/Debug.kt +++ b/app/src/main/java/io/legado/app/model/Debug.kt @@ -41,6 +41,11 @@ object Debug { callback?.printLog(state, printMsg) } + @Synchronized + fun log(msg: String?) { + log(debugSource, msg, true) + } + fun cancelDebug(destroy: Boolean = false) { tasks.clear() diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 82b521292..50fceacc4 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -6,7 +6,9 @@ import io.legado.app.constant.AppConst.SCRIPT_ENGINE import io.legado.app.constant.AppPattern.JS_PATTERN import io.legado.app.data.entities.BaseBook import io.legado.app.data.entities.BookChapter +import io.legado.app.help.CacheManager import io.legado.app.help.JsExtensions +import io.legado.app.help.http.CookieStore import io.legado.app.utils.* import org.jsoup.nodes.Entities import org.mozilla.javascript.NativeObject @@ -649,6 +651,8 @@ class AnalyzeRule(var book: BaseBook? = null) : JsExtensions { private fun evalJS(jsStr: String, result: Any?): Any? { val bindings = SimpleBindings() bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager bindings["book"] = book bindings["result"] = result bindings["baseUrl"] = baseUrl diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index aa4e7ec17..338b8386e 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -12,6 +12,7 @@ import io.legado.app.constant.AppPattern.JS_PATTERN import io.legado.app.data.entities.BaseBook import io.legado.app.data.entities.BookChapter import io.legado.app.help.AppConfig +import io.legado.app.help.CacheManager import io.legado.app.help.JsExtensions import io.legado.app.help.http.* import io.legado.app.help.http.api.HttpGetApi @@ -136,18 +137,20 @@ class AnalyzeUrl( if (ruleUrl.contains("{{") && ruleUrl.contains("}}")) { var jsEval: Any val sb = StringBuffer() - val simpleBindings = SimpleBindings() - simpleBindings["java"] = this - simpleBindings["baseUrl"] = baseUrl - simpleBindings["page"] = page - simpleBindings["key"] = key - simpleBindings["speakText"] = speakText - simpleBindings["speakSpeed"] = speakSpeed - simpleBindings["book"] = book + val bindings = SimpleBindings() + bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager + bindings["baseUrl"] = baseUrl + bindings["page"] = page + bindings["key"] = key + bindings["speakText"] = speakText + bindings["speakSpeed"] = speakSpeed + bindings["book"] = book val expMatcher = EXP_PATTERN.matcher(ruleUrl) while (expMatcher.find()) { jsEval = expMatcher.group(1)?.let { - SCRIPT_ENGINE.eval(it, simpleBindings) + SCRIPT_ENGINE.eval(it, bindings) } ?: "" if (jsEval is String) { expMatcher.appendReplacement(sb, jsEval) @@ -259,6 +262,8 @@ class AnalyzeUrl( private fun evalJS(jsStr: String, result: Any? = null): Any? { val bindings = SimpleBindings() bindings["java"] = this + bindings["cookie"] = CookieStore + bindings["cache"] = CacheManager bindings["page"] = page bindings["key"] = key bindings["speakText"] = speakText diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.kt b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.kt index 9b6a8ec52..bb8da0789 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.kt @@ -4,7 +4,6 @@ import io.legado.app.help.JsExtensions import java.nio.charset.Charset import kotlin.experimental.and -@ExperimentalUnsignedTypes /** * 解析TTF字体 * @see 获取详情 diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index c9923b776..a2d487113 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -111,7 +111,7 @@ class WebBook(val bookSource: BookSource) { headerMapF = bookSource.getHeaderMap(), book = book ).getResponseAwait(bookSource.bookSourceUrl) - BookInfo.analyzeBookInfo(book, res.body, bookSource, res.url, canReName) + BookInfo.analyzeBookInfo(book, res.body, bookSource, book.bookUrl, canReName) } book } diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt index 86e57fb68..69a91d791 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt @@ -92,13 +92,10 @@ class CacheViewModel(application: Application) : BaseViewModel(application) { .append(context.getString(R.string.author_show, book.author)) App.db.bookChapterDao().getChapterList(book.bookUrl).forEach { chapter -> BookHelp.getContent(book, chapter).let { content -> - val content1 = content?.let { - contentProcessor.getContent(book, chapter.title, it, false) - .joinToString("\n") - } + val content1 = contentProcessor + .getContent(book, chapter.title, content ?: "null", false) + .joinToString("\n") stringBuilder.append("\n\n") - .append(chapter.title) - .append("\n") .append(content1) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt index 1e68e29ff..339a535cd 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt @@ -5,7 +5,6 @@ import android.app.Activity import android.content.Intent import android.content.pm.ActivityInfo import android.graphics.Color -import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Build import android.os.Bundle @@ -44,6 +43,9 @@ import kotlinx.android.synthetic.main.view_read_menu.* import org.jetbrains.anko.sdk27.listeners.onClick import org.jetbrains.anko.startActivityForResult +/** + * 阅读界面 + */ abstract class ReadBookBaseActivity : VMBaseActivity(R.layout.activity_book_read) { @@ -166,9 +168,7 @@ abstract class ReadBookBaseActivity : if (!isInMultiWindow) { flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN } - if (ReadBookConfig.hideNavigationBar) { - flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - } + flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION if (toolBarHide) { if (ReadBookConfig.hideStatusBar) { flag = flag or View.SYSTEM_UI_FLAG_FULLSCREEN @@ -185,11 +185,8 @@ abstract class ReadBookBaseActivity : read_menu == null -> return read_menu.isVisible -> ATH.setNavigationBarColorAuto(this) bottomDialog > 0 -> ATH.setNavigationBarColorAuto(this, bottomBackground) - ReadBookConfig.bg is ColorDrawable -> { - ATH.setNavigationBarColorAuto(this, ReadBookConfig.bgMeanColor) - } else -> { - ATH.setNavigationBarColorAuto(this, Color.BLACK) + ATH.setNavigationBarColorAuto(this, Color.TRANSPARENT) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index b349fe629..7570b2f8c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -14,7 +14,6 @@ import io.legado.app.R import io.legado.app.constant.PreferKey import io.legado.app.help.AppConfig import io.legado.app.help.LocalConfig -import io.legado.app.help.ReadBookConfig import io.legado.app.lib.theme.* import io.legado.app.service.help.ReadBook import io.legado.app.utils.* @@ -237,10 +236,8 @@ class ReadMenu @JvmOverloads constructor( override fun onAnimationEnd(animation: Animation) { vw_menu_bg.onClick { runMenuOut() } - val hasNavigationBar = ReadBookConfig.hideNavigationBar - && SystemUtils.isNavigationBarExist(activity) vwNavigationBar.layoutParams = vwNavigationBar.layoutParams.apply { - height = if (hasNavigationBar) context.navigationBarHeight else 0 + height = activity!!.navigationBarHeight } if (LocalConfig.isFirstReadMenuShow) { callBack.showReadMenuHelp() diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt index 9ec107b92..e67dc8752 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt @@ -21,7 +21,6 @@ class AutoReadDialog : BaseDialogFragment() { override fun onStart() { super.onStart() - (activity as ReadBookActivity).bottomDialog++ dialog?.window?.let { it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) it.setBackgroundDrawableResource(R.color.background) @@ -44,6 +43,7 @@ class AutoReadDialog : BaseDialogFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + (activity as ReadBookActivity).bottomDialog++ callBack = activity as? CallBack return inflater.inflate(R.layout.dialog_auto_read, container) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 99b8db65d..4e9a166a2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -50,7 +50,6 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { override fun onStart() { super.onStart() - (activity as ReadBookActivity).bottomDialog++ dialog?.window?.let { it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) it.setBackgroundDrawableResource(R.color.background) @@ -68,6 +67,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + (activity as ReadBookActivity).bottomDialog++ return inflater.inflate(R.layout.dialog_read_bg_text, container) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt index 30608a1f8..ef0cc69cb 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ClickActionConfigDialog.kt @@ -23,7 +23,6 @@ class ClickActionConfigDialog : BaseDialogFragment() { override fun onStart() { super.onStart() - (activity as ReadBookActivity).bottomDialog++ dialog?.window?.let { it.setBackgroundDrawableResource(R.color.transparent) it.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) @@ -35,6 +34,7 @@ class ClickActionConfigDialog : BaseDialogFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + (activity as ReadBookActivity).bottomDialog++ return inflater.inflate(R.layout.dialog_click_action_config, container) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt index b920e1784..897895b09 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt @@ -25,7 +25,6 @@ class MoreConfigDialog : DialogFragment() { override fun onStart() { super.onStart() - (activity as ReadBookActivity).bottomDialog++ dialog?.window?.let { it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) it.setBackgroundDrawableResource(R.color.background) @@ -43,6 +42,7 @@ class MoreConfigDialog : DialogFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + (activity as ReadBookActivity).bottomDialog++ val view = LinearLayout(context) view.setBackgroundColor(requireContext().bottomBackground) view.id = R.id.tag1 diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt index a7020fb98..11ecd6c6a 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt @@ -26,7 +26,6 @@ class ReadAloudDialog : BaseDialogFragment() { override fun onStart() { super.onStart() - (activity as ReadBookActivity).bottomDialog++ dialog?.window?.let { it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) it.setBackgroundDrawableResource(R.color.background) @@ -49,6 +48,7 @@ class ReadAloudDialog : BaseDialogFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + (activity as ReadBookActivity).bottomDialog++ callBack = activity as? CallBack return inflater.inflate(R.layout.dialog_read_aloud, container) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt index 7184c9384..b17f82cca 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt @@ -35,7 +35,6 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { override fun onStart() { super.onStart() - (activity as ReadBookActivity).bottomDialog++ dialog?.window?.let { it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) it.setBackgroundDrawableResource(R.color.background) @@ -53,6 +52,7 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + (activity as ReadBookActivity).bottomDialog++ return inflater.inflate(R.layout.dialog_read_book_style, container) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt index 85e2d9d80..09daf30de 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentView.kt @@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable import android.widget.FrameLayout import androidx.core.view.isGone import androidx.core.view.isInvisible +import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseActivity import io.legado.app.constant.AppConst.timeFormat @@ -51,41 +52,42 @@ class ContentView(context: Context) : FrameLayout(context) { } } - fun upStyle() { - ReadBookConfig.apply { - bv_header_left.typeface = ChapterProvider.typeface - tv_header_left.typeface = ChapterProvider.typeface - tv_header_middle.typeface = ChapterProvider.typeface - tv_header_right.typeface = ChapterProvider.typeface - bv_footer_left.typeface = ChapterProvider.typeface - tv_footer_left.typeface = ChapterProvider.typeface - tv_footer_middle.typeface = ChapterProvider.typeface - tv_footer_right.typeface = ChapterProvider.typeface - bv_header_left.setColor(textColor) - tv_header_left.setColor(textColor) - tv_header_middle.setColor(textColor) - tv_header_right.setColor(textColor) - bv_footer_left.setColor(textColor) - tv_footer_left.setColor(textColor) - tv_footer_middle.setColor(textColor) - tv_footer_right.setColor(textColor) - upStatusBar() - ll_header.setPadding( - headerPaddingLeft.dp, - headerPaddingTop.dp, - headerPaddingRight.dp, - headerPaddingBottom.dp - ) - ll_footer.setPadding( - footerPaddingLeft.dp, - footerPaddingTop.dp, - footerPaddingRight.dp, - footerPaddingBottom.dp - ) - vw_top_divider.visible(showHeaderLine) - vw_bottom_divider.visible(showFooterLine) - content_text_view.upVisibleRect() + fun upStyle() = ReadBookConfig.apply { + bv_header_left.typeface = ChapterProvider.typeface + tv_header_left.typeface = ChapterProvider.typeface + tv_header_middle.typeface = ChapterProvider.typeface + tv_header_right.typeface = ChapterProvider.typeface + bv_footer_left.typeface = ChapterProvider.typeface + tv_footer_left.typeface = ChapterProvider.typeface + tv_footer_middle.typeface = ChapterProvider.typeface + tv_footer_right.typeface = ChapterProvider.typeface + bv_header_left.setColor(textColor) + tv_header_left.setColor(textColor) + tv_header_middle.setColor(textColor) + tv_header_right.setColor(textColor) + bv_footer_left.setColor(textColor) + tv_footer_left.setColor(textColor) + tv_footer_middle.setColor(textColor) + tv_footer_right.setColor(textColor) + upStatusBar() + ll_header.setPadding( + headerPaddingLeft.dp, + headerPaddingTop.dp, + headerPaddingRight.dp, + headerPaddingBottom.dp + ) + ll_footer.setPadding( + footerPaddingLeft.dp, + footerPaddingTop.dp, + footerPaddingRight.dp, + footerPaddingBottom.dp + ) + vw_top_divider.visible(showHeaderLine) + vw_bottom_divider.visible(showFooterLine) + page_nv_bar.layoutParams = page_nv_bar.layoutParams.apply { + height = if (hideNavigationBar) 0 else App.navigationBarHeight } + content_text_view.upVisibleRect() upTime() upBattery(battery) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 4bd777ab8..4abc569e7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -112,7 +112,7 @@ class PageView(context: Context, attrs: AttributeSet) : brRect.set(width * 0.66f, height * 0.66f, width - 10f, height - 10f) prevPage.x = -w.toFloat() pageDelegate?.setViewSize(w, h) - if (oldw != 0 && oldh != 0) { + if (w != 0 && h != 0) { ReadBook.loadContent(resetPageOffset = false) } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 44e49ca3f..ed0f3484d 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -328,6 +328,8 @@ class BookSourceActivity : VMBaseActivity(R.layout.activity layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { editText = edit_view edit_view.setHint(R.string.group_name) + edit_view.setFilterValues(groups.toList()) + edit_view.dropDownHeight = 180.dp } } okButton { @@ -337,7 +339,7 @@ class BookSourceActivity : VMBaseActivity(R.layout.activity } } } - noButton() + cancelButton() }.show() } @@ -349,6 +351,8 @@ class BookSourceActivity : VMBaseActivity(R.layout.activity layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { editText = edit_view edit_view.setHint(R.string.group_name) + edit_view.setFilterValues(groups.toList()) + edit_view.dropDownHeight = 180.dp } } okButton { @@ -358,7 +362,7 @@ class BookSourceActivity : VMBaseActivity(R.layout.activity } } } - noButton() + cancelButton() }.show() } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt index 94396919d..aa7a2db15 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt @@ -50,7 +50,7 @@ class RssSourceEditActivity : override fun finish() { val source = getRssSource() - if (!source.equal(viewModel.rssSource ?: RssSource())) { + if (!source.equal(viewModel.rssSource)) { alert(R.string.exit) { messageResource = R.string.exit_no_save positiveButton(R.string.yes) diff --git a/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt b/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt index f3f4e0be7..54259fe53 100644 --- a/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt +++ b/app/src/main/java/io/legado/app/ui/welcome/WelcomeActivity.kt @@ -33,6 +33,7 @@ open class WelcomeActivity : BaseActivity(R.layout.activity_welcome) { private fun init() { Coroutine.async { + App.db.cacheDao().clearDeadline(System.currentTimeMillis()) //清除过期数据 if (getPrefBoolean(PreferKey.autoClearExpired, true)) { App.db.searchBookDao() diff --git a/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt b/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt index 3c3c1d7c3..9e1d9cded 100644 --- a/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/BatteryView.kt @@ -26,7 +26,9 @@ class BatteryView @JvmOverloads constructor( batteryPaint.strokeWidth = 1.dp.toFloat() batteryPaint.isAntiAlias = true batteryPaint.color = paint.color - typeface = Typeface.createFromAsset(context.assets, "font${File.separator}number.ttf") + if (!isInEditMode) { + typeface = Typeface.createFromAsset(context.assets, "font${File.separator}number.ttf") + } } fun setColor(@ColorInt color: Int) { diff --git a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt index 689d5b443..df4bae769 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt @@ -21,3 +21,16 @@ fun Activity.getSize(): DisplayMetrics { } return displayMetrics } + +/** + * 该方法需要在View完全被绘制出来之后调用,否则判断不了 + * 在比如 onWindowFocusChanged()方法中可以得到正确的结果 + */ +val Activity.navigationBarHeight: Int + get() { + if (SystemUtils.isNavigationBarExist(this)) { + val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") + return resources.getDimensionPixelSize(resourceId) + } + return 0 + } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_read_aloud.xml b/app/src/main/res/layout/dialog_read_aloud.xml index 8d5b33f43..878cdbf8e 100644 --- a/app/src/main/res/layout/dialog_read_aloud.xml +++ b/app/src/main/res/layout/dialog_read_aloud.xml @@ -225,7 +225,8 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" android:text="@string/chapter_list" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -263,7 +264,8 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" android:text="@string/main_menu" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -301,7 +303,8 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" android:text="@string/to_backstage" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -339,7 +342,8 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" android:text="@string/setting" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:textColor="@color/primaryText" android:textSize="12sp" /> diff --git a/app/src/main/res/layout/view_book_page.xml b/app/src/main/res/layout/view_book_page.xml index 95fd4f1f3..69d35e794 100644 --- a/app/src/main/res/layout/view_book_page.xml +++ b/app/src/main/res/layout/view_book_page.xml @@ -148,4 +148,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_read_menu.xml b/app/src/main/res/layout/view_read_menu.xml index 27f387599..e7882c8bc 100644 --- a/app/src/main/res/layout/view_read_menu.xml +++ b/app/src/main/res/layout/view_read_menu.xml @@ -281,7 +281,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:text="@string/chapter_list" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -321,7 +322,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:text="@string/read_aloud" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -361,7 +363,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:text="@string/interface_setting" android:textColor="@color/primaryText" android:textSize="12sp" /> @@ -401,7 +404,8 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="3dp" - android:maxLines="1" + android:singleLine="true" + android:ellipsize="middle" android:text="@string/setting" android:textColor="@color/primaryText" android:textSize="12sp" /> diff --git a/build.gradle b/build.gradle index 64b5d9d91..c29e8f3c7 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'de.timfreiheit.resourceplaceholders:placeholders:0.3' classpath 'com.google.gms:google-services:4.3.4' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1' } }