├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── themes.xml │ │ │ │ └── colors.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_foreground.webp │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_foreground.webp │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_foreground.webp │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_foreground.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_foreground.webp │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── xml │ │ │ │ ├── backup_rules.xml │ │ │ │ └── data_extraction_rules.xml │ │ │ └── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── ic_launcher_background.xml │ │ ├── ic_launcher-playstore.png │ │ ├── java │ │ │ └── nl │ │ │ │ └── jovmit │ │ │ │ └── androiddevs │ │ │ │ ├── AndroidDevsApp.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainAppViewModel.kt │ │ │ │ └── MainApp.kt │ │ └── AndroidManifest.xml │ ├── androidTest │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ ├── CustomTestRunner.kt │ │ │ ├── LoginScreenRobot.kt │ │ │ └── LoginTest.kt │ └── test │ │ └── java │ │ └── nl │ │ └── jovmit │ │ └── androiddevs │ │ └── DetectLogoutSignalTest.kt ├── proguard-rules.pro └── build.gradle.kts ├── domain └── auth │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ ├── main │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── domain │ │ │ └── auth │ │ │ ├── data │ │ │ ├── User.kt │ │ │ ├── AuthMapper.kt │ │ │ └── AuthResult.kt │ │ │ ├── AuthRepository.kt │ │ │ ├── AuthModule.kt │ │ │ └── RemoteAuthRepository.kt │ └── test │ │ └── java │ │ └── nl │ │ └── jovmit │ │ └── androiddevs │ │ └── base │ │ └── auth │ │ ├── InMemoryAuthTest.kt │ │ ├── AuthContractTest.kt │ │ └── HttpAuthTest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts ├── shared ├── ui │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── font │ │ │ │ │ ├── opensans_bold.ttf │ │ │ │ │ ├── opensans_regular.ttf │ │ │ │ │ └── opensans_semibold.ttf │ │ │ │ ├── values │ │ │ │ │ └── strings.xml │ │ │ │ └── drawable │ │ │ │ │ ├── imperfect_circle_shape.xml │ │ │ │ │ └── logo_android_devs.xml │ │ │ └── java │ │ │ │ └── nl │ │ │ │ └── jovmit │ │ │ │ └── androiddevs │ │ │ │ └── shared │ │ │ │ └── ui │ │ │ │ ├── datetime │ │ │ │ ├── AppDateTimeFormat.kt │ │ │ │ ├── DateTimeFormatterUsage.kt │ │ │ │ └── ZonedAppDateTimeFormat.kt │ │ │ │ ├── extensions │ │ │ │ └── SavedStateHandle.kt │ │ │ │ ├── validation │ │ │ │ ├── PasswordValidator.kt │ │ │ │ └── EmailValidator.kt │ │ │ │ ├── theme │ │ │ │ ├── AppFont.kt │ │ │ │ ├── Color.kt │ │ │ │ ├── AppDesignSystem.kt │ │ │ │ └── AppTheme.kt │ │ │ │ ├── DispatcherModule.kt │ │ │ │ └── composables │ │ │ │ ├── PreviewClips.kt │ │ │ │ ├── ImperfectCircleShape.kt │ │ │ │ ├── EmailInput.kt │ │ │ │ ├── Buttons.kt │ │ │ │ ├── PasswordInput.kt │ │ │ │ └── TextInput.kt │ │ └── test │ │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── shared │ │ │ └── ui │ │ │ └── validation │ │ │ └── CredentialsValidationTest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts ├── database │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ │ ├── main │ │ │ ├── sqldelight │ │ │ │ └── nl │ │ │ │ │ └── jovmit │ │ │ │ │ └── androiddevs │ │ │ │ │ └── core │ │ │ │ │ └── database │ │ │ │ │ └── UserEntity.sq │ │ │ └── java │ │ │ │ └── nl │ │ │ │ └── jovmit │ │ │ │ └── androiddevs │ │ │ │ └── core │ │ │ │ └── database │ │ │ │ └── DatabaseModule.kt │ │ └── test │ │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── core │ │ │ └── database │ │ │ └── ExampleUnitTest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts └── network │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ ├── main │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── core │ │ │ └── network │ │ │ ├── LoginData.kt │ │ │ ├── SignUpData.kt │ │ │ ├── AuthService.kt │ │ │ ├── AuthResponse.kt │ │ │ ├── LogoutSignal.kt │ │ │ ├── ExpiredTokenInterceptor.kt │ │ │ └── NetworkModule.kt │ └── test │ │ └── java │ │ └── nl │ │ └── jovmit │ │ └── androiddevs │ │ └── core │ │ └── network │ │ ├── AuthTokenExpiryTest.kt │ │ └── StubRequest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts ├── testutils ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ └── java │ │ └── nl │ │ └── jovmit │ │ └── androiddevs │ │ ├── domain │ │ └── auth │ │ │ ├── data │ │ │ └── UserBuilder.kt │ │ │ └── InMemoryAuthRepository.kt │ │ └── testutils │ │ ├── CoroutineTestExtension.kt │ │ └── CoroutineExtensions.kt ├── proguard-rules.pro └── build.gradle.kts ├── feature ├── login │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ │ ├── main │ │ │ └── java │ │ │ │ └── nl │ │ │ │ └── jovmit │ │ │ │ └── androiddevs │ │ │ │ └── feature │ │ │ │ └── login │ │ │ │ ├── LoginActions.kt │ │ │ │ ├── LoginScreenState.kt │ │ │ │ ├── LoginNavigation.kt │ │ │ │ └── LoginViewModel.kt │ │ └── test │ │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── feature │ │ │ └── login │ │ │ ├── LoginScreenshotTest.kt │ │ │ ├── LoginScreenStateTest.kt │ │ │ └── LoginTest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts ├── signup │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ │ ├── main │ │ │ └── java │ │ │ │ └── nl │ │ │ │ └── jovmit │ │ │ │ └── androiddevs │ │ │ │ └── feature │ │ │ │ └── signup │ │ │ │ ├── SignUpNavigation.kt │ │ │ │ ├── state │ │ │ │ └── SignUpScreenState.kt │ │ │ │ ├── SignUpViewModel.kt │ │ │ │ └── SignUpScreen.kt │ │ └── test │ │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── feature │ │ │ └── signup │ │ │ ├── SignUpStatesDeliveryTest.kt │ │ │ ├── SignUpScreenStateTest.kt │ │ │ └── SignUpTest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts ├── timeline │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ │ ├── main │ │ │ └── java │ │ │ │ └── nl │ │ │ │ └── jovmit │ │ │ │ └── androiddevs │ │ │ │ └── feature │ │ │ │ └── timeline │ │ │ │ ├── TimelineViewModel.kt │ │ │ │ ├── TimelineNavigation.kt │ │ │ │ └── TimelineScreen.kt │ │ └── test │ │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── feature │ │ │ └── timeline │ │ │ └── ExampleUnitTest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts ├── welcome │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ │ ├── test │ │ │ ├── snapshots │ │ │ │ └── images │ │ │ │ │ └── nl.jovmit.androiddevs.feature.welcome_WelcomeScreenTest_defaultWelcomeScreen.png │ │ │ └── java │ │ │ │ └── nl │ │ │ │ └── jovmit │ │ │ │ └── androiddevs │ │ │ │ └── feature │ │ │ │ └── welcome │ │ │ │ └── WelcomeScreenTest.kt │ │ └── main │ │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── feature │ │ │ └── welcome │ │ │ ├── WelcomeNavigation.kt │ │ │ └── WelcomeScreen.kt │ ├── proguard-rules.pro │ └── build.gradle.kts └── postdetails │ ├── .gitignore │ ├── consumer-rules.pro │ ├── src │ ├── main │ │ └── java │ │ │ └── nl │ │ │ └── jovmit │ │ │ └── androiddevs │ │ │ └── feature │ │ │ └── postdetails │ │ │ ├── PostDetailsScreenState.kt │ │ │ ├── PostDetailsNavigation.kt │ │ │ ├── PostDetailsViewModel.kt │ │ │ └── PostDetailsScreen.kt │ └── test │ │ └── java │ │ └── nl │ │ └── jovmit │ │ └── androiddevs │ │ └── feature │ │ └── postdetails │ │ └── ExampleUnitTest.kt │ ├── proguard-rules.pro │ └── build.gradle.kts ├── whatsNew └── whatsnew-en-US ├── .gitattributes ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── libs.versions.toml ├── .gitignore ├── README.md ├── .github └── workflows │ ├── pull_request.yml │ └── release.yml ├── settings.gradle.kts ├── gradle.properties ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/auth/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /shared/ui/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /shared/ui/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /testutils/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /testutils/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /domain/auth/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feature/login/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/login/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feature/signup/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/signup/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feature/timeline/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/welcome/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /shared/database/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /shared/network/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /shared/network/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feature/postdetails/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/postdetails/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feature/timeline/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feature/welcome/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /shared/database/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /whatsNew/whatsnew-en-US: -------------------------------------------------------------------------------- 1 | Initial Release -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | **/snapshots/**/*.png filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Android Devs 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /shared/ui/src/main/res/font/opensans_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/shared/ui/src/main/res/font/opensans_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /shared/ui/src/main/res/font/opensans_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/shared/ui/src/main/res/font/opensans_regular.ttf -------------------------------------------------------------------------------- /shared/ui/src/main/res/font/opensans_semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/shared/ui/src/main/res/font/opensans_semibold.ttf -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitrejcevski/android-devs-app/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #F6D756 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | .cxx 10 | local.properties 11 | #Kotlin 2.0 12 | .kotlin/ -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |