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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import com.lasthopesoftware.bluewater.shared.messages.application.ApplicationMes
import com.lasthopesoftware.bluewater.shared.messages.application.RegisterForApplicationMessages
import com.lasthopesoftware.bluewater.shared.messages.application.SendApplicationMessages
import com.lasthopesoftware.bluewater.shared.messages.application.getScopedMessageBus
import com.lasthopesoftware.bluewater.tutorials.AndroidOpennessWarningViewModel
import com.lasthopesoftware.bluewater.tutorials.TutorialManager
import com.lasthopesoftware.resources.closables.ViewModelCloseableManager
import com.lasthopesoftware.resources.uri.DocumentUriSelector

Expand Down Expand Up @@ -133,4 +135,7 @@ class ActivityDependencies(
activity.contentResolver
)
}
override val androidOpennessWarningViewModel by activity.buildViewModelLazily {
AndroidOpennessWarningViewModel(TutorialManager(activity))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ import com.lasthopesoftware.bluewater.exceptions.UncaughtExceptionHandlerLogger
import com.lasthopesoftware.bluewater.settings.ApplicationSettingsView
import com.lasthopesoftware.bluewater.settings.hidden.HiddenSettingsView
import com.lasthopesoftware.bluewater.shared.android.viewmodels.ViewModelInitAction
import com.lasthopesoftware.bluewater.tutorials.AndroidOpennessWarningDialog
import com.lasthopesoftware.observables.subscribeAsState
import com.lasthopesoftware.policies.ratelimiting.RateLimitingExecutionPolicy
import com.lasthopesoftware.promises.extensions.suspend
Expand Down Expand Up @@ -840,6 +841,7 @@ fun ResponsiveApplication(
applicationSettingsViewModel = routedNavigationDependencies.applicationSettingsViewModel,
applicationNavigation = routedNavigationDependencies.applicationNavigation,
playbackService = routedNavigationDependencies.playbackServiceController,
stringResources = routedNavigationDependencies.stringResources,
)
}

Expand Down Expand Up @@ -873,6 +875,8 @@ fun ResponsiveApplication(
routedNavigationDependencies.hiddenSettingsViewModel.loadApplicationSettings()
}
}

AndroidOpennessWarningDialog(entryDependencies.androidOpennessWarningViewModel)
}

val isCheckingConnection by connectionStatusViewModel.isGettingConnection.subscribeAsState()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import com.lasthopesoftware.bluewater.settings.hidden.HiddenSettingsViewModel
import com.lasthopesoftware.bluewater.shared.android.messages.ViewModelMessageBus
import com.lasthopesoftware.bluewater.shared.messages.RegisterForTypedMessages
import com.lasthopesoftware.bluewater.shared.messages.SendTypedMessages
import com.lasthopesoftware.bluewater.tutorials.AndroidOpennessWarningViewModel

