Skip to content

Commit

Permalink
Merge pull request #13 from clemenceroumy/fix-wearos4
Browse files Browse the repository at this point in the history
WearOS 4 compatibility
  • Loading branch information
clemenceroumy committed Oct 27, 2023
2 parents e8a40a2 + 39d29bd commit af7d86f
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 50 deletions.
30 changes: 2 additions & 28 deletions .idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 7 additions & 5 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,16 @@ android {


dependencies {
val composeVersion = "1.5.1"
val wearComposeVersion = "1.2.0"
val composeVersion = "1.5.4"
val wearComposeVersion = "1.3.0-alpha08"
val hiltVersion = "2.46"
val hiltCoreVersion = "1.0.0"
val workVersion = "2.8.1"
val klockVersion = "3.4.0"
val roomVersion = "2.5.2"
val kotlinxVersion = "1.7.3"
val horlogistVersion = "0.5.0"
val accompanistVersion = "0.33.2-alpha"

// CORE
implementation("androidx.lifecycle:lifecycle-service:2.6.2")
Expand All @@ -96,22 +97,23 @@ dependencies {
implementation("com.google.android.gms:play-services-wearable:18.1.0")
implementation("androidx.wear:wear-input:1.2.0-alpha02")

// HORLOGIST
// HORLOGIST / ACCOMPANIST
implementation("com.google.android.horologist:horologist-compose-layout:$horlogistVersion")
implementation("com.google.accompanist:accompanist-permissions:$accompanistVersion")

// COMPOSE
debugImplementation("androidx.compose.ui:ui-tooling:$composeVersion")
debugImplementation("androidx.compose.ui:ui-test-manifest:$composeVersion")
implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion")
implementation(platform("androidx.compose:compose-bom:2023.08.00"))
implementation("androidx.activity:activity-compose:1.7.2")
implementation("androidx.activity:activity-compose:1.8.0")
implementation("androidx.compose.ui:ui:$composeVersion")
implementation("androidx.compose.material:material:$composeVersion")
implementation("androidx.compose.material:material-icons-extended:${composeVersion}")
implementation("androidx.wear.compose:compose-material:$wearComposeVersion")
implementation("androidx.wear.compose:compose-foundation:$wearComposeVersion")
implementation("androidx.wear.compose:compose-navigation:$wearComposeVersion")
implementation("androidx.navigation:navigation-compose:2.7.2")
implementation("androidx.compose.runtime:runtime:$composeVersion")
implementation("androidx.compose.animation:animation:${composeVersion}")

//HILT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavHostController
import androidx.wear.compose.material.SwipeToDismissBoxState
import androidx.wear.compose.material.rememberSwipeToDismissBoxState
import androidx.wear.compose.foundation.SwipeToDismissBoxState
import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState
import androidx.wear.compose.navigation.rememberSwipeDismissableNavController
import androidx.wear.compose.navigation.rememberSwipeDismissableNavHostState
import com.croumy.hltb_wearos.presentation.data.AppService
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.croumy.hltb_wearos.presentation.ui.addgame

import android.util.Log
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.ExitTransition
import androidx.compose.animation.core.FastOutLinearInEasing
Expand All @@ -21,15 +20,12 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.rotary.onRotaryScrollEvent
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalLifecycleOwner
Expand All @@ -40,10 +36,10 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.wear.compose.foundation.SwipeToDismissValue
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Picker
import androidx.wear.compose.material.Scaffold
import androidx.wear.compose.material.SwipeToDismissValue
import androidx.wear.compose.material.Text
import androidx.wear.compose.material.rememberPickerState
import com.croumy.hltb_wearos.presentation.LocalNavController
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.croumy.hltb_wearos.presentation.ui.components

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp
import androidx.wear.compose.material.Icon
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Text
import com.croumy.hltb_wearos.presentation.theme.Dimensions

@Composable
fun Button(
icon: ImageVector,
text: String,
onClick: () -> Unit
) {
Row(
modifier = Modifier
.background(MaterialTheme.colors.surface, CircleShape)
.clickable { onClick() }
.padding(vertical = Dimensions.xsPadding, horizontal = Dimensions.sPadding),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
icon,
contentDescription = "",
Modifier.size(15.dp)
)
Spacer(Modifier.width(Dimensions.xxsPadding))
Text(text = text, style = MaterialTheme.typography.body2)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.wear.compose.foundation.SwipeToDismissValue
import androidx.wear.compose.material.CircularProgressIndicator
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Scaffold
import androidx.wear.compose.material.SwipeToDismissValue
import androidx.wear.compose.material.Text
import androidx.wear.compose.material.TimeText
import com.croumy.hltb_wearos.presentation.LocalNavController
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.croumy.hltb_wearos.presentation.ui.startapp

import android.annotation.SuppressLint
import androidx.compose.animation.ExperimentalAnimationApi
import android.os.Build
import androidx.compose.foundation.layout.Arrangement
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.material.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
Expand All @@ -13,26 +16,35 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.lifecycleScope
import androidx.wear.compose.material.Scaffold
import com.croumy.hltb_wearos.presentation.ui.components.LoginItem
import androidx.wear.compose.material.Text
import com.croumy.hltb_wearos.presentation.helpers.Launcher
import com.croumy.hltb_wearos.presentation.models.Constants
import com.croumy.hltb_wearos.presentation.models.Constants.Companion.PHONE_CAPABILITY
import com.croumy.hltb_wearos.presentation.theme.Dimensions
import com.croumy.hltb_wearos.presentation.ui.components.LoginItem
import com.croumy.hltb_wearos.presentation.ui.startapp.components.DoingLogin
import com.croumy.hltb_wearos.presentation.ui.startapp.components.PhoneAppNotFound
import com.croumy.hltbwearos.R
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.rememberPermissionState
import com.google.android.gms.wearable.CapabilityClient
import com.google.android.gms.wearable.Wearable
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await

@OptIn(ExperimentalAnimationApi::class)
@OptIn(ExperimentalPermissionsApi::class)
@SuppressLint("RestrictedApi")
@Composable
fun StartApp(
Expand All @@ -45,6 +57,8 @@ fun StartApp(
val isLoggedIn = viewModel.appService.isLoggedIn.collectAsState()
val isLoggingIn = viewModel.appService.isLoggingIn.collectAsState()
val hasPhoneApp = remember { mutableStateOf(true) }
val notificationPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) rememberPermissionState(android.Manifest.permission.POST_NOTIFICATIONS) else null
val notificationDenied = remember { mutableStateOf(false) }

suspend fun checkConditions() {
//CHECK IF PHONE HAS APP INSTALLED
Expand All @@ -69,14 +83,24 @@ fun StartApp(
onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
}

LaunchedEffect(isLoggedIn.value) {
LaunchedEffect(isLoggedIn.value, notificationPermission?.status) {
// TRIGGERED WHEN MESSAGE RECEIVED FROM PHONE TO WATCH
if (isLoggedIn.value) {
if (isLoggedIn.value && isLoggingIn.value) {
delay(400) // TIME TO SHOW THE CHECK ICON
if (isLoggingIn.value) {
delay(400)
} // TIME TO SHOW THE CHECK ICON
if (notificationPermission == null || notificationPermission.status == PermissionStatus.Granted) {
viewModel.initWithUserData()
navigateToHome()
} else if (notificationPermission.status == PermissionStatus.Denied(true)) {
if(isLoggingIn.value) {
notificationDenied.value = true
delay(2000)
}
navigateToHome()
} else {
notificationPermission.launchPermissionRequest()
}
viewModel.initWithUserData()
navigateToHome()
}
}

Expand All @@ -99,7 +123,18 @@ fun StartApp(
}
)
} else {
DoingLogin(isLoggedIn.value, isLoggingIn.value, cancel = { viewModel.appService.isLoggingIn.value = false })
if (notificationDenied.value) {
Text(
text = stringResource(id = R.string.notifications_denied),
textAlign = TextAlign.Center,
modifier = Modifier.padding(Dimensions.sPadding)
)
CircularProgressIndicator(
color = Color.White,
strokeWidth = Dimensions.xsStrokeSize,
modifier = Modifier.size(Dimensions.sSize)
)
} else DoingLogin(isLoggedIn.value, isLoggingIn.value, cancel = { viewModel.appService.isLoggingIn.value = false })
}
}
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<string name="login_title">Sign in</string>
<string name="login_needed">You will be redirected to the phone app to sign into your HLTB account</string>
<string name="login_btn">Open on phone</string>
<string name="notifications_denied">As you refused notification, the app may behave inappropriately. To accept notification, go to your watch settings</string>

<string name="session_already_launched">1 session in progress</string>
<string name="session_error_upload">❗️Error uploading</string>
Expand Down

0 comments on commit af7d86f

Please sign in to comment.