Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 4 additions & 16 deletions app/src/main/java/io/simplelogin/android/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
Expand All @@ -72,7 +71,6 @@ import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.lifecycle.HiltViewModel
import io.simplelogin.android.root.AppRoot
import io.simplelogin.android.root.AppRootViewModel
import io.simplelogin.android.root.supportsMultiplePanes
import io.simplelogin.core.common.ProtonLinkManager
import io.simplelogin.core.common.ProtonLoginManager
import io.simplelogin.core.common.di.LoadingState
Expand Down Expand Up @@ -128,8 +126,6 @@ class MainActivity : AppCompatActivity() {
}
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()
val windowAdaptiveInfo = currentWindowAdaptiveInfo()
val asDialog = windowAdaptiveInfo.supportsMultiplePanes()
val appRooState by appRootViewModel.stateFlow.collectAsState()
val userInfo by viewModel.userInfoStateFlow.collectAsState()

Expand All @@ -155,9 +151,7 @@ class MainActivity : AppCompatActivity() {
}

fun openAccountSettings() {
closeDrawerAndExecute {
appRootViewModel.showAccountSettingsScreen(asDialog)
}
closeDrawerAndExecute(appRootViewModel::showAccountSettingsScreen)
}

SimpleLoginTheme(darkTheme = darkTheme, dynamicColor = devicePreferences.dynamicColor) {
Expand All @@ -173,22 +167,16 @@ class MainActivity : AppCompatActivity() {
openAccountSettings()
},
onMailboxesClick = {
closeDrawerAndExecute {
appRootViewModel.showMailboxesScreen(asDialog)
}
closeDrawerAndExecute(appRootViewModel::showMailboxesScreen)
},
onCustomDomainsClick = {
closeDrawerAndExecute {
appRootViewModel.showCustomDomainsScreen(asDialog)
}
closeDrawerAndExecute(appRootViewModel::showCustomDomainsScreen)
},
onAccountSettingsClick = {
openAccountSettings()
},
onDeviceSettingsClick = {
closeDrawerAndExecute {
appRootViewModel.showDeviceSettingsScreen(asDialog)
}
closeDrawerAndExecute(appRootViewModel::showDeviceSettingsScreen)
},
onContactUsClick = {
closeDrawerAndExecute(::openContactUsPage)
Expand Down
33 changes: 1 addition & 32 deletions app/src/main/java/io/simplelogin/android/home/HomeScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
Expand All @@ -41,26 +40,20 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import io.simplelogin.android.R
import io.simplelogin.android.home.topbar.NormalTopAppBar
import io.simplelogin.android.home.topbar.SearchTopAppBar
import io.simplelogin.android.root.supportsMultiplePanes
import io.simplelogin.core.designsystem.TitledFAB
import io.simplelogin.core.designsystem.clickableRippleDisabled
import io.simplelogin.core.designsystem.noAliasesMessage
import io.simplelogin.core.designsystem.theme.SlColor
import io.simplelogin.core.model.api.Alias
import io.simplelogin.core.model.api.ApiKey
import io.simplelogin.core.model.api.RandomMode
import io.simplelogin.core.model.ui.AliasAction
import io.simplelogin.core.model.ui.DialogPayload
import io.simplelogin.core.ui.EditTextDialog
import io.simplelogin.feature.aliasdetail.FullScreenDialog
import io.simplelogin.feature.aliaslist.AliasList
import io.simplelogin.feature.createalias.CreateAliasScreen
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.debounce
Expand All @@ -82,12 +75,10 @@ fun HomeScreen(
}

var isSearching by rememberSaveable { mutableStateOf(false) }
var createAliasDialogPayload by rememberSaveable { mutableStateOf<DialogPayload?>(null) }
var fullScreenAlias by rememberSaveable { mutableStateOf<Alias?>(null) }

val backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
var fabExpanded by rememberSaveable { mutableStateOf(false) }
val windowAdaptiveInfo = currentWindowAdaptiveInfo()

LaunchedEffect(Unit) {
createdAliasFlow.collect { alias ->
Expand Down Expand Up @@ -121,13 +112,7 @@ fun HomeScreen(
onViewDetails = onViewDetails,
onViewContacts = onViewContacts,
onEnterFullScreen = { fullScreenAlias = it },
onCustomAliasClick = {
if (windowAdaptiveInfo.supportsMultiplePanes()) {
createAliasDialogPayload = DialogPayload(ApiKey(viewModel.apiKeyValue))
} else {
onCreateAlias()
}
}
onCustomAliasClick = onCreateAlias
)
}

Expand All @@ -137,22 +122,6 @@ fun HomeScreen(
onDismiss = { fullScreenAlias = null }
)
}

createAliasDialogPayload?.let { payload ->
Dialog(
onDismissRequest = { createAliasDialogPayload = null },
properties = DialogProperties(usePlatformDefaultWidth = windowAdaptiveInfo.supportsMultiplePanes())
) {
CreateAliasScreen(
apiKeyValue = payload.apiKey.value,
onAliasCreated = {
createAliasDialogPayload = null
viewModel.handleCreatedAlias(it)
},
onDismiss = { createAliasDialogPayload = null }
)
}
}
}

@Suppress("CyclomaticComplexMethod")
Expand Down
97 changes: 22 additions & 75 deletions app/src/main/java/io/simplelogin/android/root/AppRoot.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,21 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.material3.adaptive.layout.calculatePaneScaffoldDirective
import androidx.compose.material3.adaptive.navigation3.ListDetailSceneStrategy
import androidx.compose.material3.adaptive.navigation3.rememberListDetailSceneStrategy
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.scene.DialogSceneStrategy
import androidx.navigation3.ui.NavDisplay
import androidx.window.core.layout.WindowSizeClass.Companion.WIDTH_DP_MEDIUM_LOWER_BOUND
import io.simplelogin.android.R
Expand Down Expand Up @@ -94,8 +95,7 @@ fun AppRoot(
onOpenDrawer: () -> Unit
) = with(viewModel) {
val backStack by navBackStack.collectAsState()
val dialogStack by dialogStack.collectAsState()
val activeDialog = dialogStack.lastOrNull()
val showLogOutDialog by showLogOutDialog.collectAsState()
val configuration = LocalConfiguration.current
val screenWidth = configuration.screenWidthDp.dp

Expand All @@ -104,19 +104,22 @@ fun AppRoot(
} else {
screenWidth * 0.5f
}
val windowAdaptiveInfo = currentWindowAdaptiveInfo()
val windowAdaptiveInfo = currentWindowAdaptiveInfoV2()
val numberOfPanes = if (windowAdaptiveInfo.supportsMultiplePanes()) 2 else 1
val listDetailSceneStrategy = rememberListDetailSceneStrategy<NavKey>(
directive = calculatePaneScaffoldDirective(windowAdaptiveInfo).copy(
defaultPanePreferredWidth = listPaneWidth,
maxHorizontalPartitions = if (windowAdaptiveInfo.supportsMultiplePanes()) 2 else 1,
maxHorizontalPartitions = numberOfPanes,
horizontalPartitionSpacerSize = 0.dp
)
)
val dialogStrategy = remember { DialogSceneStrategy<NavKey>() }
val dialogMetadata = if (numberOfPanes > 1) DialogSceneStrategy.dialog() else emptyMap()

NavDisplay(
modifier = modifier,
backStack = backStack,
sceneStrategies = listOf(listDetailSceneStrategy),
sceneStrategies = listOf(listDetailSceneStrategy, dialogStrategy),
entryProvider = entryProvider {
entry<InitializationDestination> {}

Expand All @@ -139,7 +142,7 @@ fun AppRoot(
)
}

entry<CreateAliasDestination> { key ->
entry<CreateAliasDestination>(metadata = dialogMetadata) { key ->
CreateAliasScreen(
apiKeyValue = key.apiKey,
onAliasCreated = viewModel::handleCreatedAlias,
Expand Down Expand Up @@ -182,52 +185,46 @@ fun AppRoot(
)
}

entry<DeviceSettingsDestination> {
entry<DeviceSettingsDestination>(metadata = dialogMetadata) {
DeviceSettingsScreen(onDismiss = viewModel::goBack)
}

entry<AccountSettingsDestination> { key ->
entry<AccountSettingsDestination>(metadata = dialogMetadata) { key ->
AccountSettingsScreen(
apiKeyValue = key.apiKey,
onDismiss = viewModel::goBack
)
}

entry<MailboxesDestination> { key ->
entry<MailboxesDestination>(metadata = dialogMetadata) { key ->
MailboxesScreen(
apiKeyValue = key.apiKey,
onDismiss = viewModel::goBack
)
}

entry<CustomDomainsDestination> { key ->
entry<CustomDomainsDestination>(metadata = dialogMetadata) { key ->
CustomDomainsScreen(
apiKeyValue = key.apiKey,
onViewDetails = {
viewModel.showCustomDomainDetails(
domain = it,
asDialog = false
)
viewModel.showCustomDomainDetails(domain = it)
},
onDismiss = viewModel::goBack
)
}

entry<CustomDomainDetailsDestination> { key ->
entry<CustomDomainDetailsDestination>(metadata = dialogMetadata) { key ->
CustomDomainDetailsScreen(
domain = key.domain,
apiKeyValue = key.apiKey,
onDismiss = viewModel::goBack,
onViewDeletedAliases = {
viewModel.showCustomDomainDeletedAliases(
domain = key.domain,
asDialog = false
)
viewModel.showCustomDomainDeletedAliases(domain = key.domain)
}
)
}

entry<CustomDomainDeletedAliasesDestination> { key ->
entry<CustomDomainDeletedAliasesDestination>(metadata = dialogMetadata) { key ->
CustomDomainDeletedAliasesScreen(
domain = key.domain,
apiKeyValue = key.apiKey,
Expand All @@ -237,8 +234,8 @@ fun AppRoot(
}
)

when (activeDialog) {
AppRootDialog.LogOut -> AlertDialog(
if (showLogOutDialog) {
AlertDialog(
onDismissRequest = ::dismissActiveDialog,
title = { Text(stringResource(R.string.sign_out)) },
text = { Text(stringResource(R.string.sign_out_message)) },
Expand All @@ -253,58 +250,8 @@ fun AppRoot(
}
}
)

AppRootDialog.DeviceSettings -> Dialog(onDismissRequest = ::dismissActiveDialog) {
DeviceSettingsScreen(onDismiss = ::dismissActiveDialog)
}

is AppRootDialog.AccountSettings -> Dialog(onDismissRequest = ::dismissActiveDialog) {
AccountSettingsScreen(
apiKeyValue = activeDialog.apiKey.value,
onDismiss = ::dismissActiveDialog
)
}

is AppRootDialog.Mailboxes -> Dialog(onDismissRequest = ::dismissActiveDialog) {
MailboxesScreen(
apiKeyValue = activeDialog.apiKey.value,
onDismiss = ::dismissActiveDialog
)
}

is AppRootDialog.CustomDomains -> Dialog(onDismissRequest = ::dismissActiveDialog) {
CustomDomainsScreen(
apiKeyValue = activeDialog.apiKey.value,
onViewDetails = { showCustomDomainDetails(domain = it, asDialog = true) },
onDismiss = ::dismissActiveDialog
)
}

is AppRootDialog.CustomDomainDetails -> Dialog(onDismissRequest = ::dismissActiveDialog) {
CustomDomainDetailsScreen(
domain = activeDialog.domain,
apiKeyValue = activeDialog.apiKey.value,
onDismiss = ::dismissActiveDialog,
onViewDeletedAliases = {
viewModel.showCustomDomainDeletedAliases(
domain = activeDialog.domain,
asDialog = true
)
}
)
}

is AppRootDialog.CustomDomainDeletedAliases -> Dialog(onDismissRequest = ::dismissActiveDialog) {
CustomDomainDeletedAliasesScreen(
domain = activeDialog.domain,
apiKeyValue = activeDialog.apiKey.value,
onDismiss = ::dismissActiveDialog
)
}

null -> Unit
}
}

fun WindowAdaptiveInfo.supportsMultiplePanes(): Boolean =
private fun WindowAdaptiveInfo.supportsMultiplePanes(): Boolean =
windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_MEDIUM_LOWER_BOUND)
15 changes: 0 additions & 15 deletions app/src/main/java/io/simplelogin/android/root/AppRootDialog.kt

This file was deleted.

Loading
Loading