mirror of
https://github.com/permissionlesstech/bitchat-android.git
synced 2026-07-25 10:45:21 +00:00
Merge pull request #125 from moehamade/Triple-click-title-to-emergency-clear-all-data-executed-not-the-way-it-supposed-to-#105
Bugfix: Handled single or triple clicked at once instead of executing them as separate events
This commit is contained in:
@@ -0,0 +1,57 @@
|
|||||||
|
package com.bitchat.android.core.ui.utils
|
||||||
|
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.composed
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
fun Modifier.singleOrTripleClickable(
|
||||||
|
onSingleClick: () -> Unit,
|
||||||
|
onTripleClick: () -> Unit,
|
||||||
|
clickTimeThreshold: Long = 300L
|
||||||
|
): Modifier = composed {
|
||||||
|
var tapCount by remember { mutableIntStateOf(0) }
|
||||||
|
var lastTapTime by remember { mutableLongStateOf(0L) }
|
||||||
|
var singleClickJob by remember { mutableStateOf<kotlinx.coroutines.Job?>(null) }
|
||||||
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
|
this.clickable {
|
||||||
|
val currentTime = System.currentTimeMillis()
|
||||||
|
|
||||||
|
if (currentTime - lastTapTime < clickTimeThreshold) {
|
||||||
|
tapCount++
|
||||||
|
} else {
|
||||||
|
tapCount = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTapTime = currentTime
|
||||||
|
|
||||||
|
// Cancel any pending single click action
|
||||||
|
singleClickJob?.cancel()
|
||||||
|
singleClickJob = null
|
||||||
|
|
||||||
|
when (tapCount) {
|
||||||
|
1 -> {
|
||||||
|
// Wait to see if more taps come
|
||||||
|
singleClickJob = coroutineScope.launch {
|
||||||
|
delay(clickTimeThreshold)
|
||||||
|
if (tapCount == 1) {
|
||||||
|
onSingleClick()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
3 -> {
|
||||||
|
// Triple click detected - execute immediately
|
||||||
|
onTripleClick()
|
||||||
|
tapCount = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset after threshold if no triple click
|
||||||
|
if (tapCount > 3) {
|
||||||
|
tapCount = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@ import androidx.compose.ui.text.font.FontWeight
|
|||||||
import androidx.compose.ui.text.input.ImeAction
|
import androidx.compose.ui.text.input.ImeAction
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
|
import com.bitchat.android.core.ui.utils.singleOrTripleClickable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Header components for ChatScreen
|
* Header components for ChatScreen
|
||||||
@@ -148,7 +149,6 @@ fun ChatHeaderContent(
|
|||||||
onShowAppInfo: () -> Unit
|
onShowAppInfo: () -> Unit
|
||||||
) {
|
) {
|
||||||
val colorScheme = MaterialTheme.colorScheme
|
val colorScheme = MaterialTheme.colorScheme
|
||||||
var tripleClickCount by remember { mutableStateOf(0) }
|
|
||||||
|
|
||||||
when {
|
when {
|
||||||
selectedPrivatePeer != null -> {
|
selectedPrivatePeer != null -> {
|
||||||
@@ -181,15 +181,8 @@ fun ChatHeaderContent(
|
|||||||
MainHeader(
|
MainHeader(
|
||||||
nickname = nickname,
|
nickname = nickname,
|
||||||
onNicknameChange = viewModel::setNickname,
|
onNicknameChange = viewModel::setNickname,
|
||||||
onTitleClick = {
|
onTitleClick = onShowAppInfo,
|
||||||
tripleClickCount++
|
onTripleTitleClick = onTripleClick,
|
||||||
if (tripleClickCount >= 3) {
|
|
||||||
tripleClickCount = 0
|
|
||||||
onTripleClick()
|
|
||||||
} else {
|
|
||||||
onShowAppInfo()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSidebarClick = onSidebarClick,
|
onSidebarClick = onSidebarClick,
|
||||||
viewModel = viewModel
|
viewModel = viewModel
|
||||||
)
|
)
|
||||||
@@ -345,6 +338,7 @@ private fun MainHeader(
|
|||||||
nickname: String,
|
nickname: String,
|
||||||
onNicknameChange: (String) -> Unit,
|
onNicknameChange: (String) -> Unit,
|
||||||
onTitleClick: () -> Unit,
|
onTitleClick: () -> Unit,
|
||||||
|
onTripleTitleClick: () -> Unit,
|
||||||
onSidebarClick: () -> Unit,
|
onSidebarClick: () -> Unit,
|
||||||
viewModel: ChatViewModel
|
viewModel: ChatViewModel
|
||||||
) {
|
) {
|
||||||
@@ -365,7 +359,10 @@ private fun MainHeader(
|
|||||||
text = "bitchat*",
|
text = "bitchat*",
|
||||||
style = MaterialTheme.typography.headlineSmall,
|
style = MaterialTheme.typography.headlineSmall,
|
||||||
color = colorScheme.primary,
|
color = colorScheme.primary,
|
||||||
modifier = Modifier.clickable { onTitleClick() }
|
modifier = Modifier.singleOrTripleClickable(
|
||||||
|
onSingleClick = onTitleClick,
|
||||||
|
onTripleClick = onTripleTitleClick
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
Spacer(modifier = Modifier.width(8.dp))
|
Spacer(modifier = Modifier.width(8.dp))
|
||||||
|
|||||||
Reference in New Issue
Block a user