diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4aa95c2f7c..305173d99f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -176,6 +176,7 @@ dependencies { implementation(libs.androidx.startup) implementation(libs.coil) implementation(libs.datetime) + implementation(libs.squareup.seismic) implementation(libs.dagger) kapt(libs.dagger.compiler) diff --git a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/detection/RageshakeDetectionPresenter.kt b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/detection/RageshakeDetectionPresenter.kt index c91d584021..dc0155877e 100644 --- a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/detection/RageshakeDetectionPresenter.kt +++ b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/detection/RageshakeDetectionPresenter.kt @@ -95,12 +95,12 @@ class RageshakeDetectionPresenter @Inject constructor( private fun handleRageShake(start: Boolean, state: RageshakeDetectionState, takeScreenshot: MutableState) { if (start) { rageShake.start(state.preferenceState.sensitivity) - rageShake.interceptor = { + rageShake.setInterceptor { takeScreenshot.value = true } } else { rageShake.stop() - rageShake.interceptor = null + rageShake.setInterceptor(null) } } diff --git a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/rageshake/DefaultRageShake.kt b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/rageshake/DefaultRageShake.kt new file mode 100644 index 0000000000..a0963000d8 --- /dev/null +++ b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/rageshake/DefaultRageShake.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * 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 io.element.android.features.rageshake.rageshake + +import android.content.Context +import android.hardware.Sensor +import android.hardware.SensorManager +import androidx.core.content.getSystemService +import com.squareup.anvil.annotations.ContributesBinding +import com.squareup.seismic.ShakeDetector +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.di.SingleIn +import javax.inject.Inject + +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class, RageShake::class) +class DefaultRageShake @Inject constructor( + @ApplicationContext context: Context, +) : ShakeDetector.Listener, RageShake { + + private var sensorManager = context.getSystemService() + private var shakeDetector: ShakeDetector? = null + private var interceptor: (() -> Unit)? = null + + override fun setInterceptor(interceptor: (() -> Unit)?) { + this.interceptor = interceptor + } + + /** + * Check if the feature is available on this device. + */ + override fun isAvailable(): Boolean { + return sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null + } + + override fun start(sensitivity: Float) { + sensorManager?.let { + shakeDetector = ShakeDetector(this).apply { + start(it, SensorManager.SENSOR_DELAY_GAME) + } + setSensitivity(sensitivity) + } + } + + override fun stop() { + shakeDetector?.stop() + } + + /** + * sensitivity will be {0, O.25, 0.5, 0.75, 1} and converted to + * [ShakeDetector.SENSITIVITY_LIGHT (=11), ShakeDetector.SENSITIVITY_HARD (=15)]. + */ + override fun setSensitivity(sensitivity: Float) { + shakeDetector?.setSensitivity( + ShakeDetector.SENSITIVITY_LIGHT + (sensitivity * 4).toInt() + ) + } + + override fun hearShake() { + interceptor?.invoke() + } +} diff --git a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/rageshake/RageShake.kt b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/rageshake/RageShake.kt index 691da5dbe2..d9150b5ecd 100644 --- a/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/rageshake/RageShake.kt +++ b/features/rageshake/src/main/kotlin/io/element/android/features/rageshake/rageshake/RageShake.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 New Vector Ltd + * Copyright (c) 2023 New Vector Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,57 +16,21 @@ package io.element.android.features.rageshake.rageshake -import android.content.Context -import android.hardware.Sensor -import android.hardware.SensorManager -import androidx.core.content.getSystemService -import com.squareup.seismic.ShakeDetector -import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.ApplicationContext -import io.element.android.libraries.di.SingleIn -import javax.inject.Inject - -@SingleIn(AppScope::class) -class RageShake @Inject constructor( - @ApplicationContext context: Context, -) : ShakeDetector.Listener { - - private var sensorManager = context.getSystemService() - private var shakeDetector: ShakeDetector? = null - - var interceptor: (() -> Unit)? = null - +interface RageShake { /** * Check if the feature is available on this device. */ - fun isAvailable(): Boolean { - return sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null - } + fun isAvailable(): Boolean - fun start(sensitivity: Float) { - sensorManager?.let { - shakeDetector = ShakeDetector(this).apply { - start(it, SensorManager.SENSOR_DELAY_GAME) - } - setSensitivity(sensitivity) - } - } + fun start(sensitivity: Float) - fun stop() { - shakeDetector?.stop() - } + fun stop() /** * sensitivity will be {0, O.25, 0.5, 0.75, 1} and converted to * [ShakeDetector.SENSITIVITY_LIGHT (=11), ShakeDetector.SENSITIVITY_HARD (=15)]. */ - fun setSensitivity(sensitivity: Float) { - shakeDetector?.setSensitivity( - ShakeDetector.SENSITIVITY_LIGHT + (sensitivity * 4).toInt() - ) - } + fun setSensitivity(sensitivity: Float) - override fun hearShake() { - interceptor?.invoke() - } + fun setInterceptor(interceptor: (() -> Unit)?) }