diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..551f3852 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# .editorconfig +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.kt] +max_line_length = 100 +continuation_indent_size = 4 + +[*.xml] +indent_size = 2 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a668b7ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,99 @@ +# Built application files +*.apk +*.aar +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +.idea/caches + +# Keystore files +# Uncomment the following line if you do not want to check your keystore files in. +#*.jks + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ + +# lint-gradle-api-26.1.2.jar +/home//.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-gradle-api/26.1.2/2e3fa2b2ddec89a49ea26a63e6b9cdaa76944f0d/lint-gradle-api-26.1.2.jar + +# Firebase config file +google-services.json + +# Classpath +.classpath + +# CMakeLists.txt.user +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps + +# Mac +.DS_Store diff --git a/README.md b/README.md index be2b402d..ea10dd44 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,115 @@ Seu projeto será avaliado de acordo com os seguintes critérios. 4. Qualidade e cobertura dos testes unitários. Adicionalmente, tentaremos verificar a sua familiarização com as bibliotecas padrões (standard libs), bem como sua experiência com programação orientada a objetos a partir da estrutura de seu projeto. + +================================================|||||====================================================================== + +# Projeto ByCoders + +Este projeto apresenta uma solução completa para a visualização de um mapa, implementando funcionalidades como login, autenticação, localização e rastreamento de usuários. Utilizando uma série de técnicas e bibliotecas modernas, o projeto segue uma estrutura modular e utiliza uma variedade de padrões de projeto. + +## Screens: + + + + + + + + + + + + + + + + +##Bibliotecas Utilizadas + +##Gerais +- Compose UI +- Room +- Koin Android +- Koin Core JVM +- Koin Test JVM +- Firebase Auth, Analytics, Crashlytics +- Google Maps +- Detekt + +##Testes de Unidade +- Junit: 4.13.2 +- MockK: 1.13.5 +- Kotlinx Coroutines Test: 1.7.1 +- Turbine: 0.13.0 +- Robolectric: 4.6.1 +- Google Truth: 1.1.3 +- AssertJ Core: 3.20.2 +- Testes Instrumentados +- AndroidX Test ext junit: 1.1.5 +- Espresso Core: 3.5.1 +- AndroidX Test ext truth: 1.5.0 +- AndroidX Test runner: 1.5.2 +- AndroidX Test rules: 1.5.0 +- Compose UI test junit4: 1.4.3 +- Koin Test: 3.4.0 +- MockK Android: 1.13.5 +- MockK Agent: 1.13.5 +- Compose UI Test Manifest: 1.4.3 + +## Recursos + +- Arquitetura limpa com abstrações para Firebase, Networking e Navigator +- Injeção de Dependência com Koin +- Integração com Firebase Auth, Analytics e Crashlytics +- Persistência de dados com Room +- Integração com Google Maps +- Padrões de Projeto Usecase e Repository +- Estratégia de Single Activity para Composables +- Análise Estática de Código com Detekt + +## Arquitetura e Módulos + +O projeto segue os princípios de Clean Architecture, com abstrações para Firebase, Networking e Navigator, e é dividido em vários módulos claros, otimizando a manutenção e escalabilidade. As features implementadas incluem: + +- Login: provê funcionalidades de autenticação de usuários. +- Home: exibe o mapa com informações de localização e permite a interação com marcadores. + +Os módulos do projeto incluem: + +- `firebase`: abstrai a integração com Firebase Auth, Firebase Analytics e Firebase Crashlytics. +- `networking`: proporciona o gerenciamento de chamadas de rede. +- `navigator`: responsável pelo gerenciamento de navegação no aplicativo. +- `database`: contém a abstração do banco de dados com Room. +- `features`: inclui as funcionalidades específicas de cada feature do projeto. + +## Testes + +Dedicamos uma atenção especial à qualidade do software, implementando testes de unidade e testes instrumentados para todas as funcionalidades do aplicativo, garantindo sua correta funcionalidade e confiabilidade. + +## Próximos Passos e Melhorias + +Estamos sempre buscando melhorar e expandir o projeto. Alguns dos nossos planos futuros incluem: + +- Melhorar a cobertura de testes +- Implementar novas features +- Aprimorar a usabilidade e a experiência do usuário +- Continuar otimizando a manutenibilidade e escalabilidade do projeto + +## Instalação + +Para instalar e executar o aplicativo no Android Studio, siga estas etapas: + +1. Clone o repositório ou baixe os arquivos zip do projeto. +2. Abra o Android Studio e clique em "Open an existing Android Studio project". +3. Navegue até a pasta do projeto e selecione a pasta raiz. +4. Aguarde o Android Studio sincronizar e construir o projeto. +5. Execute o aplicativo em um emulador ou dispositivo Android conectado. + +## Contato + +Se você tiver dúvidas ou sugestões, sinta-se à vontade para entrar em contato: + +- Nome: Leonardo Oliveira da Cruz +- E-mail: [leonardo_cruz09@hotmail.com] +- LinkedIn: [https://www.linkedin.com/in/leonardo-oliveira-da-cruz-8566a530/] diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..99113de9 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,91 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id 'com.google.gms.google-services' + id 'com.google.firebase.crashlytics' +} + +android { + namespace 'com.dacruz.bycodersmobile' + compileSdk 33 + + defaultConfig { + applicationId "com.dacruz.bycodersmobile" + minSdk 23 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary true + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = '17' + } + + buildFeatures { + compose true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.4.3" + } + + packagingOptions { + exclude("META-INF/DEPENDENCIES") + exclude("META-INF/LICENSE") + exclude("META-INF/LICENSE.txt") + exclude("META-INF/license.txt") + exclude("META-INF/NOTICE") + exclude("META-INF/NOTICE.txt") + exclude("META-INF/notice.txt") + exclude("META-INF/ASL2.0") + exclude("META-INF/*.kotlin_module") + } +} + +dependencies { + implementation project(":features:login") + implementation project(":features:home") + + implementation project(":theme") + implementation project(":navigator") + implementation project(":database") + implementation project(":networking") + implementation project(":firebase") + + + implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' + + implementation 'androidx.activity:activity-compose:1.7.2' + implementation "androidx.compose.ui:ui:1.5.0-beta01" + implementation "androidx.compose.ui:ui-tooling-preview:1.5.0-beta01" + implementation 'androidx.compose.material:material:1.4.3' + + implementation "io.insert-koin:koin-core:3.4.0" + implementation "io.insert-koin:koin-android:3.4.0" + implementation "io.insert-koin:koin-androidx-compose:3.4.4" + implementation "io.insert-koin:koin-test:3.4.0" + + implementation 'androidx.room:room-runtime:2.5.1' + +} diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 00000000..3784183e --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "778288842861", + "project_id": "bycodersmobile", + "storage_bucket": "bycodersmobile.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:778288842861:android:86a39a54554ee16f911764", + "android_client_info": { + "package_name": "com.dacruz.bycodersmobile" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyDU2NTjL2ndcMzA4kYhPwWDv3bMPbtWlhE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# 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 \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..2b12cb36 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/dacruz/bycodersmobile/AppNavigator.kt b/app/src/main/java/com/dacruz/bycodersmobile/AppNavigator.kt new file mode 100644 index 00000000..f4b7ebda --- /dev/null +++ b/app/src/main/java/com/dacruz/bycodersmobile/AppNavigator.kt @@ -0,0 +1,68 @@ +package com.dacruz.bycodersmobile + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import com.dacruz.bycodersmobile.home.presentation.HomeScreen +import com.dacruz.bycodersmobile.login.presentation.LoginScreen +import com.dacruz.bycodersmobile.login.presentation.RegisterScreen +import com.dacruz.navigator.NavigationHandler +import com.dacruz.navigator.Screen +import com.dacruz.theme.Grey100 +import com.dacruz.theme.Grey900 +import kotlinx.coroutines.delay +import org.koin.compose.rememberKoinInject + +@Composable +fun AppNavigator(navigationHandler: NavigationHandler = rememberKoinInject()) { + val currentScreen by navigationHandler.currentScreen.collectAsState() + + when (currentScreen) { + is Screen.SplashScreen -> SplashScreen(navigationHandler) + is Screen.LoginScreen -> LoginScreen(navigationHandler) + is Screen.HomeScreen -> HomeScreen(navigationHandler) + is Screen.RegisterScreen -> RegisterScreen(navigationHandler) + } +} + +@Composable +fun SplashScreen(navigationHandler: NavigationHandler) { + val alpha = remember { Animatable(1f) } + + LaunchedEffect(Unit) { + delay(2000L) + alpha.animateTo(0f, animationSpec = tween(durationMillis = 1000)) + navigationHandler.navigateTo(Screen.LoginScreen, pop = Screen.SplashScreen) + } + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Grey900) + ) + Text( + text = stringResource(id = R.string.app_name), + fontSize = 40.sp, + fontWeight = FontWeight.Bold, + color = Grey100, + modifier = Modifier.alpha(alpha.value) + ) + } +} diff --git a/app/src/main/java/com/dacruz/bycodersmobile/ByCodersApp.kt b/app/src/main/java/com/dacruz/bycodersmobile/ByCodersApp.kt new file mode 100644 index 00000000..b32b8a30 --- /dev/null +++ b/app/src/main/java/com/dacruz/bycodersmobile/ByCodersApp.kt @@ -0,0 +1,32 @@ +package com.dacruz.bycodersmobile + +import android.app.Application +import com.dacruz.bycodersmobile.firebase.di.firebaseModule +import com.dacruz.bycodersmobile.home.di.homeModule +import com.dacruz.bycodersmobile.login.di.loginModule +import com.dacruz.database.di.databaseModule +import com.dacruz.navigator.di.navigationModule +import org.koin.android.ext.koin.androidContext +import org.koin.android.ext.koin.androidLogger +import org.koin.core.context.GlobalContext.startKoin +import org.koin.core.logger.Level + +class ByCodersApp : Application() { + + override fun onCreate() { + super.onCreate() + startKoin { + androidLogger(Level.DEBUG) + androidContext(this@ByCodersApp) + modules( + listOf( + firebaseModule, + databaseModule, + navigationModule, + loginModule, + homeModule + ) + ) + } + } +} diff --git a/app/src/main/java/com/dacruz/bycodersmobile/MainActivity.kt b/app/src/main/java/com/dacruz/bycodersmobile/MainActivity.kt new file mode 100644 index 00000000..cfb96567 --- /dev/null +++ b/app/src/main/java/com/dacruz/bycodersmobile/MainActivity.kt @@ -0,0 +1,27 @@ +package com.dacruz.bycodersmobile + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import com.dacruz.navigator.NavigationHandler +import com.dacruz.theme.ByCodersTheme +import com.dacruz.theme.LocalIsLightTheme +import org.koin.android.ext.android.inject + +class MainActivity : ComponentActivity() { + private val navigationHandler: NavigationHandler by inject() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + val isLightTheme = LocalIsLightTheme.current + ByCodersTheme(isDarkTheme = isLightTheme.value) { + AppNavigator(navigationHandler) + } + } + } + + override fun onBackPressed() { + navigationHandler.navigateBack() { finish() } + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bycoders_1.png b/app/src/main/res/drawable/bycoders_1.png new file mode 100644 index 00000000..d0ec77ba Binary files /dev/null and b/app/src/main/res/drawable/bycoders_1.png differ diff --git a/app/src/main/res/drawable/bycoders_10.png b/app/src/main/res/drawable/bycoders_10.png new file mode 100644 index 00000000..44402fc4 Binary files /dev/null and b/app/src/main/res/drawable/bycoders_10.png differ diff --git a/app/src/main/res/drawable/bycoders_11.png b/app/src/main/res/drawable/bycoders_11.png new file mode 100644 index 00000000..4ed03a61 Binary files /dev/null and b/app/src/main/res/drawable/bycoders_11.png differ diff --git a/app/src/main/res/drawable/bycoders_2.png b/app/src/main/res/drawable/bycoders_2.png new file mode 100644 index 00000000..7955750d Binary files /dev/null and b/app/src/main/res/drawable/bycoders_2.png differ diff --git a/app/src/main/res/drawable/bycoders_3.png b/app/src/main/res/drawable/bycoders_3.png new file mode 100644 index 00000000..3cfd733b Binary files /dev/null and b/app/src/main/res/drawable/bycoders_3.png differ diff --git a/app/src/main/res/drawable/bycoders_4.png b/app/src/main/res/drawable/bycoders_4.png new file mode 100644 index 00000000..6b508d29 Binary files /dev/null and b/app/src/main/res/drawable/bycoders_4.png differ diff --git a/app/src/main/res/drawable/bycoders_5.png b/app/src/main/res/drawable/bycoders_5.png new file mode 100644 index 00000000..af154070 Binary files /dev/null and b/app/src/main/res/drawable/bycoders_5.png differ diff --git a/app/src/main/res/drawable/bycoders_6.png b/app/src/main/res/drawable/bycoders_6.png new file mode 100644 index 00000000..8ec2a656 Binary files /dev/null and b/app/src/main/res/drawable/bycoders_6.png differ diff --git a/app/src/main/res/drawable/bycoders_7.png b/app/src/main/res/drawable/bycoders_7.png new file mode 100644 index 00000000..e5423358 Binary files /dev/null and b/app/src/main/res/drawable/bycoders_7.png differ diff --git a/app/src/main/res/drawable/bycoders_8.png b/app/src/main/res/drawable/bycoders_8.png new file mode 100644 index 00000000..36de044a Binary files /dev/null and b/app/src/main/res/drawable/bycoders_8.png differ diff --git a/app/src/main/res/drawable/bycoders_9.png b/app/src/main/res/drawable/bycoders_9.png new file mode 100644 index 00000000..fc4c94f1 Binary files /dev/null and b/app/src/main/res/drawable/bycoders_9.png differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..e93e11ad --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 00000000..c209e78e Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 00000000..b2dfe3d1 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 00000000..4f0f1d64 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 00000000..62b611da Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 00000000..948a3070 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..1b9a6956 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 00000000..28d4b77f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9287f508 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 00000000..aa7d6427 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9126ae37 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 00000000..6c79820f --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..f8c6127d --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..0d60bc73 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + byCodersMobile + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..5bf73d64 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,4 @@ + + +