diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 13b48b1..9e678d5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,6 @@ android { vectorDrawables { useSupportLibrary = true } - } buildTypes { @@ -37,6 +36,7 @@ android { } buildFeatures { compose = true + buildFeatures.buildConfig = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.11" diff --git a/app/src/main/java/dev/niro/cameraremote/ui/activities/MainActivity.kt b/app/src/main/java/dev/niro/cameraremote/ui/activities/MainActivity.kt index fbe7850..52cf689 100644 --- a/app/src/main/java/dev/niro/cameraremote/ui/activities/MainActivity.kt +++ b/app/src/main/java/dev/niro/cameraremote/ui/activities/MainActivity.kt @@ -5,13 +5,29 @@ import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.result.ActivityResultLauncher +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.wear.ambient.AmbientLifecycleObserver +import androidx.wear.compose.material.HorizontalPageIndicator +import androidx.wear.compose.material.PageIndicatorState +import androidx.wear.compose.material.Text +import androidx.wear.tooling.preview.devices.WearDevices import dev.niro.cameraremote.bluetooth.BluetoothController import dev.niro.cameraremote.bluetooth.helper.BluetoothPermission import dev.niro.cameraremote.interfaces.IAmbientModeState import dev.niro.cameraremote.ui.pages.RemoteLayout import dev.niro.cameraremote.ui.pages.RemotePage +import dev.niro.cameraremote.ui.pages.SettingsLayout class MainActivity : ComponentActivity(), AmbientLifecycleObserver.AmbientLifecycleCallback, IAmbientModeState { @@ -42,7 +58,7 @@ class MainActivity : ComponentActivity(), AmbientLifecycleObserver.AmbientLifecy } setContent { - RemoteLayout(permissionLauncher) + MainActivityLayout(permissionLauncher) } } @@ -64,4 +80,35 @@ class MainActivity : ComponentActivity(), AmbientLifecycleObserver.AmbientLifecy override fun isAmbientModeActive(): Boolean { return isInAmbientMode } +} + +@OptIn(ExperimentalFoundationApi::class) +@Preview(device = WearDevices.RECT, showSystemUi = true) +@Preview(device = WearDevices.SQUARE, showSystemUi = true) +@Preview(device = WearDevices.SMALL_ROUND, showSystemUi = true) +@Preview(device = WearDevices.LARGE_ROUND, showSystemUi = true) +@Composable +fun MainActivityLayout(permissionLauncher: ActivityResultLauncher? = null) { + val pagerState = rememberPagerState { 3 } + + HorizontalPager(state = pagerState) {page -> + when(page) { + 0 -> RemoteLayout(permissionLauncher) + 1 -> Text(text = "Devices List", modifier = Modifier.fillMaxSize()) + 2 -> SettingsLayout() + } + } + + val pageIndicatorState: PageIndicatorState = remember { + object : PageIndicatorState { + override val pageOffset: Float + get() = 0f + override val selectedPage: Int + get() = pagerState.currentPage + override val pageCount: Int + get() = pagerState.pageCount + } + } + + HorizontalPageIndicator(pageIndicatorState = pageIndicatorState, modifier = Modifier.padding(12.dp)) } \ No newline at end of file diff --git a/app/src/main/java/dev/niro/cameraremote/ui/pages/RemotePage.kt b/app/src/main/java/dev/niro/cameraremote/ui/pages/RemotePage.kt index 0b75a28..c112bd1 100644 --- a/app/src/main/java/dev/niro/cameraremote/ui/pages/RemotePage.kt +++ b/app/src/main/java/dev/niro/cameraremote/ui/pages/RemotePage.kt @@ -44,8 +44,8 @@ import dev.niro.cameraremote.ui.activities.ErrorActivity import kotlin.math.roundToInt object RemotePage { - val triggerButtonIcon = mutableIntStateOf(0) - val timerDelayText = mutableStateOf("") + val triggerButtonIcon = mutableIntStateOf(R.drawable.baseline_linked_camera_24) + val timerDelayText = mutableStateOf("0s") val modeTextDecoration = mutableStateOf(TextDecoration.None) val progressIndicator = mutableFloatStateOf(0f) diff --git a/app/src/main/java/dev/niro/cameraremote/ui/pages/SettingsPage.kt b/app/src/main/java/dev/niro/cameraremote/ui/pages/SettingsPage.kt new file mode 100644 index 0000000..a475eeb --- /dev/null +++ b/app/src/main/java/dev/niro/cameraremote/ui/pages/SettingsPage.kt @@ -0,0 +1,82 @@ +package dev.niro.cameraremote.ui.pages + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +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.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.wear.compose.foundation.lazy.ScalingLazyColumn +import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState +import androidx.wear.compose.material.PositionIndicator +import androidx.wear.compose.material.Switch +import androidx.wear.compose.material.Text +import androidx.wear.compose.material.ToggleChip +import androidx.wear.tooling.preview.devices.WearDevices +import dev.niro.cameraremote.BuildConfig +import dev.niro.cameraremote.R + +object SettingsPage { + + var vibrationEnabled = mutableStateOf(true) + +} + +@Preview(device = WearDevices.RECT, showSystemUi = true) +@Preview(device = WearDevices.SQUARE, showSystemUi = true) +@Preview(device = WearDevices.SMALL_ROUND, showSystemUi = true) +@Preview(device = WearDevices.LARGE_ROUND, showSystemUi = true) +@Composable +fun SettingsLayout() { + val scalingState = rememberScalingLazyListState() + + PositionIndicator(scalingLazyListState = scalingState) + + ScalingLazyColumn( + modifier = Modifier.fillMaxSize(), + state = scalingState + ) { + + item { + Text( + text = stringResource(id = R.string.settings), + textAlign = TextAlign.Center, + fontWeight = FontWeight.Bold, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + ) + } + + item { + var vibrationEnabled by remember { mutableStateOf(true) } + + ToggleChip( + checked = vibrationEnabled, + onCheckedChange = { vibrationEnabled = it }, + label = { Text(stringResource(id = R.string.vibration)) }, + toggleControl = { Switch(checked = vibrationEnabled) }, + modifier = Modifier.fillMaxWidth() + ) + } + + item { + Text( + text = "v${BuildConfig.VERSION_NAME}", + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + ) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/niro/cameraremote/utils/Vibrator.kt b/app/src/main/java/dev/niro/cameraremote/utils/Vibrator.kt index bbd3a4a..5076c96 100644 --- a/app/src/main/java/dev/niro/cameraremote/utils/Vibrator.kt +++ b/app/src/main/java/dev/niro/cameraremote/utils/Vibrator.kt @@ -4,14 +4,23 @@ import android.content.Context import android.os.Build import android.os.VibrationEffect import android.os.VibratorManager +import dev.niro.cameraremote.ui.pages.SettingsPage object Vibrator { fun tick(context: Context) { + if (!SettingsPage.vibrationEnabled.value) { + return + } + getVibrator(context).vibrate(VibrationEffect.createOneShot(50, 100)) } fun shoot(context: Context) { + if (!SettingsPage.vibrationEnabled.value) { + return + } + getVibrator(context).vibrate(VibrationEffect.createOneShot(100, 200)) } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 95cb720..b92abe2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -9,4 +9,6 @@ Kein Gerät verfügbar.\n\nVerbinden Sie ihr Smartphone über die Geräteeinstellungen. Diese App benötigt Zugriff auf die Bluetooth Schnittstelle dieser Smartwatch, um Signale an Ihr Smartphone zu versenden.\n\nBeim Auslesen der Bluetooth Schnittstelle können Geräte in der Nähe identifiziert werden. Sie haben die Bluetooth Berechtigung zu oft abgeleht.\n\nWenn Sie die App verwenden möchten, müssen Sie nun die Bluetooth Berechtigung in den Geräte Einstellungen für diese App aktivieren. + Einstellungen + Vibration \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1a3d33f..610c36a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,4 +9,6 @@ No devices available.\n\nConnect your phone over the device settings. This app requires access to the Bluetooth interface of this smartwatch in order to send signals to your smartphone.\n\nWhen reading out the Bluetooth interface, devices in the vicinity can be identified. You have rejected the Bluetooth permission too often.\n\nIf you want to use the app, you must now activate Bluetooth permission for this app in the device settings. + Settings + Vibration \ No newline at end of file