This repository has been archived by the owner on Jul 24, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMappedInteractionSource.kt
64 lines (59 loc) · 2.39 KB
/
MappedInteractionSource.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
* Copyright 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.compose.material3
import androidx.compose.foundation.interaction.InteractionSource
import androidx.compose.foundation.interaction.PressInteraction
import androidx.compose.ui.geometry.Offset
import kotlinx.coroutines.flow.map
/**
* Adapts an [InteractionSource] from one component to another by mapping any interactions by a
* given offset. Namely used for the pill indicator in [NavigationBarItem] and [NavigationRailItem].
*/
internal class MappedInteractionSource(
underlyingInteractionSource: InteractionSource,
private val delta: Offset
) : InteractionSource {
private val mappedPresses =
mutableMapOf<PressInteraction.Press, PressInteraction.Press>()
override val interactions = underlyingInteractionSource.interactions.map { interaction ->
when (interaction) {
is PressInteraction.Press -> {
val mappedPress = mapPress(interaction)
mappedPresses[interaction] = mappedPress
mappedPress
}
is PressInteraction.Cancel -> {
val mappedPress = mappedPresses.remove(interaction.press)
if (mappedPress == null) {
interaction
} else {
PressInteraction.Cancel(mappedPress)
}
}
is PressInteraction.Release -> {
val mappedPress = mappedPresses.remove(interaction.press)
if (mappedPress == null) {
interaction
} else {
PressInteraction.Release(mappedPress)
}
}
else -> interaction
}
}
private fun mapPress(press: PressInteraction.Press): PressInteraction.Press =
PressInteraction.Press(press.pressPosition - delta)
}