From c7c96d2faae82a1f54793f367aac72fe5325cd97 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 3 Jun 2022 22:23:26 +0530 Subject: [PATCH 1/5] Add fullscreen mode in PDF Viewer --- .../pro/activities/PDFViewerActivity.kt | 63 ++++++++++++++++++- .../filemanager/pro/extensions/Activity.kt | 29 ++++++++- 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt index c2571d58..4e79d8d4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt @@ -1,20 +1,36 @@ package com.simplemobiletools.filemanager.pro.activities import android.content.Context +import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.os.Bundle import android.print.PrintAttributes import android.print.PrintManager import android.view.Menu import android.view.MenuItem +import android.view.View +import android.view.WindowManager +import android.widget.RelativeLayout +import androidx.core.view.updateLayoutParams import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.REAL_FILE_PATH +import com.simplemobiletools.commons.helpers.isPiePlus +import com.simplemobiletools.commons.helpers.isSPlus import com.simplemobiletools.filemanager.pro.R +import com.simplemobiletools.filemanager.pro.extensions.config +import com.simplemobiletools.filemanager.pro.extensions.getUiMode +import com.simplemobiletools.filemanager.pro.extensions.hideSystemUI +import com.simplemobiletools.filemanager.pro.extensions.showSystemUI import com.simplemobiletools.filemanager.pro.helpers.PdfDocumentAdapter import kotlinx.android.synthetic.main.activity_pdf_viewer.* + class PDFViewerActivity : SimpleActivity() { - var realFilePath = "" + private var realFilePath = "" + + private var systemUiVisible = true + private var pdfViewerHeight = -1 + private var positionOffset = 0f override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -29,6 +45,7 @@ class PDFViewerActivity : SimpleActivity() { } checkIntent() + setupFullScreenView() } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -76,4 +93,48 @@ class PDFViewerActivity : SimpleActivity() { print(realFilePath.getFilenameFromPath(), adapter, PrintAttributes.Builder().build()) } } + + private fun setupFullScreenView() { + pdf_viewer.setOnClickListener { + if (systemUiVisible) enterFullScreen() else exitFullScreen() + systemUiVisible = !systemUiVisible + } + setupNotch() + } + + private fun enterFullScreen() { + if (pdfViewerHeight == -1) { + pdfViewerHeight = pdf_viewer.height + } + positionOffset = pdf_viewer.positionOffset + hideSystemUI(true) + + pdf_viewer.updateLayoutParams { + // hack to workaround pdf viewer height glitch + this.height = pdf_viewer_wrapper.height + statusBarHeight + actionBarHeight + } + } + + private fun exitFullScreen() { + showSystemUI(true) + pdf_viewer.updateLayoutParams { + this.height = pdfViewerHeight + } + pdf_viewer.post { pdf_viewer.positionOffset = positionOffset } + + @Suppress("DEPRECATION") + // use light status bar on material you + if (isSPlus() && config.isUsingSystemTheme && getUiMode() == UI_MODE_NIGHT_NO) { + val flags = window.decorView.systemUiVisibility + window.decorView.systemUiVisibility = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } + } + + + private fun setupNotch() { + if (isPiePlus()) { + window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt index 6dd00a83..50d6ff0d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt @@ -2,7 +2,10 @@ package com.simplemobiletools.filemanager.pro.extensions import android.app.Activity import android.content.Intent +import android.content.res.Configuration import android.net.Uri +import android.view.View +import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* @@ -10,7 +13,6 @@ import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.filemanager.pro.BuildConfig import com.simplemobiletools.filemanager.pro.helpers.* import java.io.File -import java.util.* fun Activity.sharePaths(paths: ArrayList) { sharePathsIntent(paths, BuildConfig.APPLICATION_ID) @@ -77,3 +79,28 @@ fun BaseSimpleActivity.toggleItemVisibility(oldPath: String, hide: Boolean, call } } } + +@Suppress("DEPRECATION") +fun AppCompatActivity.showSystemUI(toggleActionBarVisibility: Boolean) { + if (toggleActionBarVisibility) { + supportActionBar?.show() + } + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE +} + +@Suppress("DEPRECATION") +fun AppCompatActivity.hideSystemUI(toggleActionBarVisibility: Boolean) { + if (toggleActionBarVisibility) { + supportActionBar?.hide() + } + + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or + View.SYSTEM_UI_FLAG_LOW_PROFILE or + View.SYSTEM_UI_FLAG_FULLSCREEN or + View.SYSTEM_UI_FLAG_IMMERSIVE +} + +fun Activity.getUiMode() = resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK) From d591ac4b3431cf8a9f7099baf7d62f821d6d3338 Mon Sep 17 00:00:00 2001 From: Naveen Date: Sat, 4 Jun 2022 13:08:49 +0530 Subject: [PATCH 2/5] Minor code improvements --- .../pro/activities/PDFViewerActivity.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt index 4e79d8d4..37368513 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt @@ -28,7 +28,7 @@ import kotlinx.android.synthetic.main.activity_pdf_viewer.* class PDFViewerActivity : SimpleActivity() { private var realFilePath = "" - private var systemUiVisible = true + private var isFullScreen = false private var pdfViewerHeight = -1 private var positionOffset = 0f @@ -45,7 +45,7 @@ class PDFViewerActivity : SimpleActivity() { } checkIntent() - setupFullScreenView() + setupNotch() } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -83,6 +83,7 @@ class PDFViewerActivity : SimpleActivity() { pdf_viewer.fromUri(uri) .scrollHandle(DefaultScrollHandle(this, primaryColor.getContrastColor(), primaryColor)) .spacing(15) + .onTap { toggleFullScreen() } .load() } @@ -94,12 +95,10 @@ class PDFViewerActivity : SimpleActivity() { } } - private fun setupFullScreenView() { - pdf_viewer.setOnClickListener { - if (systemUiVisible) enterFullScreen() else exitFullScreen() - systemUiVisible = !systemUiVisible - } - setupNotch() + private fun toggleFullScreen(): Boolean { + if (isFullScreen) exitFullScreen() else enterFullScreen() + isFullScreen = !isFullScreen + return true } private fun enterFullScreen() { @@ -116,6 +115,8 @@ class PDFViewerActivity : SimpleActivity() { } private fun exitFullScreen() { + positionOffset = pdf_viewer.positionOffset + showSystemUI(true) pdf_viewer.updateLayoutParams { this.height = pdfViewerHeight From 6798a1b3ba87a1649ad6c47984b263a4404fe810 Mon Sep 17 00:00:00 2001 From: Naveen Date: Thu, 9 Jun 2022 11:57:29 +0530 Subject: [PATCH 3/5] Add fullscreen toggle in PDF Viewer --- .../pro/activities/PDFViewerActivity.kt | 99 +++++++++---------- .../filemanager/pro/extensions/Activity.kt | 19 ++-- .../filemanager/pro/helpers/Constants.kt | 1 + .../drawable/gradient_background_flipped.xml | 7 ++ .../main/res/layout/activity_pdf_viewer.xml | 7 ++ app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/styles.xml | 2 +- 7 files changed, 76 insertions(+), 60 deletions(-) create mode 100644 app/src/main/res/drawable/gradient_background_flipped.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt index 37368513..0ce6893b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/PDFViewerActivity.kt @@ -1,38 +1,36 @@ package com.simplemobiletools.filemanager.pro.activities import android.content.Context -import android.content.res.Configuration.UI_MODE_NIGHT_NO +import android.graphics.Color +import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.os.Handler import android.print.PrintAttributes import android.print.PrintManager import android.view.Menu import android.view.MenuItem -import android.view.View +import android.view.WindowInsetsController import android.view.WindowManager -import android.widget.RelativeLayout -import androidx.core.view.updateLayoutParams import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.REAL_FILE_PATH import com.simplemobiletools.commons.helpers.isPiePlus -import com.simplemobiletools.commons.helpers.isSPlus +import com.simplemobiletools.commons.helpers.isRPlus import com.simplemobiletools.filemanager.pro.R -import com.simplemobiletools.filemanager.pro.extensions.config -import com.simplemobiletools.filemanager.pro.extensions.getUiMode import com.simplemobiletools.filemanager.pro.extensions.hideSystemUI import com.simplemobiletools.filemanager.pro.extensions.showSystemUI +import com.simplemobiletools.filemanager.pro.helpers.HIDE_SYSTEM_UI_DELAY import com.simplemobiletools.filemanager.pro.helpers.PdfDocumentAdapter import kotlinx.android.synthetic.main.activity_pdf_viewer.* class PDFViewerActivity : SimpleActivity() { private var realFilePath = "" - private var isFullScreen = false - private var pdfViewerHeight = -1 - private var positionOffset = 0f override fun onCreate(savedInstanceState: Bundle?) { + useDynamicTheme = false + super.onCreate(savedInstanceState) setContentView(R.layout.activity_pdf_viewer) @@ -40,12 +38,25 @@ class PDFViewerActivity : SimpleActivity() { return } + window.decorView.setBackgroundColor(getProperBackgroundColor()) + top_shadow.layoutParams.height = statusBarHeight + actionBarHeight + checkNotchSupport() + if (intent.extras?.containsKey(REAL_FILE_PATH) == true) { realFilePath = intent.extras?.get(REAL_FILE_PATH)?.toString() ?: "" } checkIntent() - setupNotch() + if (isRPlus()) { + window.insetsController?.setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS) + } + } + + override fun onResume() { + super.onResume() + supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.statusBarColor = Color.TRANSPARENT + setTranslucentNavigation() } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -54,7 +65,7 @@ class PDFViewerActivity : SimpleActivity() { findItem(R.id.menu_print).isVisible = realFilePath.isNotEmpty() } - updateMenuItemColors(menu) + updateMenuItemColors(menu, forceWhiteIcons = true) return true } @@ -73,11 +84,6 @@ class PDFViewerActivity : SimpleActivity() { return } - val filename = getFilenameFromUri(uri) - if (filename.isNotEmpty()) { - title = filename - } - val primaryColor = getProperPrimaryColor() pdf_viewer.setBackgroundColor(getProperBackgroundColor()) pdf_viewer.fromUri(uri) @@ -85,6 +91,19 @@ class PDFViewerActivity : SimpleActivity() { .spacing(15) .onTap { toggleFullScreen() } .load() + + showSystemUI(true) + + pdf_viewer_wrapper.onGlobalLayout { + Handler(mainLooper).postDelayed({ + toggleFullScreen() + }, HIDE_SYSTEM_UI_DELAY) + + val filename = getFilenameFromUri(uri) + if (filename.isNotEmpty()) { + supportActionBar?.title = filename + } + } } private fun printText() { @@ -96,43 +115,23 @@ class PDFViewerActivity : SimpleActivity() { } private fun toggleFullScreen(): Boolean { - if (isFullScreen) exitFullScreen() else enterFullScreen() isFullScreen = !isFullScreen + val newAlpha: Float + if (isFullScreen) { + newAlpha = 0f + hideSystemUI(true) + } else { + newAlpha = 1f + showSystemUI(true) + } + + top_shadow.animate().alpha(newAlpha).start() + + // return false to also toggle scroll handle return true } - private fun enterFullScreen() { - if (pdfViewerHeight == -1) { - pdfViewerHeight = pdf_viewer.height - } - positionOffset = pdf_viewer.positionOffset - hideSystemUI(true) - - pdf_viewer.updateLayoutParams { - // hack to workaround pdf viewer height glitch - this.height = pdf_viewer_wrapper.height + statusBarHeight + actionBarHeight - } - } - - private fun exitFullScreen() { - positionOffset = pdf_viewer.positionOffset - - showSystemUI(true) - pdf_viewer.updateLayoutParams { - this.height = pdfViewerHeight - } - pdf_viewer.post { pdf_viewer.positionOffset = positionOffset } - - @Suppress("DEPRECATION") - // use light status bar on material you - if (isSPlus() && config.isUsingSystemTheme && getUiMode() == UI_MODE_NIGHT_NO) { - val flags = window.decorView.systemUiVisibility - window.decorView.systemUiVisibility = flags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - } - } - - - private fun setupNotch() { + private fun checkNotchSupport() { if (isPiePlus()) { window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt index 50d6ff0d..11ae2436 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/extensions/Activity.kt @@ -80,27 +80,28 @@ fun BaseSimpleActivity.toggleItemVisibility(oldPath: String, hide: Boolean, call } } -@Suppress("DEPRECATION") fun AppCompatActivity.showSystemUI(toggleActionBarVisibility: Boolean) { if (toggleActionBarVisibility) { supportActionBar?.show() } - window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE + + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN } -@Suppress("DEPRECATION") fun AppCompatActivity.hideSystemUI(toggleActionBarVisibility: Boolean) { if (toggleActionBarVisibility) { supportActionBar?.hide() } - window.decorView.systemUiVisibility = + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or - View.SYSTEM_UI_FLAG_LOW_PROFILE or - View.SYSTEM_UI_FLAG_FULLSCREEN or - View.SYSTEM_UI_FLAG_IMMERSIVE + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or + View.SYSTEM_UI_FLAG_LOW_PROFILE or + View.SYSTEM_UI_FLAG_FULLSCREEN or + View.SYSTEM_UI_FLAG_IMMERSIVE } fun Activity.getUiMode() = resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt index 8c6b99df..9aabe173 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt @@ -6,6 +6,7 @@ import com.simplemobiletools.commons.helpers.TAB_STORAGE_ANALYSIS const val PATH = "path" const val MAX_COLUMN_COUNT = 20 +const val HIDE_SYSTEM_UI_DELAY = 800L // shared preferences const val SHOW_HIDDEN = "show_hidden" diff --git a/app/src/main/res/drawable/gradient_background_flipped.xml b/app/src/main/res/drawable/gradient_background_flipped.xml new file mode 100644 index 00000000..e8481212 --- /dev/null +++ b/app/src/main/res/drawable/gradient_background_flipped.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/layout/activity_pdf_viewer.xml b/app/src/main/res/layout/activity_pdf_viewer.xml index f6d0d427..ec6fffb1 100644 --- a/app/src/main/res/layout/activity_pdf_viewer.xml +++ b/app/src/main/res/layout/activity_pdf_viewer.xml @@ -9,4 +9,11 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index fc0c4d8a..0f28f618 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,4 +1,5 @@ 50dp 46sp + 86dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0be50415..9c3b80f3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,5 +1,5 @@ -