add setup wizard, remove stoage api permission since root is used for that

This commit is contained in:
2026-03-10 03:20:41 +05:00
parent e87510dc40
commit 86bf14f9d9
4 changed files with 383 additions and 92 deletions

View File

@@ -1,17 +1,10 @@
package sh.sar.isodroid
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.content.Context
import android.os.Bundle
import android.os.Environment
import android.provider.Settings
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
@@ -20,7 +13,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
@@ -28,39 +20,14 @@ import androidx.navigation.compose.rememberNavController
import sh.sar.isodroid.ui.screens.DownloadsScreen
import sh.sar.isodroid.ui.screens.MainScreen
import sh.sar.isodroid.ui.screens.SettingsScreen
import sh.sar.isodroid.ui.screens.SetupWizardScreen
import sh.sar.isodroid.ui.theme.ISODroidTheme
import sh.sar.isodroid.viewmodel.MainViewModel
class MainActivity : ComponentActivity() {
private lateinit var viewModel: MainViewModel
private var hasStoragePermission by mutableStateOf(false)
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
hasStoragePermission = permissions.values.all { it }
if (hasStoragePermission) {
viewModel.refresh()
}
}
private val notificationPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { /* Notification permission result - we continue regardless */ }
private val manageStorageLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
hasStoragePermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager()
} else {
true
}
if (hasStoragePermission) {
viewModel.refresh()
}
}
private var setupComplete by mutableStateOf(false)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -68,7 +35,13 @@ class MainActivity : ComponentActivity() {
viewModel = ViewModelProvider(this)[MainViewModel::class.java]
checkAndRequestPermissions()
// Check if setup was completed previously
setupComplete = isSetupComplete()
// Initialize ViewModel if setup is already complete
if (setupComplete) {
viewModel.initialize()
}
setContent {
ISODroidTheme {
@@ -76,50 +49,30 @@ class MainActivity : ComponentActivity() {
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
ISODroidNavHost(viewModel = viewModel)
if (setupComplete) {
ISODroidNavHost(viewModel = viewModel)
} else {
SetupWizardScreen(
onSetupComplete = {
markSetupComplete()
setupComplete = true
viewModel.initialize()
}
)
}
}
}
}
}
private fun checkAndRequestPermissions() {
// Request notification permission on Android 13+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
private fun isSetupComplete(): Boolean {
val prefs = getSharedPreferences("iso_drive_prefs", Context.MODE_PRIVATE)
return prefs.getBoolean("setup_complete", false)
}
// Request storage permission
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).apply {
data = Uri.parse("package:$packageName")
}
manageStorageLauncher.launch(intent)
} else {
hasStoragePermission = true
}
} else {
val permissions = arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
val needsPermission = permissions.any {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}
if (needsPermission) {
requestPermissionLauncher.launch(permissions)
} else {
hasStoragePermission = true
}
}
private fun markSetupComplete() {
val prefs = getSharedPreferences("iso_drive_prefs", Context.MODE_PRIVATE)
prefs.edit().putBoolean("setup_complete", true).apply()
}
}