From 2412f6c454c0957a2d2170cbbb52e1e561cd9079 Mon Sep 17 00:00:00 2001 From: David Jia Date: Thu, 12 Oct 2023 10:39:07 -0700 Subject: [PATCH 1/2] MultipleEventCutter --- .../feature/preview/MultipleEventCutter.kt | 34 +++++++++++++++++++ .../feature/preview/PreviewScreen.kt | 5 ++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt diff --git a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt new file mode 100644 index 000000000..15024c74f --- /dev/null +++ b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2023 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 com.google.jetpackcamera.feature.preview + +/** + * A helper class that prevents multiple clicks. + */ +internal class MultipleEventsCutter { + private val now: Long + get() = System.currentTimeMillis() + + private var lastEventTimeMs: Long = 0 + + fun processEvent(event: () -> Unit) { + if (now - lastEventTimeMs >= 300L) { + event.invoke() + } + lastEventTimeMs = now + } +} diff --git a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt index 48e8c8488..efd7d3ed9 100644 --- a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt +++ b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt @@ -195,9 +195,12 @@ fun PreviewScreen( ) } } + val multipleEventsCutter = remember { MultipleEventsCutter() } /*todo: close quick settings on start record/image capture*/ CaptureButton( - onClick = { viewModel.captureImage() }, + onClick = { + multipleEventsCutter.processEvent { viewModel.captureImage() } + }, onLongPress = { viewModel.startVideoRecording() }, onRelease = { viewModel.stopVideoRecording() }, videoRecordingState = previewUiState.videoRecordingState From 2d94036c579b62bfe510b7aaa7680bedcffd3460 Mon Sep 17 00:00:00 2001 From: David Jia Date: Thu, 12 Oct 2023 10:39:07 -0700 Subject: [PATCH 2/2] MultipleEventCutter --- .idea/gradle.xml | 3 +- .../feature/preview/MultipleEventCutter.kt | 38 +++++++++++++++++++ .../feature/preview/PreviewScreen.kt | 5 ++- 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a99b0ad4c..a3881f729 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,8 +4,6 @@ diff --git a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt new file mode 100644 index 000000000..925b18af8 --- /dev/null +++ b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/MultipleEventCutter.kt @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2023 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 com.google.jetpackcamera.feature.preview + +/** + * A helper class that prevents multiple clicks. + */ +internal class MultipleEventsCutter { + private val now: Long + get() = System.currentTimeMillis() + + private var lastEventTimeMs: Long = 0 + + fun processEvent(event: () -> Unit) { + if (now - lastEventTimeMs >= DURATION_BETWEEN_CLICKS_MS) { + event.invoke() + } + lastEventTimeMs = now + } + + companion object { + private const val DURATION_BETWEEN_CLICKS_MS = 300L + } +} diff --git a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt index 48e8c8488..efd7d3ed9 100644 --- a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt +++ b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/PreviewScreen.kt @@ -195,9 +195,12 @@ fun PreviewScreen( ) } } + val multipleEventsCutter = remember { MultipleEventsCutter() } /*todo: close quick settings on start record/image capture*/ CaptureButton( - onClick = { viewModel.captureImage() }, + onClick = { + multipleEventsCutter.processEvent { viewModel.captureImage() } + }, onLongPress = { viewModel.startVideoRecording() }, onRelease = { viewModel.stopVideoRecording() }, videoRecordingState = previewUiState.videoRecordingState