Skip to content

Commit

Permalink
feat: all files access permission variant
Browse files Browse the repository at this point in the history
  • Loading branch information
ViscousPot committed Sep 18, 2024
1 parent 9c3a70e commit f5cd5df
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
14 changes: 14 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ android {
}
buildFeatures {
compose = true
buildConfig = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.1"
Expand All @@ -47,6 +48,19 @@ android {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
productFlavors {
flavorDimensions += "version"
productFlavors {
create("base") {
dimension = "version"
buildConfigField("boolean", "ALL_FILES", "false")
}
create("all-files-variant") {
dimension = "version"
buildConfigField("boolean", "ALL_FILES", "true")
}
}
}
}

dependencies {
Expand Down
5 changes: 5 additions & 0 deletions app/src/all-files-variant/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
</manifest>
57 changes: 57 additions & 0 deletions app/src/main/java/com/viscouspot/gitsync/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import android.graphics.PorterDuff
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.provider.Settings
import android.view.MotionEvent
import android.view.View
Expand All @@ -21,13 +23,15 @@ import android.widget.EditText
import android.widget.Switch
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.button.MaterialButton
Expand Down Expand Up @@ -80,6 +84,10 @@ class MainActivity : AppCompatActivity() {
private lateinit var syncAppOpened: Switch
private lateinit var syncAppClosed: Switch

private var onStoragePermissionGranted: (() -> Unit)? = null
private var requestLegacyStoragePermission: ActivityResultLauncher<Array<String>>? = null
private var requestStoragePermission: ActivityResultLauncher<Intent>? = null

companion object {
const val REFRESH = "REFRESH"
}
Expand Down Expand Up @@ -184,6 +192,55 @@ class MainActivity : AppCompatActivity() {
log(this, "Global", Exception(paramThrowable))
}

if (BuildConfig.ALL_FILES) {
requestLegacyStoragePermission = this.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { isGrantedMap ->
if (isGrantedMap.values.all { it }) {
onStoragePermissionGranted?.invoke()
}
}

requestStoragePermission = this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
val hasPermissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager()
} else ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED

if (hasPermissions) {
onStoragePermissionGranted?.invoke()
}
}

fun checkAndRequestStoragePermission(onGranted: (() -> Unit)? = null) {
val hasPermissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager()
} else ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED


if (hasPermissions) {
onGranted?.invoke()
return
}

onStoragePermissionGranted = onGranted

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val uri = Uri.fromParts("package", packageName, null)
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri)
intent.data = Uri.fromParts("package", packageName, null)
requestStoragePermission?.launch(intent)
} else {
requestLegacyStoragePermission?.launch(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE))
}
}

checkAndRequestStoragePermission()
}

val bManager = LocalBroadcastManager.getInstance(this)
val intentFilter = IntentFilter()
intentFilter.addAction(REFRESH)
Expand Down

0 comments on commit f5cd5df

Please sign in to comment.