diff --git a/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt b/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt index f1fd920..0aa87fd 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/sp/AppStore.kt @@ -20,9 +20,14 @@ class AppStore(context: Context) { key = DOCUMENT_SORT_TYPE, defaultValue = SortConfig.default().toPreferenceString() ) + var isEyeCareMode: Boolean by store.boolean( + key = IS_EYE_CARE_MODE, defaultValue = false + ) + companion object { private const val FILE_NAME = "prp_sp_name" private const val PERMISSIONS_DIALOG_PROMPT = "permissions_dialog_prompt" private const val DOCUMENT_SORT_TYPE = "document_sort_type" + private const val IS_EYE_CARE_MODE = "is_eye_care_mode" } } \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt index 3ea4428..9caf22f 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MainActivity.kt @@ -52,7 +52,7 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback setContentView(binding.root) initObserve() ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true) - .navigationBarColor(R.color.black).init() + .navigationBarColor(R.color.white).init() setupFragments() setupNavigation() diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt index fc52292..c26127e 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt @@ -3,11 +3,12 @@ package com.all.pdfreader.pro.app.ui.act import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.MotionEvent +import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.databinding.ActivityPdfViewBinding -import com.all.pdfreader.pro.app.model.FileActionEvent import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.ui.dialog.PdfPasswordProtectionDialogFragment import com.all.pdfreader.pro.app.ui.view.CustomScrollHandle @@ -15,11 +16,14 @@ import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import com.github.barteksc.pdfviewer.listener.OnErrorListener import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener import com.github.barteksc.pdfviewer.listener.OnPageChangeListener +import com.github.barteksc.pdfviewer.listener.OnTapListener +import com.gyf.immersionbar.BarHide +import com.gyf.immersionbar.ImmersionBar import kotlinx.coroutines.launch import java.io.File class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeListener, - OnErrorListener { + OnErrorListener, OnTapListener { override val TAG: String = "PdfViewActivity" companion object { @@ -37,10 +41,14 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList private lateinit var pdfDocument: PdfDocumentEntity private val viewModel by lazy { ViewModelProvider(this)[PdfViewModel::class.java] } private val repository = getRepository() + private var isFullScreen = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityPdfViewBinding.inflate(layoutInflater) setContentView(binding.root) + ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true) + .navigationBarColor(R.color.white).init() initObserve() val filePath = intent.getStringExtra(EXTRA_PDF_HASH) ?: throw IllegalArgumentException("PDF file hash is required") @@ -48,12 +56,14 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList viewModel.getPDFDocument(filePath) } - private fun initObserve(){ + private fun initObserve() { // 观察PDF文档数据 viewModel.pdfDocument.observe(this) { document -> document?.let { pdfDocument = it loadPdf() + setupOnClick() + toggleEyeCareMode(appStore.isEyeCareMode) } ?: run { showToast(getString(R.string.file_not)) finish() @@ -61,6 +71,16 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList } } + private fun setupOnClick() { + binding.backBtn.setOnClickListener { + finish() + } + binding.eyeCareOverlayBtn.setOnClickListener { + appStore.isEyeCareMode = !appStore.isEyeCareMode + toggleEyeCareMode(appStore.isEyeCareMode) + } + } + private fun loadPdf() { logDebug("loadPdf ->${pdfDocument.lastReadPage} ${pdfDocument.readingProgress}") // 使用传递的文件路径加载PDF @@ -72,14 +92,14 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList return } // 无密码PDF正常加载 - binding.pdfview.fromFile(file) - .defaultPage(pdfDocument.lastReadPage) // 从上次阅读页码开始 + binding.pdfview.fromFile(file).defaultPage(pdfDocument.lastReadPage) // 从上次阅读页码开始 .enableDoubletap(true)// 是否允许双击缩放 - .onLoad(this) + .onLoad(this)//加载 .enableAnnotationRendering(true) // 是否渲染注释(如评论、颜色、表单等) - .onError(this) - .onPageChange(this) - .scrollHandle(CustomScrollHandle(this)) + .onError(this)//错误 + .onTap(this)//点击 + .onPageChange(this)//页面改变 + .scrollHandle(CustomScrollHandle(this))//自定义的页数展示,并且可快速拖动 .load() } else { showToast(getString(R.string.file_not) + ": ${pdfDocument.fileName}") @@ -109,6 +129,11 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList } } + override fun onTap(e: MotionEvent?): Boolean { + toggleFullScreen() + return true// 表示我们自己处理了单击事件 + } + //页面切换时回调 override fun onPageChanged(page: Int, pageCount: Int) { // 保存阅读进度到内存 @@ -139,15 +164,55 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList } private fun tryLoadPdfWithPassword(file: File, password: String) { - binding.pdfview.fromFile(file) - .password(password) // 使用输入的密码 + binding.pdfview.fromFile(file).password(password) // 使用输入的密码 .defaultPage(pdfDocument.lastReadPage) // 从上次阅读页码开始 .enableDoubletap(true)// 是否允许双击缩放 - .onLoad(this) + .onLoad(this)//加载 + .onTap(this)//单击 .enableAnnotationRendering(true) // 是否渲染注释(如评论、颜色、表单等) - .onError(this) - .onPageChange(this) - .scrollHandle(CustomScrollHandle(this)) + .onError(this)//错误 + .onPageChange(this)//页面改变 + .scrollHandle(CustomScrollHandle(this))//自定义的页数展示,并且可快速拖动 .load() } + + private fun toggleFullScreen() { + isFullScreen = !isFullScreen + updateStatusAndNavigationLayout(isFullScreen) + if (isFullScreen) { + ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_BAR).init() + } else { + val navColor = + if (appStore.isEyeCareMode) R.color.eye_protection_color else R.color.white + ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true) + .navigationBarColor(navColor).hideBar(BarHide.FLAG_SHOW_BAR).init() + } + } + + private fun updateStatusAndNavigationLayout(b: Boolean) { + if (b) { + // 隐藏顶部和底部 + binding.statusLayout.visibility = View.GONE + binding.navigationLayout.visibility = View.GONE + binding.view.visibility = View.GONE + } else { + // 显示顶部和底部 + binding.statusLayout.visibility = View.VISIBLE + binding.navigationLayout.visibility = View.VISIBLE + binding.view.visibility = View.VISIBLE + } + } + + private fun toggleEyeCareMode(b: Boolean) { + val navColor = if (b) R.color.eye_protection_color else R.color.white + if (b) { + binding.eyeCareOverlay.visibility = View.VISIBLE + binding.eyeProtectIv.setImageResource(R.drawable.eye_protect_active) + } else { + binding.eyeCareOverlay.visibility = View.GONE + binding.eyeProtectIv.setImageResource(R.drawable.eye_protect) + } + ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true) + .navigationBarColor(navColor).init() + } } \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java b/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java index e61a3b2..386e036 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/view/CustomScrollHandle.java @@ -3,6 +3,7 @@ package com.all.pdfreader.pro.app.ui.view; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Color; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Handler; import android.util.TypedValue; @@ -17,6 +18,7 @@ import com.github.barteksc.pdfviewer.scroll.ScrollHandle; import com.github.barteksc.pdfviewer.util.Util; import androidx.core.content.ContextCompat; +import androidx.core.content.res.ResourcesCompat; public class CustomScrollHandle extends RelativeLayout implements ScrollHandle { private final static int HANDLE_LONG = 36; @@ -203,6 +205,13 @@ public class CustomScrollHandle extends RelativeLayout implements ScrollHandle { textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size); } + /** + * @param tf 自定义font字体 + */ + public void setTypeface(Typeface tf){ + textView.setTypeface(tf); + } + private boolean isPDFViewReady() { return pdfView != null && pdfView.getPageCount() > 0 && !pdfView.documentFitsView(); } diff --git a/app/src/main/res/drawable/dr_scroll_handle_bottom.xml b/app/src/main/res/drawable/dr_scroll_handle_bottom.xml index 1e4921e..e97e124 100644 --- a/app/src/main/res/drawable/dr_scroll_handle_bottom.xml +++ b/app/src/main/res/drawable/dr_scroll_handle_bottom.xml @@ -3,10 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/dr_scroll_handle_right.xml b/app/src/main/res/drawable/dr_scroll_handle_right.xml index 237548d..42e2fd9 100644 --- a/app/src/main/res/drawable/dr_scroll_handle_right.xml +++ b/app/src/main/res/drawable/dr_scroll_handle_right.xml @@ -3,10 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/eye_protect.xml b/app/src/main/res/drawable/eye_protect.xml new file mode 100644 index 0000000..d466c77 --- /dev/null +++ b/app/src/main/res/drawable/eye_protect.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/eye_protect_active.xml b/app/src/main/res/drawable/eye_protect_active.xml new file mode 100644 index 0000000..27c902a --- /dev/null +++ b/app/src/main/res/drawable/eye_protect_active.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pdf_view.xml b/app/src/main/res/layout/activity_pdf_view.xml index 4cabd6f..9681592 100644 --- a/app/src/main/res/layout/activity_pdf_view.xml +++ b/app/src/main/res/layout/activity_pdf_view.xml @@ -1,77 +1,131 @@ - + android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="@color/bg_color" + android:orientation="vertical"> + + + android:id="@+id/statusLayout" + android:layout_width="match_parent" + android:layout_height="48dp" + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + - - - - - + android:layout_height="0dp" + android:layout_weight="1" + android:background="@color/white"> - + - + - + - + + + + + + + + + + + + + + + + + - \ No newline at end of file + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 53513e8..02223d8 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -14,4 +14,5 @@ #E0E0E0 #2c2c2c #666666 + #80FFD699 \ No newline at end of file