mirror of
https://github.com/home-assistant/android
synced 2024-10-02 22:34:46 +00:00
Bump dependencies and make required changes (#2030)
* Bump dependencies and make required changes * Fix lint
This commit is contained in:
parent
b4185a7012
commit
afa092b3c0
|
@ -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")
|
||||
|
|
|
@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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?) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 = {}
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
{},
|
||||
{}
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue