Commit 8f114531 authored by wanglei's avatar wanglei

Files页面

parent 4085e247
...@@ -45,8 +45,14 @@ dependencies { ...@@ -45,8 +45,14 @@ dependencies {
implementation(libs.androidx.appcompat) implementation(libs.androidx.appcompat)
implementation(libs.material) implementation(libs.material)
implementation(libs.androidx.activity) implementation(libs.androidx.activity)
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.fragment.ktx)
implementation(libs.androidx.constraintlayout) implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.navigation.fragment.ktx)
implementation(libs.androidx.navigation.ui.ktx)
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
implementation(libs.glide)
} }
\ No newline at end of file
...@@ -2,27 +2,40 @@ ...@@ -2,27 +2,40 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/wkoe_98561" android:icon="@mipmap/wkoe_98561"
android:label="@string/app_name" android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:requestRawExternalStorageAccess="true"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.SimpleFilesManager" android:theme="@style/Theme.SimpleFilesManager"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".simplegrid.SimpleGridActivity"
android:exported="false" />
<activity <activity
android:name=".JoLaunchjoActivity" android:name=".JoLaunchjoActivity"
android:exported="true" android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity"> tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <!-- <intent-filter> -->
</intent-filter> <!-- <action android:name="android.intent.action.MAIN" /> -->
<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
<!-- </intent-filter> -->
</activity> </activity>
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
...@@ -30,7 +43,11 @@ ...@@ -30,7 +43,11 @@
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity"> tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> </activity>
</application> </application>
......
package com.zxhy.simplefilesmanager
import android.app.Application
import com.bumptech.glide.annotation.GlideModule
@GlideModule
class JOJOGlideApp : Application() {
}
\ No newline at end of file
package com.zxhy.simplefilesmanager package com.zxhy.simplefilesmanager
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import androidx.navigation.fragment.NavHostFragment
import com.google.android.material.navigation.NavigationBarView
import com.zxhy.simplefilesmanager.databinding.ActivityMainBinding
import com.zxhy.simplefilesmanager.simplefile.SimpleFileFragment.Companion.DEEPLINK_SIMPLE_FILE_URI
import com.zxhy.simplefilesmanager.simplejoke.JoActivityJoLauncher
import com.zxhy.simplefilesmanager.simplejoke.permission.JoPermissionJoCheckEx.jostorejoPermissionCheck
import com.zxhy.simplefilesmanager.simplejoke.permission.JoStoreJoPermissionEx.jorequestjoStoreFollow
import com.zxhy.simplefilesmanager.simplemanager.SimpleManagerFragment.Companion.DEEPLINK_SIMPLE_MANAGER_URI
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var navController: NavController
private lateinit var joActivityJoLauncher: JoActivityJoLauncher
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
setContentView(R.layout.activity_main) joActivityJoLauncher = JoActivityJoLauncher(this)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
} }
binding.simpleBnv.itemIconTintList = null
binding.simpleBnv.setItemIconSizeRes(R.dimen.dp_24)
navController =
(supportFragmentManager.findFragmentById(R.id.simple_container) as NavHostFragment).navController
binding.simpleBnv.setOnItemSelectedListener(object : AdapterView.OnItemSelectedListener,
NavigationBarView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) = Unit
override fun onNothingSelected(parent: AdapterView<*>?) = Unit
override fun onNavigationItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_simple_manager -> {
runCatching {
val navOptions = NavOptions.Builder()
.setLaunchSingleTop(true)
.setPopUpTo(R.id.simpleFileFragment, true)
.build()
val deepLinkUri = Uri.parse(DEEPLINK_SIMPLE_MANAGER_URI)
navController.navigate(deepLinkUri, navOptions)
}
}
R.id.menu_simple_files -> {
runCatching {
val navOptions = NavOptions.Builder()
.setLaunchSingleTop(true)
.setPopUpTo(R.id.simpleManagerFragment, true)
.build()
val deepLinkUri = Uri.parse(DEEPLINK_SIMPLE_FILE_URI)
navController.navigate(deepLinkUri, navOptions)
}
}
}
return true
}
})
}
override fun onStart() {
super.onStart()
if (!jostorejoPermissionCheck()) {
jorequestjoStoreFollow(joActivityJoLauncher, disAgreeAction = {}, agreeAction = {})
}
} }
} }
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpleCommon
import androidx.lifecycle.ViewModel
abstract class SimpleCommonViewModel : ViewModel() {
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpleadpter
import android.annotation.SuppressLint
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
@SuppressLint("NotifyDataSetChanged")
abstract class JoCommonJoAdapter<T : ViewHolder, E : JoFileJo>() : RecyclerView.Adapter<T>() {
val joFileList = arrayListOf<E>()
override fun getItemCount(): Int {
return joFileList.size
}
fun setData(data: List<E>) {
joFileList.clear()
joFileList.addAll(data)
notifyDataSetChanged()
}
fun addData(data: List<E>) {
joFileList.addAll(data)
notifyDataSetChanged()
}
fun clearData() {
if (joFileList.size == 0) return
joFileList.clear()
notifyDataSetChanged()
}
fun removeData(data: List<E>) {
data.forEach {
val index = joFileList.indexOf(it)
if (index != -1) {
joFileList.removeAt(index)
notifyItemRemoved(index)
}
}
}
fun getSelectData(): List<E> {
return joFileList.filter { it.isSelect }
}
fun toggleSelect(select: Boolean) {
joFileList.forEach { fileBean ->
fileBean.isSelect = select
}
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledata
import android.net.Uri
abstract class JoFileJo(
val name: String = "",
val jisd: String = "",
var isSelect: Boolean = false,
val sdadsd: Int = 0,
val sdsadgb: Float = 0.2f,
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as JoFileJo
if (name != other.name) return false
if (jisd != other.jisd) return false
if (isSelect != other.isSelect) return false
if (sdadsd != other.sdadsd) return false
if (sdsadgb != other.sdsadgb) return false
return true
}
override fun hashCode(): Int {
var result = name.hashCode()
result = 31 * result + jisd.hashCode()
result = 31 * result + isSelect.hashCode()
result = 31 * result + sdadsd
result = 31 * result + sdsadgb.hashCode()
return result
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledata
import android.net.Uri
data class JoJoRecentImage(var uri: Uri = Uri.EMPTY) : JoFileJo()
package com.zxhy.simplefilesmanager.simplefile
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.FragmentSimpleFileBinding
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class SimpleFileFragment() : Fragment() {
private lateinit var binding: FragmentSimpleFileBinding
private val viewMode: SimpleFileViewModel by viewModels()
private lateinit var adapter: SimpleRecentAdapter
private val TAG = "SimpleFileFragment"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_simple_file, container, false)
binding = FragmentSimpleFileBinding.bind(root)
return root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// Log.e(TAG, "onViewCreated")
super.onViewCreated(view, savedInstanceState)
adapter = SimpleRecentAdapter(requireContext())
binding.rv.adapter = adapter
viewMode.joloadjoRecentImage(requireContext()) { list ->
lifecycleScope.launch(Dispatchers.Main) {
val datas = list.map { JoJoRecentImage(uri = it) }
adapter.setData(datas)
}
}
}
companion object {
const val DEEPLINK_SIMPLE_FILE_URI = "https://www.zxhy.com/simplefile/"
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplefile
import android.content.Context
import android.net.Uri
import androidx.lifecycle.viewModelScope
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simplejoke.JoMediajoStoreEx.recentImage
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class SimpleFileViewModel() : SimpleCommonViewModel() {
fun joloadjoRecentImage(context: Context, gggAction: (uris: List<Uri>) -> Unit) =
viewModelScope.launch(Dispatchers.IO) {
val list = recentImage(context)
gggAction.invoke(list)
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplefile
import android.content.Context
import android.view.RoundedCorner
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.load.resource.bitmap.TransformationUtils.centerCrop
import com.bumptech.glide.request.RequestOptions
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ItemJoImageJoRecentBinding
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx.dp2px
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleRecentAdapter(val context: Context) :
JoCommonJoAdapter<SimpleRecentAdapter.AA, JoJoRecentImage>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(dp2px(context, R.dimen.dp_8)))
class AA(view: View) : ViewHolder(view) {
val binding = ItemJoImageJoRecentBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AA {
return AA(R.layout.item_jo_image_jo_recent.jojoinflate(parent))
}
override fun onBindViewHolder(holder: AA, position: Int) {
val context = holder.binding.root.context
val data = joFileList[position]
Glide.with(context)
.load(data.uri)
.apply(options)
.into(holder.binding.iv)
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplegrid
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivitySimpleGridBinding
class SimpleGridActivity : AppCompatActivity() {
private lateinit var binding: ActivitySimpleGridBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivitySimpleGridBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplejoke
import android.content.Context
import androidx.annotation.DimenRes
object DipPxEx {
fun dp2px(context: Context, dimenResId: Int): Int {
return context.resources.getDimensionPixelOffset(dimenResId)
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplejoke
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.Settings
import androidx.annotation.RequiresApi
/**
* 访问所有文件权限设置界面
* https://blog.csdn.net/qq_17766199/article/details/115351949
*/
object IntentEx{
@RequiresApi(Build.VERSION_CODES.R)
fun settingManageExternalStorage(uri: Uri? = null): Intent {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri)
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
return intent
}
//权限设置界面
fun goToPermissionSettings(context: Context, activityLauncher: JoActivityJoLauncher) {
val intent = appSettingsIntent(context.packageName)
activityLauncher.launch(intent)
}
/**
* 应用设置页面意图
*/
fun appSettingsIntent(packageName: String): Intent {
return Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.fromParts("package", packageName, null))
}
}
package com.zxhy.simplefilesmanager.simplejoke
import android.content.Intent
import androidx.activity.result.ActivityResult
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultCaller
import androidx.activity.result.contract.ActivityResultContracts
import javax.crypto.SecretKeyFactorySpi
import javax.crypto.spec.DESKeySpec
import kotlin.time.times
class JoActivityJoLauncher(activityResultCaller: ActivityResultCaller) {
//region 权限
private var permissionCallback: ActivityResultCallback<Map<String, Boolean>>? = null
private val permissionLauncher =
activityResultCaller.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result: Map<String, Boolean> ->
nishuofahaibudongai()
permissionCallback?.onActivityResult(result)
}
fun launch(
permissionArray: Array<String>,
permissionCallback: ActivityResultCallback<Map<String, Boolean>>?
) {
nishuofahaibudongai()
this.permissionCallback = permissionCallback
permissionLauncher.launch(permissionArray)
}
//endregion
//region intent跳转
private var activityResultCallback: ActivityResultCallback<ActivityResult>? = null
private val intentLauncher =
activityResultCaller.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult: ActivityResult ->
nishuofahaibudongai()
activityResultCallback?.onActivityResult(activityResult)
}
/**
* it.resultCode == Activity.RESULT_OK
*/
fun launch(
intent: Intent,
activityResultCallback: ActivityResultCallback<ActivityResult>? = null
) {
nishuofahaibudongai()
this.activityResultCallback = activityResultCallback
intentLauncher.launch(intent)
}
//endregion
//垃圾代码
fun nishuofahaibudongai(): Int {
var i = 100
i += KotlinVersion.CURRENT.major
buildMap<String, String> {}
i += LazyThreadSafetyMode.PUBLICATION.name.length
return i * 715
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplejoke
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.provider.MediaStore
object JoMediajoStoreEx {
fun recentImage(context: Context): ArrayList<Uri> {
val list = arrayListOf<Uri>()
var cursor: Cursor? = null
// 查询照片的Uri和字段
val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
//查询内容
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_MODIFIED
)
//DESC 降列
//ASC 升序
// val sortOrder = MediaStore.Images.ImageColumns._ID + " DESC"
val sortOrder = MediaStore.Files.FileColumns.DATE_MODIFIED + " DESC"
try {
// 执行查询
cursor = context.contentResolver.query(uri, projection, null, null, sortOrder)
// 遍历结果
if (cursor != null && cursor.moveToFirst()) {
do {
val id =
cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID))
list.add(ContentUris.withAppendedId(uri, id))
if (list.size == 10) {
break
}
} while (cursor.moveToNext())
}
} catch (e: Exception) {
e.printStackTrace()
} finally {
cursor?.close()
}
return list
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplejoke
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
object JoXmljoEx {
/**
* 解析xml布局
*
* @param parent 父布局
* @param attachToRoot 是否依附到父布局
*/
fun Int.jojoinflate(parent: ViewGroup, attachToRoot: Boolean = false): View {
return LayoutInflater.from(parent.context).inflate(this, parent, attachToRoot)
}
}
package com.zxhy.simplefilesmanager.simplejoke.permission
import android.Manifest
import android.content.ClipboardManager
import android.content.pm.PackageManager
import android.os.Build
import androidx.core.content.ContextCompat
import android.content.Context
import android.os.Environment
object JoPermissionJoCheckEx {
//Android 13以后,读写权限无法弹出系统弹窗,分化为Manifest.permission.READ_MEDIA_*权限
//Android 11以后,Manifest.permission.READ_EXTERNAL_STORAGE 授予后还需授予 额外储存管理权限 ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
//Android 11以下使用Manifest.permission.READ_EXTERNAL_STORAGE
fun Context.jostorejoPermissionCheck(): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {//Android 13以后
dfzz()
return Environment.isExternalStorageManager()
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//Android 11以后
dfzz()
val flag1 = Environment.isExternalStorageManager()
val flag2 = arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
).all {
ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
}
return flag1 or flag2
} else { //Android 11以下,Android 6以上
dfzz()
return arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
).all {
ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
}
}
}
/**
* 垃圾代码
*/
fun dfzz(): Int {
ClipboardManager.OnPrimaryClipChangedListener {
}
AbstractMethodError().printStackTrace()
var result = 0
AutoCloseable {
result = (System.currentTimeMillis() + 100).toInt()
}.close()
repeat(10) {
result = ArrayDeque<String>().add("jojo").xor(true).compareTo(true).and(result)
}
return result
}
}
package com.zxhy.simplefilesmanager.simplejoke.permission
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import android.content.Context
import com.zxhy.simplefilesmanager.simplejoke.JoActivityJoLauncher
import com.zxhy.simplefilesmanager.simplejoke.IntentEx.goToPermissionSettings
import com.zxhy.simplefilesmanager.simplejoke.permission.JoPermissionJoCheckEx.dfzz
import java.util.GregorianCalendar
object JoPermissionJoEx {
fun requestPermission(
context: Context,
activityLauncher: JoActivityJoLauncher,
permission: Array<String>,
title: String = "title",
message: String = "message",
agreeAction: (() -> Unit)? = null,
disAgreeAction: (() -> Unit)? = null
) {
val permissionFlag =
permission.all {
ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}
asdashhhhdssasads()
if (permissionFlag) {
agreeAction?.invoke()
} else {
activityLauncher.launch(permission) { callback ->
val isGrantAll = callback.values.all { it }
if (!isGrantAll) {
asdashhhhdssasads()
context.alert(title = title, message = message,
positiveButton = {
goToPermissionSettings(context, activityLauncher)
},
negativeButton = {
disAgreeAction?.invoke()
})
} else {
agreeAction?.invoke()
}
}
}
}
fun Context.alert(
title: String = "",
message: String,
positiveButtonText: String = "Jump",
positiveButton: (() -> Unit)? = null,
negativeButtonText: String = "Cancel",
negativeButton: (() -> Unit)? = null,
) {
val builder = MaterialAlertDialogBuilder(this)
asdashhhhdssasads()
builder.setNegativeButton(negativeButtonText) { dialog, _ ->
dialog.dismiss()
negativeButton?.invoke()
}
asdashhhhdssasads()
builder.setPositiveButton(positiveButtonText) { dialog, _ ->
dialog.dismiss()
positiveButton?.invoke()
}
val dialog = builder.create()
dialog.setCanceledOnTouchOutside(false)
// dialog.setTitle(title)
dialog.setMessage(message)
dialog.show()
asdashhhhdssasads()
}
/**
* 垃圾代码
*/
fun asdashhhhdssasads() {
CharDirectionality.BOUNDARY_NEUTRAL
JvmMultifileClass()
LinkedHashMap<String, String>()["OAKS"] = "ASHIDA"
GregorianCalendar().set(11, 3)
dfzz()
}
}
package com.zxhy.simplefilesmanager.simplejoke.permission
import android.Manifest
import android.annotation.SuppressLint
import android.os.Environment
import com.zxhy.simplefilesmanager.simplejoke.JoActivityJoLauncher
import android.net.Uri
import android.content.Context
import android.graphics.Matrix
import android.os.Build
import com.zxhy.simplefilesmanager.simplejoke.IntentEx.settingManageExternalStorage
import com.zxhy.simplefilesmanager.simplejoke.permission.JoPermissionJoEx.requestPermission
object JoStoreJoPermissionEx {
//Android 13以后,读写权限无法弹出系统弹窗,分化为Manifest.permission.READ_MEDIA_*权限
//Android 11以后,Manifest.permission.READ_EXTERNAL_STORAGE 授予后还需授予 额外储存管理权限 ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
//Android 11以下使用Manifest.permission.READ_EXTERNAL_STORAGE
@SuppressLint("LocalSuppress")
fun Context.jorequestjoStoreFollow(
activityLauncher: JoActivityJoLauncher,
disAgreeAction: (() -> Unit)? = null,
agreeAction: (() -> Unit)? = null,
) {
//请求读写管理权限
@SuppressLint("NewApi")
val requestExternalStorageManager: () -> Unit = {
if (!Environment.isExternalStorageManager()) {
val uri = Uri.parse("package:$packageName")
ojngyx3()
val intent = settingManageExternalStorage(uri)
activityLauncher.launch(intent) {
val flag = Environment.isExternalStorageManager()
if (flag) agreeAction?.invoke() else disAgreeAction?.invoke()
}
} else {
agreeAction?.invoke()
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {//Android 13以后
ojngyx3()
requestExternalStorageManager()
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//Android 11以后
ojngyx3()
requestPermission(
this, activityLauncher,
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
), message = "Set permission to access external storage",
agreeAction = { //读写权限通过,设置储存管理权限
ojngyx3()
requestExternalStorageManager()
},
disAgreeAction = {
ojngyx3()
disAgreeAction?.invoke()
}
)
} else { //Android 11以下,Android 6以上
ojngyx3()
requestPermission(
this, activityLauncher,
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
), message = "Set permission to access external storage",
agreeAction = {
//读写权限通过
agreeAction?.invoke()
}, disAgreeAction = { disAgreeAction?.invoke() }
)
}
}
//垃圾代码
fun ojngyx3() {
sequence<String> {
UIntProgression.equals("SDA").xor(true)
}
MustBeDocumented()
val s = Matrix().mapPoints(FloatArray(5))
println(s)
}
}
package com.zxhy.simplefilesmanager.simplemanager
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.FragmentSimpleManagerBinding
class SimpleManagerFragment() : Fragment() {
private lateinit var binding: FragmentSimpleManagerBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_simple_manager, container, false)
binding = FragmentSimpleManagerBinding.bind(root)
return root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
companion object {
const val DEEPLINK_SIMPLE_MANAGER_URI = "https://www.zxhy.com/simplemanager/"
}
}
\ 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="#333333" />
<corners android:radius="20dp" />
</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="#EAF1FF" />
<corners android:radius="12dp" />
</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="#ECE5FA" />
<corners android:radius="12dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/sfas_63959208" android:state_selected="true" />
<item android:drawable="@mipmap/sfas_639592" android:state_selected="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/sfff_69985" android:state_selected="true" />
<item android:drawable="@mipmap/sfff_6998558" android:state_selected="false" />
</selector>
\ No newline at end of file
...@@ -7,13 +7,23 @@ ...@@ -7,13 +7,23 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity"> tools:context=".MainActivity">
<TextView <androidx.fragment.app.FragmentContainerView
android:layout_width="wrap_content" android:id="@+id/simple_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/simple_bnv"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/simple_nav" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/simple_bnv"
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:menu="@menu/simple_bnv_menu" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".simplegrid.SimpleGridActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<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_height="match_parent"
tools:context=".simplemanager.SimpleManagerFragment">
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="8dp"
android:text="Simple Files Manager"
android:textColor="#333333"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tv_tittle">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_store"
android:layout_width="220dp"
android:layout_height="220dp"
android:layout_marginTop="32dp"
android:background="@mipmap/sdf_7985"
android:gravity="center"
android:text="20%"
android:textColor="#FFFFFF"
android:textSize="60sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:text="Used"
android:textColor="#FFFFFF"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_store"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_free"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="26dp"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_store">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Free"
android:textColor="#666666"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_free"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="0GB"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_used"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="26dp"
android:layout_marginEnd="24dp"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_store">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Use"
android:textColor="#666666"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_use"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="0GB"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:id="@+id/tv_manager"
android:layout_width="190dp"
android:layout_height="40dp"
android:layout_marginTop="29dp"
android:background="@drawable/bg_333333_corners"
android:gravity="center"
android:text="File Manager"
android:textColor="#FFFFFF"
app:layout_constraintEnd_toEndOf="@id/tv_store"
app:layout_constraintStart_toStartOf="@id/tv_store"
app:layout_constraintTop_toBottomOf="@id/tv_store"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_large"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="28dp"
android:background="@drawable/bg_eaf1ff_corners"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_manager">
<ImageView
android:layout_width="36dp"
android:layout_height="34dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:src="@mipmap/ssd_598"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:text="Scan large files"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_dup_picture"
android:layout_width="0dp"
android:layout_height="60dp"
android:layout_marginHorizontal="24dp"
android:layout_marginTop="20dp"
android:background="@drawable/bg_ece5fa_corners"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_large">
<ImageView
android:layout_width="36dp"
android:layout_height="34dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:src="@mipmap/sfffg_68597"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:text="Scan duplicate picture"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_dup_picture" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/iv"
android:layout_width="69dp"
android:layout_height="69dp"
android:layout_margin="4dp"
tools:ignore="ContentDescription">
</ImageView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<menu 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">
<item
android:visible="true"
android:enabled="true"
android:id="@+id/menu_simple_manager"
android:icon="@drawable/bg_manager_selector"
android:title="Manager"
app:showAsAction="ifRoom"
tools:ignore="HardcodedText" />
<item
android:visible="true"
android:enabled="true"
android:id="@+id/menu_simple_files"
android:icon="@drawable/bg_home_selector"
android:title="Files"
app:showAsAction="ifRoom"
tools:ignore="HardcodedText" />
</menu>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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