interface EntryDependencies : ApplicationDependencies {
val applicationViewModel: ManageApplicationPropertyState
Expand All @@ -33,6 +34,7 @@ interface EntryDependencies : ApplicationDependencies {
val applicationSettingsViewModel: ApplicationSettingsViewModel
val hiddenSettingsViewModel: HiddenSettingsViewModel
val userSslCertificateProvider: ProvideUserSslCertificates
val androidOpennessWarningViewModel: AndroidOpennessWarningViewModel
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ private fun CustomHeadersList(
) {
ProvideTextStyle(MaterialTheme.typography.h5) {
Text(
text = "Edit Header",
text = stringResource(R.string.edit_header),
modifier = Modifier
.weight(1f)
.align(Alignment.CenterVertically),
Expand Down Expand Up @@ -342,14 +342,18 @@ private fun CustomHeadersList(
value = editingHeaderKey,
placeholder = stringResource(R.string.header),
onValueChange = { editingHeaderKey = it },
modifier = Modifier.focusRequester(fieldFocusRequester).padding(vertical = verticalPadding),
modifier = Modifier
.focusRequester(fieldFocusRequester)
.padding(vertical = verticalPadding),
)

StandardTextField(
value = editingHeaderValue,
placeholder = stringResource(R.string.value),
onValueChange = { editingHeaderValue = it },
modifier = Modifier.focusRequester(fieldFocusRequester).padding(vertical = verticalPadding),
modifier = Modifier
.focusRequester(fieldFocusRequester)
.padding(vertical = verticalPadding),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package com.lasthopesoftware.bluewater.settings

import VerticalHeaderScaffold
import android.content.Intent
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
Expand Down Expand Up @@ -58,6 +59,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.LocalResources
Expand All @@ -67,6 +69,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.core.net.toUri
import com.lasthopesoftware.bluewater.BuildConfig
import com.lasthopesoftware.bluewater.NavigateApplication
import com.lasthopesoftware.bluewater.R
Expand All @@ -93,6 +96,7 @@ import com.lasthopesoftware.observables.subscribeAsState
import com.lasthopesoftware.promises.extensions.preparePromise
import com.lasthopesoftware.promises.extensions.toState
import com.lasthopesoftware.resources.executors.ThreadPools
import com.lasthopesoftware.resources.strings.GetStringResources
import com.mikepenz.markdown.m2.Markdown
import kotlinx.coroutines.flow.first

Expand Down Expand Up @@ -224,10 +228,11 @@ fun ThemeSettingsSection(

@Composable
fun AboutApplication(
stringResources: GetStringResources,
playbackService: ControlPlaybackService,
) {
SettingsSection(
headerText = stringResource(id = R.string.title_activity_about, stringResource(R.string.app_name)),
headerText = stringResources.aboutTitle,
headerModifier = standardRowModifier,
modifier = Modifier.fillMaxWidth(),
) {
Expand All @@ -238,6 +243,43 @@ fun AboutApplication(
)
}

SettingsSection(
headerText = stringResource(id = R.string.keep_android_open),
headerModifier = standardRowModifier,
modifier = Modifier.fillMaxWidth(),
) {
Markdown(stringResource(R.string.side_loading_warning))

Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
) {
val context = LocalContext.current
Button(
onClick = {
context
.startActivity(Intent(
Intent.ACTION_VIEW,
"https://keepandroidopen.org".toUri()
))
},
) {
Text(text = stringResource(R.string.more_info))
}
Button(
onClick = {
context
.startActivity(Intent(
Intent.ACTION_VIEW,
"https://github.com/woheller69/FreeDroidWarn?tab=readme-ov-file#solutions".toUri()
))
},
) {
Text(text = stringResource(R.string.solutions))
}
}
}

SettingsSection(
headerText = stringResource(id = R.string.acknowledgements_title),
headerModifier = standardRowModifier,
Expand Down Expand Up @@ -269,7 +311,6 @@ fun AboutApplication(
@Composable
private fun SettingsList(
applicationSettingsViewModel: ApplicationSettingsViewModel,
playbackService: ControlPlaybackService,
) {
val isLoading by applicationSettingsViewModel.isLoading.subscribeAsState()
SettingsSection(
Expand Down Expand Up @@ -307,8 +348,6 @@ private fun SettingsList(
AudioSettingsSection(applicationSettingsViewModel)

ThemeSettingsSection(applicationSettingsViewModel)

AboutApplication(playbackService)
}

@Composable
Expand Down Expand Up @@ -353,6 +392,7 @@ fun ServersList(
fun ApplicationSettingsMenu(
applicationSettingsViewModel: ApplicationSettingsViewModel,
applicationNavigation: NavigateApplication,
stringResources: GetStringResources,
selectedLibraryId: LibraryId?,
modifier: Modifier = Modifier,
onTabChange: (() -> Unit)? = null,
Expand All @@ -379,30 +419,30 @@ fun ApplicationSettingsMenu(
enabled = selectedTab != ApplicationSettingsViewModel.SelectedTab.ViewServers
)

val settingsButtonLabel = stringResource(R.string.application_settings)
val addServerButtonLabel = stringResource(R.string.btn_add_server)
ColumnMenuIcon(
onClick = {
selectedTab = ApplicationSettingsViewModel.SelectedTab.ViewSettings
onTabChange?.invoke()
applicationNavigation.viewNewServerSettings()
},
iconPainter = painterResource(id = R.drawable.ic_action_settings),
contentDescription = settingsButtonLabel,
label = settingsButtonLabel,
iconPainter = painterResource(id = R.drawable.ic_add_item_36dp),
contentDescription = addServerButtonLabel,
label = addServerButtonLabel,
labelMaxLines = 2,
modifier = modifier,
enabled = selectedTab != ApplicationSettingsViewModel.SelectedTab.ViewSettings
)

val addServerButtonLabel = stringResource(R.string.btn_add_server)
val settingsButtonLabel = stringResource(R.string.application_settings)
ColumnMenuIcon(
onClick = {
applicationNavigation.viewNewServerSettings()
selectedTab = ApplicationSettingsViewModel.SelectedTab.ViewSettings
onTabChange?.invoke()
},
iconPainter = painterResource(id = R.drawable.ic_add_item_36dp),
contentDescription = addServerButtonLabel,
label = addServerButtonLabel,
iconPainter = painterResource(id = R.drawable.ic_action_settings),
contentDescription = settingsButtonLabel,
label = settingsButtonLabel,
labelMaxLines = 2,
modifier = modifier,
enabled = selectedTab != ApplicationSettingsViewModel.SelectedTab.ViewSettings
)

val connectText = stringResource(R.string.active_server)
Expand All @@ -417,6 +457,20 @@ fun ApplicationSettingsMenu(
labelMaxLines = 2,
enabled = selectedLibraryId != null
)

val aboutLabel = stringResources.aboutTitle
ColumnMenuIcon(
onClick = {
selectedTab = ApplicationSettingsViewModel.SelectedTab.ViewApplicationInformation
onTabChange?.invoke()
},
iconPainter = painterResource(id = R.drawable.information_outline_36dp),
contentDescription = aboutLabel,
label = aboutLabel,
labelMaxLines = 2,
modifier = modifier,
enabled = selectedTab != ApplicationSettingsViewModel.SelectedTab.ViewApplicationInformation
)
}
}

Expand All @@ -425,6 +479,7 @@ private fun ApplicationSettingsViewVertical(
applicationSettingsViewModel: ApplicationSettingsViewModel,
applicationNavigation: NavigateApplication,
playbackService: ControlPlaybackService,
stringResources: GetStringResources,
) {
val minHeaderHeight = LocalDensity.current.remember { Dimensions.appBarHeight.toPx() }
val headerScaler = ConsumableConnectedScaler.remember(minHeaderHeight)
Expand Down Expand Up @@ -502,9 +557,10 @@ private fun ApplicationSettingsViewVertical(
.clipToBounds()
) {
ApplicationSettingsMenu(
applicationSettingsViewModel,
applicationSettingsViewModel = applicationSettingsViewModel,
applicationNavigation = applicationNavigation,
selectedLibraryId = selectedLibraryId,
stringResources = stringResources,
modifier = Modifier
.graphicsLayer {
translationY = (menuHeightPx - expandedMenuHeightPx) * 0.5f
Expand Down Expand Up @@ -534,7 +590,10 @@ private fun ApplicationSettingsViewVertical(
)
ApplicationSettingsViewModel.SelectedTab.ViewSettings -> SettingsList(
applicationSettingsViewModel,
playbackService
)
ApplicationSettingsViewModel.SelectedTab.ViewApplicationInformation -> AboutApplication(
stringResources,
playbackService,
)
}
}
Expand All @@ -550,6 +609,7 @@ private fun BoxWithConstraintsScope.ApplicationSettingsViewHorizontal(
applicationSettingsViewModel: ApplicationSettingsViewModel,
applicationNavigation: NavigateApplication,
playbackService: ControlPlaybackService,
stringResources: GetStringResources,
) {
Row(
modifier = Modifier.fillMaxSize(),
Expand Down Expand Up @@ -585,9 +645,10 @@ private fun BoxWithConstraintsScope.ApplicationSettingsViewHorizontal(
)

ApplicationSettingsMenu(
applicationSettingsViewModel,
applicationSettingsViewModel = applicationSettingsViewModel,
applicationNavigation = applicationNavigation,
selectedLibraryId = selectedLibraryId,
stringResources = stringResources,
modifier = Modifier
.fillMaxWidth()
.height(expandedMenuHeight)
Expand All @@ -612,7 +673,10 @@ private fun BoxWithConstraintsScope.ApplicationSettingsViewHorizontal(
)
ApplicationSettingsViewModel.SelectedTab.ViewSettings -> SettingsList(
applicationSettingsViewModel,
playbackService
)
ApplicationSettingsViewModel.SelectedTab.ViewApplicationInformation -> AboutApplication(
stringResources,
playbackService,
)
}
}
Expand All @@ -624,6 +688,7 @@ fun ApplicationSettingsView(
applicationSettingsViewModel: ApplicationSettingsViewModel,
applicationNavigation: NavigateApplication,
playbackService: ControlPlaybackService,
stringResources: GetStringResources,
) {
Box(modifier = Modifier
.fillMaxSize()
Expand Down Expand Up @@ -657,11 +722,13 @@ fun ApplicationSettingsView(
if (maxWidth < maxHeight) ApplicationSettingsViewVertical(
applicationSettingsViewModel,
applicationNavigation,
playbackService
playbackService,
stringResources,
) else ApplicationSettingsViewHorizontal(
applicationSettingsViewModel,
applicationNavigation,
playbackService
playbackService,
stringResources,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class ApplicationSettingsViewModel(
) : ViewModel(), TrackLoadedViewState, ImmediateAction
{
enum class SelectedTab {
ViewServers, ViewSettings
ViewServers, ViewSettings, ViewApplicationInformation
}

private val mutableLibraries = MutableInteractionState(emptyList<Pair<LibraryId, String>>())
Expand Down
Loading
Loading