Commit 0dd1906a authored by wanglei's avatar wanglei

...启动页

parent 78a05aab
......@@ -38,6 +38,14 @@ object ConstObject {
field = value
AppPreferences.getInstance().put("ifAgreePrivacy", value, true)
}
var showPermissionPageGuide = false
get() {
return AppPreferences.getInstance().getBoolean("showPermissionPageGuide", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("showPermissionPageGuide", value, true)
}
var haveSaveDemo = false
get() {
return AppPreferences.getInstance().getBoolean("haveSaveDemo", field)
......
......@@ -2,6 +2,7 @@ package com.base.pdfoneread.ui.document
import android.annotation.SuppressLint
import android.graphics.Color
import android.net.Uri
import android.view.View
import androidx.activity.addCallback
import androidx.core.view.isVisible
......@@ -18,9 +19,11 @@ import com.base.pdfoneread.bean.DocumentBean.Companion.TYPE_WORD
import com.base.pdfoneread.databinding.ActivityDocumentBinding
import com.base.pdfoneread.ui.BaseActivity
import com.base.pdfoneread.ui.views.DialogCallBack
import com.base.pdfoneread.ui.views.DocumentDialog.showDeleteDialog
import com.base.pdfoneread.ui.views.DocumentDialog.showDocumentHomeMoreDialog
import com.base.pdfoneread.ui.views.PdfDialog.showPdfHomeMoreDialog
import com.base.pdfoneread.utils.BarUtils
import com.base.pdfoneread.utils.IntentShareUtils.shareMutDocuments
import com.base.pdfoneread.utils.LogEx
import com.base.pdfoneread.utils.PdfBoxUtils.checkPdfEncryption
import kotlinx.coroutines.Dispatchers
......@@ -129,10 +132,10 @@ class DocumentActivity : BaseActivity<ActivityDocumentBinding>(), DialogCallBack
changeRvItemSelect(binding.ivAllSelector.isSelected)
}
binding.llDelete.setOnClickListener {
deleteSelectDocument()
}
binding.llShare.setOnClickListener {
shareSelectDocument()
}
binding.flPaixu.setOnClickListener {
......@@ -154,6 +157,30 @@ class DocumentActivity : BaseActivity<ActivityDocumentBinding>(), DialogCallBack
}
}
private fun shareSelectDocument() {
val uris = adapter?.items?.filter { it.isSelect }?.map { it.uri ?: Uri.EMPTY }
uris ?: return
val arrayList = arrayListOf<Uri>()
arrayList.addAll(uris)
shareMutDocuments(type, arrayList)
}
private fun deleteSelectDocument() {
showDeleteDialog {
lifecycleScope.launch(Dispatchers.IO) {
try {
val items = adapter?.items?.filter { it.isSelect }
val unDeleteItems = adapter?.items?.filter { !it.isSelect }
items?.forEach { File(it.path).delete() }
launch(Dispatchers.Main) { adapter?.submitList(unDeleteItems) }
} catch (e: Exception) {
initData()
}
}
}
}
@SuppressLint("NotifyDataSetChanged")
private fun changeSelectUI(isSelect: Boolean) {
if (isSelect) {
......@@ -207,7 +234,6 @@ class DocumentActivity : BaseActivity<ActivityDocumentBinding>(), DialogCallBack
runOnUI(list)
}
private fun initData() = lifecycleScope.launch(Dispatchers.IO) {
val context = this@DocumentActivity
val list = when (type) {
......@@ -235,6 +261,7 @@ class DocumentActivity : BaseActivity<ActivityDocumentBinding>(), DialogCallBack
}
//region DialogCallBack
@SuppressLint("NotifyDataSetChanged")
override fun renameDocumentBean(file: File, newName: String) {
kotlin.runCatching {
val newFile = File(file.parentFile, newName)
......@@ -258,6 +285,7 @@ class DocumentActivity : BaseActivity<ActivityDocumentBinding>(), DialogCallBack
}
}
@SuppressLint("NotifyDataSetChanged")
override fun changePdfLock(item: DocumentBean) {
val pdf = adapter?.items?.find { it.path == item.path }
pdf?.state = checkPdfEncryption(item.path)
......
......@@ -3,6 +3,7 @@ package com.base.pdfoneread.ui.main
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.view.View
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
......@@ -10,6 +11,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.base.pdfoneread.R
import com.base.pdfoneread.bean.ConstObject.showPermissionPageGuide
import com.base.pdfoneread.databinding.ActivityMainBinding
import com.base.pdfoneread.ui.BaseActivity
import com.base.pdfoneread.bean.HomeUIBean.Companion.UI_TYPE_GRID
......@@ -31,6 +33,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
}
var homeUiType = UI_TYPE_GRID
var navWhere: String = NAV_HOME
private lateinit var navController: NavController
......@@ -46,9 +49,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
changeHomeRvIcon()
if (!checkStorePermission()) {
if (!checkStorePermission() && showPermissionPageGuide) {
showStoragePermission(launcher) {}
}
}
override fun onResume() {
......@@ -63,8 +67,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.llHome.setOnClickListener {
changeHomeUI()
}
binding.llHome.callOnClick()
binding.llRecent.setOnClickListener {
changeRecentUI()
}
......@@ -86,6 +88,25 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.flSearch.setOnClickListener {
startActivity(Intent(this, SearchActivity::class.java))
}
handleNav()
intent.extras?.clear()
}
private fun handleNav() {
navWhere = intent.extras?.getString("navWhere") ?: NAV_HOME
when (navWhere) {
NAV_HOME -> changeHomeUI()
NAV_RECENT -> changeRecentUI()
NAV_SETTING -> changeSettingUI()
NAV_PERMISSION -> {
if (checkStorePermission()) {
changeHomeUI()
} else {
changePermissionUI()
}
}
}
}
private fun changeHomeRvIcon() {
......@@ -154,4 +175,26 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
}
private fun changePermissionUI() {
binding.flRvMode.visibility = View.INVISIBLE
binding.flSearch.visibility = View.INVISIBLE
binding.ivHome.isSelected = true
binding.tvHome.isSelected = true
val appName = resources.getString(R.string.app_name)
binding.tvTittle.text = colorSpanner(appName, Color.parseColor("#FD1010"), 0, 3)
if (getNavCurrentFragment() !is PermissionFragment) {
navController.popBackStack()
navController.navigate(R.id.permissionFragment)
showPermissionPageGuide = true
}
}
companion object {
const val NAV_HOME = "nav_home"
const val NAV_RECENT = "nav_recent"
const val NAV_SETTING = "nav_setting"
const val NAV_PERMISSION = "nav_permission"
}
}
\ No newline at end of file
package com.base.pdfoneread.ui.main
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.base.pdfoneread.databinding.FragmentPermissionBinding
import com.base.pdfoneread.utils.PermissionUtils.requestStoragePermission
import com.base.pdfoneread.utils.SafUtils.jumpOpenDocumentThenPersistable
import com.base.pdfoneread.utils.ToastUtils.toast
class PermissionFragment : Fragment() {
private lateinit var binding: FragmentPermissionBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentPermissionBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvSet.setOnClickListener {
val activity = requireActivity() as MainActivity?
activity ?: return@setOnClickListener
requireContext().requestStoragePermission(activity.launcher) {}
}
binding.tvFileGo.setOnClickListener {
val activity = requireActivity() as MainActivity?
activity ?: return@setOnClickListener
requireContext().jumpOpenDocumentThenPersistable(activity.launcher) { uri ->
requireContext().toast("uri=$uri")
}
}
}
companion object {
}
}
\ No newline at end of file
......@@ -18,6 +18,7 @@ import com.base.pdfoneread.helper.UmpUtils.umpCalled
import com.base.pdfoneread.helper.UmpUtils.umpCanAd
import com.base.pdfoneread.ui.BaseActivity
import com.base.pdfoneread.ui.main.MainActivity
import com.base.pdfoneread.ui.main.MainActivity.Companion.NAV_PERMISSION
import com.base.pdfoneread.utils.BarUtils
import com.base.pdfoneread.utils.LogEx
import com.base.pdfoneread.utils.SpannableUtils
......@@ -126,7 +127,9 @@ class MyStartActivity : BaseActivity<ActivityMyStartBinding>() {
private fun firstStartJump() {
isFirstStart = false
startActivity(Intent(this, MainActivity::class.java))
startActivity(Intent(this, MainActivity::class.java).apply {
putExtra("navWhere", NAV_PERMISSION)
})
}
override fun onPause() {
......
......@@ -10,6 +10,7 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import com.base.pdfoneread.utils.LogEx
import kotlinx.coroutines.Dispatchers
class SplashViewModel : ViewModel() {
......@@ -25,12 +26,12 @@ class SplashViewModel : ViewModel() {
if (ConstObject.ifAgreePrivacy && startJumpJob) {
if (jumpJob == null) {
val startTime = System.currentTimeMillis()
jumpJob = viewModelScope.launch {
jumpJob = viewModelScope.launch(Dispatchers.IO) {
LogEx.logDebug(TAG, "open_ad_loading=$loadingTime")
delay(loadingTime * 1000L)
val endTime = System.currentTimeMillis()
LogEx.logDebug(TAG, "超时跳转 time=${endTime - startTime}")
splashActivity.jumpNext()
launch(Dispatchers.Main) { splashActivity.jumpNext() }
}
}
}
......
package com.base.pdfoneread.ui.views
import android.app.AlertDialog
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import androidx.core.widget.addTextChangedListener
import com.base.pdfoneread.R
import com.base.pdfoneread.databinding.DialogDocumentDetailBinding
import com.base.pdfoneread.databinding.DialogDocumentRenameBinding
import com.base.pdfoneread.ui.views.DocumentDialog.showDocumentDetail
import com.base.pdfoneread.utils.KotlinExt.toFormatTime2
import com.base.pdfoneread.utils.ToastUtils.toast
import com.google.android.material.bottomsheet.BottomSheetBehavior
......@@ -22,20 +26,18 @@ object NameDialog {
okAction: ((newName: String) -> Unit)? = null,
dismissAction: (() -> Unit)? = null
) {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val dialog = AlertDialog.Builder(this).create()
val binding = DialogDocumentRenameBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(true)
val window = dialog.window
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
dialog.show()
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val params = dialog.window?.attributes
params?.gravity = Gravity.CENTER
params?.width = resources.getDimensionPixelSize(R.dimen.dp_345)
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
binding.edit.addTextChangedListener {
binding.tvOk.isEnabled = !it.isNullOrEmpty()
......
package com.base.pdfoneread.utils
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.DocumentsContract
object SafUtils {
fun Context.persistableUri(treeUri: Uri) {
contentResolver.takePersistableUriPermission(
treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
}
fun Context.jumpOpenDocumentThenPersistable(
launcher: ActivityLauncher,
callBack: (uri: Uri?) -> Unit
) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
val downloadsUri = Uri.parse("content://com.android.providers.downloads.documents/tree/downloads")
// 可以设置一个初始URI,当文件选择器加载时会显示这个URI指向的文件夹
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, downloadsUri)
}
launcher.launch(intent) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val treeUri = result.data?.data
treeUri?.let { persistableUri(it) }
callBack.invoke(treeUri)
}
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF5910" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF5910" />
<corners android:radius="2.5dp" />
</shape>
\ No newline at end of file
......@@ -43,13 +43,26 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="@string/your_full_document_reader"
android:textColor="#8E95A0"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_app_name"
android:text="Your full document reader" />
app:layout_constraintTop_toBottomOf="@id/tv_app_name" />
<com.base.pdfoneread.ui.views.XmlLottieAnimationView
android:id="@+id/lottie"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/splash_loading" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -2,15 +2,16 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_width="360dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_f3f3f3_tlr25"
android:background="@drawable/bg_ffffff_tlr15"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl"
android:layout_width="match_parent"
android:layout_height="65dp"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
......@@ -35,21 +36,36 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl">
<EditText
android:id="@+id/edit"
<FrameLayout
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="32dp"
android:background="@drawable/bg_stoke_bababa_10"
android:ellipsize="end"
android:gravity="center_vertical"
android:paddingHorizontal="20dp"
android:singleLine="true"
android:text="DEMO.pdf"
android:textColor="#333333"
android:textSize="18sp"
tools:ignore="Autofill,HardcodedText,LabelFor,TextFields" />
android:layout_marginTop="32dp">
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="@drawable/bg_stoke_bababa_10"
android:ellipsize="end"
android:gravity="center_vertical"
android:paddingStart="20dp"
android:paddingEnd="40dp"
android:singleLine="true"
android:text="DEMO.pdf"
android:textColor="#333333"
android:textSize="18sp"
tools:ignore="Autofill,HardcodedText,LabelFor,TextFields" />
<ImageView
android:id="@+id/iv_x"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.main.PermissionFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="120dp"
android:src="@mipmap/no_empty"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="24dp"
android:text="No permissions"
android:textColor="#010101"
android:textSize="20sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="2dp"
android:text="@string/authorization_required_to_read_all_files"
android:textColor="#9E9FA2"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_set"
android:layout_width="160dp"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="80dp"
android:layout_marginBottom="50dp"
android:background="@drawable/bg_ff5910_15"
android:gravity="center"
android:text="@string/go_to_set"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#F3F4F6">
<ImageView
android:id="@+id/iv_file"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:src="@mipmap/icon_file"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:text="@string/you_can_open_files_through_nfile_manager"
android:textColor="@color/black"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="@id/iv_file"
app:layout_constraintEnd_toStartOf="@id/tv_file_go"
app:layout_constraintStart_toEndOf="@id/iv_file"
app:layout_constraintTop_toTopOf="@id/iv_file" />
<TextView
android:id="@+id/tv_file_go"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/bg_ff5910_2_5"
android:gravity="center"
android:paddingHorizontal="24dp"
android:paddingVertical="8dp"
android:text="@string/go"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/iv_file"
app:layout_constraintEnd_toStartOf="@id/fl_close"
app:layout_constraintTop_toTopOf="@id/iv_file" />
<FrameLayout
android:id="@+id/fl_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/icon_no" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
\ No newline at end of file
......@@ -20,4 +20,9 @@
android:name="com.base.pdfoneread.ui.main.SettingFragment"
android:label="fragment_setting"
tools:layout="@layout/fragment_setting" />
<fragment
android:id="@+id/permissionFragment"
android:name="com.base.pdfoneread.ui.main.PermissionFragment"
android:label="fragment_permission"
tools:layout="@layout/fragment_permission" />
</navigation>
\ No newline at end of file
This diff is collapsed.
......@@ -62,5 +62,10 @@
<string name="password_error">Password Error</string>
<string name="confirm">Confirm</string>
<string name="merge">Merge</string>
<string name="authorization_required_to_read_all_files">Authorization required to read all files.</string>
<string name="go_to_set">Go to set</string>
<string name="go">Go</string>
<string name="you_can_open_files_through_nfile_manager">You can open files through\n\"File Manager\".</string>
<string name="your_full_document_reader">Your full document reader</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment