[Architecture] split all feature modules to api/impl

This commit is contained in:
ganfra 2023-03-08 16:13:45 +01:00
parent b2c68d555a
commit 7051bfc14e
214 changed files with 626 additions and 1090 deletions

View file

@ -1 +0,0 @@
/build

View file

@ -0,0 +1,30 @@
/*
* 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.
* 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.
*/
plugins {
id("io.element.android-compose-library")
}
android {
namespace = "io.element.android.features.rageshake.api"
}
dependencies {
implementation(projects.libraries.architecture)
implementation(projects.libraries.designsystem)
implementation(projects.libraries.androidutils)
implementation(projects.libraries.uiStrings)
}

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.api.bugreport
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash
package io.element.android.features.rageshake.api.crash
import kotlinx.coroutines.flow.Flow

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash.ui
package io.element.android.features.rageshake.api.crash
sealed interface CrashDetectionEvents {
object ResetAllCrashData : CrashDetectionEvents

View file

@ -0,0 +1,21 @@
/*
* 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.
* 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.api.crash
import io.element.android.libraries.architecture.Presenter
interface CrashDetectionPresenter : Presenter<CrashDetectionState>

View file

@ -14,8 +14,11 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash.ui
package io.element.android.features.rageshake.api.crash
import androidx.compose.runtime.Immutable
@Immutable
data class CrashDetectionState(
val crashDetected: Boolean,
val eventSink: (CrashDetectionEvents) -> Unit

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash.ui
package io.element.android.features.rageshake.api.crash
fun aCrashDetectionState() = CrashDetectionState(
crashDetected = false,

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash.ui
package io.element.android.features.rageshake.api.crash
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.detection
package io.element.android.features.rageshake.api.detection
import io.element.android.features.rageshake.screenshot.ImageResult
import io.element.android.features.rageshake.api.screenshot.ImageResult
sealed interface RageshakeDetectionEvents {
object Dismiss : RageshakeDetectionEvents

View file

@ -0,0 +1,21 @@
/*
* 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.
* 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.api.detection
import io.element.android.libraries.architecture.Presenter
interface RageshakeDetectionPresenter : Presenter<RageshakeDetectionState>

View file

@ -14,12 +14,13 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.detection
package io.element.android.features.rageshake.api.detection
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.Stable
import io.element.android.features.rageshake.preferences.RageshakePreferencesState
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesState
@Stable
@Immutable
data class RageshakeDetectionState(
val takeScreenshot: Boolean,
val showDialog: Boolean,

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.detection
package io.element.android.features.rageshake.api.detection
import io.element.android.features.rageshake.preferences.aRageshakePreferencesState
import io.element.android.features.rageshake.api.preferences.aRageshakePreferencesState
fun aRageshakeDetectionState() = RageshakeDetectionState(
takeScreenshot = false,

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.detection
package io.element.android.features.rageshake.api.detection
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -23,8 +23,8 @@ import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.Lifecycle
import io.element.android.features.rageshake.screenshot.ImageResult
import io.element.android.features.rageshake.screenshot.screenshot
import io.element.android.features.rageshake.api.screenshot.ImageResult
import io.element.android.features.rageshake.api.screenshot.screenshot
import io.element.android.libraries.androidutils.hardware.vibrate
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.preview.ElementPreviewDark

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.api.preferences
sealed interface RageshakePreferencesEvents {
data class SetSensitivity(val sensitivity: Float) : RageshakePreferencesEvents

View file

@ -0,0 +1,21 @@
/*
* 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.
* 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.api.preferences
import io.element.android.libraries.architecture.Presenter
interface RageshakePreferencesPresenter : Presenter<RageshakePreferencesState>

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.api.preferences
data class RageshakePreferencesState(
val isEnabled: Boolean,

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.api.preferences
import androidx.compose.ui.tooling.preview.PreviewParameterProvider

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.api.preferences
import androidx.compose.foundation.layout.Column
import androidx.compose.material.icons.Icons

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.rageshake
package io.element.android.features.rageshake.api.rageshake
interface RageShake {
/**

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.rageshake
package io.element.android.features.rageshake.api.rageshake
import kotlinx.coroutines.flow.Flow

View file

@ -14,8 +14,10 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.reporter
package io.element.android.features.rageshake.api.reporter
import io.element.android.features.rageshake.api.reporter.BugReporterListener
import io.element.android.features.rageshake.api.reporter.ReportType
import kotlinx.coroutines.CoroutineScope
interface BugReporter {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.reporter
package io.element.android.features.rageshake.api.reporter
/**
* Bug report upload listener.

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.reporter
package io.element.android.features.rageshake.api.reporter
enum class ReportType {
BUG_REPORT,

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.screenshot
package io.element.android.features.rageshake.api.screenshot
import android.app.Activity
import android.graphics.Bitmap

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.screenshot
package io.element.android.features.rageshake.api.screenshot
import android.graphics.Bitmap

View file

@ -24,7 +24,7 @@ plugins {
}
android {
namespace = "io.element.android.features.rageshake"
namespace = "io.element.android.features.rageshake.impl"
}
anvil {
@ -32,8 +32,8 @@ anvil {
}
dependencies {
anvil(projects.anvilcodegen)
implementation(projects.anvilannotations)
anvil(projects.anvilcodegen)
implementation(projects.libraries.androidutils)
implementation(projects.libraries.core)
implementation(projects.libraries.architecture)
@ -41,6 +41,7 @@ dependencies {
implementation(projects.libraries.elementresources)
implementation(projects.libraries.uiStrings)
api(libs.squareup.seismic)
api(projects.features.rageshake.api)
implementation(libs.androidx.datastore.preferences)
implementation(libs.coil)
implementation(libs.coil.compose)
@ -51,8 +52,9 @@ dependencies {
testImplementation(libs.molecule.runtime)
testImplementation(libs.test.truth)
testImplementation(libs.test.turbine)
testImplementation(projects.libraries.matrix.test)
testImplementation(libs.test.mockk)
testImplementation(projects.libraries.matrix.test)
testImplementation(projects.features.rageshake.test)
androidTestImplementation(libs.test.junitext)
}

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.reporter;
package io.element.android.features.rageshake.impl.reporter;
import java.io.IOException;
import java.util.ArrayList;

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
sealed interface BugReportEvents {
object SendBugReport : BugReportEvents

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@ -25,6 +25,8 @@ import com.bumble.appyx.core.plugin.plugins
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
import io.element.android.features.rageshake.impl.bugreport.BugReportPresenter
import io.element.android.libraries.di.AppScope
@ContributesNode(AppScope::class)

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
@ -23,12 +23,12 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.features.rageshake.crash.CrashDataStore
import io.element.android.features.rageshake.logs.VectorFileLogger
import io.element.android.features.rageshake.reporter.BugReporter
import io.element.android.features.rageshake.reporter.BugReporterListener
import io.element.android.features.rageshake.reporter.ReportType
import io.element.android.features.rageshake.screenshot.ScreenshotHolder
import io.element.android.features.rageshake.api.reporter.BugReporter
import io.element.android.features.rageshake.api.reporter.BugReporterListener
import io.element.android.features.rageshake.api.reporter.ReportType
import io.element.android.features.rageshake.api.crash.CrashDataStore
import io.element.android.features.rageshake.impl.logs.VectorFileLogger
import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.architecture.Presenter
import kotlinx.coroutines.CoroutineScope

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import android.os.Parcelable
import io.element.android.libraries.architecture.Async

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.Async

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column

View file

@ -14,12 +14,13 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.di.AppScope
import javax.inject.Inject

View file

@ -14,19 +14,24 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash.ui
package io.element.android.features.rageshake.impl.crash
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.rememberCoroutineScope
import io.element.android.features.rageshake.crash.CrashDataStore
import io.element.android.libraries.architecture.Presenter
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.api.crash.CrashDetectionEvents
import io.element.android.features.rageshake.api.crash.CrashDetectionPresenter
import io.element.android.features.rageshake.api.crash.CrashDetectionState
import io.element.android.features.rageshake.api.crash.CrashDataStore
import io.element.android.libraries.di.AppScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject
class CrashDetectionPresenter @Inject constructor(private val crashDataStore: CrashDataStore) :
Presenter<CrashDetectionState> {
@ContributesBinding(AppScope::class)
class DefaultCrashDetectionPresenter @Inject constructor(private val crashDataStore: CrashDataStore) :
CrashDetectionPresenter {
@Composable
override fun present(): CrashDetectionState {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash
package io.element.android.features.rageshake.impl.crash
import android.content.Context
import androidx.datastore.core.DataStore
@ -24,6 +24,7 @@ import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.api.crash.CrashDataStore
import io.element.android.libraries.core.bool.orFalse
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash
package io.element.android.features.rageshake.impl.crash
import android.content.Context
import android.os.Build

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.detection
package io.element.android.features.rageshake.impl.detection
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -23,22 +23,27 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.features.rageshake.preferences.RageshakePreferencesEvents
import io.element.android.features.rageshake.preferences.RageshakePreferencesPresenter
import io.element.android.features.rageshake.rageshake.RageShake
import io.element.android.features.rageshake.screenshot.ImageResult
import io.element.android.features.rageshake.screenshot.ScreenshotHolder
import io.element.android.libraries.architecture.Presenter
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.api.detection.RageshakeDetectionEvents
import io.element.android.features.rageshake.api.detection.RageshakeDetectionPresenter
import io.element.android.features.rageshake.api.detection.RageshakeDetectionState
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesEvents
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesPresenter
import io.element.android.features.rageshake.api.rageshake.RageShake
import io.element.android.features.rageshake.api.screenshot.ImageResult
import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder
import io.element.android.libraries.di.AppScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
class RageshakeDetectionPresenter @Inject constructor(
@ContributesBinding(AppScope::class)
class DefaultRageshakeDetectionPresenter @Inject constructor(
private val screenshotHolder: ScreenshotHolder,
private val rageShake: RageShake,
private val preferencesPresenter: RageshakePreferencesPresenter,
) : Presenter<RageshakeDetectionState> {
) : RageshakeDetectionPresenter {
@Composable
override fun present(): RageshakeDetectionState {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.logs
package io.element.android.features.rageshake.impl.logs
import java.io.PrintWriter
import java.io.StringWriter

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.logs
package io.element.android.features.rageshake.impl.logs
import android.content.Context
import android.util.Log

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.impl.preferences
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
@ -22,17 +22,22 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.features.rageshake.rageshake.RageShake
import io.element.android.features.rageshake.rageshake.RageshakeDataStore
import io.element.android.libraries.architecture.Presenter
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesEvents
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesPresenter
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesState
import io.element.android.features.rageshake.api.rageshake.RageShake
import io.element.android.features.rageshake.api.rageshake.RageshakeDataStore
import io.element.android.libraries.di.AppScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject
class RageshakePreferencesPresenter @Inject constructor(
@ContributesBinding(AppScope::class)
class DefaultRageshakePreferencesPresenter @Inject constructor(
private val rageshake: RageShake,
private val rageshakeDataStore: RageshakeDataStore,
) : Presenter<RageshakePreferencesState> {
) : RageshakePreferencesPresenter {
@Composable
override fun present(): RageshakePreferencesState {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.rageshake
package io.element.android.features.rageshake.impl.rageshake
import android.content.Context
import android.hardware.Sensor
@ -22,13 +22,14 @@ import android.hardware.SensorManager
import androidx.core.content.getSystemService
import com.squareup.anvil.annotations.ContributesBinding
import com.squareup.seismic.ShakeDetector
import io.element.android.features.rageshake.api.rageshake.RageShake
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)
@ContributesBinding(scope = AppScope::class, boundType = RageShake::class)
class DefaultRageShake @Inject constructor(
@ApplicationContext context: Context,
) : ShakeDetector.Listener, RageShake {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.rageshake
package io.element.android.features.rageshake.impl.rageshake
import android.content.Context
import androidx.datastore.core.DataStore
@ -24,6 +24,7 @@ import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.floatPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.api.rageshake.RageshakeDataStore
import io.element.android.libraries.core.bool.orTrue
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext

View file

@ -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.
@ -14,17 +14,20 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.reporter
package io.element.android.features.rageshake.impl.reporter
import android.content.Context
import android.os.Build
import androidx.core.net.toFile
import androidx.core.net.toUri
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.R
import io.element.android.features.rageshake.crash.CrashDataStore
import io.element.android.features.rageshake.logs.VectorFileLogger
import io.element.android.features.rageshake.screenshot.ScreenshotHolder
import io.element.android.features.rageshake.api.reporter.BugReporter
import io.element.android.features.rageshake.api.reporter.BugReporterListener
import io.element.android.features.rageshake.api.reporter.ReportType
import io.element.android.features.rageshake.impl.R
import io.element.android.features.rageshake.api.crash.CrashDataStore
import io.element.android.features.rageshake.impl.logs.VectorFileLogger
import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder
import io.element.android.libraries.androidutils.file.compressFile
import io.element.android.libraries.androidutils.file.safeDelete
import io.element.android.libraries.core.coroutine.CoroutineDispatchers

View file

@ -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.
@ -14,12 +14,13 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.screenshot
package io.element.android.features.rageshake.impl.screenshot
import android.content.Context
import android.graphics.Bitmap
import androidx.core.net.toUri
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder
import io.element.android.libraries.androidutils.bitmap.writeBitmap
import io.element.android.libraries.androidutils.file.safeDelete
import io.element.android.libraries.di.AppScope

View file

@ -16,14 +16,14 @@
@file:OptIn(ExperimentalCoroutinesApi::class)
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import app.cash.molecule.RecompositionClock
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.features.rageshake.crash.ui.A_CRASH_DATA
import io.element.android.features.rageshake.crash.ui.FakeCrashDataStore
import io.element.android.features.rageshake.impl.crash.ui.A_CRASH_DATA
import io.element.android.features.rageshake.impl.crash.ui.FakeCrashDataStore
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.matrix.test.A_FAILURE_REASON
import kotlinx.coroutines.ExperimentalCoroutinesApi

View file

@ -14,11 +14,11 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import io.element.android.features.rageshake.reporter.BugReporter
import io.element.android.features.rageshake.reporter.BugReporterListener
import io.element.android.features.rageshake.reporter.ReportType
import io.element.android.features.rageshake.api.reporter.BugReporter
import io.element.android.features.rageshake.api.reporter.BugReporterListener
import io.element.android.features.rageshake.api.reporter.ReportType
import io.element.android.libraries.matrix.test.A_FAILURE_REASON
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay

View file

@ -14,10 +14,10 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.bugreport
package io.element.android.features.rageshake.impl.bugreport
import android.graphics.Bitmap
import io.element.android.features.rageshake.screenshot.ScreenshotHolder
import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder
const val A_SCREENSHOT_URI = "file://content/uri"

View file

@ -16,12 +16,16 @@
@file:OptIn(ExperimentalCoroutinesApi::class)
package io.element.android.features.rageshake.crash.ui
package io.element.android.features.rageshake.impl.crash.ui
import app.cash.molecule.RecompositionClock
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.features.rageshake.api.crash.CrashDetectionEvents
import io.element.android.features.rageshake.impl.crash.DefaultCrashDetectionPresenter
import io.element.android.features.rageshake.test.crash.A_CRASH_DATA
import io.element.android.features.rageshake.test.crash.FakeCrashDataStore
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Test
@ -29,7 +33,7 @@ import org.junit.Test
class CrashDetectionPresenterTest {
@Test
fun `present - initial state no crash`() = runTest {
val presenter = CrashDetectionPresenter(
val presenter = DefaultCrashDetectionPresenter(
FakeCrashDataStore()
)
moleculeFlow(RecompositionClock.Immediate) {
@ -42,7 +46,7 @@ class CrashDetectionPresenterTest {
@Test
fun `present - initial state crash`() = runTest {
val presenter = CrashDetectionPresenter(
val presenter = DefaultCrashDetectionPresenter(
FakeCrashDataStore(appHasCrashed = true)
)
moleculeFlow(RecompositionClock.Immediate) {
@ -57,7 +61,7 @@ class CrashDetectionPresenterTest {
@Test
fun `present - reset app has crashed`() = runTest {
val presenter = CrashDetectionPresenter(
val presenter = DefaultCrashDetectionPresenter(
FakeCrashDataStore(appHasCrashed = true)
)
moleculeFlow(RecompositionClock.Immediate) {
@ -73,7 +77,7 @@ class CrashDetectionPresenterTest {
@Test
fun `present - reset all crash data`() = runTest {
val presenter = CrashDetectionPresenter(
val presenter = DefaultCrashDetectionPresenter(
FakeCrashDataStore(appHasCrashed = true, crashData = A_CRASH_DATA)
)
moleculeFlow(RecompositionClock.Immediate) {

View file

@ -16,18 +16,19 @@
@file:OptIn(ExperimentalCoroutinesApi::class)
package io.element.android.features.rageshake.detection
package io.element.android.features.rageshake.impl.detection
import android.graphics.Bitmap
import app.cash.molecule.RecompositionClock
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.features.rageshake.bugreport.FakeScreenshotHolder
import io.element.android.features.rageshake.preferences.FakeRageShake
import io.element.android.features.rageshake.preferences.FakeRageshakeDataStore
import io.element.android.features.rageshake.preferences.RageshakePreferencesPresenter
import io.element.android.features.rageshake.screenshot.ImageResult
import io.element.android.features.rageshake.api.detection.RageshakeDetectionEvents
import io.element.android.features.rageshake.api.screenshot.ImageResult
import io.element.android.features.rageshake.impl.bugreport.FakeScreenshotHolder
import io.element.android.features.rageshake.impl.preferences.DefaultRageshakePreferencesPresenter
import io.element.android.features.rageshake.test.rageshake.FakeRageShake
import io.element.android.features.rageshake.test.rageshake.FakeRageshakeDataStore
import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -41,10 +42,10 @@ class RageshakeDetectionPresenterTest {
val screenshotHolder = FakeScreenshotHolder(screenshotUri = null)
val rageshake = FakeRageShake(isAvailableValue = true)
val rageshakeDataStore = FakeRageshakeDataStore(isEnabled = true)
val presenter = RageshakeDetectionPresenter(
val presenter = DefaultRageshakeDetectionPresenter(
screenshotHolder = screenshotHolder,
rageShake = rageshake,
preferencesPresenter = RageshakePreferencesPresenter(
preferencesPresenter = DefaultRageshakePreferencesPresenter(
rageshake = rageshake,
rageshakeDataStore = rageshakeDataStore,
)
@ -65,10 +66,10 @@ class RageshakeDetectionPresenterTest {
val screenshotHolder = FakeScreenshotHolder(screenshotUri = null)
val rageshake = FakeRageShake(isAvailableValue = true)
val rageshakeDataStore = FakeRageshakeDataStore(isEnabled = true)
val presenter = RageshakeDetectionPresenter(
val presenter = DefaultRageshakeDetectionPresenter(
screenshotHolder = screenshotHolder,
rageShake = rageshake,
preferencesPresenter = RageshakePreferencesPresenter(
preferencesPresenter = DefaultRageshakePreferencesPresenter(
rageshake = rageshake,
rageshakeDataStore = rageshakeDataStore,
)
@ -90,10 +91,10 @@ class RageshakeDetectionPresenterTest {
val screenshotHolder = FakeScreenshotHolder(screenshotUri = null)
val rageshake = FakeRageShake(isAvailableValue = true)
val rageshakeDataStore = FakeRageshakeDataStore(isEnabled = true)
val presenter = RageshakeDetectionPresenter(
val presenter = DefaultRageshakeDetectionPresenter(
screenshotHolder = screenshotHolder,
rageShake = rageshake,
preferencesPresenter = RageshakePreferencesPresenter(
preferencesPresenter = DefaultRageshakePreferencesPresenter(
rageshake = rageshake,
rageshakeDataStore = rageshakeDataStore,
)
@ -124,10 +125,10 @@ class RageshakeDetectionPresenterTest {
val screenshotHolder = FakeScreenshotHolder(screenshotUri = null)
val rageshake = FakeRageShake(isAvailableValue = true)
val rageshakeDataStore = FakeRageshakeDataStore(isEnabled = true)
val presenter = RageshakeDetectionPresenter(
val presenter = DefaultRageshakeDetectionPresenter(
screenshotHolder = screenshotHolder,
rageShake = rageshake,
preferencesPresenter = RageshakePreferencesPresenter(
preferencesPresenter = DefaultRageshakePreferencesPresenter(
rageshake = rageshake,
rageshakeDataStore = rageshakeDataStore,
)
@ -158,10 +159,10 @@ class RageshakeDetectionPresenterTest {
val screenshotHolder = FakeScreenshotHolder(screenshotUri = null)
val rageshake = FakeRageShake(isAvailableValue = true)
val rageshakeDataStore = FakeRageshakeDataStore(isEnabled = true)
val presenter = RageshakeDetectionPresenter(
val presenter = DefaultRageshakeDetectionPresenter(
screenshotHolder = screenshotHolder,
rageShake = rageshake,
preferencesPresenter = RageshakePreferencesPresenter(
preferencesPresenter = DefaultRageshakePreferencesPresenter(
rageshake = rageshake,
rageshakeDataStore = rageshakeDataStore,
)

View file

@ -16,12 +16,16 @@
@file:OptIn(ExperimentalCoroutinesApi::class)
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.impl.preferences
import app.cash.molecule.RecompositionClock
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesEvents
import io.element.android.features.rageshake.test.rageshake.A_SENSITIVITY
import io.element.android.features.rageshake.test.rageshake.FakeRageShake
import io.element.android.features.rageshake.test.rageshake.FakeRageshakeDataStore
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Test
@ -29,7 +33,7 @@ import org.junit.Test
class RageshakePreferencesPresenterTest {
@Test
fun `present - initial state available`() = runTest {
val presenter = RageshakePreferencesPresenter(
val presenter = DefaultRageshakePreferencesPresenter(
FakeRageShake(isAvailableValue = true),
FakeRageshakeDataStore(isEnabled = true)
)
@ -45,7 +49,7 @@ class RageshakePreferencesPresenterTest {
@Test
fun `present - initial state not available`() = runTest {
val presenter = RageshakePreferencesPresenter(
val presenter = DefaultRageshakePreferencesPresenter(
FakeRageShake(isAvailableValue = false),
FakeRageshakeDataStore(isEnabled = true)
)
@ -61,7 +65,7 @@ class RageshakePreferencesPresenterTest {
@Test
fun `present - enable and disable`() = runTest {
val presenter = RageshakePreferencesPresenter(
val presenter = DefaultRageshakePreferencesPresenter(
FakeRageShake(isAvailableValue = true),
FakeRageshakeDataStore(isEnabled = true)
)
@ -80,7 +84,7 @@ class RageshakePreferencesPresenterTest {
@Test
fun `present - set sensitivity`() = runTest {
val presenter = RageshakePreferencesPresenter(
val presenter = DefaultRageshakePreferencesPresenter(
FakeRageShake(isAvailableValue = true),
FakeRageshakeDataStore(isEnabled = true)
)

View file

@ -1,21 +0,0 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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.
-->
<manifest>
</manifest>

View file

@ -0,0 +1,28 @@
/*
* 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.
* 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.
*/
plugins {
id("io.element.android-library")
}
android {
namespace = "io.element.android.features.rageshake.test"
}
dependencies {
implementation(projects.features.rageshake.api)
implementation(libs.coroutines.core)
}

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.crash.ui
package io.element.android.features.rageshake.test.crash
import io.element.android.features.rageshake.crash.CrashDataStore
import io.element.android.features.rageshake.api.crash.CrashDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow

View file

@ -14,11 +14,9 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.test.rageshake
import io.element.android.features.rageshake.rageshake.RageShake
const val A_SENSITIVITY = 1f
import io.element.android.features.rageshake.api.rageshake.RageShake
class FakeRageShake(
private var isAvailableValue: Boolean = true

View file

@ -14,12 +14,15 @@
* limitations under the License.
*/
package io.element.android.features.rageshake.preferences
package io.element.android.features.rageshake.test.rageshake
import io.element.android.features.rageshake.rageshake.RageshakeDataStore
import io.element.android.features.rageshake.api.rageshake.RageshakeDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
const val A_SENSITIVITY = 1f
// TODO Remove this duplicated class when we will rework modules.
class FakeRageshakeDataStore(
isEnabled: Boolean = true,
sensitivity: Float = A_SENSITIVITY,

View file

@ -0,0 +1,31 @@
/*
* 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.
* 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.test.screenshot
import android.graphics.Bitmap
import io.element.android.features.rageshake.api.screenshot.ScreenshotHolder
const val A_SCREENSHOT_URI = "file://content/uri"
// TODO Remove this duplicated class when we will rework modules.
class FakeScreenshotHolder(private val screenshotUri: String? = null) : ScreenshotHolder {
override fun writeBitmap(data: Bitmap) = Unit
override fun getFileUri() = screenshotUri
override fun reset() = Unit
}