@@ -31,28 +31,31 @@ import androidx.activity.enableEdgeToEdge
3131import androidx.activity.result.ActivityResultLauncher
3232import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
3333import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
34+ import androidx.compose.runtime.LaunchedEffect
35+ import androidx.documentfile.provider.DocumentFile
3436import androidx.lifecycle.lifecycleScope
3537import androidx.preference.PreferenceManager
3638import com.mateusrodcosta.apps.share2storage.model.UriData
3739import com.mateusrodcosta.apps.share2storage.screens.DetailsScreen
40+ import com.mateusrodcosta.apps.share2storage.screens.DetailsScreenSkipped
3841import com.mateusrodcosta.apps.share2storage.utils.CreateDocumentWithInitialUri
3942import com.mateusrodcosta.apps.share2storage.utils.SharedPreferenceKeys
43+ import com.mateusrodcosta.apps.share2storage.utils.SharedPreferencesDefaultValues
4044import com.mateusrodcosta.apps.share2storage.utils.getUriData
4145import com.mateusrodcosta.apps.share2storage.utils.saveFile
4246import kotlinx.coroutines.Dispatchers
43- import kotlinx.coroutines.delay
4447import kotlinx.coroutines.launch
4548import kotlinx.coroutines.withContext
46- import kotlin.time.DurationUnit
47- import kotlin.time.toDuration
4849
4950class DetailsActivity : ComponentActivity () {
5051 private lateinit var createFile: ActivityResultLauncher <String >
51- private var uriData: UriData ? = null
52+ private lateinit var fileUri: Uri
53+ private lateinit var uriData: UriData
5254
53- private var skipFileDetails: Boolean = false
5455 private var defaultSaveLocation: Uri ? = null
55- private var showFilePreview: Boolean = true
56+ private var shouldSkipFilePicker: Boolean = false
57+ private var skipFileDetails: Boolean = false
58+ private var shouldShowFilePreview: Boolean = true
5659
5760 @OptIn(ExperimentalMaterial3WindowSizeClassApi ::class )
5861 override fun onCreate (savedInstanceState : Bundle ? ) {
@@ -62,72 +65,103 @@ class DetailsActivity : ComponentActivity() {
6265 getPreferences()
6366 handleIntent(intent)
6467 val launchFilePicker = {
65- createFile.launch(uriData?.displayName ? : " " )
68+ if (shouldSkipFilePicker) {
69+ lifecycleScope.launch {
70+ val dir = DocumentFile .fromTreeUri(applicationContext, defaultSaveLocation!! )
71+ val file = dir!! .createFile(uriData.type, uriData.displayName)
72+
73+ if (file?.uri != null ) handleFileSave(file.uri, fileUri)
74+ }
75+ } else {
76+ createFile.launch(uriData.displayName)
77+ }
78+ Unit
6679 }
6780
6881 setContent {
6982 val windowSizeClass = calculateWindowSizeClass(this )
7083
71- DetailsScreen (
72- uriData = uriData,
73- windowSizeClass = windowSizeClass,
74- launchFilePicker = launchFilePicker,
75- )
84+ if (skipFileDetails) {
85+ LaunchedEffect (key1 = Unit ) {
86+ launchFilePicker()
87+ }
88+ DetailsScreenSkipped ()
89+ } else {
90+ DetailsScreen (
91+ uriData = uriData,
92+ windowSizeClass = windowSizeClass,
93+ launchFilePicker = launchFilePicker,
94+ )
95+ }
7696 }
77-
78- if (skipFileDetails) launchFilePicker()
7997 }
8098
8199 private fun getPreferences () {
82100 val sharedPreferences = PreferenceManager .getDefaultSharedPreferences(this )
83101
84- skipFileDetails =
85- sharedPreferences.getBoolean(SharedPreferenceKeys .SKIP_FILE_DETAILS_KEY , false )
86- Log .d(" details] skipFileDetails" , skipFileDetails.toString())
87-
88102 val defaultSaveLocationRaw =
89103 sharedPreferences.getString(SharedPreferenceKeys .DEFAULT_SAVE_LOCATION_KEY , null )
90104 Log .d(" details] defaultSaveLocationRaw" , defaultSaveLocationRaw.toString())
91- defaultSaveLocation = if (defaultSaveLocationRaw != null ) Uri .parse(defaultSaveLocationRaw)
92- else null
105+ val defaultSaveLocation =
106+ if (defaultSaveLocationRaw != null ) Uri .parse(defaultSaveLocationRaw)
107+ else null
93108 Log .d(" details] defaultSaveLocation" , defaultSaveLocation.toString())
109+ this .defaultSaveLocation = defaultSaveLocation
110+
111+ val skipFilePicker = sharedPreferences.getBoolean(
112+ SharedPreferenceKeys .SKIP_FILE_PICKER_KEY ,
113+ SharedPreferencesDefaultValues .SKIP_FILE_PICKER_DEFAULT
114+ )
115+ Log .d(" details] skipFilePicker" , skipFilePicker.toString())
116+ // Only skip file picker if both a default folder is set and "Skip File Picker is selected"
117+ this .shouldSkipFilePicker = defaultSaveLocation != null && skipFilePicker
94118
95- showFilePreview =
96- sharedPreferences.getBoolean(SharedPreferenceKeys .SHOW_FILE_PREVIEW_KEY , true )
119+
120+ val skipFileDetails = sharedPreferences.getBoolean(
121+ SharedPreferenceKeys .SKIP_FILE_DETAILS_KEY ,
122+ SharedPreferencesDefaultValues .SKIP_FILE_DETAILS_DEFAULT
123+ )
124+ Log .d(" details] skipFileDetails" , skipFileDetails.toString())
125+ this .skipFileDetails = skipFileDetails
126+
127+ val showFilePreview = sharedPreferences.getBoolean(
128+ SharedPreferenceKeys .SHOW_FILE_PREVIEW_KEY ,
129+ SharedPreferencesDefaultValues .SHOW_FILE_PREVIEW_DEFAULT
130+ )
97131 Log .d(" details] showFilePreview" , showFilePreview.toString())
132+ this .shouldShowFilePreview = ! skipFileDetails && showFilePreview
98133 }
99134
100135 private fun handleIntent (intent : Intent ? ) {
101- var fileUri: Uri ? = null
102- if (intent?.action == Intent . ACTION_SEND ) {
103- fileUri =
104- if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . TIRAMISU ) intent.getParcelableExtra(
105- Intent .EXTRA_STREAM , Uri :: class .java
106- )
107- else @Suppress( " DEPRECATION " ) intent.getParcelableExtra( Intent . EXTRA_STREAM )
108- Log .d(" fileUri ACTION_SEND " , fileUri.toString() )
109- }
110- // ACTION_VIEW intents interceptor
111- if (intent?.action == Intent . ACTION_VIEW ) {
112- fileUri = intent.data
113- Log .d( " fileUri ACTION_VIEW " , fileUri.toString())
114- }
115-
116- if (fileUri != null ) uriData =
117- getUriData(contentResolver, fileUri, getPreview = showFilePreview )
118- if (uriData != null ) {
119- createFile = registerForActivityResult(
120- CreateDocumentWithInitialUri (uriData?.type ? : " */* " , defaultSaveLocation )
121- ) { uri ->
136+ val fileUri: Uri ? = if (intent?.action == Intent . ACTION_SEND ) {
137+ if (Build . VERSION . SDK_INT >= Build . VERSION_CODES . TIRAMISU ) intent.getParcelableExtra(
138+ Intent . EXTRA_STREAM , Uri :: class .java
139+ )
140+ else @Suppress( " DEPRECATION " ) intent.getParcelableExtra( Intent .EXTRA_STREAM )
141+ } else if (intent?.action == Intent . ACTION_VIEW ) intent.data
142+ else null
143+ Log .d(" fileUri" , " Action: ${intent?.action} , uri: $ fileUri" )
144+
145+ if (fileUri == null ) return
146+ this .fileUri = fileUri
147+ val uriData = getUriData(contentResolver, fileUri, getPreview = shouldShowFilePreview)
148+ if (uriData == null ) return
149+ this .uriData = uriData
150+
151+ createFile = registerForActivityResult(
152+ CreateDocumentWithInitialUri (uriData.type, defaultSaveLocation )
153+ ) { uri ->
154+ if (uri == null ) {
155+ if (skipFileDetails) finish( )
156+ } else {
122157 lifecycleScope.launch {
123158 handleFileSave(uri, fileUri)
124159 }
125160 }
126161 }
127162 }
128163
129- private suspend fun handleFileSave (uri : Uri ? , fileUri : Uri ? ) {
130- if (uri == null || fileUri == null ) return
164+ private suspend fun handleFileSave (uri : Uri , fileUri : Uri ) {
131165 return withContext(Dispatchers .IO ) {
132166 val isSuccess = saveFile(baseContext, uri, fileUri)
133167
@@ -141,11 +175,9 @@ class DetailsActivity : ComponentActivity() {
141175 ).show()
142176 }
143177
144- if (skipFileDetails) {
145- delay(1 .toDuration(DurationUnit .SECONDS ))
178+ if (skipFileDetails || shouldSkipFilePicker) {
146179 finish()
147180 }
148181 }
149-
150182 }
151183}
0 commit comments