From 40db31489db62bb04cff84210c414e54249e9bb5 Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Wed, 12 Nov 2025 18:33:06 +0800 Subject: [PATCH] update --- app/build.gradle.kts | 4 +- app/src/main/AndroidManifest.xml | 8 +- .../pdfreader/pro/app/ui/act/BaseActivity.kt | 21 +- .../pdfreader/pro/app/ui/act/FAQActivity.kt | 8 +- .../pdfreader/pro/app/ui/act/MainActivity.kt | 8 +- .../pro/app/ui/act/MergePdfActivity.kt | 8 + .../pro/app/ui/act/PdfPickerActivity.kt | 7 + .../pro/app/ui/act/PdfResultActivity.kt | 9 +- .../pro/app/ui/act/PdfToImageActivity.kt | 8 +- .../pro/app/ui/act/PdfViewActivity.kt | 20 +- .../pro/app/ui/act/PictureSelectorActivity.kt | 181 ++++++ .../pro/app/ui/act/PrivacyPolicyActivity.kt | 8 + .../pro/app/ui/act/SearchActivity.kt | 8 +- .../pro/app/ui/act/SplashActivity.kt | 12 +- .../pro/app/ui/act/SplitPdfActivity.kt | 9 +- .../pro/app/ui/fragment/ToolsFrag.kt | 107 +--- .../main/res/layout/act_picture_selector.xml | 29 + .../main/res/layout/act_privacy_policy.xml | 102 ++-- app/src/main/res/layout/activity_faq.xml | 473 ++++++++------- app/src/main/res/layout/activity_main.xml | 8 + .../main/res/layout/activity_pdf_merge.xml | 202 ++++--- .../main/res/layout/activity_pdf_picker.xml | 204 ++++--- .../main/res/layout/activity_pdf_split.xml | 303 +++++----- .../res/layout/activity_pdf_split_result.xml | 558 +++++++++--------- .../main/res/layout/activity_pdf_to_img.xml | 200 ++++--- app/src/main/res/layout/activity_pdf_view.xml | 9 + .../main/res/layout/activity_search_pdf.xml | 290 ++++----- app/src/main/res/values/themes.xml | 9 +- gradle/libs.versions.toml | 8 +- 29 files changed, 1593 insertions(+), 1228 deletions(-) create mode 100644 app/src/main/java/com/all/pdfreader/pro/app/ui/act/PictureSelectorActivity.kt create mode 100644 app/src/main/res/layout/act_picture_selector.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e4c25d1..fec5139 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -74,8 +74,8 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) -// implementation(libs.immersionbar) -// implementation(libs.immersionbar.ktx) + implementation(libs.immersionbar) + implementation(libs.immersionbar.ktx) implementation(libs.androidx.room.runtime) ksp(libs.androidx.room.compiler) implementation(libs.androidx.room.ktx) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 22ad550..3b2c482 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,9 +34,9 @@ android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/app_logo" android:label="@string/app_name" + android:largeHeap="true" android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/app_logo" - android:largeHeap="true" android:supportsRtl="true" android:theme="@style/Theme.PDFReaderPro"> + + Unit) { + val bar = ImmersionBar.with(this) + + // 通用逻辑:监听 insets 改变 + bar.setOnInsetsChangeListener(object : OnInsetsChangeListener { + override fun onInsetsChanged(top: Int, bottom: Int, left: Int, right: Int) { + rootBottomView?.setPadding(left, 0, right, bottom) + } + }) + bar.block() + + bar.init() + } } \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/FAQActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/FAQActivity.kt index 017eff8..2f3e37b 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/FAQActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/FAQActivity.kt @@ -10,7 +10,8 @@ import com.all.pdfreader.pro.app.databinding.ActivityFaqBinding class FAQActivity : BaseActivity() { override val TAG: String = "FAQActivity" - + override val rootBottomView: View? + get() = binding.rootBottomLayout private lateinit var binding: ActivityFaqBinding private var faqAboutApp1IsOpen = true private var faqAboutApp2IsOpen = false @@ -21,6 +22,11 @@ class FAQActivity : BaseActivity() { super.onCreate(savedInstanceState) binding = ActivityFaqBinding.inflate(layoutInflater) setContentView(binding.root) + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.white) + } initView() } 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 9df7393..64288bd 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 @@ -40,7 +40,8 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback RecentlyFrag.OnItemLongClickListener, FavoriteFrag.OnItemLongClickListener { override val TAG: String = "MainActivity" - + override val rootBottomView: View? + get() = binding.rootBottomLayout private lateinit var binding: ActivityMainBinding private val pdfRepository = getRepository() private lateinit var pdfScanner: PdfScanner @@ -60,6 +61,11 @@ class MainActivity : BaseActivity(), PermissionDialogFragment.PermissionCallback setContentView(binding.root) setupDoubleBackExit() initObserve() + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(false) + navigationBarColor(R.color.white) + } setupFragments() setupNavigation() pdfScanner = PdfScanner(this, pdfRepository) diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MergePdfActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MergePdfActivity.kt index 2fe1bd6..d1b968f 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MergePdfActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/MergePdfActivity.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.os.Parcelable +import android.view.View import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContract import androidx.lifecycle.lifecycleScope @@ -25,6 +26,8 @@ import java.io.File class MergePdfActivity : BaseActivity() { override val TAG: String = "MergePdfActivity" + override val rootBottomView: View? + get() = binding.rootBottomLayout private lateinit var binding: ActivityPdfMergeBinding private var selectedList: ArrayList = arrayListOf() private lateinit var adapter: PdfAdapter @@ -34,6 +37,11 @@ class MergePdfActivity : BaseActivity() { binding = ActivityPdfMergeBinding.inflate(layoutInflater) setContentView(binding.root) setupBackPressedCallback() + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.white) + } val list: ArrayList = requireParcelableArrayList(EXTRA_PDF_LIST) updateContinueNowBtnState(list.size >= 2) lifecycleScope.launch { diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfPickerActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfPickerActivity.kt index 44310da..b159d7f 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfPickerActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfPickerActivity.kt @@ -30,6 +30,8 @@ import java.io.Serializable class PdfPickerActivity : BaseActivity() { override val TAG: String = "PdfPickerActivity" + override val rootBottomView: View? + get() = binding.rootBottomLayout private lateinit var binding: ActivityPdfPickerBinding private lateinit var adapter: PdfAdapter private lateinit var source: PdfPickerSource // 保存来源 @@ -49,6 +51,11 @@ class PdfPickerActivity : BaseActivity() { } fromActivityResult = intent.getStringExtra(EXTRA_FROM) ?: "" historyList = requireParcelableArrayList(EXTRA_HISTORY_LIST) + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.white) + } updateViewAndState() initView() setupClick() diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfResultActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfResultActivity.kt index aee842c..8af44cf 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfResultActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfResultActivity.kt @@ -34,6 +34,7 @@ import com.all.pdfreader.pro.app.util.ToastUtils import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.gyf.immersionbar.ImmersionBar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -42,7 +43,8 @@ import java.io.Serializable class PdfResultActivity : BaseActivity() { override val TAG: String = "PdfResultActivity" - + override val rootBottomView: View? + get() = binding.rootBottomLayout companion object { private const val EXTRA_SELECTED_LIST = "extra_selected_list" private const val EXTRA_FILE_LIST = "extra_file_list" @@ -126,6 +128,11 @@ class PdfResultActivity : BaseActivity() { binding = ActivityPdfSplitResultBinding.inflate(layoutInflater) setContentView(binding.root) setupBackPressedCallback() + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.bg_color) + } source = getSerializableOrDefault(EXTRA_SOURCE, PdfPickerSource.NONE) if (source == PdfPickerSource.NONE) { showToast(getString(R.string.pdf_loading_failed)) diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfToImageActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfToImageActivity.kt index 8583107..9a26ed3 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfToImageActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfToImageActivity.kt @@ -24,7 +24,8 @@ import java.io.Serializable class PdfToImageActivity : BaseActivity() { override val TAG: String = "PdfToImageActivity" - + override val rootBottomView: View? + get() = binding.rootBottomLayout var currentPassword: String? = null//只会选择一个文件。直接进行密码传递 private lateinit var source: PdfPickerSource @@ -49,6 +50,11 @@ class PdfToImageActivity : BaseActivity() { super.onCreate(savedInstanceState) binding = ActivityPdfToImgBinding.inflate(layoutInflater) setContentView(binding.root) + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.bg_color) + } filePath = intent.getStringExtra(EXTRA_PDF_PATH) ?: throw IllegalArgumentException("PDF file hash is required") source = getSerializableOrDefault(EXTRA_SOURCE, PdfPickerSource.NONE) 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 df91707..39e0724 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 @@ -32,6 +32,8 @@ 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 com.tom_roush.pdfbox.pdmodel.PDDocument import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -43,7 +45,8 @@ import java.io.File class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeListener, OnErrorListener, OnTapListener { override val TAG: String = "PdfViewActivity" - + override val rootBottomView: View? + get() = binding.rootBottomLayout companion object { const val FRAG_TAG = "PdfViewActivity" private const val EXTRA_PDF_HASH = "extra_pdf_hash" @@ -72,6 +75,11 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList super.onCreate(savedInstanceState) binding = ActivityPdfViewBinding.inflate(layoutInflater) setContentView(binding.root) + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.white) + } setupDoubleBackExit() initObserve() val filePath = intent.getStringExtra(EXTRA_PDF_HASH) @@ -384,12 +392,12 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList isFullScreen = !isFullScreen updateStatusAndNavigationLayout(isFullScreen) if (isFullScreen) { -// ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_BAR).init() + 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() + ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true) + .navigationBarColor(navColor).hideBar(BarHide.FLAG_SHOW_BAR).init() } } @@ -416,8 +424,8 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList binding.eyeCareOverlay.visibility = View.GONE binding.eyeProtectIv.setImageResource(R.drawable.eye_protect) } -// ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true) -// .navigationBarColor(navColor).init() + ImmersionBar.with(this).statusBarView(binding.view).statusBarDarkFont(true) + .navigationBarColor(navColor).init() } private fun setupDoubleBackExit() { diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PictureSelectorActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PictureSelectorActivity.kt new file mode 100644 index 0000000..dcfc843 --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PictureSelectorActivity.kt @@ -0,0 +1,181 @@ +package com.all.pdfreader.pro.app.ui.act + +import android.content.Context +import android.net.Uri +import android.os.Bundle +import android.view.View +import androidx.core.net.toUri +import androidx.fragment.app.Fragment +import com.all.pdfreader.pro.app.PRApp +import com.all.pdfreader.pro.app.R +import com.all.pdfreader.pro.app.databinding.ActPictureSelectorBinding +import com.all.pdfreader.pro.app.model.PdfPickerSource +import com.all.pdfreader.pro.app.util.GlideEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.PictureMimeType +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.config.SelectModeConfig +import com.luck.picture.lib.engine.CompressFileEngine +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener +import com.luck.picture.lib.interfaces.OnMediaEditInterceptListener +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.luck.picture.lib.style.PictureSelectorStyle +import com.luck.picture.lib.style.SelectMainStyle +import com.luck.picture.lib.utils.DateUtils +import com.yalantis.ucrop.UCrop +import top.zibin.luban.Luban +import top.zibin.luban.OnNewCompressListener +import java.io.File + +class PictureSelectorActivity : BaseActivity() { + private lateinit var binding: ActPictureSelectorBinding + override val rootBottomView: View? + get() = binding.rootBottomLayout + override val TAG = "PictureSelectorActivity" + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActPictureSelectorBinding.inflate(layoutInflater) + setContentView(binding.root) + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(false) + } + openImagePicker() + } + + private fun openImagePicker() { + val selectorStyle = PictureSelectorStyle().apply { + selectMainStyle = SelectMainStyle().apply { + isSelectNumberStyle = true + isPreviewSelectNumberStyle = true + selectBackground = R.drawable.num_checkbox_selector + } + } + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setSelectorUIStyle(selectorStyle) + .setImageEngine(GlideEngine.createGlideEngine()) + .setImageSpanCount(3) + .isGif(false) + .isFastSlidingSelect(true) + .setSelectionMode(SelectModeConfig.MULTIPLE) + .setMaxSelectNum(50) + .isPreviewFullScreenMode(false) + .setCompressEngine(object : CompressFileEngine { + override fun onStartCompress( + context: Context?, + source: ArrayList?, + call: OnKeyValueResultCallbackListener? + ) { + Luban.with(context) + .load(source) + .ignoreBy(100) + .setCompressListener(object : OnNewCompressListener { + override fun onStart() { + + } + + override fun onSuccess( + source: String?, + compressFile: File? + ) { + call?.onCallback(source, compressFile?.absolutePath) + } + + override fun onError(source: String?, e: Throwable?) { + call?.onCallback(source, null) + } + }) + .launch() + } + }) + .setEditMediaInterceptListener(object : OnMediaEditInterceptListener { + override fun onStartMediaEdit( + fragment: Fragment, currentLocalMedia: LocalMedia, requestCode: Int + ) { + val currentEditPath = currentLocalMedia.getAvailablePath() + val inputUri = if (PictureMimeType.isContent(currentEditPath)) { + currentEditPath.toUri() + } else { + Uri.fromFile(File(currentEditPath)) + } + val destinationUri = Uri.fromFile( + File( + getSandboxPath(), DateUtils.getCreateFileName("CROP_") + ".jpeg" + ) + ) + val uCrop = UCrop.of(inputUri, destinationUri) + val buildOptions = UCrop.Options().apply { + isDarkStatusBarBlack(true) + } + uCrop.withOptions(buildOptions) + uCrop.start(this@PictureSelectorActivity, fragment, requestCode) + } + + }).buildLaunch(R.id.fragment_container,object : OnResultCallbackListener{ + override fun onResult(result: ArrayList) { + logDebug("forResult ->${result.size}") + if (result.isNotEmpty()) { + // result 中可能有带裁剪的 Uri 或原图 Uri + // 取出路径列表 + val paths = result.mapNotNull { media -> + media.availablePath + } + if (paths.isEmpty()) { + return + } + val intent = PdfResultActivity.createIntentInputFile( + this@PictureSelectorActivity, + ArrayList(paths), + PdfPickerSource.IMAGES_TO_PDF + ) + startActivity(intent) + finish() + } + } + + override fun onCancel() { + finish() + } + + }) + +// .forResult(object : OnResultCallbackListener { +// override fun onResult(result: ArrayList) { +// logDebug("forResult ->${result.size}") +// if (result.isNotEmpty()) { +// // result 中可能有带裁剪的 Uri 或原图 Uri +// // 取出路径列表 +// val paths = result.mapNotNull { media -> +// media.availablePath +// } +// if (paths.isEmpty()) { +// return +// } +// val intent = PdfResultActivity.createIntentInputFile( +// this@PictureSelectorActivity, +// ArrayList(paths), +// PdfPickerSource.IMAGES_TO_PDF +// ) +// startActivity(intent) +// } +// } +// +// override fun onCancel() { +// logDebug("onCancel") +// } +// }) + +// supportFragmentManager.beginTransaction() +// .add(R.id.fragment_fl, selectorFragment, selectorFragment.getFragmentTag()) +// .addToBackStack(selectorFragment.getFragmentTag()) +// .commitAllowingStateLoss(); + } + + fun getSandboxPath(): String { + val dir = File(PRApp.getContext().externalCacheDir, "SandboxPdfPro") + if (!dir.exists()) dir.mkdirs() + return dir.absolutePath + } +} \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PrivacyPolicyActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PrivacyPolicyActivity.kt index aeaa69b..8719660 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PrivacyPolicyActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PrivacyPolicyActivity.kt @@ -1,6 +1,7 @@ package com.all.pdfreader.pro.app.ui.act import android.os.Bundle +import android.view.View import android.webkit.WebChromeClient import android.webkit.WebResourceError import android.webkit.WebResourceRequest @@ -11,12 +12,19 @@ import com.all.pdfreader.pro.app.databinding.ActPrivacyPolicyBinding class PrivacyPolicyActivity : BaseActivity() { private lateinit var binding: ActPrivacyPolicyBinding + override val rootBottomView: View? + get() = binding.rootBottomLayout override val TAG = "PrivacyPolicyActivity" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActPrivacyPolicyBinding.inflate(layoutInflater) setContentView(binding.root) + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.bg_color) + } binding.backBtn.setOnClickListener { finish() } diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt index 9c3b2df..f9b32a7 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt @@ -36,7 +36,8 @@ import java.io.Serializable class SearchActivity : BaseActivity() { override val TAG: String = "SearchActivity" - + override val rootBottomView: View? + get() = binding.rootBottomLayout companion object { const val FRAG_TAG = "SearchActivity" private const val PREF_SEARCH_HISTORY = "pref_search_history" @@ -64,6 +65,11 @@ class SearchActivity : BaseActivity() { super.onCreate(savedInstanceState) binding = ActivitySearchPdfBinding.inflate(layoutInflater) setContentView(binding.root) + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.bg_color) + } source = getSerializableOrDefault(EXTRA_SOURCE, PdfPickerSource.NONE) sp = getSharedPreferences(PREF_SEARCH_HISTORY, MODE_PRIVATE) loadHistory() diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplashActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplashActivity.kt index 939a6d3..4d139c2 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplashActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplashActivity.kt @@ -5,11 +5,14 @@ import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Looper +import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.databinding.ActivitySplashBinding +import com.gyf.immersionbar.BarHide +import com.gyf.immersionbar.ImmersionBar @SuppressLint("CustomSplashScreen") class SplashActivity : BaseActivity() { - + override val TAG: String = "SplashActivity" private lateinit var binding: ActivitySplashBinding @@ -17,10 +20,15 @@ class SplashActivity : BaseActivity() { companion object { private const val SPLASH_DELAY = 3000L // 启动页显示时长 } - + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySplashBinding.inflate(layoutInflater) + setupImmersionBar { + fullScreen(true) + statusBarDarkFont(true) + hideBar(BarHide.FLAG_HIDE_NAVIGATION_BAR) + } // 设置启动页布局 setContentView(binding.root) diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt index ec53f42..53db126 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SplitPdfActivity.kt @@ -23,6 +23,7 @@ import com.all.pdfreader.pro.app.util.AppUtils.setOnSingleClickListener import com.all.pdfreader.pro.app.util.FileUtils.isPdfEncrypted import com.all.pdfreader.pro.app.util.FileUtils.toUnderscoreDateTime import com.all.pdfreader.pro.app.util.PdfUtils +import com.gyf.immersionbar.ImmersionBar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -30,7 +31,8 @@ import java.io.File class SplitPdfActivity : BaseActivity() { override val TAG: String = "SplitPdfActivity" - + override val rootBottomView: View? + get() = binding.rootBottomLayout private var currentViewState: ViewState = ViewState.SPLIT_LIST var currentPassword : String? = null//拆分只会选择一个文件。直接进行密码传递 @@ -63,6 +65,11 @@ class SplitPdfActivity : BaseActivity() { binding = ActivityPdfSplitBinding.inflate(layoutInflater) setContentView(binding.root) setupBackPressedCallback() + setupImmersionBar { + statusBarView(binding.view) + statusBarDarkFont(true) + navigationBarColor(R.color.bg_color) + } filePath = intent.getStringExtra(EXTRA_PDF_PATH) ?: throw IllegalArgumentException("PDF file hash is required") if (filePath.isEmpty()) { diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/ToolsFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/ToolsFrag.kt index 519b502..5192efc 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/ToolsFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/ToolsFrag.kt @@ -1,6 +1,7 @@ package com.all.pdfreader.pro.app.ui.fragment import android.content.Context +import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.LayoutInflater @@ -14,6 +15,7 @@ import com.all.pdfreader.pro.app.databinding.FragmentToolsBinding import com.all.pdfreader.pro.app.model.PdfPickerSource import com.all.pdfreader.pro.app.ui.act.PdfPickerActivity import com.all.pdfreader.pro.app.ui.act.PdfResultActivity +import com.all.pdfreader.pro.app.ui.act.PictureSelectorActivity import com.all.pdfreader.pro.app.util.GlideEngine import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.PictureMimeType @@ -66,7 +68,8 @@ class ToolsFrag : BaseFrag() { startActivity(intent) } binding.imgToPdfBtn.setOnClickListener { - openImagePicker() + val intent = Intent(requireActivity(), PictureSelectorActivity::class.java) + startActivity(intent) } binding.pdfToImgBtn.setOnClickListener { val intent = PdfPickerActivity.createIntent(requireActivity(), PdfPickerSource.PDF_TO_IMAGES) @@ -81,106 +84,4 @@ class ToolsFrag : BaseFrag() { startActivity(intent) } } - - private fun openImagePicker() { - val selectorStyle = PictureSelectorStyle().apply { - selectMainStyle = SelectMainStyle().apply { - isSelectNumberStyle = true - isPreviewSelectNumberStyle = true - selectBackground = R.drawable.num_checkbox_selector - } - } - PictureSelector.create(this) - .openGallery(SelectMimeType.ofImage()) - .setSelectorUIStyle(selectorStyle) - .setImageEngine(GlideEngine.createGlideEngine()) - .setImageSpanCount(3) - .isGif(false) - .isFastSlidingSelect(true) - .setSelectionMode(SelectModeConfig.MULTIPLE) - .setMaxSelectNum(50) - - .setCompressEngine(object : CompressFileEngine { - override fun onStartCompress( - context: Context?, - source: ArrayList?, - call: OnKeyValueResultCallbackListener? - ) { - Luban.with(context) - .load(source) - .ignoreBy(100) - .setCompressListener(object : OnNewCompressListener { - override fun onStart() { - - } - - override fun onSuccess( - source: String?, - compressFile: File? - ) { - call?.onCallback(source, compressFile?.absolutePath) - } - - override fun onError(source: String?, e: Throwable?) { - call?.onCallback(source, null) - } - }) - .launch() - } - }) - .setEditMediaInterceptListener(object : OnMediaEditInterceptListener { - override fun onStartMediaEdit( - fragment: Fragment, currentLocalMedia: LocalMedia, requestCode: Int - ) { - val currentEditPath = currentLocalMedia.getAvailablePath() - val inputUri = if (PictureMimeType.isContent(currentEditPath)) { - currentEditPath.toUri() - } else { - Uri.fromFile(File(currentEditPath)) - } - val destinationUri = Uri.fromFile( - File( - getSandboxPath(), DateUtils.getCreateFileName("CROP_") + ".jpeg" - ) - ) - val uCrop = UCrop.of(inputUri, destinationUri) - val buildOptions = UCrop.Options().apply { - isDarkStatusBarBlack(true) - } - uCrop.withOptions(buildOptions) - uCrop.start(requireActivity(), fragment, requestCode) - } - - }).forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList) { - logDebug("forResult ->${result.size}") - if (result.isNotEmpty()) { - // result 中可能有带裁剪的 Uri 或原图 Uri - // 取出路径列表 - val paths = result.mapNotNull { media -> - media.availablePath - } - if (paths.isEmpty()) { - return - } - val intent = PdfResultActivity.createIntentInputFile( - requireActivity(), - ArrayList(paths), - PdfPickerSource.IMAGES_TO_PDF - ) - startActivity(intent) - } - } - - override fun onCancel() { - logDebug("onCancel") - } - }) - } - - fun getSandboxPath(): String { - val dir = File(PRApp.getContext().externalCacheDir, "SandboxPdfPro") - if (!dir.exists()) dir.mkdirs() - return dir.absolutePath - } } \ No newline at end of file diff --git a/app/src/main/res/layout/act_picture_selector.xml b/app/src/main/res/layout/act_picture_selector.xml new file mode 100644 index 0000000..a47c8a9 --- /dev/null +++ b/app/src/main/res/layout/act_picture_selector.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/act_privacy_policy.xml b/app/src/main/res/layout/act_privacy_policy.xml index 3d2d5fb..468504e 100644 --- a/app/src/main/res/layout/act_privacy_policy.xml +++ b/app/src/main/res/layout/act_privacy_policy.xml @@ -1,5 +1,5 @@ - + android:layout_height="match_parent" + android:layout_above="@+id/rootBottomLayout" + android:layout_below="@+id/view" + android:orientation="vertical"> + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + + + + - + + + + + + - - - - - + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:orientation="horizontal"> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_faq.xml b/app/src/main/res/layout/activity_faq.xml index 16465a8..0978154 100644 --- a/app/src/main/res/layout/activity_faq.xml +++ b/app/src/main/res/layout/activity_faq.xml @@ -1,5 +1,5 @@ - + android:layout_height="match_parent" + android:layout_above="@+id/rootBottomLayout" + android:layout_below="@+id/view" + android:orientation="vertical"> + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ea64891..a4425bf 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -454,6 +454,14 @@ android:textSize="12sp" /> + + + + diff --git a/app/src/main/res/layout/activity_pdf_merge.xml b/app/src/main/res/layout/activity_pdf_merge.xml index 8c03a6f..3bb9c2d 100644 --- a/app/src/main/res/layout/activity_pdf_merge.xml +++ b/app/src/main/res/layout/activity_pdf_merge.xml @@ -1,5 +1,5 @@ - + android:layout_height="match_parent" + android:layout_above="@+id/rootBottomLayout" + android:layout_below="@+id/view" + android:orientation="vertical"> + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + + + + + + + + - - - + android:id="@+id/noFilesLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + android:visibility="gone"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@mipmap/img_no_files_yet" /> + + + + + + + + + + + + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:orientation="horizontal"> - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/layout/activity_pdf_picker.xml b/app/src/main/res/layout/activity_pdf_picker.xml index afd0743..a1deca5 100644 --- a/app/src/main/res/layout/activity_pdf_picker.xml +++ b/app/src/main/res/layout/activity_pdf_picker.xml @@ -1,5 +1,5 @@ - + android:layout_above="@+id/rootBottomLayout" + android:layout_height="match_parent" + android:orientation="vertical"> + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + + + + + + + + - - - + android:id="@+id/noFilesLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + android:visibility="gone"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@mipmap/img_no_files_yet" /> + + + + + + + + + + + + + android:layout_height="wrap_content" + android:background="@color/white" + android:layout_alignParentBottom="true" + android:orientation="horizontal"> - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/layout/activity_pdf_split.xml b/app/src/main/res/layout/activity_pdf_split.xml index ec6cc56..605ed03 100644 --- a/app/src/main/res/layout/activity_pdf_split.xml +++ b/app/src/main/res/layout/activity_pdf_split.xml @@ -1,5 +1,5 @@ - + android:layout_height="match_parent" + android:layout_above="@+id/rootBottomLayout" + android:layout_below="@+id/view" + android:orientation="vertical"> - - - - - - - + android:orientation="horizontal"> - + - + + + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/layout/activity_pdf_split_result.xml b/app/src/main/res/layout/activity_pdf_split_result.xml index 21ebf17..804cb59 100644 --- a/app/src/main/res/layout/activity_pdf_split_result.xml +++ b/app/src/main/res/layout/activity_pdf_split_result.xml @@ -1,5 +1,5 @@ - + android:orientation="vertical"> + android:id="@+id/processingLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + android:visibility="gone"> - + android:orientation="horizontal"> + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="24dp" + android:layout_margin="32dp" + android:indeterminate="true" /> + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -257,104 +173,208 @@ - + android:visibility="gone"> + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + - - - - - - - - - - - - - + + + - - + + + diff --git a/app/src/main/res/layout/activity_pdf_to_img.xml b/app/src/main/res/layout/activity_pdf_to_img.xml index 1d55b7a..ad15f5c 100644 --- a/app/src/main/res/layout/activity_pdf_to_img.xml +++ b/app/src/main/res/layout/activity_pdf_to_img.xml @@ -1,5 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_above="@+id/rootBottomLayout" + android:layout_below="@+id/view" + android:orientation="vertical"> + android:layout_height="44dp" + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_pdf_view.xml b/app/src/main/res/layout/activity_pdf_view.xml index de70880..f8856a0 100644 --- a/app/src/main/res/layout/activity_pdf_view.xml +++ b/app/src/main/res/layout/activity_pdf_view.xml @@ -333,6 +333,15 @@ + + + + diff --git a/app/src/main/res/layout/activity_search_pdf.xml b/app/src/main/res/layout/activity_search_pdf.xml index 5b19b72..613259c 100644 --- a/app/src/main/res/layout/activity_search_pdf.xml +++ b/app/src/main/res/layout/activity_search_pdf.xml @@ -1,5 +1,5 @@ - + android:layout_height="match_parent" + android:layout_above="@+id/rootBottomLayout" + android:layout_below="@+id/view" + android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:src="@drawable/back_black" /> + + + + + + + + + + + + + + + - + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + android:layout_height="wrap_content" + android:background="@color/white" + android:layout_alignParentBottom="true" + android:orientation="horizontal"> - + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 87ddd41..d5b049c 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,14 +1,7 @@ - +