Bump dependencies and make required changes (#2030)

* Bump dependencies and make required changes

* Fix lint
This commit is contained in:
Daniel Shokouhi 2021-12-24 04:18:43 -08:00 committed by GitHub
parent b4185a7012
commit afa092b3c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 202 additions and 224 deletions

View file

@ -162,8 +162,8 @@ dependencies {
implementation("com.squareup.okhttp3:okhttp:4.9.3")
implementation("com.squareup.picasso:picasso:2.8")
"fullImplementation"("com.google.android.gms:play-services-location:18.0.0")
"fullImplementation"("com.google.firebase:firebase-core:20.0.0")
"fullImplementation"("com.google.android.gms:play-services-location:19.0.0")
"fullImplementation"("com.google.firebase:firebase-core:20.0.2")
"fullImplementation"("com.google.firebase:firebase-iid:21.1.0")
"fullImplementation"("com.google.firebase:firebase-messaging:23.0.0")
"fullImplementation"("io.sentry:sentry-android:5.5.2")
@ -187,8 +187,8 @@ dependencies {
implementation("androidx.compose.ui:ui:1.0.5")
implementation("androidx.compose.ui:ui-tooling:1.0.5")
implementation("androidx.activity:activity-compose:1.4.0")
implementation("androidx.navigation:navigation-compose:2.4.0-beta02")
implementation("com.google.android.material:compose-theme-adapter:1.1.0")
implementation("androidx.navigation:navigation-compose:2.4.0-rc01")
implementation("com.google.android.material:compose-theme-adapter:1.1.1")
implementation("com.google.accompanist:accompanist-appcompat-theme:0.20.3")
implementation("com.mikepenz:iconics-core:5.3.3")

View file

@ -91,18 +91,20 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
Log.d(TAG, "Received activity update.")
if (ActivityRecognitionResult.hasResult(intent)) {
val result = ActivityRecognitionResult.extractResult(intent)
var probActivity = typeToString(result.mostProbableActivity)
var probActivity = result?.let { typeToString(it.mostProbableActivity) }
if (probActivity == "on_foot")
probActivity = getSubActivity(result)
probActivity = result?.let { getSubActivity(it) }
onSensorUpdated(
context,
activity,
probActivity,
getSensorIcon(probActivity),
result.probableActivities.map { typeToString(it) to it.confidence }.toMap()
)
if (probActivity != null && result != null) {
onSensorUpdated(
context,
activity,
probActivity,
getSensorIcon(probActivity),
result.probableActivities.map { typeToString(it) to it.confidence }.toMap()
)
}
}
}

View file

@ -6,6 +6,7 @@ import android.content.Context
import android.content.Intent
import android.location.Location
import android.os.Build
import android.os.Looper
import android.os.PowerManager
import android.util.Log
import android.widget.Toast
@ -793,13 +794,13 @@ class LocationSensorManager : LocationSensorManagerBase() {
"HomeAssistant::AccurateLocation"
)?.apply { acquire(10 * 60 * 1000L /*10 minutes*/) }
var numberCalls = 0
override fun onLocationResult(locationResult: LocationResult?) {
override fun onLocationResult(locationResult: LocationResult) {
numberCalls++
Log.d(
TAG,
"Got single accurate location update: ${locationResult?.lastLocation}"
"Got single accurate location update: ${locationResult.lastLocation}"
)
if (locationResult == null) {
if (locationResult.equals(null)) {
Log.w(TAG, "No location provided.")
return
}
@ -828,7 +829,7 @@ class LocationSensorManager : LocationSensorManagerBase() {
}
}
},
null
Looper.getMainLooper()
)
}

View file

@ -55,9 +55,9 @@ dependencies {
implementation("com.google.dagger:hilt-android:2.40.5")
kapt("com.google.dagger:hilt-android-compiler:2.40.5")
api("androidx.room:room-runtime:2.3.0")
api("androidx.room:room-ktx:2.3.0")
kapt("androidx.room:room-compiler:2.3.0")
api("androidx.room:room-runtime:2.4.0")
api("androidx.room:room-ktx:2.4.0")
kapt("androidx.room:room-compiler:2.4.0")
api("androidx.work:work-runtime-ktx:2.7.1")

View file

@ -107,14 +107,14 @@ dependencies {
implementation("com.mikepenz:community-material-typeface:6.4.95.0-kotlin@aar")
implementation("com.mikepenz:iconics-compose:5.3.3")
implementation("androidx.activity:activity:1.4.0")
implementation("androidx.activity:activity-ktx:1.4.0")
implementation("androidx.activity:activity-compose:1.4.0")
implementation("androidx.compose.compiler:compiler:1.0.5")
implementation("androidx.compose.foundation:foundation:1.0.5")
implementation("androidx.compose.ui:ui-tooling:1.0.5")
implementation("androidx.wear.compose:compose-foundation:1.0.0-alpha11")
implementation("androidx.wear.compose:compose-material:1.0.0-alpha11")
implementation("androidx.wear.compose:compose-navigation:1.0.0-alpha11")
implementation("androidx.wear.compose:compose-foundation:1.0.0-alpha13")
implementation("androidx.wear.compose:compose-material:1.0.0-alpha13")
implementation("androidx.wear.compose:compose-navigation:1.0.0-alpha13")
implementation("com.google.guava:guava:31.0.1-android")
implementation("androidx.wear.tiles:tiles:1.0.0")

View file

@ -7,6 +7,7 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.wear.compose.material.ExperimentalWearMaterialApi
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.home.views.LoadHomePage
@ -32,6 +33,7 @@ class HomeActivity : ComponentActivity(), HomeView {
}
}
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@ExperimentalWearMaterialApi
override fun onCreate(savedInstanceState: Bundle?) {

View file

@ -11,10 +11,12 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@ -30,10 +32,11 @@ import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.data.SimplifiedEntity
import io.homeassistant.companion.android.home.MainViewModel
import io.homeassistant.companion.android.theme.WearAppTheme
import io.homeassistant.companion.android.util.RotaryEventState
import io.homeassistant.companion.android.util.getIcon
import io.homeassistant.companion.android.util.scrollHandler
import io.homeassistant.companion.android.common.R as commonR
@ExperimentalComposeUiApi
@Composable
fun ChooseEntityView(
mainViewModel: MainViewModel,
@ -48,12 +51,13 @@ fun ChooseEntityView(
var expandedSwitches: Boolean by rememberSaveable { mutableStateOf(true) }
val scalingLazyListState: ScalingLazyListState = rememberScalingLazyListState()
RotaryEventState(scrollState = scalingLazyListState)
LocalView.current.requestFocus()
WearAppTheme {
ScalingLazyColumn(
modifier = Modifier
.fillMaxSize(),
.fillMaxSize()
.scrollHandler(scalingLazyListState),
contentPadding = PaddingValues(
top = 24.dp,
start = 8.dp,

View file

@ -5,13 +5,12 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
@ -25,13 +24,12 @@ import androidx.wear.compose.material.Text
import androidx.wear.compose.material.rememberScalingLazyListState
import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.theme.WearAppTheme
import io.homeassistant.companion.android.util.LocalRotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventState
import io.homeassistant.companion.android.util.previewEntity1
import io.homeassistant.companion.android.util.previewEntity2
import io.homeassistant.companion.android.util.scrollHandler
import io.homeassistant.companion.android.common.R as commonR
@ExperimentalComposeUiApi
@Composable
fun EntityViewList(
entityLists: Map<Int, List<Entity<*>>>,
@ -49,12 +47,13 @@ fun EntityViewList(
}
val scalingLazyListState: ScalingLazyListState = rememberScalingLazyListState()
RotaryEventState(scrollState = scalingLazyListState)
LocalView.current.requestFocus()
WearAppTheme {
ScalingLazyColumn(
modifier = Modifier
.fillMaxSize(),
.fillMaxSize()
.scrollHandler(scalingLazyListState),
contentPadding = PaddingValues(
top = 24.dp,
start = 8.dp,
@ -111,20 +110,15 @@ fun EntityViewList(
}
}
@ExperimentalComposeUiApi
@ExperimentalWearMaterialApi
@Preview
@Composable
private fun PreviewEntityListView() {
val rotaryEventDispatcher = RotaryEventDispatcher()
CompositionLocalProvider(
LocalRotaryEventDispatcher provides rotaryEventDispatcher
) {
EntityViewList(
entityLists = mapOf(commonR.string.lights to listOf(previewEntity1, previewEntity2)),
onEntityClicked = { _, _ -> },
isHapticEnabled = false,
isToastEnabled = false
)
}
EntityViewList(
entityLists = mapOf(commonR.string.lights to listOf(previewEntity1, previewEntity2)),
onEntityClicked = { _, _ -> },
isHapticEnabled = false,
isToastEnabled = false
)
}

View file

@ -5,13 +5,14 @@ import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
@ -27,9 +28,6 @@ import io.homeassistant.companion.android.database.wear.Favorites
import io.homeassistant.companion.android.home.MainViewModel
import io.homeassistant.companion.android.theme.WearAppTheme
import io.homeassistant.companion.android.tiles.ShortcutsTile
import io.homeassistant.companion.android.util.LocalRotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventHandlerSetup
import io.homeassistant.companion.android.common.R as commonR
private const val SCREEN_LANDING = "landing"
@ -39,6 +37,7 @@ private const val SCREEN_SET_FAVORITES = "set_favorites"
private const val SCREEN_SET_TILE_SHORTCUTS = "set_tile_shortcuts"
private const val SCREEN_SELECT_TILE_SHORTCUT = "select_tile_shortcut"
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@ExperimentalWearMaterialApi
@Composable
@ -47,8 +46,7 @@ fun LoadHomePage(
) {
var shortcutEntitySelectionIndex: Int by remember { mutableStateOf(0) }
val context = LocalContext.current
val rotaryEventDispatcher = RotaryEventDispatcher()
LocalView.current.requestFocus()
WearAppTheme {
if (mainViewModel.entities.isNullOrEmpty() && mainViewModel.favoriteEntityIds.isNullOrEmpty()) {
@ -75,90 +73,85 @@ fun LoadHomePage(
swipeDismissableNavController.popBackStack()
}
}
CompositionLocalProvider(
LocalRotaryEventDispatcher provides rotaryEventDispatcher
SwipeDismissableNavHost(
navController = swipeDismissableNavController,
startDestination = SCREEN_LANDING
) {
RotaryEventHandlerSetup(rotaryEventDispatcher)
SwipeDismissableNavHost(
navController = swipeDismissableNavController,
startDestination = SCREEN_LANDING
) {
composable(SCREEN_LANDING) {
MainView(
mainViewModel,
mainViewModel.favoriteEntityIds,
{ id, state -> mainViewModel.toggleEntity(id, state) },
{ swipeDismissableNavController.navigate(SCREEN_SETTINGS) },
{
mainViewModel.entityLists.clear()
mainViewModel.entityLists.putAll(it)
swipeDismissableNavController.navigate(SCREEN_ENTITY_LIST)
},
mainViewModel.isHapticEnabled.value,
mainViewModel.isToastEnabled.value,
{ id -> mainViewModel.removeFavorites(id) }
)
}
composable(SCREEN_ENTITY_LIST) {
EntityViewList(
entityLists = mainViewModel.entityLists,
onEntityClicked =
{ entityId, state ->
mainViewModel.toggleEntity(entityId, state)
},
isHapticEnabled = mainViewModel.isHapticEnabled.value,
isToastEnabled = mainViewModel.isToastEnabled.value
)
}
composable(SCREEN_SETTINGS) {
SettingsView(
mainViewModel.favoriteEntityIds,
{ swipeDismissableNavController.navigate(SCREEN_SET_FAVORITES) },
{ mainViewModel.clearFavorites() },
{ swipeDismissableNavController.navigate(SCREEN_SET_TILE_SHORTCUTS) },
{ mainViewModel.logout() },
mainViewModel.isHapticEnabled.value,
mainViewModel.isToastEnabled.value,
{ mainViewModel.setHapticEnabled(it) },
{ mainViewModel.setToastEnabled(it) }
)
}
composable(SCREEN_SET_FAVORITES) {
SetFavoritesView(
mainViewModel,
mainViewModel.favoriteEntityIds
) { entityId, position, isSelected ->
val favorites = Favorites(entityId, position)
if (isSelected) {
mainViewModel.addFavorites(favorites)
} else {
mainViewModel.removeFavorites(entityId)
}
composable(SCREEN_LANDING) {
MainView(
mainViewModel,
mainViewModel.favoriteEntityIds,
{ id, state -> mainViewModel.toggleEntity(id, state) },
{ swipeDismissableNavController.navigate(SCREEN_SETTINGS) },
{
mainViewModel.entityLists.clear()
mainViewModel.entityLists.putAll(it)
swipeDismissableNavController.navigate(SCREEN_ENTITY_LIST)
},
mainViewModel.isHapticEnabled.value,
mainViewModel.isToastEnabled.value,
{ id -> mainViewModel.removeFavorites(id) }
)
}
composable(SCREEN_ENTITY_LIST) {
EntityViewList(
entityLists = mainViewModel.entityLists,
onEntityClicked =
{ entityId, state ->
mainViewModel.toggleEntity(entityId, state)
},
isHapticEnabled = mainViewModel.isHapticEnabled.value,
isToastEnabled = mainViewModel.isToastEnabled.value
)
}
composable(SCREEN_SETTINGS) {
SettingsView(
mainViewModel.favoriteEntityIds,
{ swipeDismissableNavController.navigate(SCREEN_SET_FAVORITES) },
{ mainViewModel.clearFavorites() },
{ swipeDismissableNavController.navigate(SCREEN_SET_TILE_SHORTCUTS) },
{ mainViewModel.logout() },
mainViewModel.isHapticEnabled.value,
mainViewModel.isToastEnabled.value,
{ mainViewModel.setHapticEnabled(it) },
{ mainViewModel.setToastEnabled(it) }
)
}
composable(SCREEN_SET_FAVORITES) {
SetFavoritesView(
mainViewModel,
mainViewModel.favoriteEntityIds
) { entityId, position, isSelected ->
val favorites = Favorites(entityId, position)
if (isSelected) {
mainViewModel.addFavorites(favorites)
} else {
mainViewModel.removeFavorites(entityId)
}
}
composable(SCREEN_SET_TILE_SHORTCUTS) {
SetTileShortcutsView(
mainViewModel.shortcutEntities
) {
shortcutEntitySelectionIndex = it
swipeDismissableNavController.navigate(SCREEN_SELECT_TILE_SHORTCUT)
}
composable(SCREEN_SET_TILE_SHORTCUTS) {
SetTileShortcutsView(
mainViewModel.shortcutEntities
) {
shortcutEntitySelectionIndex = it
swipeDismissableNavController.navigate(SCREEN_SELECT_TILE_SHORTCUT)
}
}
composable(SCREEN_SELECT_TILE_SHORTCUT) {
ChooseEntityView(
mainViewModel,
{
mainViewModel.clearTileShortcut(shortcutEntitySelectionIndex)
TileService.getUpdater(context).requestUpdate(ShortcutsTile::class.java)
swipeDismissableNavController.navigateUp()
},
{ entity ->
mainViewModel.setTileShortcut(shortcutEntitySelectionIndex, entity)
TileService.getUpdater(context).requestUpdate(ShortcutsTile::class.java)
swipeDismissableNavController.navigateUp()
}
}
composable(SCREEN_SELECT_TILE_SHORTCUT) {
ChooseEntityView(
mainViewModel,
{
mainViewModel.clearTileShortcut(shortcutEntitySelectionIndex)
TileService.getUpdater(context).requestUpdate(ShortcutsTile::class.java)
swipeDismissableNavController.navigateUp()
},
{ entity ->
mainViewModel.setTileShortcut(shortcutEntitySelectionIndex, entity)
TileService.getUpdater(context).requestUpdate(ShortcutsTile::class.java)
swipeDismissableNavController.navigateUp()
}
)
}
)
}
}
}

View file

@ -13,11 +13,13 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@ -37,12 +39,12 @@ import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.home.MainViewModel
import io.homeassistant.companion.android.theme.WearAppTheme
import io.homeassistant.companion.android.theme.wearColorPalette
import io.homeassistant.companion.android.util.RotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventState
import io.homeassistant.companion.android.util.getIcon
import io.homeassistant.companion.android.util.onEntityClickedFeedback
import io.homeassistant.companion.android.util.scrollHandler
import io.homeassistant.companion.android.common.R as commonR
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@ExperimentalWearMaterialApi
@Composable
@ -62,8 +64,7 @@ fun MainView(
val haptic = LocalHapticFeedback.current
val context = LocalContext.current
RotaryEventDispatcher(scalingLazyListState)
RotaryEventState(scrollState = scalingLazyListState)
LocalView.current.requestFocus()
WearAppTheme {
Scaffold(
@ -75,7 +76,8 @@ fun MainView(
) {
ScalingLazyColumn(
modifier = Modifier
.fillMaxSize(),
.fillMaxSize()
.scrollHandler(scalingLazyListState),
contentPadding = PaddingValues(
top = 24.dp,
start = 8.dp,

View file

@ -10,9 +10,11 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.wear.compose.material.ExperimentalWearMaterialApi
@ -30,10 +32,11 @@ import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.home.MainViewModel
import io.homeassistant.companion.android.theme.WearAppTheme
import io.homeassistant.companion.android.theme.wearColorPalette
import io.homeassistant.companion.android.util.RotaryEventState
import io.homeassistant.companion.android.util.getIcon
import io.homeassistant.companion.android.util.scrollHandler
import io.homeassistant.companion.android.common.R as commonR
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@ExperimentalWearMaterialApi
@Composable
@ -50,7 +53,7 @@ fun SetFavoritesView(
var expandedSwitches: Boolean by rememberSaveable { mutableStateOf(true) }
val scalingLazyListState: ScalingLazyListState = rememberScalingLazyListState()
RotaryEventState(scrollState = scalingLazyListState)
LocalView.current.requestFocus()
WearAppTheme {
Scaffold(
@ -62,7 +65,8 @@ fun SetFavoritesView(
) {
ScalingLazyColumn(
modifier = Modifier
.fillMaxSize(),
.fillMaxSize()
.scrollHandler(scalingLazyListState),
contentPadding = PaddingValues(
top = 24.dp,
start = 8.dp,

View file

@ -6,12 +6,13 @@ 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.CompositionLocalProvider
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
@ -28,14 +29,12 @@ import com.mikepenz.iconics.compose.Image
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import io.homeassistant.companion.android.data.SimplifiedEntity
import io.homeassistant.companion.android.theme.WearAppTheme
import io.homeassistant.companion.android.util.LocalRotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventHandlerSetup
import io.homeassistant.companion.android.util.RotaryEventState
import io.homeassistant.companion.android.util.getIcon
import io.homeassistant.companion.android.util.scrollHandler
import io.homeassistant.companion.android.util.simplifiedEntity
import io.homeassistant.companion.android.common.R as commonR
@ExperimentalComposeUiApi
@Composable
fun SetTileShortcutsView(
shortcutEntities: MutableList<SimplifiedEntity>,
@ -43,12 +42,13 @@ fun SetTileShortcutsView(
) {
val scalingLazyListState: ScalingLazyListState = rememberScalingLazyListState()
RotaryEventState(scrollState = scalingLazyListState)
LocalView.current.requestFocus()
WearAppTheme {
ScalingLazyColumn(
modifier = Modifier
.fillMaxSize(),
.fillMaxSize()
.scrollHandler(scalingLazyListState),
contentPadding = PaddingValues(
top = 24.dp,
start = 8.dp,
@ -112,17 +112,12 @@ fun SetTileShortcutsView(
}
}
@ExperimentalComposeUiApi
@Preview
@Composable
private fun PreviewSetTileShortcutsView() {
val rotaryEventDispatcher = RotaryEventDispatcher()
CompositionLocalProvider(
LocalRotaryEventDispatcher provides rotaryEventDispatcher
) {
RotaryEventHandlerSetup(rotaryEventDispatcher)
SetTileShortcutsView(
shortcutEntities = mutableListOf(simplifiedEntity),
onShortcutEntitySelectionChange = {}
)
}
SetTileShortcutsView(
shortcutEntities = mutableListOf(simplifiedEntity),
onShortcutEntitySelectionChange = {}
)
}

View file

@ -6,13 +6,14 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@ -30,12 +31,11 @@ import com.mikepenz.iconics.compose.Image
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import io.homeassistant.companion.android.theme.WearAppTheme
import io.homeassistant.companion.android.theme.wearColorPalette
import io.homeassistant.companion.android.util.LocalRotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventDispatcher
import io.homeassistant.companion.android.util.RotaryEventState
import io.homeassistant.companion.android.util.previewFavoritesList
import io.homeassistant.companion.android.util.scrollHandler
import io.homeassistant.companion.android.common.R as commonR
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@ExperimentalWearMaterialApi
@Composable
@ -51,7 +51,7 @@ fun SettingsView(
onToastEnabled: (Boolean) -> Unit
) {
val scalingLazyListState: ScalingLazyListState = rememberScalingLazyListState()
RotaryEventState(scrollState = scalingLazyListState)
LocalView.current.requestFocus()
WearAppTheme {
Scaffold(
@ -63,7 +63,8 @@ fun SettingsView(
) {
ScalingLazyColumn(
modifier = Modifier
.fillMaxSize(),
.fillMaxSize()
.scrollHandler(scalingLazyListState),
contentPadding = PaddingValues(
top = 24.dp,
start = 8.dp,
@ -229,26 +230,21 @@ fun SettingsView(
}
}
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@ExperimentalWearMaterialApi
@Preview
@Composable
private fun PreviewSettingsView() {
val rotaryEventDispatcher = RotaryEventDispatcher()
CompositionLocalProvider(
LocalRotaryEventDispatcher provides rotaryEventDispatcher
) {
SettingsView(
favorites = previewFavoritesList,
onClickSetFavorites = { /*TODO*/ },
onClearFavorites = {},
onClickSetShortcuts = {},
onClickLogout = {},
isHapticEnabled = true,
isToastEnabled = false,
{},
{}
)
}
SettingsView(
favorites = previewFavoritesList,
onClickSetFavorites = { /*TODO*/ },
onClearFavorites = {},
onClickSetShortcuts = {},
onClickLogout = {},
isHapticEnabled = true,
isToastEnabled = false,
{},
{}
)
}

View file

@ -1,62 +1,47 @@
package io.homeassistant.companion.android.util
import android.os.Build
import android.view.MotionEvent
import android.view.ViewConfiguration
import androidx.compose.foundation.gestures.ScrollableState
import androidx.compose.foundation.gestures.scrollBy
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.input.pointer.RequestDisallowInterceptTouchEvent
import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.core.view.InputDeviceCompat
import androidx.core.view.MotionEventCompat
import androidx.core.view.ViewConfigurationCompat
import kotlinx.coroutines.launch
val LocalRotaryEventDispatcher = staticCompositionLocalOf<RotaryEventDispatcher> {
noLocalProvidedFor("LocalRotaryEventDispatcher")
}
class RotaryEventDispatcher(
var scrollState: ScrollableState? = null
) {
suspend fun onRotate(delta: Float): Float? =
scrollState?.scrollBy(delta)
}
@Composable
fun RotaryEventHandlerSetup(rotaryEventDispatcher: RotaryEventDispatcher) {
val view = LocalView.current
@ExperimentalComposeUiApi
fun Modifier.scrollHandler(scrollState: ScrollableState): Modifier = composed {
val context = LocalContext.current
val scope = rememberCoroutineScope()
view.requestFocus()
view.setOnGenericMotionListener { _, event ->
if (event?.action != MotionEvent.ACTION_SCROLL || !event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)) {
return@setOnGenericMotionListener false
val scaledVerticalScrollFactor =
remember {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ViewConfiguration.get(context).scaledVerticalScrollFactor
} else {
ViewConfiguration::class.java.getDeclaredMethod("getScaledScrollFactor").toString().toFloat()
}
}
val delta = -event.getAxisValue(MotionEventCompat.AXIS_SCROLL) * ViewConfigurationCompat.getScaledVerticalScrollFactor(
ViewConfiguration.get(context), context
)
scope.launch {
rotaryEventDispatcher.onRotate(delta)
this.pointerInteropFilter(RequestDisallowInterceptTouchEvent()) { event ->
if (event.action != MotionEvent.ACTION_SCROLL ||
!event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
) {
false
} else {
val delta = -event.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
scaledVerticalScrollFactor
scope.launch {
scrollState.scrollBy(delta)
}
true
}
true
}
}
@Composable
fun RotaryEventState(scrollState: ScrollableState?) {
val dispater = LocalRotaryEventDispatcher.current
SideEffect {
dispater.scrollState = scrollState
}
}
private fun noLocalProvidedFor(noOp: String): Nothing {
error("composition local $noOp not present")
}