├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── drawable-hdpi │ │ │ │ └── ic_fp_40px.png │ │ │ ├── drawable-mdpi │ │ │ │ └── ic_fp_40px.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── ic_fp_40px.png │ │ │ │ ├── ic_fingerprint_success.xml │ │ │ │ └── ic_fingerprint_error.xml │ │ │ ├── drawable-xxhdpi │ │ │ │ └── ic_fp_40px.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── ic_fp_40px.png │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── drawable │ │ │ │ ├── nav_header_background.xml │ │ │ │ ├── ic_home_black_24dp.xml │ │ │ │ ├── ic_dashboard_black_24dp.xml │ │ │ │ ├── ic_notifications_black_24dp.xml │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── values-v21 │ │ │ │ └── styles.xml │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── styles.xml │ │ │ │ ├── dimens.xml │ │ │ │ └── strings.xml │ │ │ ├── layout │ │ │ │ ├── activity_main_nav_header.xml │ │ │ │ ├── fragment_secret_key.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_main_content.xml │ │ │ │ ├── fragment_pin.xml │ │ │ │ ├── fragment_fingerprint.xml │ │ │ │ ├── fingerprint_dialog_container.xml │ │ │ │ ├── fingerprint_dialog_content.xml │ │ │ │ └── view_encryption_form.xml │ │ │ ├── menu │ │ │ │ └── main_drawer.xml │ │ │ ├── navigation │ │ │ │ └── main_nav_graph.xml │ │ │ └── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ ├── kotlin │ │ │ └── pl │ │ │ │ └── mobite │ │ │ │ └── sample │ │ │ │ └── security │ │ │ │ ├── ui │ │ │ │ ├── base │ │ │ │ │ ├── BaseActivity.kt │ │ │ │ │ ├── mvi │ │ │ │ │ │ ├── SchedulersProvider.kt │ │ │ │ │ │ ├── MviCore.kt │ │ │ │ │ │ ├── DefaultSchedulersProvider.kt │ │ │ │ │ │ ├── MviActionsProcessor.kt │ │ │ │ │ │ ├── ViewStateEvents.kt │ │ │ │ │ │ └── MviViewModel.kt │ │ │ │ │ └── BaseFragment.kt │ │ │ │ ├── custom │ │ │ │ │ ├── CustomTextWatcher.kt │ │ │ │ │ └── encryptionform │ │ │ │ │ │ ├── EncryptionFormViewState.kt │ │ │ │ │ │ └── EncryptionFormView.kt │ │ │ │ └── components │ │ │ │ │ ├── secretkey │ │ │ │ │ ├── mvi │ │ │ │ │ │ ├── SecretKeyResult.kt │ │ │ │ │ │ ├── SecretKeyAction.kt │ │ │ │ │ │ └── SecretKeyActionProcessor.kt │ │ │ │ │ ├── SecretKeyFragment.kt │ │ │ │ │ ├── SecretKeyViewModel.kt │ │ │ │ │ └── SecretKeyViewState.kt │ │ │ │ │ ├── pin │ │ │ │ │ ├── mvi │ │ │ │ │ │ ├── PinAction.kt │ │ │ │ │ │ ├── PinResult.kt │ │ │ │ │ │ └── PinActionProcessor.kt │ │ │ │ │ ├── PinViewModel.kt │ │ │ │ │ ├── PinFragment.kt │ │ │ │ │ └── PinViewState.kt │ │ │ │ │ ├── fingerprint │ │ │ │ │ ├── mvi │ │ │ │ │ │ ├── FingerprintAction.kt │ │ │ │ │ │ ├── FingerprintResult.kt │ │ │ │ │ │ └── FingerprintActionProcessor.kt │ │ │ │ │ ├── FingerprintViewModel.kt │ │ │ │ │ ├── FingerprintFragment.kt │ │ │ │ │ ├── fingerprintdialog │ │ │ │ │ │ ├── FingerprintAuthenticationDialogFragment.kt │ │ │ │ │ │ └── FingerprintUiHelper.kt │ │ │ │ │ └── FingerprintViewState.kt │ │ │ │ │ └── MainActivity.kt │ │ │ │ ├── utils │ │ │ │ ├── Utils.kt │ │ │ │ └── Extensions.kt │ │ │ │ ├── di │ │ │ │ ├── WrappersModule.kt │ │ │ │ ├── AppModule.kt │ │ │ │ ├── PinUseCasesModule.kt │ │ │ │ ├── SectetKeyUseCasesModule.kt │ │ │ │ └── FingerprintUseCasesModule.kt │ │ │ │ ├── data │ │ │ │ └── local │ │ │ │ │ ├── EncryptionPreferences.kt │ │ │ │ │ └── SharedPrefs.kt │ │ │ │ ├── wrappers │ │ │ │ ├── FingerprintManagerWrapper.kt │ │ │ │ ├── KeyguardWrapper.kt │ │ │ │ ├── BiometricPromptWrapper.kt │ │ │ │ ├── KeystoreWrapper.kt │ │ │ │ └── CipherWrapper.kt │ │ │ │ ├── SecurityApp.kt │ │ │ │ └── uscases │ │ │ │ ├── PinUseCases.kt │ │ │ │ ├── SecretKeyUseCases.kt │ │ │ │ └── FingerprintUseCases.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── kotlin │ │ │ └── pl │ │ │ └── mobite │ │ │ └── sample │ │ │ └── security │ │ │ └── utils │ │ │ ├── TestExtensions.kt │ │ │ ├── ImmediateSchedulerProvider.kt │ │ │ ├── Assertion.kt │ │ │ └── StateModifier.kt │ └── androidTest │ │ └── kotlin │ │ └── pl │ │ └── mobite │ │ └── sample │ │ └── security │ │ └── ExampleInstrumentedTest.kt ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── README.md ├── gradle.properties ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_fp_40px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/drawable-hdpi/ic_fp_40px.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_fp_40px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/drawable-mdpi/ic_fp_40px.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_fp_40px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/drawable-xhdpi/ic_fp_40px.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_fp_40px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/drawable-xxhdpi/ic_fp_40px.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_fp_40px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/drawable-xxxhdpi/ic_fp_40px.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdabrowski89/sample-security/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/ui/base/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.ui.base 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | 5 | abstract class BaseActivity: AppCompatActivity() { 6 | 7 | // do nothing 8 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/utils/Utils.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.utils 2 | 3 | import android.os.Build 4 | 5 | 6 | fun hasMarshmallow() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M 7 | 8 | fun hasPie() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Aug 28 16:45:47 CEST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip 7 | -------------------------------------------------------------------------------- /app/src/test/kotlin/pl/mobite/sample/security/utils/TestExtensions.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.utils 2 | 3 | import org.mockito.Mockito 4 | 5 | 6 | /** 7 | * Lazy delegate for creating mocks 8 | */ 9 | inline fun lazyMock(): Lazy = lazy { Mockito.mock(T::class.java) } -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/ui/base/mvi/SchedulersProvider.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.ui.base.mvi 2 | 3 | import io.reactivex.Scheduler 4 | 5 | 6 | interface SchedulersProvider { 7 | 8 | fun subscriptionScheduler(): Scheduler 9 | 10 | fun observationScheduler(): Scheduler 11 | } -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nav_header_background.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/ui/base/mvi/MviCore.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.ui.base.mvi 2 | 3 | import android.os.Parcelable 4 | 5 | 6 | interface MviAction 7 | 8 | interface MviResult 9 | 10 | interface MviViewState: Parcelable { 11 | 12 | fun reduce(result: R): MviViewState 13 | 14 | fun isSavable(): Boolean 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/utils/Extensions.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.utils 2 | 3 | import android.view.View 4 | import io.reactivex.Observable 5 | import io.reactivex.android.schedulers.AndroidSchedulers 6 | import java.util.concurrent.TimeUnit 7 | 8 | 9 | fun View.setVisibleOrGone(visible: Boolean) { 10 | visibility = if (visible) View.VISIBLE else View.GONE 11 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dashboard_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/di/WrappersModule.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.di 2 | 3 | import org.koin.dsl.module 4 | import pl.mobite.sample.security.wrappers.* 5 | 6 | 7 | val wrappersModule = module { 8 | 9 | single { KeystoreWrapper(get()) } 10 | 11 | single { CipherWrapper() } 12 | 13 | single { FingerprintManagerWrapper(get()) } 14 | 15 | single { KeyguardWrapper(get()) } 16 | 17 | single { BiometricPromptWrapper() } 18 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/ui/custom/CustomTextWatcher.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.ui.custom 2 | 3 | import android.text.Editable 4 | import android.text.TextWatcher 5 | 6 | 7 | abstract class CustomTextWatcher: TextWatcher { 8 | override fun afterTextChanged(s: Editable?) {} 9 | 10 | override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} 11 | 12 | override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} 13 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/di/AppModule.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.di 2 | 3 | import org.koin.dsl.module 4 | import pl.mobite.sample.security.data.local.EncryptionPreferences 5 | import pl.mobite.sample.security.ui.base.mvi.DefaultSchedulersProvider 6 | import pl.mobite.sample.security.ui.base.mvi.SchedulersProvider 7 | 8 | 9 | val appModule = module { 10 | 11 | single { DefaultSchedulersProvider.instance } 12 | 13 | single { EncryptionPreferences(get()) } 14 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/data/local/EncryptionPreferences.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.data.local 2 | 3 | import android.content.Context 4 | 5 | 6 | class EncryptionPreferences( 7 | context: Context 8 | ): SharedPrefs(context, "EncryptionPreferences") { 9 | 10 | var encryptedSecretKey by sharedPrefs.string("encryptedSecretKey", null) 11 | 12 | var secretKeyIv by sharedPrefs.string("secretKeyIv", null) 13 | 14 | var fingerprintIv by sharedPrefs.string("fingerprintIv", null) 15 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/di/PinUseCasesModule.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.di 2 | 3 | import org.koin.dsl.module 4 | import pl.mobite.sample.security.uscases.* 5 | 6 | 7 | val pinUseCasesModule = module { 8 | 9 | factory { GenerateKeyForPinUseCaseImpl(get()) } 10 | 11 | factory { GetKeyForPinUseCaseImpl(get()) } 12 | 13 | factory { EncryptWithPinUseCaseImpl(get()) } 14 | 15 | factory { DecryptWithPinUseCaseImpl(get()) } 16 | } -------------------------------------------------------------------------------- /app/src/test/kotlin/pl/mobite/sample/security/utils/ImmediateSchedulerProvider.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.utils 2 | 3 | import io.reactivex.Scheduler 4 | import io.reactivex.schedulers.Schedulers 5 | import pl.mobite.sample.security.ui.base.mvi.SchedulerProvider 6 | 7 | 8 | class ImmediateSchedulerProvider private constructor(): SchedulerProvider { 9 | 10 | override fun io(): Scheduler = Schedulers.trampoline() 11 | 12 | override fun ui(): Scheduler = Schedulers.trampoline() 13 | 14 | companion object { 15 | 16 | val instance = ImmediateSchedulerProvider() 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | 8 | #009688 9 | #F4511E 10 | #42000000 11 | #FFFFFF 12 | #f4511e 13 | #009688 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/ui/base/mvi/DefaultSchedulersProvider.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.ui.base.mvi 2 | 3 | import io.reactivex.Scheduler 4 | import io.reactivex.android.schedulers.AndroidSchedulers 5 | import io.reactivex.schedulers.Schedulers 6 | 7 | 8 | class DefaultSchedulersProvider private constructor() : SchedulersProvider { 9 | 10 | override fun subscriptionScheduler(): Scheduler = Schedulers.io() 11 | 12 | override fun observationScheduler(): Scheduler = AndroidSchedulers.mainThread() 13 | 14 | companion object { 15 | 16 | val instance = DefaultSchedulersProvider() 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/wrappers/FingerprintManagerWrapper.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.wrappers 2 | 3 | import android.content.Context 4 | import androidx.core.hardware.fingerprint.FingerprintManagerCompat 5 | 6 | 7 | class FingerprintManagerWrapper( 8 | context: Context 9 | ) { 10 | private val fingerprintManager = FingerprintManagerCompat.from(context) 11 | 12 | fun isHardwareDetected(): Boolean { 13 | return fingerprintManager.isHardwareDetected 14 | } 15 | 16 | fun hasEnrolledFingerprints(): Boolean { 17 | return fingerprintManager.hasEnrolledFingerprints() 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/kotlin/pl/mobite/sample/security/wrappers/KeyguardWrapper.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.wrappers 2 | 3 | import android.app.KeyguardManager 4 | import android.content.Context 5 | import pl.mobite.sample.security.utils.hasMarshmallow 6 | 7 | 8 | class KeyguardWrapper( 9 | context: Context 10 | ) { 11 | 12 | private val keyguardManager: KeyguardManager? = if (hasMarshmallow()) { 13 | context.getSystemService(KeyguardManager::class.java) 14 | } else { 15 | null 16 | } 17 | 18 | fun isDeviceSecure(): Boolean { 19 | return hasMarshmallow() && keyguardManager?.isDeviceSecure ?: false 20 | } 21 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Android Studio project files 6 | .idea/ 7 | 8 | # Files for the ART/Dalvik VM 9 | *.dex 10 | 11 | # Java class files 12 | *.class 13 | 14 | # Generated files 15 | bin/ 16 | gen/ 17 | out/ 18 | 19 | # Gradle files 20 | .gradle/ 21 | build/ 22 | 23 | # Local configuration file (sdk path, etc) 24 | local.properties 25 | 26 | # Proguard folder generated by Eclipse 27 | proguard/ 28 | 29 | # Log Files 30 | *.log 31 | 32 | # Android Studio Navigation editor temp files 33 | .navigation/ 34 | 35 | # Android Studio captures folder 36 | captures/ 37 | 38 | # Intellij 39 | *.iml 40 | .idea/workspace.xml -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main_nav_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/test/kotlin/pl/mobite/sample/security/utils/Assertion.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security.utils 2 | 3 | import org.junit.Assert 4 | import pl.mobite.sample.security.ui.components.secretkey.SecretKeyViewState 5 | 6 | 7 | fun assertSecretKeyViewState(expected: SecretKeyViewState, tested: SecretKeyViewState) { 8 | Assert.assertEquals(expected.secretKeyAlias, tested.secretKeyAlias) 9 | Assert.assertEquals(expected.messageEncrypted, tested.messageEncrypted) 10 | Assert.assertEquals(expected.messageDecrypted, tested.messageDecrypted) 11 | Assert.assertEquals(expected.isLoading, tested.isLoading) 12 | Assert.assertEquals(expected.clearEvent.get(), tested.clearEvent.get()) 13 | Assert.assertEquals(expected.error?.throwable, tested.error?.throwable) 14 | } -------------------------------------------------------------------------------- /app/src/androidTest/kotlin/pl/mobite/sample/security/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package pl.mobite.sample.security 2 | 3 | import android.support.test.InstrumentationRegistry 4 | import android.support.test.runner.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getTargetContext() 22 | assertEquals("pl.mobite.samp.ecurity", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 |