@@ -2,6 +2,7 @@ package com.kyhsgeekcode.disassembler.ui
22
33import android.app.Activity
44import android.content.Intent
5+ import androidx.activity.compose.ManagedActivityResultLauncher
56import androidx.activity.compose.rememberLauncherForActivityResult
67import androidx.activity.result.contract.ActivityResultContracts
78import androidx.compose.foundation.layout.Arrangement
@@ -14,20 +15,34 @@ import androidx.compose.material3.AlertDialog
1415import androidx.compose.material3.Button
1516import androidx.compose.material3.Text
1617import androidx.compose.runtime.Composable
18+ import androidx.compose.runtime.DisposableEffect
1719import androidx.compose.runtime.collectAsState
20+ import androidx.compose.runtime.getValue
21+ import androidx.compose.runtime.mutableStateOf
22+ import androidx.compose.runtime.remember
23+ import androidx.compose.runtime.setValue
1824import androidx.compose.ui.Modifier
1925import androidx.compose.ui.platform.LocalContext
2026import androidx.compose.ui.res.stringResource
2127import androidx.compose.ui.unit.dp
28+ import androidx.lifecycle.DefaultLifecycleObserver
29+ import androidx.lifecycle.LifecycleOwner
2230import com.kyhsgeekcode.disassembler.R
31+ import com.kyhsgeekcode.disassembler.importing.DefaultImportEntryPointCatalog
32+ import com.kyhsgeekcode.disassembler.importing.ImportEntryPoint
33+ import com.kyhsgeekcode.disassembler.preference.PowerUserModeSettings
2334import com.kyhsgeekcode.disassembler.viewmodel.MainViewModel
2435import com.kyhsgeekcode.filechooser.NewFileChooserActivity
2536
2637@Composable
2738fun ProjectOverview (viewModel : MainViewModel ) {
2839 val context = LocalContext .current
40+ val lifecycleOwner = context as ? LifecycleOwner
41+ var powerUserModeEnabled by remember {
42+ mutableStateOf(PowerUserModeSettings .isEnabled(context))
43+ }
2944
30- val launcher = rememberLauncherForActivityResult(
45+ val advancedImportLauncher = rememberLauncherForActivityResult(
3146 ActivityResultContracts .StartActivityForResult ()
3247 ) {
3348 if (it.resultCode == Activity .RESULT_OK ) {
@@ -37,8 +52,46 @@ fun ProjectOverview(viewModel: MainViewModel) {
3752 }
3853 }
3954 }
55+ val safImportLauncher = rememberLauncherForActivityResult(
56+ ActivityResultContracts .OpenDocument ()
57+ ) { selectedUri ->
58+ if (selectedUri != null ) {
59+ try {
60+ context.contentResolver.takePersistableUriPermission(
61+ selectedUri,
62+ Intent .FLAG_GRANT_READ_URI_PERMISSION
63+ )
64+ } catch (_: SecurityException ) {
65+ }
66+ viewModel.onSelectIntent(
67+ Intent ().apply {
68+ putExtra(" uri" , selectedUri)
69+ putExtra(" openProject" , false )
70+ }
71+ )
72+ }
73+ }
4074
4175 val askCopy = viewModel.askCopy.collectAsState()
76+ val visibleEntryPoints = remember(powerUserModeEnabled) {
77+ DefaultImportEntryPointCatalog .visibleEntryPoints(powerUserModeEnabled)
78+ }
79+
80+ DisposableEffect (lifecycleOwner, context) {
81+ if (lifecycleOwner == null ) {
82+ onDispose {}
83+ } else {
84+ val observer = object : DefaultLifecycleObserver {
85+ override fun onResume (owner : LifecycleOwner ) {
86+ powerUserModeEnabled = PowerUserModeSettings .isEnabled(context)
87+ }
88+ }
89+ lifecycleOwner.lifecycle.addObserver(observer)
90+ onDispose {
91+ lifecycleOwner.lifecycle.removeObserver(observer)
92+ }
93+ }
94+ }
4295
4396 Column (
4497 Modifier
@@ -47,11 +100,20 @@ fun ProjectOverview(viewModel: MainViewModel) {
47100 ) {
48101 Text (text = stringResource(id = R .string.main_select_source_guide))
49102 Row (Modifier .fillMaxWidth()) {
50- Button (onClick = {
51- val j = Intent (context, NewFileChooserActivity ::class .java)
52- launcher.launch(j)
53- }) {
54- Text (text = stringResource(id = R .string.select_file))
103+ for (entryPoint in visibleEntryPoints) {
104+ Button (
105+ modifier = Modifier .padding(end = 8 .dp),
106+ onClick = {
107+ launchImportEntryPoint(
108+ entryPoint,
109+ context = context,
110+ safImportLauncher = safImportLauncher,
111+ advancedImportLauncher = advancedImportLauncher
112+ )
113+ }
114+ ) {
115+ Text (text = stringResource(id = entryPoint.labelRes))
116+ }
55117 }
56118 }
57119 }
@@ -89,3 +151,20 @@ fun ProjectOverview(viewModel: MainViewModel) {
89151 )
90152 }
91153}
154+
155+ private fun launchImportEntryPoint (
156+ entryPoint : ImportEntryPoint ,
157+ context : android.content.Context ,
158+ safImportLauncher : ManagedActivityResultLauncher <Array <String >, android.net.Uri ? >,
159+ advancedImportLauncher : ManagedActivityResultLauncher <Intent , androidx.activity.result.ActivityResult >
160+ ) {
161+ when (entryPoint) {
162+ ImportEntryPoint .SafImport -> safImportLauncher.launch(arrayOf(" */*" ))
163+ ImportEntryPoint .AdvancedImport -> {
164+ val intent = Intent (context, NewFileChooserActivity ::class .java).apply {
165+ putExtra(NewFileChooserActivity .EXTRA_POWER_USER_MODE , true )
166+ }
167+ advancedImportLauncher.launch(intent)
168+ }
169+ }
170+ }
0 commit comments