From 65bbe72ecc211aef0342ce5ced7ad2c689f5cfd9 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 17 Oct 2023 18:28:39 +0200 Subject: [PATCH] Pin : move some classes around and introduce PinCodeManager --- features/pin/impl/build.gradle.kts | 1 + .../pin/impl/pin/DefaultPinCodeManager.kt | 70 +++++++++++++++++++ .../features/pin/impl/pin/PinCodeManager.kt | 59 ++++++++++++++++ .../storage/EncryptedPinCodeStorage.kt | 8 +-- .../impl/{ => pin}/storage/PinCodeStore.kt | 2 +- .../storage/SharedPreferencesPinCodeStore.kt | 21 +++--- .../DefaultPinEntryPoint.kt | 2 +- .../impl/{ => presentation}/PinFlowNode.kt | 6 +- .../auth/PinAuthenticationEvents.kt | 2 +- .../auth/PinAuthenticationNode.kt | 2 +- .../auth/PinAuthenticationPresenter.kt | 2 +- .../auth/PinAuthenticationState.kt | 2 +- .../auth/PinAuthenticationStateProvider.kt | 30 ++++++++ .../auth/PinAuthenticationView.kt | 2 +- .../create/CreatePinEvents.kt | 2 +- .../create/CreatePinNode.kt | 2 +- .../create/CreatePinPresenter.kt | 2 +- .../create/CreatePinState.kt | 2 +- .../create/CreatePinStateProvider.kt | 2 +- .../create/CreatePinView.kt | 2 +- 20 files changed, 188 insertions(+), 33 deletions(-) create mode 100644 features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/DefaultPinCodeManager.kt create mode 100644 features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/PinCodeManager.kt rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => pin}/storage/EncryptedPinCodeStorage.kt (85%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => pin}/storage/PinCodeStore.kt (96%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => pin}/storage/SharedPreferencesPinCodeStore.kt (80%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/DefaultPinEntryPoint.kt (95%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/PinFlowNode.kt (91%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/auth/PinAuthenticationEvents.kt (91%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/auth/PinAuthenticationNode.kt (95%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/auth/PinAuthenticationPresenter.kt (95%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/auth/PinAuthenticationState.kt (91%) create mode 100644 features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationStateProvider.kt rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/auth/PinAuthenticationView.kt (97%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/create/CreatePinEvents.kt (91%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/create/CreatePinNode.kt (95%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/create/CreatePinPresenter.kt (94%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/create/CreatePinState.kt (91%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/create/CreatePinStateProvider.kt (93%) rename features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/{ => presentation}/create/CreatePinView.kt (96%) diff --git a/features/pin/impl/build.gradle.kts b/features/pin/impl/build.gradle.kts index 6cfc9fce11..e734035ab3 100644 --- a/features/pin/impl/build.gradle.kts +++ b/features/pin/impl/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { implementation(projects.libraries.matrixui) implementation(projects.libraries.designsystem) implementation(projects.libraries.featureflag.api) + implementation(projects.libraries.cryptography.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/DefaultPinCodeManager.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/DefaultPinCodeManager.kt new file mode 100644 index 0000000000..4ee1a530a2 --- /dev/null +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/DefaultPinCodeManager.kt @@ -0,0 +1,70 @@ +/* + * 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.pin.impl.pin + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.features.pin.impl.pin.storage.PinCodeStore +import io.element.android.libraries.cryptography.api.CryptoService +import io.element.android.libraries.cryptography.api.EncryptionResult +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +private const val SECRET_KEY_ALIAS = "SECRET_KEY_ALIAS_PIN_CODE" + +@ContributesBinding(AppScope::class) +class DefaultPinCodeManager @Inject constructor( + private val cryptoService: CryptoService, + private val pinCodeStore: PinCodeStore, +) : PinCodeManager { + + override suspend fun isPinCodeAvailable(): Boolean { + return pinCodeStore.hasPinCode() + } + + override suspend fun createPinCode(pinCode: String) { + val secretKey = cryptoService.getOrCreateSecretKey(SECRET_KEY_ALIAS) + val encryptedPinCode = cryptoService.encrypt(secretKey, pinCode.toByteArray()).toBase64() + pinCodeStore.saveEncryptedPinCode(encryptedPinCode) + } + + override suspend fun verifyPinCode(pinCode: String): Boolean { + val encryptedPinCode = pinCodeStore.getEncryptedCode() ?: return false + return try { + val secretKey = cryptoService.getOrCreateSecretKey(SECRET_KEY_ALIAS) + val decryptedPinCode = cryptoService.decrypt(secretKey, EncryptionResult.fromBase64(encryptedPinCode)) + decryptedPinCode.contentEquals(pinCode.toByteArray()) + } catch (failure: Throwable) { + false + } + } + + override suspend fun deletePinCode() { + pinCodeStore.deleteEncryptedPinCode() + } + + override suspend fun getRemainingPinCodeAttemptsNumber(): Int { + return pinCodeStore.getRemainingPinCodeAttemptsNumber() + } + + override suspend fun onWrongPin(): Int { + return pinCodeStore.onWrongPin() + } + + override suspend fun resetCounter() { + pinCodeStore.resetCounter() + } +} diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/PinCodeManager.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/PinCodeManager.kt new file mode 100644 index 0000000000..df4262d9eb --- /dev/null +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/PinCodeManager.kt @@ -0,0 +1,59 @@ +/* + * 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.pin.impl.pin + +/** + * This interface is the main interface to manage the pin code. + * Implementation should take care of encrypting the pin code and storing it. + */ +interface PinCodeManager { + /** + * @return true if a pin code is available. + */ + suspend fun isPinCodeAvailable(): Boolean + + /** + * creates a new encrypted pin code. + * @param pinCode the clear pin code to create + */ + suspend fun createPinCode(pinCode: String) + + /** + * @return true if the pin code is correct + */ + suspend fun verifyPinCode(pinCode: String): Boolean + + /** + * deletes the previously created pin code + */ + suspend fun deletePinCode() + + /** + * @return the number of remaining attempts before the pin code is blocked + */ + suspend fun getRemainingPinCodeAttemptsNumber(): Int + + /** + * @return the number of remaining attempts before the pin code is blocked + */ + suspend fun onWrongPin(): Int + + /** + * Resets the counter of attempts for PIN code. + */ + suspend fun resetCounter() +} diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/EncryptedPinCodeStorage.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/EncryptedPinCodeStorage.kt similarity index 85% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/EncryptedPinCodeStorage.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/EncryptedPinCodeStorage.kt index ae3bd7b893..bf1dec8d0d 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/EncryptedPinCodeStorage.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/EncryptedPinCodeStorage.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.storage +package io.element.android.features.pin.impl.pin.storage /** * Should be implemented by any class that provides access to the encrypted PIN code. @@ -24,17 +24,17 @@ interface EncryptedPinCodeStorage { /** * Returns the encrypted PIN code. */ - suspend fun getPinCode(): String? + suspend fun getEncryptedCode(): String? /** * Saves the encrypted PIN code to some persistable storage. */ - suspend fun savePinCode(pinCode: String) + suspend fun saveEncryptedPinCode(pinCode: String) /** * Deletes the PIN code from some persistable storage. */ - suspend fun deletePinCode() + suspend fun deleteEncryptedPinCode() /** * Returns whether the PIN code is stored or not. diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/PinCodeStore.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/PinCodeStore.kt similarity index 96% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/PinCodeStore.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/PinCodeStore.kt index 5c54cc26f9..3476890275 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/PinCodeStore.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/PinCodeStore.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.storage +package io.element.android.features.pin.impl.pin.storage interface PinCodeStore : EncryptedPinCodeStorage { diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/SharedPreferencesPinCodeStore.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/SharedPreferencesPinCodeStore.kt similarity index 80% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/SharedPreferencesPinCodeStore.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/SharedPreferencesPinCodeStore.kt index fc8155352f..892336f01d 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/storage/SharedPreferencesPinCodeStore.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/pin/storage/SharedPreferencesPinCodeStore.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.storage +package io.element.android.features.pin.impl.pin.storage import android.content.SharedPreferences import androidx.core.content.edit @@ -26,6 +26,10 @@ import kotlinx.coroutines.withContext import java.util.concurrent.CopyOnWriteArrayList import javax.inject.Inject +private const val ENCODED_PIN_CODE_KEY = "ENCODED_PIN_CODE_KEY" +private const val REMAINING_PIN_CODE_ATTEMPTS_KEY = "REMAINING_PIN_CODE_ATTEMPTS_KEY" +private const val MAX_PIN_CODE_ATTEMPTS_NUMBER_BEFORE_LOGOUT = 3 + @SingleIn(AppScope::class) @ContributesBinding(AppScope::class) class SharedPreferencesPinCodeStore @Inject constructor( @@ -35,11 +39,11 @@ class SharedPreferencesPinCodeStore @Inject constructor( private val listeners = CopyOnWriteArrayList() - override suspend fun getPinCode(): String? = withContext(dispatchers.io) { + override suspend fun getEncryptedCode(): String? = withContext(dispatchers.io) { sharedPreferences.getString(ENCODED_PIN_CODE_KEY, null) } - override suspend fun savePinCode(pinCode: String) = withContext(dispatchers.io) { + override suspend fun saveEncryptedPinCode(pinCode: String) = withContext(dispatchers.io) { sharedPreferences.edit { putString(ENCODED_PIN_CODE_KEY, pinCode) } @@ -48,7 +52,7 @@ class SharedPreferencesPinCodeStore @Inject constructor( } } - override suspend fun deletePinCode() = withContext(dispatchers.io) { + override suspend fun deleteEncryptedPinCode() = withContext(dispatchers.io) { // Also reset the counters resetCounter() sharedPreferences.edit { @@ -78,7 +82,6 @@ class SharedPreferencesPinCodeStore @Inject constructor( override suspend fun resetCounter() = withContext(dispatchers.io) { sharedPreferences.edit { remove(REMAINING_PIN_CODE_ATTEMPTS_KEY) - remove(REMAINING_BIOMETRICS_ATTEMPTS_KEY) } } @@ -89,12 +92,4 @@ class SharedPreferencesPinCodeStore @Inject constructor( override fun removeListener(listener: PinCodeStore.Listener) { listeners.remove(listener) } - - companion object { - private const val ENCODED_PIN_CODE_KEY = "ENCODED_PIN_CODE_KEY" - private const val REMAINING_PIN_CODE_ATTEMPTS_KEY = "REMAINING_PIN_CODE_ATTEMPTS_KEY" - private const val REMAINING_BIOMETRICS_ATTEMPTS_KEY = "REMAINING_BIOMETRICS_ATTEMPTS_KEY" - - private const val MAX_PIN_CODE_ATTEMPTS_NUMBER_BEFORE_LOGOUT = 3 - } } diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/DefaultPinEntryPoint.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/DefaultPinEntryPoint.kt similarity index 95% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/DefaultPinEntryPoint.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/DefaultPinEntryPoint.kt index 920691cad2..17b7f6d612 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/DefaultPinEntryPoint.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/DefaultPinEntryPoint.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl +package io.element.android.features.pin.impl.presentation import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/PinFlowNode.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/PinFlowNode.kt similarity index 91% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/PinFlowNode.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/PinFlowNode.kt index a76504ce8a..acf10ffcce 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/PinFlowNode.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/PinFlowNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl +package io.element.android.features.pin.impl.presentation import android.os.Parcelable import androidx.compose.runtime.Composable @@ -27,8 +27,8 @@ import com.bumble.appyx.navmodel.backstack.BackStack import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.features.pin.impl.auth.PinAuthenticationNode -import io.element.android.features.pin.impl.create.CreatePinNode +import io.element.android.features.pin.impl.presentation.auth.PinAuthenticationNode +import io.element.android.features.pin.impl.presentation.create.CreatePinNode import io.element.android.libraries.architecture.BackstackNode import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler import io.element.android.libraries.architecture.createNode diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationEvents.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationEvents.kt similarity index 91% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationEvents.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationEvents.kt index 110c62660a..01835df18c 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationEvents.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationEvents.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.auth +package io.element.android.features.pin.impl.presentation.auth sealed interface PinAuthenticationEvents { data object Unlock : PinAuthenticationEvents diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationNode.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationNode.kt similarity index 95% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationNode.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationNode.kt index b5dab44c96..ec4b78dc15 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationNode.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.auth +package io.element.android.features.pin.impl.presentation.auth import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationPresenter.kt similarity index 95% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationPresenter.kt index 5e7e274ba7..bb1e5d04ad 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationPresenter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.auth +package io.element.android.features.pin.impl.presentation.auth import androidx.compose.runtime.Composable import io.element.android.features.pin.api.PinStateService diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationState.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationState.kt similarity index 91% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationState.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationState.kt index 2df1e50f83..3d319356ec 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationState.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.auth +package io.element.android.features.pin.impl.presentation.auth data class PinAuthenticationState( val eventSink: (PinAuthenticationEvents) -> Unit diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationStateProvider.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationStateProvider.kt new file mode 100644 index 0000000000..3cfbe5cb84 --- /dev/null +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationStateProvider.kt @@ -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. + */ + +package io.element.android.features.pin.impl.presentation.auth + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider + +open class PinAuthenticationStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aPinAuthenticationState(), + ) +} + +fun aPinAuthenticationState() = PinAuthenticationState( + eventSink = {} +) diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationView.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationView.kt similarity index 97% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationView.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationView.kt index 9fe689bb39..9efab19813 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationView.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/auth/PinAuthenticationView.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.auth +package io.element.android.features.pin.impl.presentation.auth import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinEvents.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinEvents.kt similarity index 91% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinEvents.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinEvents.kt index 280856b5c8..87aee27557 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinEvents.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinEvents.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.create +package io.element.android.features.pin.impl.presentation.create sealed interface CreatePinEvents { object MyEvent : CreatePinEvents diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinNode.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinNode.kt similarity index 95% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinNode.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinNode.kt index 0ed0343a5b..6b71510d5a 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinNode.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.create +package io.element.android.features.pin.impl.presentation.create import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinPresenter.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinPresenter.kt similarity index 94% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinPresenter.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinPresenter.kt index d45257b4bd..8cfdc22e46 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinPresenter.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinPresenter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.create +package io.element.android.features.pin.impl.presentation.create import androidx.compose.runtime.Composable import io.element.android.libraries.architecture.Presenter diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinState.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinState.kt similarity index 91% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinState.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinState.kt index c405db82ec..64c0ae0a5a 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinState.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.create +package io.element.android.features.pin.impl.presentation.create data class CreatePinState( val eventSink: (CreatePinEvents) -> Unit diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinStateProvider.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinStateProvider.kt similarity index 93% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinStateProvider.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinStateProvider.kt index 4bff72023e..0afe3442a2 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinStateProvider.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinStateProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.create +package io.element.android.features.pin.impl.presentation.create import androidx.compose.ui.tooling.preview.PreviewParameterProvider diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinView.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinView.kt similarity index 96% rename from features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinView.kt rename to features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinView.kt index 64e5be4091..643f487d1b 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/create/CreatePinView.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/presentation/create/CreatePinView.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.features.pin.impl.create +package io.element.android.features.pin.impl.presentation.create import androidx.compose.foundation.layout.Box import androidx.compose.material3.MaterialTheme