├── .gitignore ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── net │ │ └── simplifiedcoding │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── net │ │ │ └── simplifiedcoding │ │ │ ├── FirebaseAuthApp.kt │ │ │ ├── MainActivity.kt │ │ │ ├── navigation │ │ │ ├── AppNavHost.kt │ │ │ └── Routes.kt │ │ │ └── ui │ │ │ ├── auth │ │ │ ├── AuthHeader.kt │ │ │ ├── AuthViewModel.kt │ │ │ ├── Login.kt │ │ │ └── Signup.kt │ │ │ ├── home │ │ │ └── HomeScreen.kt │ │ │ └── theme │ │ │ ├── Color.kt │ │ │ ├── Spacing.kt │ │ │ ├── Theme.kt │ │ │ └── Typography.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_app_logo.xml │ │ ├── ic_launcher_background.xml │ │ └── ic_person.xml │ │ ├── font │ │ ├── poppins_black.ttf │ │ ├── poppins_bold.ttf │ │ ├── poppins_extra_bold.ttf │ │ ├── poppins_italic.ttf │ │ ├── poppins_light.ttf │ │ ├── poppins_medium.ttf │ │ ├── poppins_regular.ttf │ │ └── poppins_thin.ttf │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ └── themes.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ ├── backup_rules.xml │ │ └── data_extraction_rules.xml │ └── test │ └── java │ └── net │ └── simplifiedcoding │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | #built application files 2 | *.apk 3 | *.ap_ 4 | *.aab 5 | 6 | # files for the dex VM 7 | *.dex 8 | 9 | # Java class files 10 | *.class 11 | 12 | # generated files 13 | bin/ 14 | gen/ 15 | 16 | # Local configuration file (sdk path, etc) 17 | local.properties 18 | 19 | # Windows thumbnail db 20 | Thumbs.db 21 | 22 | # OSX files 23 | .DS_Store 24 | 25 | # Android Studio 26 | *.iml 27 | .idea 28 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs. 29 | .gradle 30 | build/ 31 | .navigation 32 | captures/ 33 | output.json 34 | 35 | /app/google-services.json 36 | 37 | #NDK 38 | obj/ 39 | .externalNativeBuild 40 | /local.properties 41 | /.idea/caches 42 | /.idea/libraries 43 | /.idea/modules.xml 44 | /.idea/workspace.xml 45 | /.idea/navEditor.xml 46 | /.idea/assetWizardSettings.xml 47 | /build 48 | /captures 49 | .cxx 50 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "kotlin-android" 3 | id "com.android.application" 4 | id "org.jetbrains.kotlin.android" 5 | id "com.google.gms.google-services" 6 | id "kotlin-kapt" 7 | id "dagger.hilt.android.plugin" 8 | } 9 | 10 | android { 11 | compileSdk 33 12 | 13 | defaultConfig { 14 | applicationId "net.simplifiedcoding" 15 | minSdk 21 16 | targetSdk 33 17 | versionCode 1 18 | versionName "1.0" 19 | 20 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 21 | } 22 | 23 | buildTypes { 24 | release { 25 | minifyEnabled false 26 | proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" 27 | } 28 | } 29 | compileOptions { 30 | sourceCompatibility JavaVersion.VERSION_1_8 31 | targetCompatibility JavaVersion.VERSION_1_8 32 | } 33 | kotlinOptions { 34 | jvmTarget = "1.8" 35 | } 36 | buildFeatures { 37 | compose true 38 | } 39 | composeOptions { 40 | kotlinCompilerExtensionVersion "1.3.0" 41 | } 42 | } 43 | 44 | dependencies { 45 | implementation "androidx.core:core-ktx:1.8.0" 46 | implementation "androidx.appcompat:appcompat:1.4.2" 47 | implementation "com.google.android.material:material:1.6.1" 48 | implementation "androidx.constraintlayout:constraintlayout:2.1.4" 49 | implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4" 50 | 51 | implementation platform("com.google.firebase:firebase-bom:30.3.1") 52 | implementation "com.google.firebase:firebase-auth-ktx" 53 | 54 | implementation "androidx.activity:activity-compose:1.5.1" 55 | implementation "androidx.compose.material3:material3:1.0.0-beta01" 56 | implementation "androidx.compose.animation:animation:1.2.1" 57 | implementation "androidx.compose.ui:ui-tooling:1.2.1" 58 | implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1" 59 | 60 | implementation "androidx.navigation:navigation-compose:2.5.1" 61 | implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1" 62 | 63 | implementation "com.google.dagger:hilt-android:2.42" 64 | kapt "com.google.dagger:hilt-android-compiler:2.42" 65 | 66 | testImplementation "junit:junit:4.13.2" 67 | androidTestImplementation "androidx.test.ext:junit:1.1.3" 68 | androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0" 69 | androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.2.1" 70 | } 71 | 72 | kapt { 73 | correctErrorTypes = true 74 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/net/simplifiedcoding/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.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.getInstrumentation().targetContext 22 | assertEquals("net.simplifiedcoding", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/FirebaseAuthApp.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding 2 | 3 | import android.app.Application 4 | import dagger.hilt.android.HiltAndroidApp 5 | 6 | @HiltAndroidApp 7 | class FirebaseAuthApp : Application() -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding 2 | 3 | import android.os.Bundle 4 | import androidx.activity.compose.setContent 5 | import androidx.appcompat.app.AppCompatActivity 6 | import net.simplifiedcoding.navigation.AppNavHost 7 | import net.simplifiedcoding.ui.theme.AppTheme 8 | 9 | class MainActivity : AppCompatActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContent { 14 | AppTheme { 15 | AppNavHost() 16 | } 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/navigation/AppNavHost.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.navigation 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.ui.Modifier 5 | import androidx.navigation.NavHostController 6 | import androidx.navigation.compose.NavHost 7 | import androidx.navigation.compose.composable 8 | import androidx.navigation.compose.rememberNavController 9 | import net.simplifiedcoding.ui.auth.LoginScreen 10 | import net.simplifiedcoding.ui.auth.SignupScreen 11 | import net.simplifiedcoding.ui.home.HomeScreen 12 | 13 | @Composable 14 | fun AppNavHost( 15 | modifier: Modifier = Modifier, 16 | navController: NavHostController = rememberNavController(), 17 | startDestination: String = ROUTE_LOGIN 18 | ) { 19 | NavHost( 20 | modifier = modifier, 21 | navController = navController, 22 | startDestination = startDestination 23 | ) { 24 | composable(ROUTE_LOGIN) { 25 | LoginScreen(navController) 26 | } 27 | composable(ROUTE_SIGNUP) { 28 | SignupScreen(navController) 29 | } 30 | composable(ROUTE_HOME) { 31 | HomeScreen(navController) 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/navigation/Routes.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.navigation 2 | 3 | const val ROUTE_LOGIN = "login" 4 | const val ROUTE_SIGNUP = "signup" 5 | const val ROUTE_HOME = "home" -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/auth/AuthHeader.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.auth 2 | 3 | import android.content.res.Configuration 4 | import androidx.compose.foundation.Image 5 | import androidx.compose.foundation.layout.* 6 | import androidx.compose.material3.MaterialTheme 7 | import androidx.compose.material3.Text 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Alignment 10 | import androidx.compose.ui.Modifier 11 | import androidx.compose.ui.res.painterResource 12 | import androidx.compose.ui.res.stringResource 13 | import androidx.compose.ui.text.style.TextAlign 14 | import androidx.compose.ui.tooling.preview.Preview 15 | import androidx.compose.ui.unit.dp 16 | import net.simplifiedcoding.R 17 | import net.simplifiedcoding.ui.theme.AppTheme 18 | import net.simplifiedcoding.ui.theme.spacing 19 | 20 | @Composable 21 | fun AuthHeader() { 22 | Column( 23 | modifier = Modifier.wrapContentSize(), 24 | horizontalAlignment = Alignment.CenterHorizontally 25 | ) { 26 | val spacing = MaterialTheme.spacing 27 | 28 | Image( 29 | modifier = Modifier 30 | .size(128.dp, 128.dp), 31 | painter = painterResource(id = R.drawable.ic_app_logo), 32 | contentDescription = stringResource(id = R.string.app_name) 33 | ) 34 | 35 | Text( 36 | modifier = Modifier 37 | .fillMaxWidth() 38 | .wrapContentHeight() 39 | .padding(top = spacing.medium), 40 | text = stringResource(id = R.string.app_name), 41 | style = MaterialTheme.typography.headlineMedium, 42 | textAlign = TextAlign.Center, 43 | color = MaterialTheme.colorScheme.onSurface 44 | ) 45 | } 46 | } 47 | 48 | @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) 49 | @Composable 50 | fun AppHeaderLight() { 51 | AppTheme { 52 | AuthHeader() 53 | } 54 | } 55 | 56 | @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) 57 | @Composable 58 | fun AppHeaderDark() { 59 | AppTheme { 60 | AuthHeader() 61 | } 62 | } -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/auth/AuthViewModel.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.auth 2 | 3 | import androidx.lifecycle.ViewModel 4 | 5 | class AuthViewModel : ViewModel() { 6 | 7 | } -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/auth/Login.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.auth 2 | 3 | import android.content.res.Configuration.UI_MODE_NIGHT_NO 4 | import android.content.res.Configuration.UI_MODE_NIGHT_YES 5 | import androidx.compose.foundation.clickable 6 | import androidx.compose.foundation.layout.Box 7 | import androidx.compose.foundation.layout.fillMaxSize 8 | import androidx.compose.foundation.layout.wrapContentSize 9 | import androidx.compose.foundation.text.KeyboardOptions 10 | import androidx.compose.material3.* 11 | import androidx.compose.runtime.* 12 | import androidx.compose.ui.Modifier 13 | import androidx.compose.ui.res.stringResource 14 | import androidx.compose.ui.text.input.ImeAction 15 | import androidx.compose.ui.text.input.KeyboardCapitalization 16 | import androidx.compose.ui.text.input.KeyboardType 17 | import androidx.compose.ui.text.style.TextAlign 18 | import androidx.compose.ui.tooling.preview.Preview 19 | import androidx.constraintlayout.compose.ConstraintLayout 20 | import androidx.constraintlayout.compose.Dimension 21 | import androidx.navigation.NavController 22 | import androidx.navigation.compose.rememberNavController 23 | import net.simplifiedcoding.R 24 | import net.simplifiedcoding.navigation.ROUTE_LOGIN 25 | import net.simplifiedcoding.navigation.ROUTE_SIGNUP 26 | import net.simplifiedcoding.ui.theme.AppTheme 27 | import net.simplifiedcoding.ui.theme.spacing 28 | 29 | @OptIn(ExperimentalMaterial3Api::class) 30 | @Composable 31 | fun LoginScreen(navController: NavController) { 32 | var email by remember { mutableStateOf("") } 33 | var password by remember { mutableStateOf("") } 34 | 35 | ConstraintLayout( 36 | modifier = Modifier.fillMaxSize() 37 | ) { 38 | 39 | val (refHeader, refEmail, refPassword, refButtonLogin, refTextSignup) = createRefs() 40 | val spacing = MaterialTheme.spacing 41 | 42 | Box( 43 | modifier = Modifier 44 | .constrainAs(refHeader) { 45 | top.linkTo(parent.top, spacing.extraLarge) 46 | start.linkTo(parent.start) 47 | end.linkTo(parent.end) 48 | width = Dimension.fillToConstraints 49 | } 50 | .wrapContentSize() 51 | ) { 52 | AuthHeader() 53 | } 54 | 55 | 56 | TextField( 57 | value = email, 58 | onValueChange = { 59 | email = it 60 | }, 61 | label = { 62 | Text(text = stringResource(id = R.string.email)) 63 | }, 64 | modifier = Modifier.constrainAs(refEmail) { 65 | top.linkTo(refHeader.bottom, spacing.extraLarge) 66 | start.linkTo(parent.start, spacing.large) 67 | end.linkTo(parent.end, spacing.large) 68 | width = Dimension.fillToConstraints 69 | }, 70 | keyboardOptions = KeyboardOptions( 71 | capitalization = KeyboardCapitalization.None, 72 | autoCorrect = false, 73 | keyboardType = KeyboardType.Email, 74 | imeAction = ImeAction.Next 75 | ) 76 | ) 77 | 78 | TextField( 79 | value = password, 80 | onValueChange = { 81 | password = it 82 | }, 83 | label = { 84 | Text(text = stringResource(id = R.string.password)) 85 | }, 86 | modifier = Modifier.constrainAs(refPassword) { 87 | top.linkTo(refEmail.bottom, spacing.medium) 88 | start.linkTo(parent.start, spacing.large) 89 | end.linkTo(parent.end, spacing.large) 90 | width = Dimension.fillToConstraints 91 | }, 92 | keyboardOptions = KeyboardOptions( 93 | capitalization = KeyboardCapitalization.None, 94 | autoCorrect = false, 95 | keyboardType = KeyboardType.Password, 96 | imeAction = ImeAction.Done 97 | ) 98 | ) 99 | 100 | Button( 101 | onClick = { 102 | 103 | }, 104 | modifier = Modifier.constrainAs(refButtonLogin) { 105 | top.linkTo(refPassword.bottom, spacing.large) 106 | start.linkTo(parent.start, spacing.extraLarge) 107 | end.linkTo(parent.end, spacing.extraLarge) 108 | width = Dimension.fillToConstraints 109 | } 110 | ) { 111 | Text(text = stringResource(id = R.string.login), style = MaterialTheme.typography.titleMedium) 112 | } 113 | 114 | 115 | Text( 116 | modifier = Modifier 117 | .constrainAs(refTextSignup) { 118 | top.linkTo(refButtonLogin.bottom, spacing.medium) 119 | start.linkTo(parent.start, spacing.extraLarge) 120 | end.linkTo(parent.end, spacing.extraLarge) 121 | } 122 | .clickable { 123 | navController.navigate(ROUTE_SIGNUP) { 124 | popUpTo(ROUTE_LOGIN) { inclusive = true } 125 | } 126 | }, 127 | text = stringResource(id = R.string.dont_have_account), 128 | style = MaterialTheme.typography.bodyLarge, 129 | textAlign = TextAlign.Center, 130 | color = MaterialTheme.colorScheme.onSurface 131 | ) 132 | 133 | } 134 | } 135 | 136 | @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_NO) 137 | @Composable 138 | fun LoginScreenPreviewLight() { 139 | AppTheme { 140 | LoginScreen(rememberNavController()) 141 | } 142 | } 143 | 144 | @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES) 145 | @Composable 146 | fun LoginScreenPreviewDark() { 147 | AppTheme { 148 | LoginScreen(rememberNavController()) 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/auth/Signup.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.auth 2 | 3 | import android.content.res.Configuration.UI_MODE_NIGHT_NO 4 | import android.content.res.Configuration.UI_MODE_NIGHT_YES 5 | import androidx.compose.foundation.clickable 6 | import androidx.compose.foundation.layout.Box 7 | import androidx.compose.foundation.layout.fillMaxSize 8 | import androidx.compose.foundation.layout.wrapContentSize 9 | import androidx.compose.foundation.text.KeyboardOptions 10 | import androidx.compose.material3.* 11 | import androidx.compose.runtime.* 12 | import androidx.compose.ui.Modifier 13 | import androidx.compose.ui.res.stringResource 14 | import androidx.compose.ui.text.input.ImeAction 15 | import androidx.compose.ui.text.input.KeyboardCapitalization 16 | import androidx.compose.ui.text.input.KeyboardType 17 | import androidx.compose.ui.text.input.PasswordVisualTransformation 18 | import androidx.compose.ui.text.style.TextAlign 19 | import androidx.compose.ui.tooling.preview.Preview 20 | import androidx.constraintlayout.compose.ConstraintLayout 21 | import androidx.constraintlayout.compose.Dimension 22 | import androidx.navigation.NavHostController 23 | import androidx.navigation.compose.rememberNavController 24 | import net.simplifiedcoding.R 25 | import net.simplifiedcoding.navigation.ROUTE_LOGIN 26 | import net.simplifiedcoding.navigation.ROUTE_SIGNUP 27 | import net.simplifiedcoding.ui.theme.AppTheme 28 | import net.simplifiedcoding.ui.theme.spacing 29 | 30 | @OptIn(ExperimentalMaterial3Api::class) 31 | @Composable 32 | fun SignupScreen(navController: NavHostController) { 33 | var name by remember { mutableStateOf("") } 34 | var email by remember { mutableStateOf("") } 35 | var password by remember { mutableStateOf("") } 36 | 37 | ConstraintLayout( 38 | modifier = Modifier.fillMaxSize() 39 | ) { 40 | val (refHeader, refName, refEmail, refPassword, refButtonSignup, refTextSignup) = createRefs() 41 | val spacing = MaterialTheme.spacing 42 | 43 | Box( 44 | modifier = Modifier 45 | .constrainAs(refHeader) { 46 | top.linkTo(parent.top, spacing.extraLarge) 47 | start.linkTo(parent.start) 48 | end.linkTo(parent.end) 49 | width = Dimension.fillToConstraints 50 | } 51 | .wrapContentSize() 52 | ) { 53 | AuthHeader() 54 | } 55 | 56 | TextField( 57 | value = name, 58 | onValueChange = { 59 | name = it 60 | }, 61 | label = { 62 | Text(text = stringResource(id = R.string.name)) 63 | }, 64 | modifier = Modifier.constrainAs(refName) { 65 | top.linkTo(refHeader.bottom, spacing.extraLarge) 66 | start.linkTo(parent.start, spacing.large) 67 | end.linkTo(parent.end, spacing.large) 68 | width = Dimension.fillToConstraints 69 | }, 70 | keyboardOptions = KeyboardOptions( 71 | capitalization = KeyboardCapitalization.None, 72 | autoCorrect = false, 73 | keyboardType = KeyboardType.Email, 74 | imeAction = ImeAction.Next 75 | ) 76 | ) 77 | 78 | TextField( 79 | value = email, 80 | onValueChange = { 81 | email = it 82 | }, 83 | label = { 84 | Text(text = stringResource(id = R.string.email)) 85 | }, 86 | modifier = Modifier.constrainAs(refEmail) { 87 | top.linkTo(refName.bottom, spacing.medium) 88 | start.linkTo(parent.start, spacing.large) 89 | end.linkTo(parent.end, spacing.large) 90 | width = Dimension.fillToConstraints 91 | }, 92 | keyboardOptions = KeyboardOptions( 93 | capitalization = KeyboardCapitalization.None, 94 | autoCorrect = false, 95 | keyboardType = KeyboardType.Email, 96 | imeAction = ImeAction.Next 97 | ) 98 | ) 99 | 100 | TextField( 101 | value = password, 102 | onValueChange = { 103 | password = it 104 | }, 105 | label = { 106 | Text(text = stringResource(id = R.string.password)) 107 | }, 108 | modifier = Modifier.constrainAs(refPassword) { 109 | top.linkTo(refEmail.bottom, spacing.medium) 110 | start.linkTo(parent.start, spacing.large) 111 | end.linkTo(parent.end, spacing.large) 112 | width = Dimension.fillToConstraints 113 | }, 114 | visualTransformation = PasswordVisualTransformation(), 115 | keyboardOptions = KeyboardOptions( 116 | capitalization = KeyboardCapitalization.None, 117 | autoCorrect = false, 118 | keyboardType = KeyboardType.Password, 119 | imeAction = ImeAction.Done 120 | ) 121 | ) 122 | 123 | Button( 124 | onClick = { 125 | 126 | }, 127 | modifier = Modifier.constrainAs(refButtonSignup) { 128 | top.linkTo(refPassword.bottom, spacing.large) 129 | start.linkTo(parent.start, spacing.extraLarge) 130 | end.linkTo(parent.end, spacing.extraLarge) 131 | width = Dimension.fillToConstraints 132 | } 133 | ) { 134 | Text(text = stringResource(id = R.string.signup), style = MaterialTheme.typography.titleMedium) 135 | } 136 | 137 | 138 | Text( 139 | modifier = Modifier 140 | .constrainAs(refTextSignup) { 141 | top.linkTo(refButtonSignup.bottom, spacing.medium) 142 | start.linkTo(parent.start, spacing.extraLarge) 143 | end.linkTo(parent.end, spacing.extraLarge) 144 | } 145 | .clickable { 146 | navController.navigate(ROUTE_LOGIN) { 147 | popUpTo(ROUTE_SIGNUP) { inclusive = true } 148 | } 149 | }, 150 | text = stringResource(id = R.string.already_have_account), 151 | style = MaterialTheme.typography.bodyLarge, 152 | textAlign = TextAlign.Center, 153 | color = MaterialTheme.colorScheme.onSurface 154 | ) 155 | 156 | } 157 | } 158 | 159 | @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_NO) 160 | @Composable 161 | fun SignupScreenPreviewLight() { 162 | AppTheme { 163 | SignupScreen(rememberNavController()) 164 | } 165 | } 166 | 167 | @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES) 168 | @Composable 169 | fun SignupScreenPreviewDark() { 170 | AppTheme { 171 | SignupScreen(rememberNavController()) 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/home/HomeScreen.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.home 2 | 3 | import android.content.res.Configuration 4 | import androidx.compose.foundation.Image 5 | import androidx.compose.foundation.layout.* 6 | import androidx.compose.material3.Button 7 | import androidx.compose.material3.MaterialTheme 8 | import androidx.compose.material3.Text 9 | import androidx.compose.runtime.Composable 10 | import androidx.compose.ui.Alignment 11 | import androidx.compose.ui.Modifier 12 | import androidx.compose.ui.res.painterResource 13 | import androidx.compose.ui.res.stringResource 14 | import androidx.compose.ui.tooling.preview.Preview 15 | import androidx.compose.ui.unit.dp 16 | import androidx.navigation.NavHostController 17 | import androidx.navigation.compose.rememberNavController 18 | import net.simplifiedcoding.R 19 | import net.simplifiedcoding.ui.theme.AppTheme 20 | import net.simplifiedcoding.ui.theme.spacing 21 | 22 | @Composable 23 | fun HomeScreen(navController: NavHostController) { 24 | val spacing = MaterialTheme.spacing 25 | Column( 26 | modifier = Modifier 27 | .fillMaxWidth() 28 | .wrapContentHeight() 29 | .padding(spacing.medium) 30 | .padding(top = spacing.extraLarge), 31 | horizontalAlignment = Alignment.CenterHorizontally 32 | ) { 33 | 34 | Text( 35 | text = stringResource(id = R.string.welcome_back), 36 | style = MaterialTheme.typography.headlineSmall, 37 | color = MaterialTheme.colorScheme.onSurface 38 | ) 39 | 40 | Text( 41 | text = stringResource(id = R.string.name), 42 | style = MaterialTheme.typography.displaySmall, 43 | color = MaterialTheme.colorScheme.onSurface 44 | ) 45 | 46 | Image( 47 | painter = painterResource(id = R.drawable.ic_person), 48 | contentDescription = stringResource(id = R.string.empty), 49 | modifier = Modifier.size(128.dp) 50 | ) 51 | 52 | Column( 53 | modifier = Modifier 54 | .fillMaxWidth() 55 | .wrapContentHeight() 56 | .padding(spacing.medium) 57 | ) { 58 | Row( 59 | modifier = Modifier 60 | .fillMaxWidth() 61 | .wrapContentHeight() 62 | ) { 63 | Text( 64 | text = stringResource(id = R.string.name), 65 | style = MaterialTheme.typography.bodyLarge, 66 | modifier = Modifier.weight(0.3f), 67 | color = MaterialTheme.colorScheme.onSurface 68 | ) 69 | 70 | Text( 71 | text = "Belal Khan", 72 | style = MaterialTheme.typography.bodyLarge, 73 | modifier = Modifier.weight(0.7f), 74 | color = MaterialTheme.colorScheme.onSurface 75 | ) 76 | } 77 | 78 | Row( 79 | modifier = Modifier 80 | .fillMaxWidth() 81 | .wrapContentHeight() 82 | ) { 83 | Text( 84 | text = stringResource(id = R.string.email), 85 | style = MaterialTheme.typography.bodyLarge, 86 | modifier = Modifier.weight(0.3f), 87 | color = MaterialTheme.colorScheme.onSurface 88 | ) 89 | 90 | Text( 91 | text = "probelalkhan@gmail.com", 92 | style = MaterialTheme.typography.bodyLarge, 93 | modifier = Modifier.weight(0.7f), 94 | color = MaterialTheme.colorScheme.onSurface 95 | ) 96 | } 97 | 98 | Button( 99 | onClick = { /*TODO*/ }, 100 | modifier = Modifier 101 | .align(Alignment.CenterHorizontally) 102 | .padding(top = spacing.extraLarge) 103 | ) { 104 | Text(text = stringResource(id = R.string.logout)) 105 | } 106 | } 107 | } 108 | } 109 | 110 | @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) 111 | @Composable 112 | fun HomeScreenPreviewLight() { 113 | AppTheme { 114 | HomeScreen(rememberNavController()) 115 | } 116 | } 117 | 118 | @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) 119 | @Composable 120 | fun HomeScreenPreviewDark() { 121 | AppTheme { 122 | HomeScreen(rememberNavController()) 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val md_theme_light_primary = Color(0xFF006492) 6 | val md_theme_light_onPrimary = Color(0xFFFFFFFF) 7 | val md_theme_light_primaryContainer = Color(0xFFC9E6FF) 8 | val md_theme_light_onPrimaryContainer = Color(0xFF001E2F) 9 | val md_theme_light_secondary = Color(0xFF50606E) 10 | val md_theme_light_onSecondary = Color(0xFFFFFFFF) 11 | val md_theme_light_secondaryContainer = Color(0xFFD3E5F5) 12 | val md_theme_light_onSecondaryContainer = Color(0xFF0C1D29) 13 | val md_theme_light_tertiary = Color(0xFF64597B) 14 | val md_theme_light_onTertiary = Color(0xFFFFFFFF) 15 | val md_theme_light_tertiaryContainer = Color(0xFFEADDFF) 16 | val md_theme_light_onTertiaryContainer = Color(0xFF201634) 17 | val md_theme_light_error = Color(0xFFBA1A1A) 18 | val md_theme_light_errorContainer = Color(0xFFFFDAD6) 19 | val md_theme_light_onError = Color(0xFFFFFFFF) 20 | val md_theme_light_onErrorContainer = Color(0xFF410002) 21 | val md_theme_light_background = Color(0xFFFCFCFF) 22 | val md_theme_light_onBackground = Color(0xFF1A1C1E) 23 | val md_theme_light_surface = Color(0xFFFCFCFF) 24 | val md_theme_light_onSurface = Color(0xFF1A1C1E) 25 | val md_theme_light_surfaceVariant = Color(0xFFDDE3EA) 26 | val md_theme_light_onSurfaceVariant = Color(0xFF41474D) 27 | val md_theme_light_outline = Color(0xFF72787E) 28 | val md_theme_light_inverseOnSurface = Color(0xFFF0F0F3) 29 | val md_theme_light_inverseSurface = Color(0xFF2E3133) 30 | val md_theme_light_inversePrimary = Color(0xFF8BCEFF) 31 | val md_theme_light_shadow = Color(0xFF000000) 32 | val md_theme_light_surfaceTint = Color(0xFF006492) 33 | 34 | val md_theme_dark_primary = Color(0xFF8BCEFF) 35 | val md_theme_dark_onPrimary = Color(0xFF00344E) 36 | val md_theme_dark_primaryContainer = Color(0xFF004B6F) 37 | val md_theme_dark_onPrimaryContainer = Color(0xFFC9E6FF) 38 | val md_theme_dark_secondary = Color(0xFFB7C9D9) 39 | val md_theme_dark_onSecondary = Color(0xFF22323F) 40 | val md_theme_dark_secondaryContainer = Color(0xFF384956) 41 | val md_theme_dark_onSecondaryContainer = Color(0xFFD3E5F5) 42 | val md_theme_dark_tertiary = Color(0xFFCFC0E8) 43 | val md_theme_dark_onTertiary = Color(0xFF352B4B) 44 | val md_theme_dark_tertiaryContainer = Color(0xFF4C4162) 45 | val md_theme_dark_onTertiaryContainer = Color(0xFFEADDFF) 46 | val md_theme_dark_error = Color(0xFFFFB4AB) 47 | val md_theme_dark_errorContainer = Color(0xFF93000A) 48 | val md_theme_dark_onError = Color(0xFF690005) 49 | val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6) 50 | val md_theme_dark_background = Color(0xFF1A1C1E) 51 | val md_theme_dark_onBackground = Color(0xFFE2E2E5) 52 | val md_theme_dark_surface = Color(0xFF1A1C1E) 53 | val md_theme_dark_onSurface = Color(0xFFE2E2E5) 54 | val md_theme_dark_surfaceVariant = Color(0xFF41474D) 55 | val md_theme_dark_onSurfaceVariant = Color(0xFFC1C7CE) 56 | val md_theme_dark_outline = Color(0xFF8B9198) 57 | val md_theme_dark_inverseOnSurface = Color(0xFF1A1C1E) 58 | val md_theme_dark_inverseSurface = Color(0xFFE2E2E5) 59 | val md_theme_dark_inversePrimary = Color(0xFF006492) 60 | val md_theme_dark_shadow = Color(0xFF000000) 61 | val md_theme_dark_surfaceTint = Color(0xFF8BCEFF) 62 | 63 | 64 | val seed = Color(0xFF3B80AC) 65 | -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/theme/Spacing.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.theme 2 | 3 | import androidx.compose.material3.MaterialTheme 4 | import androidx.compose.runtime.Composable 5 | import androidx.compose.runtime.ReadOnlyComposable 6 | import androidx.compose.runtime.compositionLocalOf 7 | import androidx.compose.ui.unit.Dp 8 | import androidx.compose.ui.unit.dp 9 | 10 | data class Spacing( 11 | val extraSmall: Dp = 4.dp, 12 | val small: Dp = 8.dp, 13 | val medium: Dp = 16.dp, 14 | val large: Dp = 32.dp, 15 | val extraLarge: Dp = 64.dp 16 | ) 17 | 18 | val LocalSpacing = compositionLocalOf { Spacing() } 19 | 20 | val MaterialTheme.spacing: Spacing 21 | @Composable 22 | @ReadOnlyComposable 23 | get() = LocalSpacing.current -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.theme 2 | 3 | import androidx.compose.foundation.isSystemInDarkTheme 4 | import androidx.compose.material3.MaterialTheme 5 | import androidx.compose.material3.Typography 6 | import androidx.compose.material3.darkColorScheme 7 | import androidx.compose.material3.lightColorScheme 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.runtime.CompositionLocalProvider 10 | import androidx.compose.ui.platform.LocalDensity 11 | import androidx.compose.ui.text.font.FontFamily 12 | 13 | 14 | private val LightColors = lightColorScheme( 15 | primary = md_theme_light_primary, 16 | onPrimary = md_theme_light_onPrimary, 17 | primaryContainer = md_theme_light_primaryContainer, 18 | onPrimaryContainer = md_theme_light_onPrimaryContainer, 19 | secondary = md_theme_light_secondary, 20 | onSecondary = md_theme_light_onSecondary, 21 | secondaryContainer = md_theme_light_secondaryContainer, 22 | onSecondaryContainer = md_theme_light_onSecondaryContainer, 23 | tertiary = md_theme_light_tertiary, 24 | onTertiary = md_theme_light_onTertiary, 25 | tertiaryContainer = md_theme_light_tertiaryContainer, 26 | onTertiaryContainer = md_theme_light_onTertiaryContainer, 27 | error = md_theme_light_error, 28 | errorContainer = md_theme_light_errorContainer, 29 | onError = md_theme_light_onError, 30 | onErrorContainer = md_theme_light_onErrorContainer, 31 | background = md_theme_light_background, 32 | onBackground = md_theme_light_onBackground, 33 | surface = md_theme_light_surface, 34 | onSurface = md_theme_light_onSurface, 35 | surfaceVariant = md_theme_light_surfaceVariant, 36 | onSurfaceVariant = md_theme_light_onSurfaceVariant, 37 | outline = md_theme_light_outline, 38 | inverseOnSurface = md_theme_light_inverseOnSurface, 39 | inverseSurface = md_theme_light_inverseSurface, 40 | inversePrimary = md_theme_light_inversePrimary, 41 | surfaceTint = md_theme_light_surfaceTint, 42 | ) 43 | 44 | 45 | private val DarkColors = darkColorScheme( 46 | primary = md_theme_dark_primary, 47 | onPrimary = md_theme_dark_onPrimary, 48 | primaryContainer = md_theme_dark_primaryContainer, 49 | onPrimaryContainer = md_theme_dark_onPrimaryContainer, 50 | secondary = md_theme_dark_secondary, 51 | onSecondary = md_theme_dark_onSecondary, 52 | secondaryContainer = md_theme_dark_secondaryContainer, 53 | onSecondaryContainer = md_theme_dark_onSecondaryContainer, 54 | tertiary = md_theme_dark_tertiary, 55 | onTertiary = md_theme_dark_onTertiary, 56 | tertiaryContainer = md_theme_dark_tertiaryContainer, 57 | onTertiaryContainer = md_theme_dark_onTertiaryContainer, 58 | error = md_theme_dark_error, 59 | errorContainer = md_theme_dark_errorContainer, 60 | onError = md_theme_dark_onError, 61 | onErrorContainer = md_theme_dark_onErrorContainer, 62 | background = md_theme_dark_background, 63 | onBackground = md_theme_dark_onBackground, 64 | surface = md_theme_dark_surface, 65 | onSurface = md_theme_dark_onSurface, 66 | surfaceVariant = md_theme_dark_surfaceVariant, 67 | onSurfaceVariant = md_theme_dark_onSurfaceVariant, 68 | outline = md_theme_dark_outline, 69 | inverseOnSurface = md_theme_dark_inverseOnSurface, 70 | inverseSurface = md_theme_dark_inverseSurface, 71 | inversePrimary = md_theme_dark_inversePrimary, 72 | surfaceTint = md_theme_dark_surfaceTint, 73 | ) 74 | 75 | 76 | @Composable 77 | fun AppTheme( 78 | useDarkTheme: Boolean = isSystemInDarkTheme(), 79 | content: @Composable() () -> Unit 80 | ) { 81 | val colors = if (!useDarkTheme) { 82 | LightColors 83 | } else { 84 | DarkColors 85 | } 86 | 87 | CompositionLocalProvider(LocalSpacing provides Spacing()) { 88 | MaterialTheme( 89 | colorScheme = colors, 90 | content = content, 91 | typography = AppTypography 92 | ) 93 | } 94 | } -------------------------------------------------------------------------------- /app/src/main/java/net/simplifiedcoding/ui/theme/Typography.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding.ui.theme 2 | 3 | import androidx.compose.material3.Typography 4 | import androidx.compose.ui.text.PlatformTextStyle 5 | import androidx.compose.ui.text.TextStyle 6 | import androidx.compose.ui.text.font.Font 7 | import androidx.compose.ui.text.font.FontFamily 8 | import androidx.compose.ui.text.font.FontWeight 9 | import androidx.compose.ui.text.style.LineHeightStyle 10 | import androidx.compose.ui.unit.sp 11 | import net.simplifiedcoding.R 12 | 13 | private val Poppins = FontFamily( 14 | Font(R.font.poppins_regular), 15 | Font(R.font.poppins_bold), 16 | Font(R.font.poppins_extra_bold), 17 | Font(R.font.poppins_medium), 18 | Font(R.font.poppins_thin), 19 | Font(R.font.poppins_italic), 20 | Font(R.font.poppins_light), 21 | Font(R.font.poppins_black) 22 | ) 23 | 24 | @Suppress("DEPRECATION") 25 | val defaultTextStyle = TextStyle( 26 | fontFamily = Poppins, 27 | platformStyle = PlatformTextStyle( 28 | includeFontPadding = false 29 | ), 30 | lineHeightStyle = LineHeightStyle( 31 | alignment = LineHeightStyle.Alignment.Center, 32 | trim = LineHeightStyle.Trim.None 33 | ) 34 | ) 35 | 36 | val AppTypography = Typography( 37 | displayLarge = defaultTextStyle.copy( 38 | fontSize = 57.sp, lineHeight = 64.sp, letterSpacing = (-0.25).sp 39 | ), 40 | displayMedium = defaultTextStyle.copy( 41 | fontSize = 45.sp, lineHeight = 52.sp, letterSpacing = 0.sp 42 | ), 43 | displaySmall = defaultTextStyle.copy( 44 | fontSize = 36.sp, lineHeight = 44.sp, letterSpacing = 0.sp 45 | ), 46 | headlineLarge = defaultTextStyle.copy( 47 | fontSize = 32.sp, lineHeight = 40.sp, letterSpacing = 0.sp 48 | ), 49 | headlineMedium = defaultTextStyle.copy( 50 | fontSize = 28.sp, lineHeight = 36.sp, letterSpacing = 0.sp 51 | ), 52 | headlineSmall = defaultTextStyle.copy( 53 | fontSize = 24.sp, lineHeight = 32.sp, letterSpacing = 0.sp 54 | ), 55 | titleLarge = defaultTextStyle.copy( 56 | fontSize = 22.sp, lineHeight = 28.sp, letterSpacing = 0.sp 57 | ), 58 | titleMedium = defaultTextStyle.copy( 59 | fontSize = 16.sp, 60 | lineHeight = 24.sp, 61 | letterSpacing = 0.15.sp, 62 | fontWeight = FontWeight.Medium 63 | ), 64 | titleSmall = defaultTextStyle.copy( 65 | fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.1.sp, fontWeight = FontWeight.Medium 66 | ), 67 | labelLarge = defaultTextStyle.copy( 68 | fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.1.sp, fontWeight = FontWeight.Medium 69 | ), 70 | labelMedium = defaultTextStyle.copy( 71 | fontSize = 12.sp, lineHeight = 16.sp, letterSpacing = 0.5.sp, fontWeight = FontWeight.Medium 72 | ), 73 | labelSmall = defaultTextStyle.copy( 74 | fontSize = 11.sp, lineHeight = 16.sp, letterSpacing = 0.5.sp, fontWeight = FontWeight.Medium 75 | ), 76 | bodyLarge = defaultTextStyle.copy( 77 | fontSize = 16.sp, lineHeight = 24.sp, letterSpacing = 0.5.sp 78 | ), 79 | bodyMedium = defaultTextStyle.copy( 80 | fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.25.sp 81 | ), 82 | bodySmall = defaultTextStyle.copy( 83 | fontSize = 12.sp, lineHeight = 16.sp, letterSpacing = 0.4.sp 84 | ), 85 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_app_logo.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_black.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_extra_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_extra_bold.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_italic.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_light.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_medium.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/poppins_thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/font/poppins_thin.ttf -------------------------------------------------------------------------------- /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/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Firebase Auth\nSample 3 | email 4 | password 5 | login 6 | Do not have an account?\nClick here to sign up 7 | name 8 | signup 9 | Already have an account?\nClick here to login 10 | Welcome Back 11 | 12 | logout 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /app/src/test/java/net/simplifiedcoding/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package net.simplifiedcoding 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | dependencies { 3 | classpath 'com.google.gms:google-services:4.3.3' 4 | classpath "com.android.tools.build:gradle:7.2.2" 5 | classpath "com.google.dagger:hilt-android-gradle-plugin:2.42" 6 | } 7 | }// Top-level build file where you can add configuration options common to all sub-projects/modules. 8 | plugins { 9 | id 'com.android.application' version '7.2.1' apply false 10 | id 'com.android.library' version '7.2.1' apply false 11 | id 'org.jetbrains.kotlin.android' version '1.7.10' apply false 12 | } 13 | 14 | task clean(type: Delete) { 15 | delete rootProject.buildDir 16 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Kotlin code style for this project: "official" or "obsolete": 19 | kotlin.code.style=official 20 | # Enables namespacing of each library's R class so that its R class includes only the 21 | # resources declared in the library itself and none from the library's dependencies, 22 | # thereby reducing the size of the R class for that library 23 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/probelalkhan/firebase_auth_compose/da02667e01cf22d389f92eb57f92ae0d2a244f65/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Aug 03 13:13:14 IST 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | } 14 | } 15 | rootProject.name = "Firebase-Auth" 16 | include ':app' 17 | --------------------------------------------------------------------------------