From e85f5caeb6f54e4bfc618e132c336d653ce4dea1 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Thu, 1 Aug 2024 20:59:04 +0200 Subject: [PATCH 01/89] remove old functionality for physical menu button I think no such devices were manufactured for over ten years --- .../streetcomplete/screens/MainActivity.kt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt index 03144682e0..aa300428de 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt @@ -9,7 +9,6 @@ import android.os.Bundle import android.text.Html import android.text.method.LinkMovementMethod import android.text.util.Linkify -import android.view.KeyEvent import android.view.View import android.view.WindowManager import android.widget.TextView @@ -176,17 +175,6 @@ class MainActivity : updateLocationAvailability(hasLocationPermission && isLocationEnabled) } - override fun dispatchKeyEvent(event: KeyEvent): Boolean { - val mainFragment = mainFragment - if (event.keyCode == KeyEvent.KEYCODE_MENU && mainFragment != null) { - if (event.action == KeyEvent.ACTION_UP) { - mainFragment.onClickMainMenu() - } - return true - } - return super.dispatchKeyEvent(event) - } - public override fun onPause() { super.onPause() val pos = mainFragment?.getCameraPosition()?.position ?: return From 4f94d7f5ceafe407811f23980e138976d98ad6e4 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Thu, 1 Aug 2024 20:59:31 +0200 Subject: [PATCH 02/89] Put QuestPresetDropdownMenu into own file --- .../quest_presets/QuestPresetDropdownMenu.kt | 76 +++++++++++++++++++ .../settings/quest_presets/QuestPresetItem.kt | 66 ---------------- 2 files changed, 76 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetDropdownMenu.kt diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetDropdownMenu.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetDropdownMenu.kt new file mode 100644 index 0000000000..b24faa8f48 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetDropdownMenu.kt @@ -0,0 +1,76 @@ +package de.westnordost.streetcomplete.screens.settings.quest_presets + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.material.DropdownMenu +import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R + +/** The dropdown menu that shows when tapping on the more button */ +@Composable +fun QuestPresetDropdownMenu( + expanded: Boolean, + onDismissRequest: () -> Unit, + onRename: () -> Unit, + onDuplicate: () -> Unit, + onShare: () -> Unit, + onDelete: () -> Unit, + isDefaultPreset: Boolean, + modifier: Modifier = Modifier +) { + DropdownMenu( + expanded = expanded, + onDismissRequest = onDismissRequest, + modifier = modifier + ) { + if (!isDefaultPreset) { + DropdownMenuItem(onClick = { onDismissRequest(); onRename() }) { + TextWithIcon( + text = stringResource(R.string.quest_presets_rename), + painter = painterResource(R.drawable.ic_edit_24dp) + ) + } + } + DropdownMenuItem(onClick = { onDismissRequest(); onDuplicate() }) { + TextWithIcon( + text = stringResource(R.string.quest_presets_duplicate), + painter = painterResource(R.drawable.ic_content_copy_24dp) + ) + } + DropdownMenuItem(onClick = { onDismissRequest(); onShare() }) { + TextWithIcon( + text = stringResource(R.string.quest_presets_share), + painter = painterResource(R.drawable.ic_share_24dp) + ) + } + if (!isDefaultPreset) { + DropdownMenuItem(onClick = { onDismissRequest(); onDelete() }) { + TextWithIcon( + text = stringResource(R.string.quest_presets_delete), + painter = painterResource(R.drawable.ic_delete_24dp) + ) + } + } + } +} + +@Composable +private fun TextWithIcon(text: String, painter: Painter, modifier: Modifier = Modifier) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon(painter, text) + Text(text) + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetItem.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetItem.kt index efaecf3d54..2dde9e5130 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetItem.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/settings/quest_presets/QuestPresetItem.kt @@ -1,6 +1,5 @@ package de.westnordost.streetcomplete.screens.settings.quest_presets -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row @@ -8,9 +7,6 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem -import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.RadioButton @@ -22,8 +18,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -124,66 +118,6 @@ fun QuestPresetItem( } } -/** The dropdown menu that shows when tapping on the more button */ -@Composable -private fun QuestPresetDropdownMenu( - expanded: Boolean, - onDismissRequest: () -> Unit, - onRename: () -> Unit, - onDuplicate: () -> Unit, - onShare: () -> Unit, - onDelete: () -> Unit, - isDefaultPreset: Boolean, - modifier: Modifier = Modifier -) { - DropdownMenu( - expanded = expanded, - onDismissRequest = onDismissRequest, - modifier = modifier - ) { - if (!isDefaultPreset) { - DropdownMenuItem(onClick = { onDismissRequest(); onRename() }) { - TextWithIcon( - text = stringResource(R.string.quest_presets_rename), - painter = painterResource(R.drawable.ic_edit_24dp) - ) - } - } - DropdownMenuItem(onClick = { onDismissRequest(); onDuplicate() }) { - TextWithIcon( - text = stringResource(R.string.quest_presets_duplicate), - painter = painterResource(R.drawable.ic_content_copy_24dp) - ) - } - DropdownMenuItem(onClick = { onDismissRequest(); onShare() }) { - TextWithIcon( - text = stringResource(R.string.quest_presets_share), - painter = painterResource(R.drawable.ic_share_24dp) - ) - } - if (!isDefaultPreset) { - DropdownMenuItem(onClick = { onDismissRequest(); onDelete() }) { - TextWithIcon( - text = stringResource(R.string.quest_presets_delete), - painter = painterResource(R.drawable.ic_delete_24dp) - ) - } - } - } -} - -@Composable -private fun TextWithIcon(text: String, painter: Painter, modifier: Modifier = Modifier) { - Row( - modifier = modifier, - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Icon(painter, text) - Text(text) - } -} - @Preview @Composable private fun PreviewQuestPresetItem() { From 6eb89fd9a0ab0a4798ef99108a1566fe488e4787 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Mon, 5 Aug 2024 15:21:47 +0200 Subject: [PATCH 03/89] Add composables for various main screen controls --- .../screens/about/logs/LogsScreen.kt | 2 +- .../screens/main/controls/CompassButton.kt | 55 +++++++++ .../screens/main/controls/Crosshair.kt | 49 ++++++++ .../controls/MapButtonNotificationText.kt | 52 +++++++++ .../screens/main/controls/StarsCounter.kt | 81 +++++++++++++ .../main/overlays/OverlaySelectionButton.kt | 42 +++++++ .../overlays/OverlaySelectionDropdownMenu.kt | 56 +++++++++ .../main/teammode/TeamModeColorCircle.kt | 53 +++++++++ .../tutorial/OverlaysTutorialScreen.kt | 1 - .../streetcomplete/ui/common/ActionIcons.kt | 45 ++++++++ .../ui/common/AnimatedInPlaceVisibility.kt | 30 +++++ .../streetcomplete/ui/common/Counter.kt | 109 ++++++++++++++++++ .../westnordost/streetcomplete/ui/ktx/Dp.kt | 11 ++ .../streetcomplete/ui/theme/Dimensions.kt | 13 +++ 14 files changed, 597 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/CompassButton.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/Crosshair.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotificationText.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionButton.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionDropdownMenu.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircle.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedInPlaceVisibility.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/ui/theme/Dimensions.kt diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/about/logs/LogsScreen.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/about/logs/LogsScreen.kt index c102c78077..fd8a050c65 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/about/logs/LogsScreen.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/about/logs/LogsScreen.kt @@ -114,7 +114,7 @@ private fun FiltersCounter(count: Int, modifier: Modifier = Modifier) { modifier = modifier .size(16.dp) .background( - color = MaterialTheme.colors.secondaryVariant, + color = MaterialTheme.colors.secondary, shape = CircleShape ), textAlign = TextAlign.Center, diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/CompassButton.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/CompassButton.kt new file mode 100644 index 0000000000..1f8c325aed --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/CompassButton.kt @@ -0,0 +1,55 @@ +package de.westnordost.streetcomplete.screens.main.controls + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R + +/** Map button showing current compass orientation in relation to the map */ +@OptIn(ExperimentalMaterialApi::class) +@Composable +fun CompassButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + rotation: Float = 0f, + tilt: Float = 0f, +) { + Surface( + onClick = onClick, + modifier = modifier.padding(6.dp), + shape = CircleShape, + elevation = 4.dp + ) { + Image( + painter = painterResource(R.drawable.ic_compass_needle_48dp), + contentDescription = null, + modifier = Modifier + .padding(8.dp) + .size(32.dp) + .graphicsLayer( + rotationZ = rotation, + rotationX = tilt + ) + ) + } +} + +@Preview +@Composable +private fun PreviewCompassButton() { + CompassButton( + onClick = {}, + rotation = 30f, + tilt = 0f + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/Crosshair.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/Crosshair.kt new file mode 100644 index 0000000000..3f26aa8af4 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/Crosshair.kt @@ -0,0 +1,49 @@ +package de.westnordost.streetcomplete.screens.main.controls + +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material.ContentAlpha +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.ui.theme.AppTheme +import de.westnordost.streetcomplete.ui.theme.getMaxQuestFormWidth +import de.westnordost.streetcomplete.ui.theme.getQuestFormPeekHeight + +/** A crosshair at the position at which a new POI should be created */ +@Composable +fun Crosshair(modifier: Modifier = Modifier) { + BoxWithConstraints(modifier.fillMaxSize()) { + val isLandscape = maxWidth > maxHeight + val crosshairOffsetX = if (isLandscape) getMaxQuestFormWidth(maxWidth) else 0.dp + val crosshairOffsetY = if (isLandscape) 0.dp else getQuestFormPeekHeight(maxHeight) + + Icon( + painter = painterResource(R.drawable.crosshair), + contentDescription = null, + modifier = Modifier + .align(Alignment.Center) + .padding(start = crosshairOffsetX, bottom = crosshairOffsetY), + tint = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium) + ) + } +} + +@PreviewLightDark +@Composable +private fun PreviewCrosshair() { + AppTheme { + Surface { + Crosshair() + } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotificationText.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotificationText.kt new file mode 100644 index 0000000000..a519db4c37 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotificationText.kt @@ -0,0 +1,52 @@ +package de.westnordost.streetcomplete.screens.main.controls + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R + +/** Notification text shown on the top end corner of e.g. a button */ +@Composable +fun BoxScope.MapButtonNotificationText( + text: String, + modifier: Modifier = Modifier, +) { + Text( + text = text, + modifier = modifier + .align(Alignment.TopEnd) + .padding(6.dp) + .background(MaterialTheme.colors.secondary, RoundedCornerShape(12.dp)) + .padding(vertical = 2.dp, horizontal = 6.dp), + color = Color.White, + style = MaterialTheme.typography.caption, + textAlign = TextAlign.Center + ) +} + +@Preview +@Composable +private fun PreviewMapButtonWithNotificationText() { + Box { + MapButton(onClick = {}) { + Icon(painterResource(R.drawable.ic_email_24dp), null) + } + MapButtonNotificationText(text = "999") + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt new file mode 100644 index 0000000000..20592aeeb2 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt @@ -0,0 +1,81 @@ +package de.westnordost.streetcomplete.screens.main.controls + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shadow +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.ui.common.Counter + +/** View that displays the user's quest answer counter */ +@Composable +fun StarsCounter( + count: Int, + modifier: Modifier = Modifier, + isCurrentWeek: Boolean = false, + showProgress: Boolean = false, +) { + val textShadow = Shadow(offset = Offset(0f, 1f), blurRadius = 4f) + Row( + modifier = modifier, + verticalAlignment = Alignment.CenterVertically + ) { + Box(contentAlignment = Alignment.Center) { + if (showProgress) { + CircularProgressIndicator( + modifier = Modifier.size(42.dp), + color = MaterialTheme.colors.secondary + ) + } + Image( + painter = painterResource(R.drawable.ic_star_white_shadow_32dp), + contentDescription = null, + modifier = Modifier.padding(8.dp) + ) + } + Column { + AnimatedVisibility (isCurrentWeek) { + Text( + text = stringResource(R.string.user_profile_current_week_title), + fontWeight = FontWeight.Bold, + color = Color.White, + maxLines = 1, + style = MaterialTheme.typography.body2.copy(shadow = textShadow), + ) + } + Counter( + count = count, + fontWeight = FontWeight.Bold, + color = Color.White, + style = MaterialTheme.typography.body1.copy(shadow = textShadow), + ) + } + } +} + +@Preview +@Composable +private fun PreviewStarsCounter() { + StarsCounter( + count = 123, + isCurrentWeek = true, + showProgress = true + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionButton.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionButton.kt new file mode 100644 index 0000000000..1f107b2762 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionButton.kt @@ -0,0 +1,42 @@ +package de.westnordost.streetcomplete.screens.main.overlays + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.overlays.Overlay +import de.westnordost.streetcomplete.ui.common.OverlaysIcon + +/** Overlay selection button that shows the icon of the currently selected overlay */ +@OptIn(ExperimentalMaterialApi::class) +@Composable +fun OverlaySelectionButton( + onClick: () -> Unit, + overlay: Overlay?, + modifier: Modifier = Modifier +) { + Surface( + onClick = onClick, + modifier = modifier.padding(6.dp), + shape = CircleShape, + elevation = 4.dp + ) { + val icon = overlay?.icon + if (icon != null) { + Image( + painter = painterResource(icon), + contentDescription = overlay.name, + modifier = Modifier.padding(6.dp).size(36.dp) + ) + } else { + Box(Modifier.padding(12.dp)) { OverlaysIcon() } + } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionDropdownMenu.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionDropdownMenu.kt new file mode 100644 index 0000000000..8c0ed02b3f --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionDropdownMenu.kt @@ -0,0 +1,56 @@ +package de.westnordost.streetcomplete.screens.main.overlays + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.DropdownMenu +import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.overlays.Overlay + +/** Dropdown menu for selecting an overlay */ +@Composable +fun OverlaySelectionDropdownMenu( + expanded: Boolean, + onDismissRequest: () -> Unit, + overlays: List, + onSelect: (Overlay?) -> Unit, + modifier: Modifier = Modifier +) { + DropdownMenu( + expanded = expanded, + onDismissRequest = onDismissRequest, + modifier = modifier + ) { + DropdownMenuItem(onClick = { onDismissRequest(); onSelect(null) }) { + Text( + text = stringResource(R.string.overlay_none), + modifier = Modifier.padding(start = 48.dp) + ) + } + for (overlay in overlays) { + DropdownMenuItem(onClick = { onDismissRequest(); onSelect(overlay) }) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painter = painterResource(overlay.icon), + contentDescription = null, + modifier = Modifier.size(36.dp) + ) + Text(stringResource(overlay.title)) + } + } + } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircle.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircle.kt new file mode 100644 index 0000000000..78004665c4 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircle.kt @@ -0,0 +1,53 @@ +package de.westnordost.streetcomplete.screens.main.teammode + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.ui.ktx.dpToSp +import de.westnordost.streetcomplete.ui.theme.TeamColors + +/** Circle showing the color and letter of the selected team mode index. + * A size should be provided, as it has no intrinsic size*/ +@Composable +fun TeamModeColorCircle( + index: Int, + modifier: Modifier = Modifier, +) { + val color = TeamColors[index] + + BoxWithConstraints( + contentAlignment = Alignment.Center, + modifier = modifier + .background(color, CircleShape) + .aspectRatio(1f) + ) { + Text( + text = (index + 'A'.code).toChar().toString(), + color = Color.White, + fontSize = (maxWidth * 0.5f).dpToSp() + ) + } +} + +@OptIn(ExperimentalLayoutApi::class) +@Preview +@Composable +private fun PreviewTeamModeColorCircle() { + FlowRow { + for (index in TeamColors.indices) { + TeamModeColorCircle(index = index, modifier = Modifier.size(24.dp)) + } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt index d6c087dad1..90f061e7fe 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt @@ -212,7 +212,6 @@ private fun BoxScope.OverlaysTutorialIllustration( Icon( painter = painterResource(R.drawable.ic_overlay_black_24dp), contentDescription = null, - tint = Color.Black ) } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/common/ActionIcons.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/common/ActionIcons.kt index d53d0c9420..3471266642 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/ui/common/ActionIcons.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/common/ActionIcons.kt @@ -40,3 +40,48 @@ fun OpenInBrowserIcon() { fun NextScreenIcon() { Icon(painterResource(R.drawable.ic_chevron_next_24dp), null) } + +@Composable +fun UndoIcon() { + Icon(painterResource(R.drawable.ic_undo_24dp), stringResource(R.string.action_undo)) +} + +@Composable +fun OverlaysIcon() { + Icon(painterResource(R.drawable.ic_overlay_black_24dp), stringResource(R.string.action_overlays)) +} + +@Composable +fun UploadIcon() { + Icon(painterResource(R.drawable.ic_file_upload_24dp), stringResource(R.string.action_upload)) +} + +@Composable +fun MessagesIcon() { + Icon(painterResource(R.drawable.ic_email_24dp), stringResource(R.string.action_messages)) +} + +@Composable +fun MenuIcon() { + Icon(painterResource(R.drawable.ic_menu_24dp), stringResource(R.string.map_btn_menu)) +} + +@Composable +fun ZoomInIcon() { + Icon(painterResource(R.drawable.ic_add_24dp), stringResource(R.string.map_btn_zoom_in)) +} + +@Composable +fun ZoomOutIcon() { + Icon(painterResource(R.drawable.ic_subtract_24dp), stringResource(R.string.map_btn_zoom_out)) +} + +@Composable +fun StopRecordingIcon() { + Icon(painterResource(R.drawable.ic_stop_recording_24dp), stringResource(R.string.map_btn_stop_track)) +} + +@Composable +fun LargeCreateIcon() { + Icon(painterResource(R.drawable.ic_add_48dp), stringResource(R.string.action_create_new_poi)) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedInPlaceVisibility.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedInPlaceVisibility.kt new file mode 100644 index 0000000000..417daf8393 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedInPlaceVisibility.kt @@ -0,0 +1,30 @@ +package de.westnordost.streetcomplete.ui.common + +import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.EaseInOut +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha + +@Composable +fun AnimatedInPlaceVisibility( + visible: Boolean, + modifier: Modifier = Modifier, + animationSpec: AnimationSpec = tween(durationMillis = 400, delayMillis = 0, easing = EaseInOut), + label: String = "AnimatedInPlaceVisibility", + content: @Composable () -> Unit +) { + val alpha by animateFloatAsState( + if (visible) 1f else 0f, + label = label, + animationSpec = animationSpec, + ) + + Box(modifier = modifier.alpha(alpha)) { + content.invoke() + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt new file mode 100644 index 0000000000..479b1c4ab3 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt @@ -0,0 +1,109 @@ +package de.westnordost.streetcomplete.ui.common + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.material.Button +import androidx.compose.material.LocalTextStyle +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.sp + +@Composable +fun Counter( + count: Int, + modifier: Modifier = Modifier, + color: Color = Color.Unspecified, + fontSize: TextUnit = TextUnit.Unspecified, + fontStyle: FontStyle? = null, + fontWeight: FontWeight? = null, + fontFamily: FontFamily? = null, + letterSpacing: TextUnit = TextUnit.Unspecified, + textDecoration: TextDecoration? = null, + textAlign: TextAlign? = null, + lineHeight: TextUnit = TextUnit.Unspecified, + onTextLayout: ((TextLayoutResult) -> Unit)? = null, + style: TextStyle = LocalTextStyle.current +) { + var oldCount by remember { mutableIntStateOf(count) } + SideEffect { oldCount = count } + + val digits = count.toString().toCharArray().reversed() + + CompositionLocalProvider(LocalLayoutDirection provides LocalLayoutDirection.current.reversed()) { + Row(modifier = modifier) { + digits.forEachIndexed { index, digit -> + AnimatedContent( + targetState = digit, + transitionSpec = { + if (count > oldCount) { + slideInVertically { -it } togetherWith slideOutVertically { it } + } else { + slideInVertically { it } togetherWith slideOutVertically { -it } + } + }, + label = "CounterAnimation$index" + ) { + Text( + text = it.toString(), + color = color, + fontSize = fontSize, + fontStyle = fontStyle, + fontWeight = fontWeight, + fontFamily = fontFamily, + letterSpacing = letterSpacing, + textDecoration = textDecoration, + textAlign = textAlign, + lineHeight = lineHeight, + overflow = TextOverflow.Visible, + softWrap = false, + maxLines = 1, + minLines = 1, + onTextLayout = onTextLayout, + style = style + ) + } + } + } + } +} + +private fun LayoutDirection.reversed() = when (this) { + LayoutDirection.Ltr -> LayoutDirection.Rtl + LayoutDirection.Rtl -> LayoutDirection.Ltr +} + +@Preview +@Composable +private fun PreviewCounter() { + var count by remember { mutableIntStateOf(0) } + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Button(onClick = { count-- }) { Text("-") } + Counter(count, fontSize = 20.sp) + Button(onClick = { count++ }) { Text("+") } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/ktx/Dp.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/ktx/Dp.kt index 502488b013..5d8f048064 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/ui/ktx/Dp.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/ktx/Dp.kt @@ -1,20 +1,31 @@ package de.westnordost.streetcomplete.ui.ktx import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit @Composable +@ReadOnlyComposable fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() } @Composable +@ReadOnlyComposable fun Int.pxToSp() = with(LocalDensity.current) { this@pxToSp.toSp() } @Composable +@ReadOnlyComposable fun TextUnit.toDp() = with(LocalDensity.current) { this@toDp.toDp() } + +@Composable +@ReadOnlyComposable +fun Dp.dpToSp() = with(LocalDensity.current) { + this@dpToSp.toSp() +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/theme/Dimensions.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/theme/Dimensions.kt new file mode 100644 index 0000000000..7a01a19c69 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/theme/Dimensions.kt @@ -0,0 +1,13 @@ +package de.westnordost.streetcomplete.ui.theme + +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +fun getMaxQuestFormWidth(totalWidth: Dp): Dp = + if (totalWidth >= 820.dp) 480.dp + else if (totalWidth >= 600.dp) 360.dp + else 480.dp + +fun getQuestFormPeekHeight(totalHeight: Dp): Dp = + if (totalHeight >= 720.dp) 442.dp + else 352.dp From 266aa968e5671022c503b5402b2e001966e6274b Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Mon, 5 Aug 2024 15:23:31 +0200 Subject: [PATCH 04/89] make tutorial screens always have a background, improve overlays tutorial animation --- .../tutorial/OverlaysTutorialScreen.kt | 18 ++++- .../screens/tutorial/TutorialFragment.kt | 9 +-- .../screens/tutorial/TutorialScreen.kt | 75 ++++++++++--------- 3 files changed, 58 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt index 90f061e7fe..67e6b993be 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt @@ -19,7 +19,9 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -80,17 +82,28 @@ private fun BoxScope.OverlaysTutorialIllustration( val mapZoom = remember { Animatable(0f) } var showSelection by remember { mutableStateOf(ShowEdit.No) } val showEdit = remember { Animatable(0f) } + + var oldPage by remember { mutableIntStateOf(page) } + LaunchedEffect(page) { // button only visible on page 0 launch { button.animateTo(if (page == 0) 0f else 1f, tween(450)) } // paint roller rolls from the top left to the bottom right - if (page == 1) { + if (page == 1 && oldPage < 1) { launch { paintRollerAlpha.animateTo(1f, tween(300, 300)) paintRollerAlpha.animateTo(0f, tween(300, 450)) } launch { paintRollerPosition.animateTo(1f, tween(900, 300, LinearEasing)) } + } else if (oldPage == 1 && page < 1) { + // reverse paint-roller when going back + launch { + paintRollerAlpha.animateTo(1f, tween(300, 0)) + paintRollerAlpha.animateTo(0f, tween(300, 450)) + } + paintRollerPosition.snapTo(1f) + launch { paintRollerPosition.animateTo(0f, tween(900, 150, LinearEasing)) } } else { launch { paintRollerAlpha.animateTo(0f, tween(300)) } launch { paintRollerPosition.animateTo(0f, tween(300, 300)) } @@ -99,7 +112,7 @@ private fun BoxScope.OverlaysTutorialIllustration( if (page > 0) { launch { overlayPaint.animateTo(1f, tween(900, 600, LinearEasing)) } } else { - launch { overlayPaint.animateTo(0f, tween(600)) } + launch { overlayPaint.animateTo(0f, tween(900)) } } // map zooms in on page 2, shows selection etc. if (page == 2) { @@ -113,6 +126,7 @@ private fun BoxScope.OverlaysTutorialIllustration( showEdit.animateTo(0f, tween(300)) mapZoom.animateTo(0f, tween(900)) } + oldPage = page } Box(contentAlignment = Alignment.TopStart) { diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt index e7db3f13db..3c9b3e4dc1 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt @@ -4,7 +4,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.compose.material.Surface import androidx.fragment.app.Fragment import de.westnordost.streetcomplete.ui.util.composableContent @@ -17,10 +16,8 @@ class TutorialFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = composableContent { - Surface { - IntroTutorialScreen( - onFinished = { listener?.onTutorialFinished() } - ) - } + IntroTutorialScreen( + onFinished = { listener?.onTutorialFinished() } + ) } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt index 24e141f962..2df8b923df 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt @@ -28,6 +28,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material.Button import androidx.compose.material.ContentAlpha import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -60,44 +61,46 @@ fun TutorialScreen( } } - TutorialScreenLayout( - illustration = { - illustration(state.currentPage) - }, - pageContent = { - HorizontalPager( - state = state, - modifier = Modifier.width(480.dp), - contentPadding = PaddingValues(horizontal = 16.dp), - pageSpacing = 64.dp, - pageContent = { page -> - Box( - Modifier - .verticalScroll(rememberScrollState()) - .padding(bottom = 96.dp) - ) { - pageContent(page) + Surface(Modifier.fillMaxSize()) { + TutorialScreenLayout( + illustration = { + illustration(state.currentPage) + }, + pageContent = { + HorizontalPager( + state = state, + modifier = Modifier.width(480.dp), + contentPadding = PaddingValues(horizontal = 16.dp), + pageSpacing = 64.dp, + pageContent = { page -> + Box( + Modifier + .verticalScroll(rememberScrollState()) + .padding(bottom = 96.dp) + ) { + pageContent(page) + } } - } - ) - }, - controls = { - PagerControls( - state = state, - onLastPageFinished = onFinished, - modifier = Modifier - .fillMaxWidth() - .background( - Brush.verticalGradient( - .0f to Color.Transparent, - .5f to MaterialTheme.colors.surface + ) + }, + controls = { + PagerControls( + state = state, + onLastPageFinished = onFinished, + modifier = Modifier + .fillMaxWidth() + .background( + Brush.verticalGradient( + .0f to Color.Transparent, + .5f to MaterialTheme.colors.surface + ) ) - ) - .padding(bottom = 16.dp) - ) - }, - modifier = Modifier.safeDrawingPadding() - ) + .padding(bottom = 16.dp) + ) + }, + modifier = Modifier.safeDrawingPadding() + ) + } } @Composable From 0b24c21dcbc3a21d5b0936a0ef3f177638e8dc76 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Tue, 6 Aug 2024 17:54:52 +0200 Subject: [PATCH 05/89] add some more buttons --- .../screens/main/controls/MainMenuButton.kt | 27 ++++++++++++ .../screens/main/controls/MapButton.kt | 15 +++++-- ...cationText.kt => MapButtonNotification.kt} | 44 ++++++++++--------- .../screens/main/controls/StarsCounter.kt | 16 ++++++- 4 files changed, 76 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuButton.kt rename app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/{MapButtonNotificationText.kt => MapButtonNotification.kt} (50%) diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuButton.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuButton.kt new file mode 100644 index 0000000000..ef671caa83 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuButton.kt @@ -0,0 +1,27 @@ +package de.westnordost.streetcomplete.screens.main.controls + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.size +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.screens.main.teammode.TeamModeColorCircle +import de.westnordost.streetcomplete.ui.common.MenuIcon + +@Composable +fun MainMenuButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + indexInTeam: Int? = null, +) { + Box(modifier) { + MapButton(onClick = onClick) { MenuIcon() } + if (indexInTeam != null) { + TeamModeColorCircle( + index = indexInTeam, + modifier = Modifier.size(16.dp).align(Alignment.TopEnd) + ) + } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButton.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButton.kt index bce6cebefc..e047cdda50 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButton.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButton.kt @@ -6,32 +6,39 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface +import androidx.compose.material.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import de.westnordost.streetcomplete.R +/** Small floating button on top of the map */ @OptIn(ExperimentalMaterialApi::class) @Composable fun MapButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - content: @Composable() (BoxScope.() -> Unit) + color: Color = MaterialTheme.colors.surface, + contentColor: Color = contentColorFor(color), + content: @Composable (BoxScope.() -> Unit), ) { Surface( onClick = onClick, - modifier = modifier, + modifier = modifier.padding(6.dp), enabled = enabled, shape = CircleShape, - color = Color.White, + color = color, + contentColor = contentColor, elevation = 4.dp ) { - Box(Modifier.padding(16.dp), content = content) + Box(modifier = Modifier.padding(12.dp), content = content) } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotificationText.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotification.kt similarity index 50% rename from app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotificationText.kt rename to app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotification.kt index a519db4c37..108ec2bd39 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotificationText.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapButtonNotification.kt @@ -3,50 +3,54 @@ package de.westnordost.streetcomplete.screens.main.controls import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon +import androidx.compose.material.LocalContentColor +import androidx.compose.material.LocalTextStyle import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import de.westnordost.streetcomplete.R -/** Notification text shown on the top end corner of e.g. a button */ +/** Notification shown on the top end corner of e.g. a button */ @Composable -fun BoxScope.MapButtonNotificationText( - text: String, +fun BoxScope.MapButtonNotification( modifier: Modifier = Modifier, + content: @Composable BoxScope.() -> Unit, ) { - Text( - text = text, - modifier = modifier - .align(Alignment.TopEnd) - .padding(6.dp) - .background(MaterialTheme.colors.secondary, RoundedCornerShape(12.dp)) - .padding(vertical = 2.dp, horizontal = 6.dp), - color = Color.White, - style = MaterialTheme.typography.caption, - textAlign = TextAlign.Center - ) + CompositionLocalProvider( + LocalContentColor provides Color.White, + LocalTextStyle provides MaterialTheme.typography.caption + ) { + Box( + modifier = modifier + .align(Alignment.TopEnd) + .padding(6.dp) + .background(MaterialTheme.colors.secondary, RoundedCornerShape(12.dp)) + .padding(vertical = 2.dp, horizontal = 6.dp), + contentAlignment = Alignment.Center, + content = content + ) + } } @Preview @Composable -private fun PreviewMapButtonWithNotificationText() { +private fun PreviewMapButtonWithNotification() { Box { MapButton(onClick = {}) { Icon(painterResource(R.drawable.ic_email_24dp), null) } - MapButtonNotificationText(text = "999") + MapButtonNotification { + Text(text = "999") + } } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt index 20592aeeb2..7d7381fa74 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounter.kt @@ -1,6 +1,10 @@ package de.westnordost.streetcomplete.screens.main.controls +import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.togetherWith import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -50,8 +54,9 @@ fun StarsCounter( modifier = Modifier.padding(8.dp) ) } - Column { - AnimatedVisibility (isCurrentWeek) { + + if (isCurrentWeek) { + Column { Text( text = stringResource(R.string.user_profile_current_week_title), fontWeight = FontWeight.Bold, @@ -59,7 +64,14 @@ fun StarsCounter( maxLines = 1, style = MaterialTheme.typography.body2.copy(shadow = textShadow), ) + Counter( + count = count, + fontWeight = FontWeight.Bold, + color = Color.White, + style = MaterialTheme.typography.body1.copy(shadow = textShadow), + ) } + } else { Counter( count = count, fontWeight = FontWeight.Bold, From ac22888bfc3908468851f57488dacbd169da5439 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Tue, 6 Aug 2024 17:56:32 +0200 Subject: [PATCH 06/89] messages thing as composable --- .../data/messages/MessagesSource.kt | 2 +- .../screens/main/messages/MessageDialog.kt | 53 ++++++ .../screens/main/messages/OpenMailPainter.kt | 36 ++++ .../main/messages/QuestSelectionHintDialog.kt | 30 ++++ .../main/messages/UnreadMessagesDialog.kt | 160 ++++++++++++++++++ .../streetcomplete/ui/util/Color.kt | 10 ++ app/src/main/res/drawable/mail_back.xml | 13 ++ app/src/main/res/drawable/mail_front.xml | 20 +++ app/src/main/res/values-h720dp/dimens.xml | 2 - app/src/main/res/values/strings.xml | 4 + 10 files changed, 327 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessageDialog.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OpenMailPainter.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/QuestSelectionHintDialog.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/UnreadMessagesDialog.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/ui/util/Color.kt create mode 100644 app/src/main/res/drawable/mail_back.xml create mode 100644 app/src/main/res/drawable/mail_front.xml diff --git a/app/src/main/java/de/westnordost/streetcomplete/data/messages/MessagesSource.kt b/app/src/main/java/de/westnordost/streetcomplete/data/messages/MessagesSource.kt index 9e9bc7218c..a8c6cb9eb8 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/data/messages/MessagesSource.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/data/messages/MessagesSource.kt @@ -25,7 +25,7 @@ class MessagesSource( private val changelog: Changelog, ) { /* Must be a singleton because there is a listener that should respond to a change in the - * database table*/ + * database table */ interface UpdateListener { fun onNumberOfMessagesUpdated(messageCount: Int) diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessageDialog.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessageDialog.kt new file mode 100644 index 0000000000..baa5dd1526 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessageDialog.kt @@ -0,0 +1,53 @@ +package de.westnordost.streetcomplete.screens.main.messages + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import de.westnordost.streetcomplete.data.messages.Message +import de.westnordost.streetcomplete.data.messages.NewAchievementMessage +import de.westnordost.streetcomplete.data.messages.NewVersionMessage +import de.westnordost.streetcomplete.data.messages.OsmUnreadMessagesMessage +import de.westnordost.streetcomplete.data.messages.QuestSelectionHintMessage +import de.westnordost.streetcomplete.screens.settings.SettingsActivity +import de.westnordost.streetcomplete.screens.user.achievements.AchievementDialog +import de.westnordost.streetcomplete.util.ktx.openUri + +/** Dialog that shows a Message */ +@Composable +fun MessageDialog( + message: Message, + onDismissRequest: () -> Unit, +) { + val context = LocalContext.current + + when (message) { + is NewAchievementMessage -> { + AchievementDialog( + achievement = message.achievement, + level = message.level, + onDismissRequest = onDismissRequest + ) + } + is NewVersionMessage -> { + WhatsNewDialog( + changelog = message.changelog, + onDismissRequest = onDismissRequest, + onClickLink = { context.openUri(it) } + ) + } + is QuestSelectionHintMessage -> { + QuestSelectionHintDialog( + onDismissRequest = onDismissRequest, + onClickOpenSettings = { + context.startActivity(SettingsActivity.createLaunchQuestSettingsIntent(context)) + } + ) + } + is OsmUnreadMessagesMessage -> { + UnreadMessagesDialog( + unreadMessageCount = message.unreadMessages, + onDismissRequest = onDismissRequest, + onClickOpenMessages = { context.openUri("https://www.openstreetmap.org/messages/inbox") } + ) + } + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OpenMailPainter.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OpenMailPainter.kt new file mode 100644 index 0000000000..5bd8dc54a5 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OpenMailPainter.kt @@ -0,0 +1,36 @@ +package de.westnordost.streetcomplete.screens.main.messages + +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap +import androidx.compose.ui.graphics.StrokeJoin +import androidx.compose.ui.graphics.vector.Path +import androidx.compose.ui.graphics.vector.PathData +import androidx.compose.ui.graphics.vector.VectorPainter +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.ui.util.interpolateColors + +@Composable +fun openMailPainter(progress: Float): VectorPainter = rememberVectorPainter( + defaultWidth = 288.dp, + defaultHeight = 288.dp, + viewportWidth = 288f, + viewportHeight = 288f, + autoMirror = false +) { _, _ -> + Path( + pathData = PathData { + moveTo(7.911f, 121.751f) + lineTo(142.5f, 238.62f * (1f - progress) + 6f) + lineTo(275.119f, 121.751f) + close() + }, + strokeLineJoin = StrokeJoin.Round, + strokeLineCap = StrokeCap.Round, + strokeLineWidth = 6f, + stroke = SolidColor(Color(0xffD3BF95)), + fill = SolidColor(interpolateColors(Color(0xffFFF7E0), Color(0xffD3BF95), progress)), + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/QuestSelectionHintDialog.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/QuestSelectionHintDialog.kt new file mode 100644 index 0000000000..64a5a43e0b --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/QuestSelectionHintDialog.kt @@ -0,0 +1,30 @@ +package de.westnordost.streetcomplete.screens.main.messages + +import androidx.compose.material.AlertDialog +import androidx.compose.material.Text +import androidx.compose.material.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import de.westnordost.streetcomplete.R + +@Composable +fun QuestSelectionHintDialog( + onDismissRequest: () -> Unit, + onClickOpenSettings: () -> Unit, +) { + AlertDialog( + onDismissRequest = onDismissRequest, + confirmButton = { + TextButton(onClick = { onDismissRequest(); onClickOpenSettings() }) { + Text(stringResource(R.string.quest_streetName_cantType_open_settings)) + } + }, + dismissButton = { + TextButton(onClick = onDismissRequest) { + Text(stringResource(android.R.string.ok)) + } + }, + title = { Text(stringResource(R.string.quest_selection_hint_title)) }, + text = { Text(stringResource(R.string.quest_selection_hint_message)) } + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/UnreadMessagesDialog.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/UnreadMessagesDialog.kt new file mode 100644 index 0000000000..23a617d77c --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/UnreadMessagesDialog.kt @@ -0,0 +1,160 @@ +package de.westnordost.streetcomplete.screens.main.messages + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.Button +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import de.westnordost.streetcomplete.R +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlin.math.abs + +/** Dialog that shows a message that the user has X unread messages in his OSM inbox */ +@Composable +fun UnreadMessagesDialog( + unreadMessageCount: Int, + onDismissRequest: () -> Unit, + onClickOpenMessages: () -> Unit, + modifier: Modifier = Modifier, +) { + // TODO soundFx.play(R.raw.sliding_envelope) + + val density = LocalDensity.current.density + val envelope = remember { Animatable(-1f) } + val envelopeOpen = remember { Animatable(0f) } + val content = remember { Animatable(0f) } + + LaunchedEffect(unreadMessageCount) { + envelope.animateTo(0f, tween(600)) + delay(150) + launch { envelopeOpen.animateTo(1f, tween(300)) } + launch { content.animateTo(1f, tween(300, 150)) } + } + + Dialog( + onDismissRequest = onDismissRequest, + properties = DialogProperties(usePlatformDefaultWidth = false) + ) { + Box( + modifier = Modifier + .fillMaxSize() + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) { onDismissRequest() }, + contentAlignment = Alignment.Center + ) { + Envelope( + opening = envelopeOpen.value, + modifier = modifier.graphicsLayer { + val e = envelope.value + rotationZ = e * 40f + rotationY = e * 45f + alpha = 1f - 0.8f * abs(e) + translationX = e * 400 * density + translationY = -e * 60 * density + } + ) { + UnreadMessagesContent( + unreadMessageCount = unreadMessageCount, + onClickOpenMessages = { onDismissRequest(); onClickOpenMessages() }, + modifier = Modifier.graphicsLayer { + val c = content.value + val scale = 0.8f + 0.2f * c + scaleX = scale + scaleY = scale + alpha = 0.4f + c * 0.6f + translationY = (140f * (1f - c)) * density + } + ) + } + } + } +} +@Composable +private fun Envelope( + opening: Float, + modifier: Modifier = Modifier, + content: @Composable BoxScope.() -> Unit +) { + Box( + modifier = modifier, + contentAlignment = Alignment.TopCenter + ) { + Image(painterResource(R.drawable.mail_back), null) + if (opening > 0.5f) Image(openMailPainter(progress = opening), null) + content() + Image(painterResource(R.drawable.mail_front), null) + if (opening <= 0.5f) Image(openMailPainter(progress = opening), null) + } +} + +@Composable +private fun UnreadMessagesContent( + unreadMessageCount: Int, + onClickOpenMessages: () -> Unit, + modifier: Modifier = Modifier +) { + Surface( + shape = MaterialTheme.shapes.medium, + modifier = modifier.width(240.dp) + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier.padding(24.dp) + ) { + Text( + text = stringResource(R.string.unread_messages_message, unreadMessageCount), + textAlign = TextAlign.Center, + ) + Button(onClick = onClickOpenMessages) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon(painterResource(R.drawable.ic_open_in_browser_24dp), null) + Text(stringResource(R.string.unread_messages_button)) + } + } + } + } +} + +@Preview +@Composable +private fun PreviewUnreadMessagesDialog() { + UnreadMessagesDialog( + unreadMessageCount = 9, + onDismissRequest = {}, + onClickOpenMessages = {} + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/util/Color.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/util/Color.kt new file mode 100644 index 0000000000..69f26613cd --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/util/Color.kt @@ -0,0 +1,10 @@ +package de.westnordost.streetcomplete.ui.util + +import androidx.compose.ui.graphics.Color + +fun interpolateColors(color1: Color, color2: Color, progress: Float) = Color( + red = color1.red * (1 - progress) + color2.red * progress, + green = color1.green * (1 - progress) + color2.green * progress, + blue = color1.blue * (1 - progress) + color2.blue * progress, + alpha = color1.alpha * (1 - progress) + color2.alpha * progress, +) diff --git a/app/src/main/res/drawable/mail_back.xml b/app/src/main/res/drawable/mail_back.xml new file mode 100644 index 0000000000..c5a70df168 --- /dev/null +++ b/app/src/main/res/drawable/mail_back.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/mail_front.xml b/app/src/main/res/drawable/mail_front.xml new file mode 100644 index 0000000000..54135278c7 --- /dev/null +++ b/app/src/main/res/drawable/mail_front.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/values-h720dp/dimens.xml b/app/src/main/res/values-h720dp/dimens.xml index d402cceeb4..c7f6a8c293 100644 --- a/app/src/main/res/values-h720dp/dimens.xml +++ b/app/src/main/res/values-h720dp/dimens.xml @@ -1,7 +1,5 @@ - - 442dp 160dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e2f46ec258..e3f4fa8109 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,6 +53,10 @@ The info you enter is directly added to OpenStreetMap in your name, without the "Upload answers" + "Show messages" + + "Create new" + Open location in another app No other map application installed From 28397e8be08a4715cee00de022fece8be966f114 Mon Sep 17 00:00:00 2001 From: Tobias Zwick Date: Tue, 6 Aug 2024 20:02:52 +0200 Subject: [PATCH 07/89] wip migrate main screen (controls) to compose --- .../streetcomplete/screens/MainActivity.kt | 70 +--- .../screens/main/MainFragment.kt | 199 +++-------- .../screens/main/MainViewModel.kt | 22 +- .../screens/main/MainViewModelImpl.kt | 41 ++- .../screens/main/controls/LocationState.kt | 17 - .../main/controls/LocationStateButton.kt | 194 +++++----- .../main/controls/LocationStateButton2.kt | 81 ----- .../screens/main/controls/MainMenuDialog.kt | 220 +++++++++--- .../screens/main/controls/MapControls.kt | 330 ++++++++++++++++++ .../screens/main/controls/MessagesButton.kt | 39 +-- .../screens/main/controls/StarsCounterView.kt | 56 --- .../screens/main/controls/UploadButton.kt | 48 +-- .../messages/MessagesContainerFragment.kt | 72 ---- .../messages/OsmUnreadMessagesFragment.kt | 126 ------- .../main/overlays/OverlaySelectionAdapter.kt | 36 -- .../main/teammode/TeamModeColorCircleView.kt | 57 --- .../screens/main/teammode/TeamModeDialog.kt | 75 ---- .../teammode/TeamModeIndexSelectAdapter.kt | 78 ----- .../screens/main/teammode/TeamModeWizard.kt | 149 ++++++++ .../screens/tutorial/IntroTutorialScreen.kt | 17 +- .../tutorial/OverlaysTutorialFragment.kt | 26 -- .../tutorial/OverlaysTutorialScreen.kt | 5 +- .../screens/tutorial/TutorialFragment.kt | 23 -- .../screens/tutorial/TutorialScreen.kt | 26 +- .../user/achievements/AchievementDialog.kt | 7 +- .../ui/common/AnimatedScreenVisibility.kt | 28 ++ .../streetcomplete/ui/common/Counter.kt | 11 +- .../streetcomplete/ui/theme/Color.kt | 26 +- .../res/color/activated_tint_on_white.xml | 5 - .../main/res/drawable-xxhdpi/team_mode.jpg | Bin 0 -> 272591 bytes .../res/drawable/ic_animated_open_mail.xml | 25 -- .../ic_location_navigation_searching_24dp.xml | 7 - .../drawable/ic_location_searching_24dp.xml | 7 - .../res/drawable/ic_location_state_24dp.xml | 10 - app/src/main/res/drawable/ic_mail.xml | 35 -- app/src/main/res/drawable/ic_mail_front.xml | 18 - .../res/drawable/notification_background.xml | 8 - app/src/main/res/drawable/space_24dp.xml | 4 - app/src/main/res/layout/activity_main.xml | 12 - .../cell_team_mode_color_circle_select.xml | 19 - app/src/main/res/layout/dialog_main_menu.xml | 122 ------- app/src/main/res/layout/dialog_team_mode.xml | 80 ----- app/src/main/res/layout/fragment_main.xml | 171 +-------- .../layout/fragment_unread_osm_message.xml | 80 ----- .../main/res/layout/row_overlay_selection.xml | 13 - .../main/res/layout/view_answers_counter.xml | 74 ---- .../layout/view_icons_download_progress.xml | 19 - .../main/res/layout/view_messages_button.xml | 31 -- .../layout/view_team_mode_color_circle.xml | 37 -- .../main/res/layout/view_upload_button.xml | 31 -- app/src/main/res/values/attrs.xml | 10 - app/src/main/res/values/colors.xml | 16 - app/src/main/res/values/strings.xml | 1 - 53 files changed, 957 insertions(+), 1957 deletions(-) delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationState.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton2.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapControls.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounterView.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessagesContainerFragment.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OsmUnreadMessagesFragment.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionAdapter.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircleView.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeDialog.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeIndexSelectAdapter.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeWizard.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialFragment.kt delete mode 100644 app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt create mode 100644 app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedScreenVisibility.kt delete mode 100644 app/src/main/res/color/activated_tint_on_white.xml create mode 100644 app/src/main/res/drawable-xxhdpi/team_mode.jpg delete mode 100644 app/src/main/res/drawable/ic_animated_open_mail.xml delete mode 100644 app/src/main/res/drawable/ic_location_navigation_searching_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_location_searching_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_location_state_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_mail.xml delete mode 100644 app/src/main/res/drawable/ic_mail_front.xml delete mode 100644 app/src/main/res/drawable/notification_background.xml delete mode 100644 app/src/main/res/drawable/space_24dp.xml delete mode 100644 app/src/main/res/layout/cell_team_mode_color_circle_select.xml delete mode 100644 app/src/main/res/layout/dialog_main_menu.xml delete mode 100644 app/src/main/res/layout/dialog_team_mode.xml delete mode 100644 app/src/main/res/layout/fragment_unread_osm_message.xml delete mode 100644 app/src/main/res/layout/row_overlay_selection.xml delete mode 100644 app/src/main/res/layout/view_answers_counter.xml delete mode 100644 app/src/main/res/layout/view_icons_download_progress.xml delete mode 100644 app/src/main/res/layout/view_messages_button.xml delete mode 100644 app/src/main/res/layout/view_team_mode_color_circle.xml delete mode 100644 app/src/main/res/layout/view_upload_button.xml diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt index aa300428de..e8617d0552 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/MainActivity.kt @@ -39,9 +39,6 @@ import de.westnordost.streetcomplete.data.urlconfig.UrlConfigController import de.westnordost.streetcomplete.data.user.UserLoginController import de.westnordost.streetcomplete.data.visiblequests.QuestPresetsSource import de.westnordost.streetcomplete.screens.main.MainFragment -import de.westnordost.streetcomplete.screens.main.messages.MessagesContainerFragment -import de.westnordost.streetcomplete.screens.tutorial.OverlaysTutorialFragment -import de.westnordost.streetcomplete.screens.tutorial.TutorialFragment import de.westnordost.streetcomplete.util.CrashReportExceptionHandler import de.westnordost.streetcomplete.util.ktx.hasLocationPermission import de.westnordost.streetcomplete.util.ktx.isLocationEnabled @@ -55,9 +52,7 @@ import org.koin.android.ext.android.inject class MainActivity : BaseActivity(), - MainFragment.Listener, - TutorialFragment.Listener, - OverlaysTutorialFragment.Listener { + MainFragment.Listener { private val crashReportExceptionHandler: CrashReportExceptionHandler by inject() private val questAutoSyncer: QuestAutoSyncer by inject() @@ -111,15 +106,6 @@ class MainActivity : setContentView(R.layout.activity_main) mainFragment = supportFragmentManager.findFragmentById(R.id.map_fragment) as MainFragment? - if (savedInstanceState == null) { - supportFragmentManager.commit { add(LocationRequestFragment(), TAG_LOCATION_REQUEST) } - if (!prefs.hasShownTutorial && !userLoginController.isLoggedIn) { - supportFragmentManager.commit { - setCustomAnimations(R.anim.fade_in_from_bottom, R.anim.fade_out_to_bottom) - add(R.id.fragment_container, TutorialFragment()) - } - } - } elementEditsSource.addListener(elementEditsListener) noteEditsSource.addListener(noteEditsListener) @@ -197,10 +183,6 @@ class MainActivity : override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) findViewById(R.id.main).requestLayout() - // recreate the MessagesContainerFragment because it should load a new layout, see #2330 - supportFragmentManager.commit { - replace(R.id.messages_container_fragment, MessagesContainerFragment()) - } } private suspend fun ensureLoggedIn() { @@ -285,60 +267,12 @@ class MainActivity : } } - /* --------------------------------- MessagesButtonFragment.Listener ------------------------ */ - - override fun onClickShowMessage(message: Message) { - messagesContainerFragment?.showMessage(message) - } - - private val messagesContainerFragment get() = - supportFragmentManager.findFragmentById(R.id.messages_container_fragment) as? MessagesContainerFragment - /* --------------------------------- MainFragment.Listener ---------------------------------- */ override fun onMapInitialized() { handleGeoUri() } - /* ------------------------------- TutorialFragment.Listener -------------------------------- */ - - override fun onTutorialFinished() { - requestLocation() - - prefs.hasShownTutorial = true - removeTutorialFragment() - } - - private fun requestLocation() { - (supportFragmentManager.findFragmentByTag(TAG_LOCATION_REQUEST) as? LocationRequestFragment)?.startRequest() - } - - private fun removeTutorialFragment() { - val tutorialFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) - if (tutorialFragment != null) { - supportFragmentManager.commit { - setCustomAnimations(R.anim.fade_in_from_bottom, R.anim.fade_out_to_bottom) - remove(tutorialFragment) - } - } - } - - /* ---------------------------- OverlaysButtonFragment.Listener ----------------------------- */ - - override fun onShowOverlaysTutorial() { - supportFragmentManager.commit { - setCustomAnimations(R.anim.fade_in_from_bottom, R.anim.fade_out_to_bottom) - add(R.id.fragment_container, OverlaysTutorialFragment()) - } - } - - /* --------------------------- OverlaysTutorialFragment.Listener ---------------------------- */ - - override fun onOverlaysTutorialFinished() { - prefs.hasShownOverlaysTutorial = true - removeTutorialFragment() - } - /* ------------------------------------ Location listener ----------------------------------- */ private fun updateLocationAvailability(isAvailable: Boolean) { @@ -350,8 +284,6 @@ class MainActivity : } companion object { - private const val TAG_LOCATION_REQUEST = "LocationRequestFragment" - // per application start settings private var dontShowRequestAuthorizationAgain = false } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainFragment.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainFragment.kt index 6bbb754529..c2f41cce6a 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainFragment.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainFragment.kt @@ -22,14 +22,14 @@ import androidx.annotation.UiThread import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.ListPopupWindow import androidx.appcompat.widget.PopupMenu +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.core.graphics.Insets import androidx.core.graphics.minus -import androidx.core.graphics.toPointF import androidx.core.graphics.toRectF import androidx.core.os.bundleOf import androidx.core.view.isGone -import androidx.core.view.isInvisible -import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.commit @@ -79,7 +79,7 @@ import de.westnordost.streetcomplete.screens.main.bottom_sheet.IsMapPositionAwar import de.westnordost.streetcomplete.screens.main.bottom_sheet.MoveNodeFragment import de.westnordost.streetcomplete.screens.main.bottom_sheet.SplitWayFragment import de.westnordost.streetcomplete.screens.main.controls.LocationState -import de.westnordost.streetcomplete.screens.main.controls.MainMenuDialog +import de.westnordost.streetcomplete.screens.main.controls.MapControls import de.westnordost.streetcomplete.screens.main.edithistory.EditHistoryFragment import de.westnordost.streetcomplete.screens.main.edithistory.EditHistoryViewModel import de.westnordost.streetcomplete.screens.main.map.LocationAwareMapFragment @@ -89,7 +89,7 @@ import de.westnordost.streetcomplete.screens.main.map.ShowsGeometryMarkers import de.westnordost.streetcomplete.screens.main.map.getPinIcon import de.westnordost.streetcomplete.screens.main.map.getTitle import de.westnordost.streetcomplete.screens.main.map.tangram.CameraPosition -import de.westnordost.streetcomplete.screens.main.overlays.OverlaySelectionAdapter +import de.westnordost.streetcomplete.ui.util.content import de.westnordost.streetcomplete.util.SoundFx import de.westnordost.streetcomplete.util.buildGeoUri import de.westnordost.streetcomplete.util.ktx.childFragmentManagerOrNull @@ -99,8 +99,6 @@ import de.westnordost.streetcomplete.util.ktx.hasLocationPermission import de.westnordost.streetcomplete.util.ktx.hideKeyboard import de.westnordost.streetcomplete.util.ktx.isLocationEnabled import de.westnordost.streetcomplete.util.ktx.observe -import de.westnordost.streetcomplete.util.ktx.popIn -import de.westnordost.streetcomplete.util.ktx.popOut import de.westnordost.streetcomplete.util.ktx.setMargins import de.westnordost.streetcomplete.util.ktx.toLatLon import de.westnordost.streetcomplete.util.ktx.toast @@ -197,8 +195,6 @@ class MainFragment : interface Listener { fun onMapInitialized() - fun onClickShowMessage(message: Message) - fun onShowOverlaysTutorial() } private val listener: Listener? get() = parentFragment as? Listener ?: activity as? Listener @@ -234,24 +230,32 @@ class MainFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.controls.content { + val hasEdits by remember { + derivedStateOf { editHistoryViewModel.editItems.value.isNotEmpty() } + } + + MapControls( + viewModel = controlsViewModel, + hasEdits = hasEdits, + onClickZoomIn = ::onClickZoomIn, + onClickZoomOut = ::onClickZoomOut, + onClickCompass = ::onClickCompassButton, + onClickLocation = ::onClickTrackingButton, + onClickCreate = ::onClickCreateButton, + onClickStopTrackRecording = ::onClickTracksStop, + onClickUndo = ::onClickUndoButton, + onClickDownload = ::onClickDownload, + onClickUpload = ::onClickUploadButton, + onExplainedNeedForLocationPermission = ::requestLocation + ) + } + binding.mapControls.respectSystemInsets(View::setMargins) view.respectSystemInsets { windowInsets = it } binding.locationPointerPin.setOnClickListener { onClickLocationPointer() } - binding.compassView.setOnClickListener { onClickCompassButton() } - binding.gpsTrackingButton.setOnClickListener { onClickTrackingButton() } - binding.stopTracksButton.setOnClickListener { onClickTracksStop() } - binding.zoomInButton.setOnClickListener { onClickZoomIn() } - binding.zoomOutButton.setOnClickListener { onClickZoomOut() } - binding.createButton.setOnClickListener { onClickCreateButton() } - binding.uploadButton.setOnClickListener { onClickUploadButton() } - binding.undoButton.setOnClickListener { onClickUndoButton() } - binding.messagesButton.setOnClickListener { onClickMessagesButton() } - binding.starsCounterView.setOnClickListener { onClickAnswersCounterView() } - binding.overlaysButton.setOnClickListener { onClickOverlaysButton() } - binding.mainMenuButton.setOnClickListener { onClickMainMenu() } - updateOffsetWithOpenBottomSheet() requireActivity().onBackPressedDispatcher @@ -261,54 +265,7 @@ class MainFragment : .addCallback(viewLifecycleOwner, sheetBackPressedCallback) sheetBackPressedCallback.isEnabled = bottomSheetFragment is IsCloseableBottomSheet - observe(controlsViewModel.isAutoSync) { isAutoSync -> - binding.uploadButton.isGone = isAutoSync - } - observe(controlsViewModel.unsyncedEditsCount) { count -> - binding.uploadButton.uploadableCount = count - } - observe(controlsViewModel.isUploading) { isUploadInProgress -> - binding.uploadButton.isEnabled = !isUploadInProgress - // Don't allow undoing while uploading. Should prevent race conditions. - // (Undoing quest while also uploading it at the same time) - binding.undoButton.isEnabled = !isUploadInProgress - } - observe(controlsViewModel.messagesCount) { messagesCount -> - binding.messagesButton.messagesCount = messagesCount - binding.messagesButton.isGone = messagesCount <= 0 - } - observe(controlsViewModel.isUploadingOrDownloading) { isUploadingOrDownloading -> - binding.starsCounterView.showProgress = isUploadingOrDownloading - } - observe(controlsViewModel.isShowingStarsCurrentWeek) { isShowingCurrentWeek -> - binding.starsCounterView.showLabel = isShowingCurrentWeek - } - observe(controlsViewModel.starsCount) { count -> - // only animate if count is positive, for positive feedback - binding.starsCounterView.setUploadedCount(count, count > 0) - } - observe(controlsViewModel.selectedOverlay) { overlay -> - val iconRes = overlay?.icon ?: R.drawable.ic_overlay_black_24dp - binding.overlaysButton.setImageResource(iconRes) - } - observe(controlsViewModel.isTeamMode) { isTeamMode -> - if (isTeamMode) { - // always show this toast on start to remind user that it is still on - context?.toast(R.string.team_mode_active) - binding.teamModeColorCircle.popIn() - binding.teamModeColorCircle.setIndexInTeam(controlsViewModel.indexInTeam) - } else { - // show this only once when turning it off - if (controlsViewModel.teamModeChanged) context?.toast(R.string.team_mode_deactivated) - binding.teamModeColorCircle.popOut() - } - controlsViewModel.teamModeChanged = false - } - observe(controlsViewModel.selectedOverlay) { overlay -> - val isCreateNodeEnabled = overlay?.isCreateNodeEnabled == true - binding.createButton.isGone = !isCreateNodeEnabled - binding.crosshairView.isGone = !isCreateNodeEnabled - + observe(controlsViewModel.selectedOverlay) { val f = bottomSheetFragment if (f is IsShowingElement) { closeBottomSheet() @@ -316,7 +273,6 @@ class MainFragment : } observe(editHistoryViewModel.editItems) { editItems -> if (editItems.isEmpty()) closeEditHistorySidebar() - binding.undoButton.isGone = editItems.isEmpty() } observe(editHistoryViewModel.selectedEdit) { edit -> if (edit == null) { @@ -344,12 +300,6 @@ class MainFragment : if (bottomSheetFragment != null) { mapFragment.adjustToOffsets(previousOffset, mapOffsetWithOpenBottomSheet) } - binding.crosshairView.setPadding( - resources.getDimensionPixelSize(R.dimen.quest_form_leftOffset), - resources.getDimensionPixelSize(R.dimen.quest_form_topOffset), - resources.getDimensionPixelSize(R.dimen.quest_form_rightOffset), - resources.getDimensionPixelSize(R.dimen.quest_form_bottomOffset) - ) updateLocationPointerPin() } @@ -387,23 +337,20 @@ class MainFragment : /* ---------------------------------- MapFragment.Listener ---------------------------------- */ override fun onMapInitialized() { - binding.gpsTrackingButton.isActivated = mapFragment?.isFollowingPosition ?: false - binding.gpsTrackingButton.isNavigation = mapFragment?.isNavigationMode ?: false - binding.stopTracksButton.isVisible = mapFragment?.isRecordingTracks ?: false + controlsViewModel.isFollowingPosition.value = mapFragment?.isFollowingPosition ?: false + controlsViewModel.isNavigationMode.value = mapFragment?.isNavigationMode ?: false + controlsViewModel.isRecordingTracks.value = mapFragment?.isRecordingTracks ?: false + controlsViewModel.mapZoom.value = mapFragment?.cameraPosition?.zoom ?: 18f updateLocationPointerPin() - mapFragment?.cameraPosition?.zoom?.let { updateCreateButtonEnablement(it) } listener?.onMapInitialized() } override fun onMapIsChanging(position: LatLon, rotation: Float, tilt: Float, zoom: Float) { - binding.compassView.rotation = (180 * rotation / PI).toFloat() - binding.compassView.rotationX = (180 * tilt / PI).toFloat() - - val margin = 2 * PI / 180 - binding.compassView.isInvisible = abs(rotation) < margin && tilt < margin + controlsViewModel.mapRotation.value = (180 * rotation / PI).toFloat() + controlsViewModel.mapTilt.value = (180 * tilt / PI).toFloat() + controlsViewModel.mapZoom.value = zoom updateLocationPointerPin() - updateCreateButtonEnablement(zoom) val f = bottomSheetFragment if (f is IsMapOrientationAware) f.onMapOrientation(rotation, tilt) @@ -668,7 +615,7 @@ class MainFragment : @SuppressLint("MissingPermission") private fun onLocationIsEnabled() { - binding.gpsTrackingButton.state = LocationState.SEARCHING + controlsViewModel.locationState.value = LocationState.SEARCHING mapFragment!!.startPositionTracking() setIsFollowingPosition(wasFollowingPosition ?: true) @@ -676,11 +623,11 @@ class MainFragment : } private fun onLocationIsDisabled() { - binding.gpsTrackingButton.state = when { + controlsViewModel.locationState.value = when { requireContext().hasLocationPermission -> LocationState.ALLOWED else -> LocationState.DENIED } - binding.gpsTrackingButton.isNavigation = false + controlsViewModel.isNavigationMode.value = false binding.locationPointerPin.visibility = View.GONE mapFragment!!.clearPositionTracking() locationManager.removeUpdates() @@ -688,7 +635,7 @@ class MainFragment : private fun onLocationChanged(location: Location) { viewLifecycleScope.launch { - binding.gpsTrackingButton.state = LocationState.UPDATING + controlsViewModel.locationState.value = LocationState.UPDATING updateLocationPointerPin() } } @@ -697,16 +644,6 @@ class MainFragment : //region Buttons - Functionality for the buttons in the main view - fun onClickMainMenu() { - MainMenuDialog( - requireContext(), - if (controlsViewModel.isTeamMode.value) controlsViewModel.indexInTeam else null, - this::onClickDownload, - controlsViewModel::enableTeamMode, - controlsViewModel::disableTeamMode - ).show() - } - private fun onClickDownload() { if (controlsViewModel.isConnected) { val downloadBbox = getDownloadArea() ?: return @@ -738,7 +675,6 @@ class MainFragment : private fun onClickTracksStop() { // hide the track information - binding.stopTracksButton.isVisible = false val mapFragment = mapFragment ?: return mapFragment.stopPositionTrackRecording() val pos = mapFragment.displayedLocation?.toLatLon() ?: return @@ -761,27 +697,6 @@ class MainFragment : showEditHistorySidebar() } - private fun onClickMessagesButton() { - viewLifecycleScope.launch { - val message = controlsViewModel.popMessage() - if (message != null) { - listener?.onClickShowMessage(message) - } - } - } - - private fun onClickAnswersCounterView() { - controlsViewModel.toggleShowingCurrentWeek() - } - - private fun onClickOverlaysButton() { - if (!controlsViewModel.hasShownOverlaysTutorial) { - showOverlaysTutorial() - } else { - showOverlaysMenu() - } - } - private fun onClickCompassButton() { // Clicking the compass button will always rotate the map back to north and remove tilt val mapFragment = mapFragment ?: return @@ -803,7 +718,7 @@ class MainFragment : val mapFragment = mapFragment ?: return when { - !binding.gpsTrackingButton.state.isEnabled -> { + !controlsViewModel.locationState.value.isEnabled -> { requestLocation() } !mapFragment.isFollowingPosition -> { @@ -823,14 +738,10 @@ class MainFragment : showOverlayFormForNewElement() } - private fun updateCreateButtonEnablement(zoom: Float) { - binding.createButton.isEnabled = zoom >= 18f - } - private fun setIsNavigationMode(navigation: Boolean) { val mapFragment = mapFragment ?: return mapFragment.isNavigationMode = navigation - binding.gpsTrackingButton.isNavigation = navigation + controlsViewModel.isNavigationMode.value = navigation // always re-center position because navigation mode shifts the center position mapFragment.centerCurrentPositionIfFollowing() } @@ -838,28 +749,10 @@ class MainFragment : private fun setIsFollowingPosition(follow: Boolean) { val mapFragment = mapFragment ?: return mapFragment.isFollowingPosition = follow - binding.gpsTrackingButton.isActivated = follow + controlsViewModel.isFollowingPosition.value = follow if (follow) mapFragment.centerCurrentPositionIfFollowing() } - private fun showOverlaysTutorial() { - listener?.onShowOverlaysTutorial() - } - - private fun showOverlaysMenu() { - val adapter = OverlaySelectionAdapter(controlsViewModel.overlays) - val popupWindow = ListPopupWindow(requireContext()) - - popupWindow.setAdapter(adapter) - popupWindow.setOnItemClickListener { _, _, position, _ -> - controlsViewModel.selectOverlay(adapter.getItem(position)) - popupWindow.dismiss() - } - popupWindow.anchorView = binding.overlaysButton - popupWindow.width = resources.dpToPx(240).toInt() - popupWindow.show() - } - private fun getDownloadArea(): BoundingBox? { val displayArea = mapFragment?.getDisplayedArea() if (displayArea == null) { @@ -944,7 +837,6 @@ class MainFragment : private fun onClickCreateTrack() { val mapFragment = mapFragment ?: return mapFragment.startPositionTrackRecording() - binding.stopTracksButton.isVisible = true } // ---------------------------------- Location Pointer Pin --------------------------------- */ @@ -1249,13 +1141,10 @@ class MainFragment : img.setImageResource(iconResId) root.addView(img) - val isAutoSync = controlsViewModel.isAutoSync.value - val answerTarget = if (isAutoSync) binding.starsCounterView else binding.uploadButton - flingQuestMarkerTo(img, answerTarget) { root.removeView(img) } + flingQuestMarker(img) { root.removeView(img) } } - private fun flingQuestMarkerTo(quest: View, target: View, onFinished: () -> Unit) { - val targetPos = target.getLocationInWindow().toPointF() + private fun flingQuestMarker(quest: View, onFinished: () -> Unit) { quest.animate() .scaleX(1.6f).scaleY(1.6f) .setInterpolator(OvershootInterpolator(8f)) @@ -1264,7 +1153,7 @@ class MainFragment : quest.animate() .scaleX(0.2f).scaleY(0.2f) .alpha(0.8f) - .x(targetPos.x).y(targetPos.y) + .x(0f).y(0f) .setDuration(250) .setInterpolator(AccelerateInterpolator()) .withEndAction(onFinished) diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModel.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModel.kt index cde247bb76..ef03bf8afa 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModel.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModel.kt @@ -4,9 +4,14 @@ import androidx.lifecycle.ViewModel import de.westnordost.streetcomplete.data.messages.Message import de.westnordost.streetcomplete.data.osm.mapdata.BoundingBox import de.westnordost.streetcomplete.overlays.Overlay +import de.westnordost.streetcomplete.screens.main.controls.LocationState +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow abstract class MainViewModel : ViewModel() { + /* intro */ + abstract var hasShownTutorial: Boolean + /* messages */ abstract val messagesCount: StateFlow abstract suspend fun popMessage(): Message? @@ -15,14 +20,14 @@ abstract class MainViewModel : ViewModel() { abstract val selectedOverlay: StateFlow abstract val overlays: List - abstract val hasShownOverlaysTutorial: Boolean + abstract var hasShownOverlaysTutorial: Boolean abstract fun selectOverlay(overlay: Overlay?) /* team mode */ abstract val isTeamMode: StateFlow abstract var teamModeChanged: Boolean - abstract val indexInTeam: Int + abstract val indexInTeam: StateFlow abstract fun enableTeamMode(teamSize: Int, indexInTeam: Int) abstract fun disableTeamMode() @@ -44,4 +49,17 @@ abstract class MainViewModel : ViewModel() { abstract val starsCount: StateFlow abstract val isShowingStarsCurrentWeek: StateFlow abstract fun toggleShowingCurrentWeek() + + /* map */ + // NOTE: currently filled from MainFragment (communication to compose view), i.e. the source of + // truth is actually the MapFragment + abstract val locationState: MutableStateFlow + abstract val mapZoom: MutableStateFlow + abstract val mapRotation: MutableStateFlow + abstract val mapTilt: MutableStateFlow + + abstract val isFollowingPosition: MutableStateFlow + abstract val isNavigationMode: MutableStateFlow + + abstract val isRecordingTracks: MutableStateFlow } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModelImpl.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModelImpl.kt index a453cb2e6f..ce58adf028 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModelImpl.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/MainViewModelImpl.kt @@ -19,8 +19,10 @@ import de.westnordost.streetcomplete.data.user.UserLoginSource import de.westnordost.streetcomplete.data.user.statistics.StatisticsSource import de.westnordost.streetcomplete.data.visiblequests.TeamModeQuestFilter import de.westnordost.streetcomplete.overlays.Overlay +import de.westnordost.streetcomplete.screens.main.controls.LocationState import de.westnordost.streetcomplete.util.ktx.launch import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -51,6 +53,12 @@ class MainViewModelImpl( /* messages */ + override var hasShownTutorial: Boolean + get() = prefs.hasShownTutorial + set(value) { prefs.hasShownTutorial = value } + + /* messages */ + override val messagesCount: StateFlow = callbackFlow { send(messagesSource.getNumberOfMessages()) val listener = object : MessagesSource.UpdateListener { @@ -58,11 +66,10 @@ class MainViewModelImpl( } messagesSource.addListener(listener) awaitClose { messagesSource.removeListener(listener) } - }.stateIn(viewModelScope + Dispatchers.IO, SharingStarted.Eagerly, 0) + }.stateIn(viewModelScope + IO, SharingStarted.Eagerly, 0) - override suspend fun popMessage(): Message? = withContext(Dispatchers.IO) { - messagesSource.popNextMessage() - } + override suspend fun popMessage(): Message? = + withContext(IO) { messagesSource.popNextMessage() } /* overlays */ @@ -79,11 +86,12 @@ class MainViewModelImpl( awaitClose { selectedOverlayController.removeListener(listener) } }.stateIn(viewModelScope + Dispatchers.IO, SharingStarted.Eagerly, null) - override val hasShownOverlaysTutorial: Boolean get() = - prefs.hasShownOverlaysTutorial + override var hasShownOverlaysTutorial: Boolean + get() = prefs.hasShownOverlaysTutorial + set(value) { prefs.hasShownOverlaysTutorial = value } override fun selectOverlay(overlay: Overlay?) { - launch(Dispatchers.IO) { + launch(IO) { selectedOverlayController.selectedOverlay = overlay } } @@ -92,17 +100,15 @@ class MainViewModelImpl( override val isTeamMode = MutableStateFlow(teamModeQuestFilter.isEnabled) - override val indexInTeam: Int - get() = teamModeQuestFilter.indexInTeam - override var teamModeChanged: Boolean = false + override val indexInTeam = MutableStateFlow(teamModeQuestFilter.indexInTeam) override fun enableTeamMode(teamSize: Int, indexInTeam: Int) { - launch(Dispatchers.IO) { teamModeQuestFilter.enableTeamMode(teamSize, indexInTeam) } + launch(IO) { teamModeQuestFilter.enableTeamMode(teamSize, indexInTeam) } } override fun disableTeamMode() { - launch(Dispatchers.IO) { teamModeQuestFilter.disableTeamMode() } + launch(IO) { teamModeQuestFilter.disableTeamMode() } } override fun download(bbox: BoundingBox) { @@ -113,6 +119,7 @@ class MainViewModelImpl( override fun onTeamModeChanged(enabled: Boolean) { teamModeChanged = true isTeamMode.value = enabled + indexInTeam.value = teamModeQuestFilter.indexInTeam } } @@ -245,6 +252,16 @@ class MainViewModelImpl( syncedEdits + unsyncedEdits }.stateIn(viewModelScope + Dispatchers.IO, SharingStarted.Eagerly, 0) + override val locationState = MutableStateFlow(LocationState.ENABLED) + override val mapZoom = MutableStateFlow(18f) + override val mapRotation = MutableStateFlow(0f) + override val mapTilt = MutableStateFlow(0f) + + override val isFollowingPosition = MutableStateFlow(false) + override val isNavigationMode = MutableStateFlow(false) + + override val isRecordingTracks = MutableStateFlow(false) + // --------------------------------------------------------------------------------------- init { diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationState.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationState.kt deleted file mode 100644 index 8fda57f345..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationState.kt +++ /dev/null @@ -1,17 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.controls - -/** State of location updates */ -enum class LocationState { - /** user declined to give this app access to location */ - DENIED, - /** user allowed this app to access location (but location disabled) */ - ALLOWED, - /** location service is turned on (but no location request active) */ - ENABLED, - /** requested location updates and waiting for first fix */ - SEARCHING, - /** receiving location updates */ - UPDATING; - - val isEnabled: Boolean get() = ordinal >= ENABLED.ordinal -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton.kt index 0360b96b69..78567507e2 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton.kt @@ -1,120 +1,100 @@ package de.westnordost.streetcomplete.screens.main.controls -import android.content.Context -import android.content.res.ColorStateList -import android.content.res.TypedArray -import android.graphics.drawable.Animatable -import android.os.Bundle -import android.os.Parcelable -import android.util.AttributeSet -import android.view.View -import androidx.appcompat.widget.AppCompatImageButton -import androidx.core.os.bundleOf +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.material.Icon +import androidx.compose.material.LocalContentColor +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.util.ktx.parcelable -import de.westnordost.streetcomplete.util.ktx.serializable - -/** - * An image button which shows the current location state - */ -class LocationStateButton @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0 -) : AppCompatImageButton(context, attrs, defStyle) { - - var state: LocationState - get() = _state ?: LocationState.DENIED - set(value) { _state = value } - - // this is necessary because state is accessed before it is initialized (in constructor of super) - private var _state: LocationState? = null - set(value) { - if (field != value) { - field = value - refreshDrawableState() - } - } +import kotlinx.coroutines.delay + +/** State of location updates */ +enum class LocationState { + /** user declined to give this app access to location */ + DENIED, + /** user allowed this app to access location (but location disabled) */ + ALLOWED, + /** location service is turned on (but no location request active) */ + ENABLED, + /** requested location updates and waiting for first fix */ + SEARCHING, + /** receiving location updates */ + UPDATING; + + val isEnabled: Boolean get() = ordinal >= ENABLED.ordinal +} - private val tint: ColorStateList? - var isNavigation: Boolean = false - set(value) { - if (field != value) { - field = value - refreshDrawableState() +/** Map button that shows the current state of location updates and map mode */ +@Composable +fun LocationStateButton( + onClick: () -> Unit, + state: LocationState, + modifier: Modifier = Modifier, + isNavigationMode: Boolean = false, + isFollowing: Boolean = false, + enabled: Boolean = true +) { + var iconResource by remember(state) { mutableStateOf(getIcon(state, isNavigationMode)) } + + MapButton( + onClick = onClick, + modifier = modifier, + enabled = enabled + ) { + LaunchedEffect(state) { + if (state == LocationState.SEARCHING) { + while (true) { + delay(750) + iconResource = getIcon(LocationState.UPDATING, isNavigationMode) + delay(750) + iconResource = getIcon(LocationState.ENABLED, isNavigationMode) + } } } - - init { - val a = context.obtainStyledAttributes(attrs, R.styleable.LocationStateButton) - state = determineStateFrom(a) - tint = a.getColorStateList(R.styleable.LocationStateButton_tint) - isNavigation = a.getBoolean(R.styleable.LocationStateButton_is_navigation, false) - - a.recycle() - } - - private fun determineStateFrom(a: TypedArray): LocationState = when { - a.getBoolean(R.styleable.LocationStateButton_state_updating, false) -> LocationState.UPDATING - a.getBoolean(R.styleable.LocationStateButton_state_searching, false) -> LocationState.SEARCHING - a.getBoolean(R.styleable.LocationStateButton_state_enabled, false) -> LocationState.ENABLED - a.getBoolean(R.styleable.LocationStateButton_state_allowed, false) -> LocationState.ALLOWED - else -> LocationState.DENIED - } - - override fun drawableStateChanged() { - super.drawableStateChanged() - // autostart - val current = drawable.current - if (current is Animatable) { - if (!current.isRunning) current.start() - } - if (tint != null && tint.isStateful) { - setColorFilter(tint.getColorForState(drawableState, 0)) - } - } - - override fun onCreateDrawableState(extraSpace: Int): IntArray { - val attributes = ArrayList() - attributes += state.styleableAttributes - if (isNavigation) attributes += R.attr.is_navigation - - val drawableState = super.onCreateDrawableState(extraSpace + attributes.size) - - View.mergeDrawableStates(drawableState, attributes.toIntArray()) - return drawableState + Icon( + painter = painterResource(iconResource), + contentDescription = stringResource(R.string.map_btn_gps_tracking), + tint = if (isFollowing) MaterialTheme.colors.secondary else LocalContentColor.current + ) } +} - override fun onSaveInstanceState() = bundleOf( - KEY_SUPER_STATE to super.onSaveInstanceState(), - KEY_STATE to state, - KEY_IS_ACTIVATED to isActivated, - KEY_IS_NAVIGATION to isNavigation, - ) +private fun getIcon(state: LocationState, isNavigationMode: Boolean) = when (state) { + LocationState.DENIED, + LocationState.ALLOWED -> + R.drawable.ic_location_disabled_24dp + LocationState.ENABLED, + LocationState.SEARCHING -> + if (isNavigationMode) R.drawable.ic_location_navigation_no_location_24dp + else R.drawable.ic_location_no_location_24dp + LocationState.UPDATING -> + if (isNavigationMode) R.drawable.ic_location_navigation_24dp + else R.drawable.ic_location_24dp +} - override fun onRestoreInstanceState(state: Parcelable?) { - if (state is Bundle) { - super.onRestoreInstanceState(state.parcelable(KEY_SUPER_STATE)) - this.state = state.serializable(KEY_STATE)!! - isActivated = state.getBoolean(KEY_IS_ACTIVATED) - isNavigation = state.getBoolean(KEY_IS_NAVIGATION) - requestLayout() +@Preview +@Composable +private fun PreviewLocationButton() { + Column { + for (state in LocationState.entries) { + Row { + LocationStateButton(onClick = {}, state = state) + LocationStateButton(onClick = {}, state = state, isNavigationMode = true) + LocationStateButton(onClick = {}, state = state, isFollowing = true) + LocationStateButton(onClick = {}, state = state, isNavigationMode = true, isFollowing = true) + } } } - - private val LocationState.styleableAttributes: List get() = - listOf( - R.attr.state_allowed, - R.attr.state_enabled, - R.attr.state_searching, - R.attr.state_updating - ).subList(0, ordinal) - - companion object { - private const val KEY_SUPER_STATE = "superState" - private const val KEY_STATE = "state" - private const val KEY_IS_ACTIVATED = "isActivated" - private const val KEY_IS_NAVIGATION = "isNavigation" - } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton2.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton2.kt deleted file mode 100644 index 063ca8202a..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/LocationStateButton2.kt +++ /dev/null @@ -1,81 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.controls - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.material.Icon -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import de.westnordost.streetcomplete.R -import kotlinx.coroutines.delay - -@Composable -fun LocationStateButton( - onClick: () -> Unit, - state: LocationState, - modifier: Modifier = Modifier, - isNavigationMode: Boolean = false, - isFollowing: Boolean = false, - enabled: Boolean = true -) { - var iconResource by remember(state) { mutableStateOf(getIcon(state, isNavigationMode)) } - - MapButton( - onClick = onClick, - modifier = modifier, - enabled = enabled - ) { - LaunchedEffect(state) { - if (state == LocationState.SEARCHING) { - while (true) { - delay(750) - iconResource = getIcon(LocationState.UPDATING, isNavigationMode) - delay(750) - iconResource = getIcon(LocationState.ENABLED, isNavigationMode) - } - } - } - Icon( - painter = painterResource(iconResource), - contentDescription = stringResource(R.string.map_btn_gps_tracking), - tint = if (isFollowing) MaterialTheme.colors.secondary else Color.Black - ) - } -} - -private fun getIcon(state: LocationState, isNavigationMode: Boolean) = when (state) { - LocationState.DENIED, - LocationState.ALLOWED -> - R.drawable.ic_location_disabled_24dp - LocationState.ENABLED, - LocationState.SEARCHING -> - if (isNavigationMode) R.drawable.ic_location_navigation_no_location_24dp - else R.drawable.ic_location_no_location_24dp - LocationState.UPDATING -> - if (isNavigationMode) R.drawable.ic_location_navigation_24dp - else R.drawable.ic_location_24dp -} - -@Preview -@Composable -private fun PreviewLocationButton() { - Column { - for (state in LocationState.entries) { - Row { - LocationStateButton(onClick = {}, state = state) - LocationStateButton(onClick = {}, state = state, isNavigationMode = true) - LocationStateButton(onClick = {}, state = state, isFollowing = true) - LocationStateButton(onClick = {}, state = state, isNavigationMode = true, isFollowing = true) - } - } - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuDialog.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuDialog.kt index 6803dc19d1..797ac2e2d7 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuDialog.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MainMenuDialog.kt @@ -1,66 +1,172 @@ package de.westnordost.streetcomplete.screens.main.controls -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import androidx.appcompat.app.AlertDialog -import androidx.core.view.doOnPreDraw -import androidx.core.view.isGone -import de.westnordost.streetcomplete.databinding.DialogMainMenuBinding -import de.westnordost.streetcomplete.screens.about.AboutActivity -import de.westnordost.streetcomplete.screens.main.teammode.TeamModeDialog -import de.westnordost.streetcomplete.screens.settings.SettingsActivity -import de.westnordost.streetcomplete.screens.user.UserActivity +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.contentColorFor +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.screens.main.teammode.TeamModeColorCircle -/** Shows a dialog containing the main menu items */ -class MainMenuDialog( - context: Context, - indexInTeam: Int?, +@OptIn(ExperimentalLayoutApi::class) +@Composable +fun MainMenuDialog( + onDismissRequest: () -> Unit, + onClickProfile: () -> Unit, + onClickSettings: () -> Unit, + onClickAbout: () -> Unit, onClickDownload: () -> Unit, - onEnableTeamMode: (Int, Int) -> Unit, - onDisableTeamMode: () -> Unit -) : AlertDialog(context) { - init { - val binding = DialogMainMenuBinding.inflate(LayoutInflater.from(context)) - - binding.profileButton.setOnClickListener { - val intent = Intent(context, UserActivity::class.java) - context.startActivity(intent) - dismiss() - } - binding.enableTeamModeButton.setOnClickListener { - TeamModeDialog(context, onEnableTeamMode).show() - dismiss() - } - binding.disableTeamModeButton.setOnClickListener { - onDisableTeamMode() - dismiss() - } - binding.settingsButton.setOnClickListener { - val intent = Intent(context, SettingsActivity::class.java) - context.startActivity(intent) - dismiss() - } - binding.aboutButton.setOnClickListener { - val intent = Intent(context, AboutActivity::class.java) - context.startActivity(intent) - dismiss() - } - binding.downloadButton.setOnClickListener { - onClickDownload() - dismiss() - } - - if (indexInTeam != null) { - binding.teamModeColorCircle.setIndexInTeam(indexInTeam) + onClickEnterTeamMode: () -> Unit, + onClickExitTeamMode: () -> Unit, + isLoggedIn: Boolean, + indexInTeam: Int?, + modifier: Modifier = Modifier, + shape: Shape = MaterialTheme.shapes.medium, + backgroundColor: Color = MaterialTheme.colors.surface, + contentColor: Color = contentColorFor(backgroundColor), +) { + Dialog(onDismissRequest = onDismissRequest) { + Surface( + modifier = modifier, + shape = shape, + color = backgroundColor, + contentColor = contentColor + ) { + Column { + FlowRow( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + BigMenuButton( + onClick = { onDismissRequest(); onClickProfile() }, + icon = { Icon(painterResource(R.drawable.ic_profile_48dp), null) }, + text = stringResource( + if (isLoggedIn) R.string.user_profile else R.string.user_login + ), + ) + BigMenuButton( + onClick = { onDismissRequest(); onClickSettings() }, + icon = { Icon(painterResource(R.drawable.ic_settings_48dp), null) }, + text = stringResource(R.string.action_settings), + ) + BigMenuButton( + onClick = { onDismissRequest(); onClickAbout() }, + icon = { Icon(painterResource(R.drawable.ic_info_outline_48dp), null) }, + text = stringResource(R.string.action_about2), + ) + } + Divider() + CompactMenuButton( + onClick = { onDismissRequest(); onClickDownload() }, + icon = { Icon(painterResource(R.drawable.ic_search_24dp), null) }, + text = stringResource(R.string.action_download), + ) + if (indexInTeam == null) { + CompactMenuButton( + onClick = { onDismissRequest(); onClickEnterTeamMode() }, + icon = { Icon(painterResource(R.drawable.ic_team_mode_24dp), null) }, + text = stringResource(R.string.team_mode) + ) + } else { + CompactMenuButton( + onClick = { onDismissRequest(); onClickExitTeamMode() }, + icon = { + TeamModeColorCircle( + index = indexInTeam, + modifier = Modifier.size(24.dp) + ) + }, + text = stringResource(R.string.team_mode_exit) + ) + } + } } - binding.enableTeamModeButton.isGone = indexInTeam != null - binding.disableTeamModeButton.isGone = indexInTeam == null + } +} - binding.root.doOnPreDraw { - binding.bigMenuItemsContainer.columnCount = binding.root.width / binding.profileButton.width - } +@Composable +private fun BigMenuButton( + onClick: () -> Unit, + icon: @Composable () -> Unit, + text: String, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .width(144.dp) + .clickable { onClick() } + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + icon() + Text( + text = text, + style = MaterialTheme.typography.body1 + ) + } +} - setView(binding.root) +@Composable +private fun CompactMenuButton( + onClick: () -> Unit, + icon: @Composable () -> Unit, + text: String, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier + .fillMaxWidth() + .clickable { onClick() } + .padding(horizontal = 16.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + icon() + Text( + text = text, + modifier = Modifier.weight(1f), + textAlign = TextAlign.Center, + style = MaterialTheme.typography.body1, + ) } } + +@Preview +@Composable +private fun PreviewMainMenuDialog() { + MainMenuDialog( + onDismissRequest = {}, + onClickProfile = {}, + onClickSettings = {}, + onClickAbout = {}, + onClickDownload = {}, + onClickEnterTeamMode = {}, + onClickExitTeamMode = {}, + isLoggedIn = true, + indexInTeam = 0, + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapControls.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapControls.kt new file mode 100644 index 0000000000..db1d50f4dc --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MapControls.kt @@ -0,0 +1,330 @@ +package de.westnordost.streetcomplete.screens.main.controls + +import android.content.Intent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.layout.size +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.BiasAlignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.messages.Message +import de.westnordost.streetcomplete.screens.about.AboutActivity +import de.westnordost.streetcomplete.screens.main.MainViewModel +import de.westnordost.streetcomplete.screens.main.messages.MessageDialog +import de.westnordost.streetcomplete.screens.main.overlays.OverlaySelectionButton +import de.westnordost.streetcomplete.screens.main.overlays.OverlaySelectionDropdownMenu +import de.westnordost.streetcomplete.screens.main.teammode.TeamModeColorCircle +import de.westnordost.streetcomplete.screens.main.teammode.TeamModeWizard +import de.westnordost.streetcomplete.screens.settings.SettingsActivity +import de.westnordost.streetcomplete.screens.tutorial.IntroTutorialScreen +import de.westnordost.streetcomplete.screens.tutorial.OverlaysTutorialScreen +import de.westnordost.streetcomplete.screens.user.UserActivity +import de.westnordost.streetcomplete.ui.common.AnimatedScreenVisibility +import de.westnordost.streetcomplete.ui.common.Counter +import de.westnordost.streetcomplete.ui.common.LargeCreateIcon +import de.westnordost.streetcomplete.ui.common.MenuIcon +import de.westnordost.streetcomplete.ui.common.MessagesIcon +import de.westnordost.streetcomplete.ui.common.StopRecordingIcon +import de.westnordost.streetcomplete.ui.common.UndoIcon +import de.westnordost.streetcomplete.ui.common.UploadIcon +import de.westnordost.streetcomplete.ui.common.ZoomInIcon +import de.westnordost.streetcomplete.ui.common.ZoomOutIcon +import de.westnordost.streetcomplete.util.ktx.toast +import kotlinx.coroutines.launch +import kotlin.math.abs + +// NOTE: this will eventually grow into something that should be renamed to MainScreen, i.e. +// replacing MainFragment completely. For now, it is mostly only the controls and dialogs +// and dropdowns triggered by that. But since this is big, we should take care to put any +// elements that can meaningfully be put into an own composable in another file + +/** Map controls shown on top of the map. */ +@Composable +fun MapControls( + viewModel: MainViewModel, + hasEdits: Boolean, + onClickZoomIn: () -> Unit, + onClickZoomOut: () -> Unit, + onClickCompass: () -> Unit, + onClickLocation: () -> Unit, + onClickCreate: () -> Unit, + onClickStopTrackRecording: () -> Unit, + onClickUndo: () -> Unit, + onClickDownload: () -> Unit, + onClickUpload: () -> Unit, + onExplainedNeedForLocationPermission: () -> Unit, + modifier: Modifier = Modifier +) { + val coroutineScope = rememberCoroutineScope() + + val context = LocalContext.current + + val starsCount by viewModel.starsCount.collectAsState() + val isShowingStarsCurrentWeek by viewModel.isShowingStarsCurrentWeek.collectAsState() + + val selectedOverlay by viewModel.selectedOverlay.collectAsState() + + val isAutoSync by viewModel.isAutoSync.collectAsState() + val unsyncedEditsCount by viewModel.unsyncedEditsCount.collectAsState() + + val isTeamMode by viewModel.isTeamMode.collectAsState() + val indexInTeam by viewModel.indexInTeam.collectAsState() + + val messagesCount by viewModel.messagesCount.collectAsState() + + val isLoggedIn by viewModel.isLoggedIn.collectAsState() + val isUploadingOrDownloading by viewModel.isUploadingOrDownloading.collectAsState() + + val locationState by viewModel.locationState.collectAsState() + val isNavigationMode by viewModel.isNavigationMode.collectAsState() + val isFollowingPosition by viewModel.isFollowingPosition.collectAsState() + val isRecordingTracks by viewModel.isRecordingTracks.collectAsState() + + val mapZoom by viewModel.mapZoom.collectAsState() + val mapRotation by viewModel.mapRotation.collectAsState() + val mapTilt by viewModel.mapTilt.collectAsState() + + val isCreateButtonEnabled by remember { derivedStateOf { mapZoom >= 18f } } + + var showOverlaysDropdown by remember { mutableStateOf(false) } + var showOverlaysTutorial by remember { mutableStateOf(false) } + var showIntroTutorial by remember { mutableStateOf(false) } + var showTeamModeWizard by remember { mutableStateOf(false) } + var showMainMenuDialog by remember { mutableStateOf(false) } + var shownMessage by remember { mutableStateOf(null) } + + fun onClickOverlays() { + if (viewModel.hasShownOverlaysTutorial) { + showOverlaysDropdown = true + } else { + showOverlaysTutorial = true + } + } + + fun onClickMessages() { + coroutineScope.launch { + shownMessage = viewModel.popMessage() + } + } + + LaunchedEffect(viewModel.hasShownTutorial) { + if (!viewModel.hasShownTutorial && !isLoggedIn) { + showIntroTutorial = true + } + } + + LaunchedEffect(isTeamMode) { + // always show this toast on start to remind user that it is still on + if (isTeamMode) { + context.toast(R.string.team_mode_active) + } + // show this only once when turning it off + else if (viewModel.teamModeChanged) { + context.toast(R.string.team_mode_deactivated) + viewModel.teamModeChanged = false + } + } + + // the layout of the buttons is not mirrored for different text directions + CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) { + if (selectedOverlay?.isCreateNodeEnabled == true) { + Crosshair() + } + Box( + modifier + .fillMaxSize() + .safeDrawingPadding() + .padding(bottom = 22.dp) + ) { + // stars counter + StarsCounter( + count = starsCount, + modifier = Modifier + .defaultMinSize(minWidth = 96.dp) + .align(Alignment.TopStart) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) { viewModel.toggleShowingCurrentWeek() }, + isCurrentWeek = isShowingStarsCurrentWeek, + showProgress = isUploadingOrDownloading + ) + + // top controls + Row(Modifier.align(Alignment.TopEnd)) { + if (messagesCount > 0) { + MessagesButton( + onClick = ::onClickMessages, + messagesCount = messagesCount + ) + } + if (!isAutoSync) { + UploadButton( + onClick = onClickUpload, + unsyncedEditsCount = unsyncedEditsCount, + enabled = !isUploadingOrDownloading + ) + } + Box { + OverlaySelectionButton( + onClick = ::onClickOverlays, + overlay = selectedOverlay + ) + OverlaySelectionDropdownMenu( + expanded = showOverlaysDropdown, + onDismissRequest = { showOverlaysDropdown = false }, + overlays = viewModel.overlays, + onSelect = { viewModel.selectOverlay(it) } + ) + } + + MainMenuButton( + onClick = { showMainMenuDialog = true }, + indexInTeam = if (isTeamMode) indexInTeam else null + ) + } + + // bottom-right controls + Column(Modifier.align(Alignment.BottomEnd)) { + val isCompassVisible = abs(mapRotation) >= 1f || abs(mapTilt) >= 1f + AnimatedVisibility( + visible = isCompassVisible, + enter = fadeIn(), + exit = fadeOut() + ) { + CompassButton( + onClick = onClickCompass, + modifier = Modifier.graphicsLayer( + rotationZ = mapRotation, + rotationX = mapTilt + ) + ) + } + MapButton(onClick = onClickZoomIn) { ZoomInIcon() } + MapButton(onClick = onClickZoomOut) { ZoomOutIcon() } + LocationStateButton( + onClick = onClickLocation, + state = locationState, + isNavigationMode = isNavigationMode, + isFollowing = isFollowingPosition, + ) + } + + if (selectedOverlay?.isCreateNodeEnabled == true) { + MapButton( + onClick = onClickCreate, + modifier = Modifier.align(BiasAlignment(0.25f, 1f)), + enabled = isCreateButtonEnabled, + color = MaterialTheme.colors.secondaryVariant, + contentColor = Color.White, + ) { + LargeCreateIcon() + } + } + + // bottom-left controls + Column(Modifier.align(Alignment.BottomStart)) { + if (isRecordingTracks) { + MapButton( + onClick = onClickStopTrackRecording, + color = MaterialTheme.colors.secondaryVariant, + contentColor = Color.White + ) { + StopRecordingIcon() + } + } + + if (hasEdits) { + MapButton( + onClick = onClickUndo, + // Don't allow undoing while uploading. Should prevent race conditions. + // (Undoing quest while also uploading it at the same time) + enabled = !isUploadingOrDownloading, + ) { + UndoIcon() + } + } + } + } + } + + shownMessage?.let { message -> + MessageDialog( + message = message, + onDismissRequest = { shownMessage = null } + ) + } + + if (showMainMenuDialog) { + MainMenuDialog( + onDismissRequest = { showMainMenuDialog = false }, + onClickProfile = { context.startActivity(Intent(context, UserActivity::class.java)) }, + onClickSettings = { context.startActivity(Intent(context, SettingsActivity::class.java)) }, + onClickAbout = { context.startActivity(Intent(context, AboutActivity::class.java)) }, + onClickDownload = onClickDownload, + onClickEnterTeamMode = { showTeamModeWizard = true }, + onClickExitTeamMode = { viewModel.disableTeamMode() }, + isLoggedIn = isLoggedIn, + indexInTeam = if (isTeamMode) indexInTeam else null, + ) + } + + AnimatedScreenVisibility(showTeamModeWizard) { + TeamModeWizard( + onDismissRequest = { showTeamModeWizard = false }, + onFinished = { teamSize, indexInTeam -> + viewModel.enableTeamMode( + teamSize = teamSize, + indexInTeam = indexInTeam + ) + } + ) + } + + AnimatedScreenVisibility(showOverlaysTutorial,) { + OverlaysTutorialScreen( + onDismissRequest = { showOverlaysTutorial = false }, + onFinished = { viewModel.hasShownOverlaysTutorial = true } + ) + } + + AnimatedScreenVisibility(showIntroTutorial,) { + IntroTutorialScreen( + onDismissRequest = { showIntroTutorial = false }, + onExplainedNeedForLocationPermission = onExplainedNeedForLocationPermission, + onFinished = { viewModel.hasShownTutorial = true }, + ) + } +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MessagesButton.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MessagesButton.kt index 8242ad3d06..a446dbba91 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MessagesButton.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/MessagesButton.kt @@ -1,29 +1,22 @@ package de.westnordost.streetcomplete.screens.main.controls -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.RelativeLayout -import androidx.core.view.isInvisible -import de.westnordost.streetcomplete.databinding.ViewMessagesButtonBinding +import androidx.compose.foundation.layout.Box +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import de.westnordost.streetcomplete.ui.common.MessagesIcon -/** View that shows a messages-button with a little counter at the top right */ -class MessagesButton @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : RelativeLayout(context, attrs, defStyleAttr) { - - private val binding = ViewMessagesButtonBinding.inflate(LayoutInflater.from(context), this) - - var messagesCount: Int = 0 - set(value) { - field = value - binding.textView.text = value.toString() - binding.textView.isInvisible = value == 0 +@Composable +fun MessagesButton( + onClick: () -> Unit, + messagesCount: Int, + modifier: Modifier = Modifier, +) { + Box(modifier) { + MapButton(onClick = onClick) { MessagesIcon() } + MapButtonNotification { + Text(messagesCount.toString(), textAlign = TextAlign.Center) } - - init { - clipToPadding = false } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounterView.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounterView.kt deleted file mode 100644 index 2928592302..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/StarsCounterView.kt +++ /dev/null @@ -1,56 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.controls - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.animation.AccelerateDecelerateInterpolator -import android.view.animation.DecelerateInterpolator -import android.widget.RelativeLayout -import androidx.core.view.isGone -import androidx.core.view.isInvisible -import de.westnordost.streetcomplete.databinding.ViewAnswersCounterBinding - -/** View that displays the user's quest answer counter */ -class StarsCounterView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : RelativeLayout(context, attrs, defStyleAttr) { - - private val binding = ViewAnswersCounterBinding.inflate(LayoutInflater.from(context), this) - - var starsCount: Int = 0 - set(value) { - field = value - binding.textView.text = value.toString() - } - - var showProgress: Boolean = false - set(value) { - field = value - binding.progressView.isInvisible = !value - } - - var showLabel: Boolean - set(value) { binding.labelView.isGone = !value } - get() = binding.labelView.isGone - - fun setUploadedCount(uploadedCount: Int, animate: Boolean) { - if (this.starsCount < uploadedCount && animate) { - animateChange() - } - this.starsCount = uploadedCount - } - - private fun animateChange() { - binding.textView.animate() - .scaleX(1.6f).scaleY(1.6f) - .setInterpolator(DecelerateInterpolator(2f)) - .setDuration(100) - .withEndAction { - binding.textView.animate() - .scaleX(1f).scaleY(1f) - .setInterpolator(AccelerateDecelerateInterpolator()).duration = 100 - } - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/UploadButton.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/UploadButton.kt index ff15dfd023..2a63ef842b 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/UploadButton.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/controls/UploadButton.kt @@ -1,35 +1,25 @@ package de.westnordost.streetcomplete.screens.main.controls -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.RelativeLayout -import androidx.core.view.isInvisible -import de.westnordost.streetcomplete.databinding.ViewUploadButtonBinding +import androidx.compose.foundation.layout.Box +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import de.westnordost.streetcomplete.ui.common.UploadIcon -/** A view that shows an upload-icon, with a counter at the top right and an (upload) progress view - */ -class UploadButton @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : RelativeLayout(context, attrs, defStyleAttr) { - - private val binding = ViewUploadButtonBinding.inflate(LayoutInflater.from(context), this) - - var uploadableCount: Int = 0 - set(value) { - field = value - binding.textView.text = value.toString() - binding.textView.isInvisible = value == 0 +@Composable +fun UploadButton( + onClick: () -> Unit, + unsyncedEditsCount: Int, + modifier: Modifier = Modifier, + enabled: Boolean = true, +) { + Box(modifier) { + MapButton(onClick = onClick, enabled = enabled) { UploadIcon() } + if(unsyncedEditsCount > 0) { + MapButtonNotification { + Text(unsyncedEditsCount.toString(), textAlign = TextAlign.Center) + } } - - override fun setEnabled(enabled: Boolean) { - super.setEnabled(enabled) - binding.iconView.alpha = if (enabled) 1f else 0.5f - } - - init { - clipToPadding = false } } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessagesContainerFragment.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessagesContainerFragment.kt deleted file mode 100644 index 4d6c4a2f75..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/MessagesContainerFragment.kt +++ /dev/null @@ -1,72 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.messages - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.fragment.app.Fragment -import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.data.messages.Message -import de.westnordost.streetcomplete.data.messages.NewAchievementMessage -import de.westnordost.streetcomplete.data.messages.NewVersionMessage -import de.westnordost.streetcomplete.data.messages.OsmUnreadMessagesMessage -import de.westnordost.streetcomplete.data.messages.QuestSelectionHintMessage -import de.westnordost.streetcomplete.screens.settings.SettingsActivity -import de.westnordost.streetcomplete.screens.user.achievements.AchievementDialog -import de.westnordost.streetcomplete.ui.util.composableContent -import kotlinx.coroutines.flow.MutableStateFlow - -/** A fragment that contains any fragments that would show messages. - * Usually, messages are shown as dialogs, however there is currently one exception which - * makes this necessary as a fragment */ -class MessagesContainerFragment : Fragment() { - - private val shownMessage = MutableStateFlow(null) - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) = composableContent { - val message by shownMessage.collectAsState() - - when (val msg = message) { - is NewAchievementMessage -> { - AchievementDialog( - msg.achievement, - msg.level, - onDismissRequest = { shownMessage.value = null } - ) - } - is NewVersionMessage -> { - WhatsNewDialog( - changelog = msg.changelog, - onDismissRequest = { shownMessage.value = null }, - onClickLink = { } - ) - } - else -> {} - } - } - - fun showMessage(message: Message) { - val ctx = context ?: return - shownMessage.value = message - when (message) { - is OsmUnreadMessagesMessage -> { - OsmUnreadMessagesFragment - .create(message.unreadMessages) - .show(childFragmentManager, null) - } - is QuestSelectionHintMessage -> { - AlertDialog.Builder(ctx) - .setTitle(R.string.quest_selection_hint_title) - .setMessage(R.string.quest_selection_hint_message) - .setPositiveButton(R.string.quest_streetName_cantType_open_settings) { _, _ -> - startActivity(SettingsActivity.createLaunchQuestSettingsIntent(ctx)) - } - .setNegativeButton(android.R.string.ok, null) - .show() - } - else -> {} - } - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OsmUnreadMessagesFragment.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OsmUnreadMessagesFragment.kt deleted file mode 100644 index a6cc5866e0..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/messages/OsmUnreadMessagesFragment.kt +++ /dev/null @@ -1,126 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.messages - -import android.app.Dialog -import android.graphics.drawable.AnimatedVectorDrawable -import android.os.Build -import android.os.Bundle -import android.view.View -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.animation.DecelerateInterpolator -import androidx.core.os.bundleOf -import androidx.fragment.app.DialogFragment -import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.databinding.FragmentUnreadOsmMessageBinding -import de.westnordost.streetcomplete.util.SoundFx -import de.westnordost.streetcomplete.util.ktx.dpToPx -import de.westnordost.streetcomplete.util.ktx.openUri -import de.westnordost.streetcomplete.util.ktx.viewLifecycleScope -import de.westnordost.streetcomplete.util.viewBinding -import kotlinx.coroutines.launch -import org.koin.android.ext.android.inject - -/** Fragment that shows a message that the user has X unread messages in his OSM inbox */ -class OsmUnreadMessagesFragment : DialogFragment(R.layout.fragment_unread_osm_message) { - - private val soundFx: SoundFx by inject() - - private val binding by viewBinding(FragmentUnreadOsmMessageBinding::bind) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setStyle(STYLE_NO_FRAME, R.style.Theme_CustomDialog) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - // hide first, to avoid flashing - binding.mailContainer.alpha = 0.0f - binding.dialogContainer.setOnClickListener { dismiss() } - binding.readMailButton.setOnClickListener { - openUri("https://www.openstreetmap.org/messages/inbox") - dismiss() - } - val unreadMessagesCount = arguments?.getInt(ARG_UNREAD_MESSAGE_COUNT, 0) ?: 0 - binding.unreadMessagesTextView.text = getString(R.string.unread_messages_message, unreadMessagesCount) - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val dialog = super.onCreateDialog(savedInstanceState) - dialog.setOnShowListener { startAnimation() } - // we want to show a highly custom dialog here with no frame. Without this, the dialog's - // content is restricted to wrap content, but we want to use whole screen here (for animation) - dialog.window?.setLayout(MATCH_PARENT, MATCH_PARENT) - return dialog - } - - private fun startAnimation() { - val ctx = requireContext() - - viewLifecycleScope.launch { soundFx.play(R.raw.sliding_envelope) } - - val speechbubbleContentContainer = binding.speechbubbleContentContainer - val mailOpenImageView = binding.mailOpenImageView - val mailFrontImageView = binding.mailFrontImageView - - mailFrontImageView.alpha = 0f - - speechbubbleContentContainer.alpha = 0.0f - speechbubbleContentContainer.visibility = View.VISIBLE - speechbubbleContentContainer.scaleX = 0.8f - speechbubbleContentContainer.scaleY = 0.8f - speechbubbleContentContainer.translationY = ctx.resources.dpToPx(140) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - (mailOpenImageView.drawable as? AnimatedVectorDrawable)?.reset() - } - - binding.mailContainer.rotation = -40f - binding.mailContainer.rotationY = -45f - binding.mailContainer.alpha = 0.2f - binding.mailContainer.translationX = ctx.resources.dpToPx(-400) - binding.mailContainer.translationY = ctx.resources.dpToPx(60) - binding.mailContainer.animate().run { - duration = 400 - startDelay = 200 - interpolator = DecelerateInterpolator() - rotation(0f) - rotationY(0f) - alpha(1f) - translationX(0f) - translationY(0f) - withEndAction { - (mailOpenImageView.drawable as? AnimatedVectorDrawable)?.start() - - mailFrontImageView.animate().run { - duration = 100 - startDelay = 100 - alpha(1f) - start() - } - - speechbubbleContentContainer.animate().run { - withStartAction { speechbubbleContentContainer.alpha = 0.4f } - startDelay = 200 - duration = 300 - scaleX(1f) - scaleY(1f) - alpha(1f) - translationY(0f) - start() - } - } - start() - } - } - - companion object { - private const val ARG_UNREAD_MESSAGE_COUNT = "unread_message_count" - - fun create(unreadMessagesCount: Int): OsmUnreadMessagesFragment { - val args = bundleOf(ARG_UNREAD_MESSAGE_COUNT to unreadMessagesCount) - val f = OsmUnreadMessagesFragment() - f.arguments = args - return f - } - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionAdapter.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionAdapter.kt deleted file mode 100644 index 66a2549dd2..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/overlays/OverlaySelectionAdapter.kt +++ /dev/null @@ -1,36 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.overlays - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.BaseAdapter -import android.widget.TextView -import androidx.core.graphics.drawable.updateBounds -import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.overlays.Overlay -import de.westnordost.streetcomplete.util.ktx.dpToPx - -/** Adapter for the list in which the user can select which overlay he wants to use */ -class OverlaySelectionAdapter(private val overlays: List) : BaseAdapter() { - - override fun getCount() = 1 + overlays.size - - override fun getItem(position: Int) = if (position > 0) overlays[position - 1] else null - - override fun getItemId(position: Int) = position.toLong() - - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - val overlay = getItem(position) - val context = parent.context - val view = convertView - ?: LayoutInflater.from(context).inflate(R.layout.row_overlay_selection, parent, false) - val textView = view as TextView - textView.setText(overlay?.title ?: R.string.overlay_none) - val icon = context.getDrawable(overlay?.icon ?: R.drawable.space_24dp) - val bound = context.resources.dpToPx(38).toInt() - icon?.updateBounds(right = bound, bottom = bound) - textView.setCompoundDrawables(icon, null, null, null) - textView.compoundDrawablePadding = context.resources.dpToPx(8).toInt() - return textView - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircleView.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircleView.kt deleted file mode 100644 index 5017279e82..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeColorCircleView.kt +++ /dev/null @@ -1,57 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.teammode - -import android.content.Context -import android.graphics.Color -import android.util.AttributeSet -import android.view.LayoutInflater -import androidx.annotation.ColorInt -import androidx.constraintlayout.widget.ConstraintLayout -import de.westnordost.streetcomplete.R -import de.westnordost.streetcomplete.databinding.ViewTeamModeColorCircleBinding - -class TeamModeColorCircleView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr) { - - private val binding = ViewTeamModeColorCircleBinding.inflate(LayoutInflater.from(context), this) - - fun setIndexInTeam(index: Int) { - val color = context.resources.getColor(colors[index]) - val brightness = getColorBrightness(color) - - binding.teamModeColorCircleBackground.setColorFilter(color) - binding.teamModeColorCircleText.text = (index + 'A'.code).toChar().toString() - binding.teamModeColorCircleText.setTextColor(if (brightness > 0.7) Color.BLACK else Color.WHITE) - } - - private fun getColorBrightness(@ColorInt color: Int): Float { - val hsv = FloatArray(3) - Color.colorToHSV(color, hsv) - return hsv[2] - } - - init { - setIndexInTeam(0) - } - - companion object { - private val colors = listOf( - R.color.team_0, - R.color.team_1, - R.color.team_2, - R.color.team_3, - R.color.team_4, - R.color.team_5, - R.color.team_6, - R.color.team_7, - R.color.team_8, - R.color.team_9, - R.color.team_10, - R.color.team_11 - ) - - val MAX_TEAM_SIZE get() = colors.size - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeDialog.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeDialog.kt deleted file mode 100644 index d4b3e69554..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeDialog.kt +++ /dev/null @@ -1,75 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.teammode - -import android.content.Context -import android.view.LayoutInflater -import android.view.WindowManager -import androidx.appcompat.app.AlertDialog -import androidx.core.view.isGone -import androidx.core.widget.doAfterTextChanged -import androidx.recyclerview.widget.GridLayoutManager -import de.westnordost.streetcomplete.databinding.DialogTeamModeBinding -import de.westnordost.streetcomplete.screens.main.teammode.TeamModeColorCircleView.Companion.MAX_TEAM_SIZE - -/** Shows a dialog containing the team mode settings */ -class TeamModeDialog( - context: Context, - onEnableTeamMode: (Int, Int) -> Unit -) : AlertDialog(context) { - - private var selectedTeamSize: Int? = null - private var selectedIndexInTeam: Int? = null - private val binding = DialogTeamModeBinding.inflate(LayoutInflater.from(context)) - - init { - val adapter = TeamModeIndexSelectAdapter() - adapter.listeners.add(object : TeamModeIndexSelectAdapter.OnSelectedIndexChangedListener { - override fun onSelectedIndexChanged(index: Int?) { - selectedIndexInTeam = index - updateOkButtonEnablement() - } - }) - binding.colorCircles.adapter = adapter - binding.colorCircles.layoutManager = GridLayoutManager(context, 3) - - binding.teamSizeInput.doAfterTextChanged { editable -> - selectedTeamSize = parseTeamSize(editable.toString()) - updateOkButtonEnablement() - - if (selectedTeamSize == null) { - binding.introText.isGone = false - binding.teamSizeHint.isGone = false - binding.colorHint.isGone = true - binding.colorCircles.isGone = true - } else { - binding.introText.isGone = true - binding.teamSizeHint.isGone = true - binding.colorHint.isGone = false - binding.colorCircles.isGone = false - adapter.count = selectedTeamSize!! - } - } - - setButton(BUTTON_POSITIVE, context.resources.getText(android.R.string.ok)) { _, _ -> - onEnableTeamMode(selectedTeamSize!!, selectedIndexInTeam!!) - dismiss() - } - - setOnShowListener { updateOkButtonEnablement() } - - window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) - - setView(binding.root) - } - - private fun updateOkButtonEnablement() { - getButton(BUTTON_POSITIVE)?.isEnabled = selectedTeamSize != null && selectedIndexInTeam != null - } - - private fun parseTeamSize(string: String): Int? = - try { - val number = Integer.parseInt(string) - if (number in 2..MAX_TEAM_SIZE) number else null - } catch (e: NumberFormatException) { - null - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeIndexSelectAdapter.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeIndexSelectAdapter.kt deleted file mode 100644 index fa5e4df20f..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeIndexSelectAdapter.kt +++ /dev/null @@ -1,78 +0,0 @@ -package de.westnordost.streetcomplete.screens.main.teammode - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import de.westnordost.streetcomplete.databinding.CellTeamModeColorCircleSelectBinding -import de.westnordost.streetcomplete.util.Listeners - -class TeamModeIndexSelectAdapter : RecyclerView.Adapter() { - var count: Int = 0 - set(value) { - deselect() - field = value - notifyDataSetChanged() - } - - private var selectedIndex: Int? = null - set(index) { - val oldIndex = field - field = index - - oldIndex?.let { notifyItemChanged(it) } - index?.let { notifyItemChanged(it) } - listeners.forEach { it.onSelectedIndexChanged(index) } - } - - val listeners = Listeners() - - interface OnSelectedIndexChangedListener { - fun onSelectedIndexChanged(index: Int?) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val inflater = LayoutInflater.from(parent.context) - val binding = CellTeamModeColorCircleSelectBinding.inflate(inflater, parent, false) - val holder = ViewHolder(binding) - holder.onClickListener = ::toggle - return holder - } - - private fun toggle(index: Int) { - if (index < 0 || index >= count) { - throw ArrayIndexOutOfBoundsException(index) - } - - selectedIndex = if (index == selectedIndex) null else index - } - - private fun deselect() { - selectedIndex = null - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(position) - holder.itemView.isSelected = selectedIndex == position - } - - override fun getItemCount() = count - - class ViewHolder(val binding: CellTeamModeColorCircleSelectBinding) : RecyclerView.ViewHolder(binding.root) { - var onClickListener: ((index: Int) -> Unit)? = null - set(value) { - field = value - if (value == null) { - itemView.setOnClickListener(null) - } else { - itemView.setOnClickListener { - val index = adapterPosition - if (index != RecyclerView.NO_POSITION) value.invoke(index) - } - } - } - - fun bind(index: Int) { - binding.teamModeColorCircle.setIndexInTeam(index) - } - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeWizard.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeWizard.kt new file mode 100644 index 0000000000..6b7cbe42d8 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/main/teammode/TeamModeWizard.kt @@ -0,0 +1,149 @@ +package de.westnordost.streetcomplete.screens.main.teammode + +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyHorizontalGrid +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.itemsIndexed +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.ContentAlpha +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.screens.tutorial.TutorialScreen +import de.westnordost.streetcomplete.ui.theme.TeamColors +import de.westnordost.streetcomplete.ui.theme.headlineLarge + +// TODO disable next button + +/** Wizard which enables team mode */ +@Composable +fun TeamModeWizard( + onDismissRequest: () -> Unit, + onFinished: (teamSize: Int, indexInTeam: Int) -> Unit, +) { + var teamSize by remember { mutableStateOf(TextFieldValue()) } + var indexInTeam by remember { mutableStateOf(null) } + + fun isValidTeamSize(input: String): Boolean { + val size = input.toIntOrNull() + return size != null && size in 2..12 + } + + TutorialScreen( + pageCount = 3, + onDismissRequest = onDismissRequest, + onFinished = { onFinished(teamSize.text.toInt(), indexInTeam!!) }, + illustration = { page -> + Image(painterResource(R.drawable.team_mode), null) + } + ) { page -> + Column( + modifier = Modifier.fillMaxSize(1f), + horizontalAlignment = Alignment.CenterHorizontally + ) { + when (page) { + 0 -> TeamModeDescription() + 1 -> TeamModeTeamSizeInput( + value = teamSize, + onValueChange = { if (isValidTeamSize(it.text)) teamSize = it } + ) + 2 -> TeamModeColorSelect( + selectedIndex = indexInTeam, + onSelectedIndex = { indexInTeam = it } + ) + } + } + } +} + +@Composable +private fun TeamModeDescription() { + Text( + text = stringResource(R.string.team_mode), + style = MaterialTheme.typography.headlineLarge, + textAlign = TextAlign.Center, + ) + Text( + text = stringResource(R.string.team_mode_description), + style = MaterialTheme.typography.body1, + textAlign = TextAlign.Center, + modifier = Modifier.padding(top = 24.dp) + ) +} + +@Composable +private fun TeamModeTeamSizeInput( + value: TextFieldValue, + onValueChange: (TextFieldValue) -> Unit, +) { + val focusRequester = remember { FocusRequester() } + LaunchedEffect(value) { focusRequester.requestFocus() } + + Text( + text = stringResource(R.string.team_mode_team_size_label2), + style = MaterialTheme.typography.body1, + textAlign = TextAlign.Center + ) + // TODO number picker +} + +@Composable +private fun TeamModeColorSelect( + selectedIndex: Int?, + onSelectedIndex: (Int) -> Unit, +) { + Text( + text = stringResource(R.string.team_mode_choose_color2), + style = MaterialTheme.typography.body1, + textAlign = TextAlign.Center + ) + LazyVerticalGrid( + columns = GridCells.Adaptive(52.dp), + modifier = Modifier.padding(top = 24.dp) + ) { + items(TeamColors.size) { index -> + TeamModeColorCircle( + index = index, + modifier = Modifier + .clickable { onSelectedIndex(index) } + .padding(4.dp) + ) + } + } +} + +@Preview +@Composable +private fun PreviewTeamModeWizard() { + TeamModeWizard( + onDismissRequest = { }, + onFinished = { _, _ -> } + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/IntroTutorialScreen.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/IntroTutorialScreen.kt index 32c8ef3e56..fc00739188 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/IntroTutorialScreen.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/IntroTutorialScreen.kt @@ -15,7 +15,11 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -39,14 +43,23 @@ import kotlinx.coroutines.launch /** Shows a short tutorial for first-time users */ @Composable fun IntroTutorialScreen( + onDismissRequest: () -> Unit, + onExplainedNeedForLocationPermission: () -> Unit, onFinished: () -> Unit, ) { TutorialScreen( pageCount = 4, + onDismissRequest = onDismissRequest, onFinished = onFinished, + onPageChanged = { page -> + if (page == 2) { + onExplainedNeedForLocationPermission() + } + }, illustration = { page -> IntroTutorialIllustration(page) - } + }, + dismissOnBackPress = false, ) { page -> Column( modifier = Modifier.fillMaxSize(1f), @@ -240,5 +253,5 @@ private fun IntroTutorialStep3Text() { @PreviewScreenSizes @Composable private fun PreviewIntroTutorialScreen() { - IntroTutorialScreen {} + IntroTutorialScreen({},{},{}) } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialFragment.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialFragment.kt deleted file mode 100644 index 40baab9125..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialFragment.kt +++ /dev/null @@ -1,26 +0,0 @@ -package de.westnordost.streetcomplete.screens.tutorial - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.compose.material.Surface -import androidx.fragment.app.Fragment -import de.westnordost.streetcomplete.ui.util.composableContent - -class OverlaysTutorialFragment : Fragment() { - - interface Listener { - fun onOverlaysTutorialFinished() - } - private val listener: Listener? get() = parentFragment as? Listener ?: activity as? Listener - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - composableContent { - Surface { - OverlaysTutorialScreen( - onFinished = { listener?.onOverlaysTutorialFinished() } - ) - } - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt index 67e6b993be..3d0e309a10 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/OverlaysTutorialScreen.kt @@ -46,11 +46,14 @@ import kotlinx.coroutines.launch @Composable fun OverlaysTutorialScreen( + onDismissRequest: () -> Unit, onFinished: () -> Unit, ) { TutorialScreen( pageCount = 3, + onDismissRequest = onDismissRequest, onFinished = onFinished, + dismissOnBackPress = true, illustration = { page -> OverlaysTutorialIllustration(page) }, @@ -268,5 +271,5 @@ private fun OverlaysTutorialStepEditText() { @PreviewScreenSizes @Composable private fun PreviewOverlaysTutorialScreen() { - OverlaysTutorialScreen {} + OverlaysTutorialScreen({},{}) } diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt deleted file mode 100644 index 3c9b3e4dc1..0000000000 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialFragment.kt +++ /dev/null @@ -1,23 +0,0 @@ -package de.westnordost.streetcomplete.screens.tutorial - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import de.westnordost.streetcomplete.ui.util.composableContent - -class TutorialFragment : Fragment() { - - interface Listener { - fun onTutorialFinished() - } - private val listener: Listener? get() = parentFragment as? Listener ?: activity as? Listener - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = - composableContent { - IntroTutorialScreen( - onFinished = { listener?.onTutorialFinished() } - ) - } -} diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt index 2df8b923df..0fa79b5f56 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/tutorial/TutorialScreen.kt @@ -31,6 +31,9 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -49,17 +52,27 @@ import kotlinx.coroutines.launch @Composable fun TutorialScreen( pageCount: Int, + onDismissRequest: () -> Unit, onFinished: () -> Unit, + onPageChanged: suspend (page: Int) -> Unit = {}, + dismissOnBackPress: Boolean = true, illustration: @Composable BoxScope.(page: Int) -> Unit, - pageContent: @Composable (page: Int) -> Unit + pageContent: @Composable (page: Int) -> Unit, ) { val state = rememberPagerState { pageCount } val coroutineScope = rememberCoroutineScope() - BackHandler(state.currentPage > 0) { - coroutineScope.launch { - state.animateScrollToPage(state.currentPage - 1) + BackHandler(state.currentPage > 0 || dismissOnBackPress) { + if (state.currentPage > 0) { + coroutineScope.launch { + state.animateScrollToPage(state.currentPage - 1) + } + } else { + onDismissRequest() } } + LaunchedEffect(state.currentPage) { + onPageChanged(state.currentPage) + } Surface(Modifier.fillMaxSize()) { TutorialScreenLayout( @@ -86,7 +99,10 @@ fun TutorialScreen( controls = { PagerControls( state = state, - onLastPageFinished = onFinished, + onLastPageFinished = { + onDismissRequest() + onFinished() + }, modifier = Modifier .fillMaxWidth() .background( diff --git a/app/src/main/java/de/westnordost/streetcomplete/screens/user/achievements/AchievementDialog.kt b/app/src/main/java/de/westnordost/streetcomplete/screens/user/achievements/AchievementDialog.kt index beed605686..022bbe4725 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/screens/user/achievements/AchievementDialog.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/screens/user/achievements/AchievementDialog.kt @@ -55,8 +55,6 @@ fun AchievementDialog( onDismissRequest = onDismissRequest, properties = DialogProperties(usePlatformDefaultWidth = false) ) { - val interactionSource = remember { MutableInteractionSource() } - if (isNew) { AnimatedTadaShine() } @@ -65,7 +63,10 @@ fun AchievementDialog( modifier = Modifier .fillMaxSize() // dismiss when clicking wherever - no ripple effect - .clickable(interactionSource, null) { onDismissRequest() }, + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null + ) { onDismissRequest() }, contentAlignment = Alignment.Center ) { ContentWithIconPortraitOrLandscape(modifier.padding(16.dp)) { isLandscape, iconSize -> diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedScreenVisibility.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedScreenVisibility.kt new file mode 100644 index 0000000000..6acd187d26 --- /dev/null +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/common/AnimatedScreenVisibility.kt @@ -0,0 +1,28 @@ +package de.westnordost.streetcomplete.ui.common + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.AnimatedVisibilityScope +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +/** An animated visibility for something that should appear as a full-screen dialog */ +@Composable +fun AnimatedScreenVisibility( + visible: Boolean, + modifier: Modifier = Modifier, + label: String = "AnimatedScreenVisibility", + content: @Composable() AnimatedVisibilityScope.() -> Unit +) { + AnimatedVisibility( + visible = visible, + enter = fadeIn() + slideInVertically(initialOffsetY = { it / 10 }), + exit = fadeOut() + slideOutVertically(targetOffsetY = { it / 10 }), + modifier = modifier, + label = label, + content = content + ) +} diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt index 479b1c4ab3..46f917e48d 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/common/Counter.kt @@ -1,6 +1,9 @@ package de.westnordost.streetcomplete.ui.common import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.SizeTransform +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith @@ -37,6 +40,7 @@ import androidx.compose.ui.unit.sp fun Counter( count: Int, modifier: Modifier = Modifier, + clip: Boolean = false, color: Color = Color.Unspecified, fontSize: TextUnit = TextUnit.Unspecified, fontStyle: FontStyle? = null, @@ -60,11 +64,12 @@ fun Counter( AnimatedContent( targetState = digit, transitionSpec = { - if (count > oldCount) { - slideInVertically { -it } togetherWith slideOutVertically { it } + val contentTransform = if (count > oldCount) { + slideInVertically { -it } + fadeIn() togetherWith slideOutVertically { it } + fadeOut() } else { - slideInVertically { it } togetherWith slideOutVertically { -it } + slideInVertically { it } + fadeIn() togetherWith slideOutVertically { -it } + fadeOut() } + contentTransform.using(SizeTransform(clip)) }, label = "CounterAnimation$index" ) { diff --git a/app/src/main/java/de/westnordost/streetcomplete/ui/theme/Color.kt b/app/src/main/java/de/westnordost/streetcomplete/ui/theme/Color.kt index 84d32828c4..6e6828bbcc 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/ui/theme/Color.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/ui/theme/Color.kt @@ -19,18 +19,20 @@ val TrafficGrayA = Color(0xff8e9291) val TrafficGrayB = Color(0xff4f5250) /* Colors for the teams in team mode. */ -val Team0 = Color(0xfff44336) -val Team1 = Color(0xff529add) -val Team2 = Color(0xffffdd55) -val Team3 = Color(0xffca72e2) -val Team4 = Color(0xff9bbe55) -val Team5 = Color(0xfff4900c) -val Team6 = Color(0xff9aa0ad) -val Team7 = Color(0xff6390a0) -val Team8 = Color(0xffa07a43) -val Team9 = Color(0xff494EAD) -val Team10 = Color(0xffAA335D) -val Team11 = Color(0xff655555) +val TeamColors = arrayOf( + Color(0xfff44336), + Color(0xff529add), + Color(0xffffdd55), + Color(0xffca72e2), + Color(0xff9bbe55), + Color(0xfff4900c), + Color(0xff9aa0ad), + Color(0xff6390a0), + Color(0xffa07a43), + Color(0xff494EAD), + Color(0xffAA335D), + Color(0xff655555), +) val White = Color(0xffffffff) diff --git a/app/src/main/res/color/activated_tint_on_white.xml b/app/src/main/res/color/activated_tint_on_white.xml deleted file mode 100644 index 7b8a348789..0000000000 --- a/app/src/main/res/color/activated_tint_on_white.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-xxhdpi/team_mode.jpg b/app/src/main/res/drawable-xxhdpi/team_mode.jpg new file mode 100644 index 0000000000000000000000000000000000000000..134d48fec88a927e5780b7c201bf9477d5ccc3f1 GIT binary patch literal 272591 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
W}4z<(2A)e|Dh@wUu6Z9jYRI5kb( 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 GNdMVx3xnYR literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_animated_open_mail.xml b/app/src/main/res/drawable/ic_animated_open_mail.xml deleted file mode 100644 index 99c589c79f..0000000000 --- a/app/src/main/res/drawable/ic_animated_open_mail.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_location_navigation_searching_24dp.xml b/app/src/main/res/drawable/ic_location_navigation_searching_24dp.xml deleted file mode 100644 index 09e031b30d..0000000000 --- a/app/src/main/res/drawable/ic_location_navigation_searching_24dp.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_location_searching_24dp.xml b/app/src/main/res/drawable/ic_location_searching_24dp.xml deleted file mode 100644 index c72826d5ae..0000000000 --- a/app/src/main/res/drawable/ic_location_searching_24dp.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_location_state_24dp.xml b/app/src/main/res/drawable/ic_location_state_24dp.xml deleted file mode 100644 index fa457d1268..0000000000 --- a/app/src/main/res/drawable/ic_location_state_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_mail.xml b/app/src/main/res/drawable/ic_mail.xml deleted file mode 100644 index ba030afff0..0000000000 --- a/app/src/main/res/drawable/ic_mail.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_mail_front.xml b/app/src/main/res/drawable/ic_mail_front.xml deleted file mode 100644 index 18fbaa5569..0000000000 --- a/app/src/main/res/drawable/ic_mail_front.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/notification_background.xml b/app/src/main/res/drawable/notification_background.xml deleted file mode 100644 index d840c718b9..0000000000 --- a/app/src/main/res/drawable/notification_background.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/space_24dp.xml b/app/src/main/res/drawable/space_24dp.xml deleted file mode 100644 index 261afd38d1..0000000000 --- a/app/src/main/res/drawable/space_24dp.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 61d45832bb..dac26205c0 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,16 +11,4 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> - - - - diff --git a/app/src/main/res/layout/cell_team_mode_color_circle_select.xml b/app/src/main/res/layout/cell_team_mode_color_circle_select.xml deleted file mode 100644 index bacdb68c01..0000000000 --- a/app/src/main/res/layout/cell_team_mode_color_circle_select.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/dialog_main_menu.xml b/app/src/main/res/layout/dialog_main_menu.xml deleted file mode 100644 index d30f12765a..0000000000 --- a/app/src/main/res/layout/dialog_main_menu.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_team_mode.xml b/app/src/main/res/layout/dialog_team_mode.xml deleted file mode 100644 index e682b13757..0000000000 --- a/app/src/main/res/layout/dialog_team_mode.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 785c3ab6b1..bdfcd43412 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -13,20 +13,6 @@ tools:layout="@layout/fragment_map" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - -

I;q^!-u9mv+nNuidze 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 nTilGU(tC_x*G6vj7|;d0 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