Skip to content

Commit

Permalink
Rewrite dialogs to compose
Browse files Browse the repository at this point in the history
  • Loading branch information
massivemadness committed Feb 9, 2025
1 parent 713f85f commit a594b96
Show file tree
Hide file tree
Showing 46 changed files with 950 additions and 687 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ fun AlertDialog(
content = content,
modifier = Modifier
.weight(1f, fill = false)
.then(paddingModifier)
.then(scrollableModifier)
.then(paddingModifier)
)

Row(
Expand Down Expand Up @@ -138,7 +138,7 @@ private fun AlertDialogPreview() {
content = {
Text(
text = "Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum",
style = SquircleTheme.typography.text14Regular,
style = SquircleTheme.typography.text16Regular,
color = SquircleTheme.colors.colorTextAndIconSecondary,
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ import com.blacksquircle.ui.ds.textfield.internal.TextFieldLabel
@Composable
fun TextField(
inputText: String,
onInputChanged: (String) -> Unit,
modifier: Modifier = Modifier,
onInputChanged: (String) -> Unit = {},
labelText: String? = null,
helpText: String? = null,
placeholderText: String? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ internal class ExplorerRepositoryImpl(
)
update(progress)

filesystem.createFile(fileModel)
delay(10000L)
// filesystem.createFile(fileModel)
delay(100)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ internal fun Context.openFileWith(fileModel: FileModel) {
}
startActivity(intent)
} catch (e: Exception) {
Timber.d(e, e.message)
Timber.e(e, e.message)
showToast(R.string.message_cannot_be_opened)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,7 @@ import com.blacksquircle.ui.feature.editor.api.internal.EditorApiDepsProvider
import com.blacksquircle.ui.feature.editor.api.internal.EditorApiProvider
import com.blacksquircle.ui.feature.explorer.api.internal.ExplorerApiDepsProvider
import com.blacksquircle.ui.feature.explorer.api.internal.ExplorerApiProvider
import com.blacksquircle.ui.feature.explorer.ui.dialog.AuthDialog
import com.blacksquircle.ui.feature.explorer.ui.dialog.CompressDialog
import com.blacksquircle.ui.feature.explorer.ui.dialog.CreateDialog
import com.blacksquircle.ui.feature.explorer.ui.dialog.DeleteDialog
import com.blacksquircle.ui.feature.explorer.ui.dialog.ProgressDialog
import com.blacksquircle.ui.feature.explorer.ui.dialog.RenameDialog
import com.blacksquircle.ui.feature.explorer.ui.fragment.ExplorerFragment
import com.blacksquircle.ui.feature.explorer.ui.service.FileService
import com.blacksquircle.ui.feature.servers.api.internal.ServersApiDepsProvider
Expand All @@ -49,12 +44,7 @@ import dagger.Component
)
internal interface ExplorerComponent {

fun inject(dialog: AuthDialog)
fun inject(dialog: CompressDialog)
fun inject(dialog: CreateDialog)
fun inject(dialog: DeleteDialog)
fun inject(dialog: ProgressDialog)
fun inject(dialog: RenameDialog)
fun inject(fragment: ExplorerFragment)
fun inject(service: FileService)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,50 +16,52 @@

package com.blacksquircle.ui.feature.explorer.ui.dialog

import android.app.Dialog
import android.content.Context
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.blacksquircle.ui.core.extensions.activityViewModels
import com.blacksquircle.ui.feature.explorer.R
import com.blacksquircle.ui.feature.explorer.databinding.DialogAuthBinding
import com.blacksquircle.ui.feature.explorer.internal.ExplorerComponent
import com.blacksquircle.ui.feature.explorer.ui.mvi.ExplorerIntent
import com.blacksquircle.ui.feature.explorer.ui.viewmodel.ExplorerViewModel
import com.blacksquircle.ui.core.extensions.sendFragmentResult
import com.blacksquircle.ui.ds.SquircleTheme
import com.blacksquircle.ui.feature.explorer.ui.fragment.ExplorerFragment
import com.blacksquircle.ui.filesystem.base.model.AuthMethod
import javax.inject.Inject
import javax.inject.Provider
import com.blacksquircle.ui.ds.R as UiR

internal class AuthDialog : DialogFragment() {

@Inject
lateinit var viewModelProvider: Provider<ExplorerViewModel>

private val viewModel by activityViewModels<ExplorerViewModel> { viewModelProvider.get() }
private val navController by lazy { findNavController() }
private val navArgs by navArgs<AuthDialogArgs>()

override fun onAttach(context: Context) {
ExplorerComponent.buildOrGet(context).inject(this)
super.onAttach(context)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val binding = DialogAuthBinding.inflate(layoutInflater)
binding.input.hint = when (AuthMethod.of(navArgs.authMethod)) {
AuthMethod.PASSWORD -> getString(R.string.hint_enter_password)
AuthMethod.KEY -> getString(R.string.hint_enter_passphrase)
}
return AlertDialog.Builder(requireContext())
.setTitle(R.string.dialog_title_authentication)
.setView(binding.root)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(UiR.string.common_continue) { _, _ ->
val password = binding.input.text.toString()
viewModel.obtainEvent(ExplorerIntent.Authenticate(password))
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
SquircleTheme {
AuthScreen(
authMethod = AuthMethod.of(navArgs.authMethod),
onConfirmClicked = { credentials ->
sendFragmentResult(
resultKey = ExplorerFragment.KEY_AUTHENTICATION,
bundle = bundleOf(
ExplorerFragment.ARG_USER_INPUT to credentials,
)
)
navController.popBackStack()
},
onCancelClicked = {
navController.popBackStack()
},
)
}
}
.create()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* Copyright 2025 Squircle CE contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.blacksquircle.ui.feature.explorer.ui.dialog

import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.tooling.preview.PreviewLightDark
import com.blacksquircle.ui.ds.PreviewBackground
import com.blacksquircle.ui.ds.dialog.AlertDialog
import com.blacksquircle.ui.ds.textfield.TextField
import com.blacksquircle.ui.feature.explorer.R
import com.blacksquircle.ui.filesystem.base.model.AuthMethod
import com.blacksquircle.ui.ds.R as UiR

@Composable
internal fun AuthScreen(
authMethod: AuthMethod,
onConfirmClicked: (String) -> Unit = {},
onCancelClicked: () -> Unit = {}
) {
var credentials by rememberSaveable {
mutableStateOf("")
}
AlertDialog(
title = stringResource(R.string.dialog_title_authentication),
content = {
TextField(
inputText = credentials,
onInputChanged = { credentials = it },
labelText = when (authMethod) {
AuthMethod.PASSWORD -> stringResource(R.string.hint_enter_password)
AuthMethod.KEY -> stringResource(R.string.hint_enter_passphrase)
},
keyboardOptions = KeyboardOptions(
autoCorrectEnabled = false,
keyboardType = KeyboardType.Password,
),
visualTransformation = PasswordVisualTransformation(),
)
},
confirmButton = stringResource(UiR.string.common_continue),
dismissButton = stringResource(android.R.string.cancel),
onConfirmClicked = { onConfirmClicked(credentials) },
onDismissClicked = onCancelClicked,
onDismiss = onCancelClicked,
)
}

@PreviewLightDark
@Composable
private fun AuthScreenPreview() {
PreviewBackground {
AuthScreen(
authMethod = AuthMethod.PASSWORD,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,46 +16,47 @@

package com.blacksquircle.ui.feature.explorer.ui.dialog

import android.app.Dialog
import android.content.Context
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import androidx.navigation.fragment.findNavController
import com.blacksquircle.ui.core.extensions.activityViewModels
import com.blacksquircle.ui.feature.explorer.R
import com.blacksquircle.ui.feature.explorer.databinding.DialogCompressBinding
import com.blacksquircle.ui.feature.explorer.internal.ExplorerComponent
import com.blacksquircle.ui.feature.explorer.ui.mvi.ExplorerIntent
import com.blacksquircle.ui.feature.explorer.ui.viewmodel.ExplorerViewModel
import javax.inject.Inject
import javax.inject.Provider
import com.blacksquircle.ui.ds.R as UiR
import com.blacksquircle.ui.core.extensions.sendFragmentResult
import com.blacksquircle.ui.ds.SquircleTheme
import com.blacksquircle.ui.feature.explorer.ui.fragment.ExplorerFragment

internal class CompressDialog : DialogFragment() {

@Inject
lateinit var viewModelProvider: Provider<ExplorerViewModel>

private val viewModel by activityViewModels<ExplorerViewModel> { viewModelProvider.get() }
private val navController by lazy { findNavController() }

override fun onAttach(context: Context) {
ExplorerComponent.buildOrGet(context).inject(this)
super.onAttach(context)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val binding = DialogCompressBinding.inflate(layoutInflater)
return AlertDialog.Builder(requireContext())
.setTitle(R.string.dialog_title_archive_name)
.setView(binding.root)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.action_compress) { _, _ ->
val fileName = binding.input.text?.ifEmpty { getString(UiR.string.common_untitled) }
navController.popBackStack()
viewModel.obtainEvent(ExplorerIntent.CompressFile(fileName.toString()))
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
SquircleTheme {
CompressScreen(
onConfirmClicked = { fileName ->
sendFragmentResult(
resultKey = ExplorerFragment.KEY_COMPRESS_FILE,
bundle = bundleOf(
ExplorerFragment.ARG_USER_INPUT to fileName,
)
)
},
onCancelClicked = {
navController.popBackStack()
}
)
}
}
.create()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright 2025 Squircle CE contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.blacksquircle.ui.feature.explorer.ui.dialog

import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewLightDark
import com.blacksquircle.ui.ds.PreviewBackground
import com.blacksquircle.ui.ds.dialog.AlertDialog
import com.blacksquircle.ui.ds.textfield.TextField
import com.blacksquircle.ui.feature.explorer.R
import com.blacksquircle.ui.ds.R as UiR

@Composable
internal fun CompressScreen(
onConfirmClicked: (String) -> Unit = {},
onCancelClicked: () -> Unit = {}
) {
val placeholder = stringResource(UiR.string.common_untitled)
var fileName by rememberSaveable {
mutableStateOf("")
}
AlertDialog(
title = stringResource(R.string.dialog_title_archive_name),
content = {
TextField(
inputText = fileName,
onInputChanged = { fileName = it },
labelText = stringResource(R.string.hint_enter_archive_name),
placeholderText = placeholder,
)
},
confirmButton = stringResource(R.string.action_compress),
dismissButton = stringResource(android.R.string.cancel),
onConfirmClicked = { onConfirmClicked(fileName.ifEmpty { placeholder }) },
onDismissClicked = onCancelClicked,
onDismiss = onCancelClicked,
)
}

@PreviewLightDark
@Composable
private fun CompressScreenPreview() {
PreviewBackground {
CompressScreen()
}
}
Loading

0 comments on commit a594b96

Please sign in to comment.