commit a5a15ff9695c5271c4dd98d128f1032d17f7e32e Author: vinay6kr Date: Sat May 27 14:26:37 2023 +0530 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /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 0000000..0a1fdf1 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,66 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.vinay.compose_test' + compileSdk 33 + + defaultConfig { + applicationId "com.vinay.compose_test" + minSdk 24 + 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' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion '1.3.2' + } + packagingOptions { + resources { + excludes += '/META-INF/{AL2.0,LGPL2.1}' + } + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' + implementation 'androidx.activity:activity-compose:1.5.1' + implementation platform('androidx.compose:compose-bom:2022.10.00') + implementation 'androidx.compose.ui:ui' + implementation 'androidx.compose.ui:ui-graphics' + implementation 'androidx.compose.ui:ui-tooling-preview' + implementation 'androidx.compose.material:material:1.2.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00') + androidTestImplementation 'androidx.compose.ui:ui-test-junit4' + debugImplementation 'androidx.compose.ui:ui-tooling' + debugImplementation 'androidx.compose.ui:ui-test-manifest' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /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/androidTest/java/com/vinay/compose_test/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/vinay/compose_test/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..6b7688b --- /dev/null +++ b/app/src/androidTest/java/com/vinay/compose_test/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.vinay.compose_test + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.vinay.compose_test", appContext.packageName) + } +} \ 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 0000000..ffbdd92 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/vinay/compose_test/MainActivity.kt b/app/src/main/java/com/vinay/compose_test/MainActivity.kt new file mode 100644 index 0000000..14a51cb --- /dev/null +++ b/app/src/main/java/com/vinay/compose_test/MainActivity.kt @@ -0,0 +1,303 @@ +package com.vinay.compose_test + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.Image +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.TopAppBar +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.lerp +import androidx.compose.ui.unit.sp +import com.vinay.compose_test.ui.theme.Black900 +import com.vinay.compose_test.ui.theme.ComposetestTheme + +/** + * Created by Vinay + * @Author: Vinay + * @Date: 27-05-2023 + */ +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + ComposetestTheme { + // A surface container using the 'background' color from the theme + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colors.surface + ) { + CollapsingToolbarScreen() + } + } + } + + } +} + +@Composable +fun Greeting(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview() { + ComposetestTheme { + Greeting("Android") + } +} + +private val headerHeight = 250.dp +private val toolbarHeight = 56.dp + +private val paddingMedium = 16.dp + +private val titlePaddingStart = 16.dp +private val titlePaddingEnd = 72.dp + +private const val titleFontScaleStart = 1f +private const val titleFontScaleEnd = 0.66f + +@Preview +@Composable +fun CollapsingToolbarScreen(modifier: Modifier = Modifier) { + val scroll: ScrollState = rememberScrollState(0) + + val headerHeightPx = with(LocalDensity.current) { headerHeight.toPx() } + val toolbarHeightPx = with(LocalDensity.current) { toolbarHeight.toPx() } + + Box(modifier = modifier) { + Header( + scroll = scroll, + headerHeightPx = headerHeightPx, + modifier = Modifier + .fillMaxWidth() + .height(headerHeight) + ) + Body( + scroll = scroll, + modifier = Modifier.fillMaxSize() + ) + Toolbar( + scroll = scroll, + headerHeightPx = headerHeightPx, + toolbarHeightPx = toolbarHeightPx + ) + Title(scroll = scroll) + } +} + +@Composable +private fun Header( + scroll: ScrollState, + headerHeightPx: Float, + modifier: Modifier = Modifier +) { + Box( + modifier = modifier + .graphicsLayer { + translationY = -scroll.value.toFloat() / 2f // Parallax effect + alpha = (-1f / headerHeightPx) * scroll.value + 1 + } + ) { + Image( + painter = painterResource(id = R.drawable.header_image), + contentDescription = null, + contentScale = ContentScale.FillBounds + ) + + Box( + Modifier + .fillMaxSize() + .background( + brush = Brush.verticalGradient( + colors = listOf(Color.Transparent, Black900), + startY = 3 * headerHeightPx / 4 + ) + ) + ) + } +} + +@Composable +private fun Body(scroll: ScrollState, modifier: Modifier = Modifier) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier.verticalScroll(scroll) + ) { + Spacer(Modifier.height(headerHeight)) + repeat(5) { + Text( + text = stringResource(R.string.lorem_ipsum), + style = MaterialTheme.typography.body1, + color = MaterialTheme.colors.onSurface, + textAlign = TextAlign.Justify, + modifier = Modifier.padding(16.dp) + ) + } + } +} + +@Composable +private fun Toolbar( + scroll: ScrollState, + headerHeightPx: Float, + toolbarHeightPx: Float, + modifier: Modifier = Modifier +) { + val toolbarBottom by remember { + mutableStateOf(headerHeightPx - toolbarHeightPx) + } + + val showToolbar by remember { + derivedStateOf { + scroll.value >= toolbarBottom + } + } + + AnimatedVisibility( + modifier = modifier, + visible = showToolbar, + enter = fadeIn(animationSpec = tween(300)), + exit = fadeOut(animationSpec = tween(300)) + ) { + TopAppBar( + navigationIcon = { + IconButton( + onClick = {}, + modifier = Modifier + .padding(16.dp) + .size(24.dp) + ) { + Icon( + imageVector = Icons.Default.Menu, + contentDescription = null, + tint = Color.White + ) + } + }, + title = {}, + backgroundColor = Color.Blue, + elevation = 0.dp + ) + } +} + +@Composable +private fun Title( + scroll: ScrollState, + modifier: Modifier = Modifier +) { + var titleHeightPx by remember { mutableStateOf(0f) } + var titleWidthPx by remember { mutableStateOf(0f) } + + Text( + text = stringResource(id = R.string.app_name), + fontSize = 30.sp, + fontWeight = FontWeight.Bold, + color = Color.White, + modifier = modifier + .graphicsLayer { + val collapseRange: Float = (headerHeight.toPx() - toolbarHeight.toPx()) + val collapseFraction: Float = (scroll.value / collapseRange).coerceIn(0f, 1f) + + val scaleXY = lerp( + titleFontScaleStart.dp, + titleFontScaleEnd.dp, + collapseFraction + ) + + val titleExtraStartPadding = titleWidthPx.toDp() * (1 - scaleXY.value) / 2f + + val titleYFirstInterpolatedPoint = lerp( + headerHeight - titleHeightPx.toDp() - paddingMedium, + headerHeight / 2, + collapseFraction + ) + + val titleXFirstInterpolatedPoint = lerp( + titlePaddingStart, + (titlePaddingEnd - titleExtraStartPadding) * 5 / 4, + collapseFraction + ) + + val titleYSecondInterpolatedPoint = lerp( + headerHeight / 2, + toolbarHeight / 2 - titleHeightPx.toDp() / 2, + collapseFraction + ) + + val titleXSecondInterpolatedPoint = lerp( + (titlePaddingEnd - titleExtraStartPadding) * 5 / 4, + titlePaddingEnd - titleExtraStartPadding, + collapseFraction + ) + + val titleY = lerp( + titleYFirstInterpolatedPoint, + titleYSecondInterpolatedPoint, + collapseFraction + ) + + val titleX = lerp( + titleXFirstInterpolatedPoint, + titleXSecondInterpolatedPoint, + collapseFraction + ) + + translationY = titleY.toPx() + translationX = titleX.toPx() + scaleX = scaleXY.value + scaleY = scaleXY.value + } + .onGloballyPositioned { + titleHeightPx = it.size.height.toFloat() + titleWidthPx = it.size.width.toFloat() + } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vinay/compose_test/ui/theme/Color.kt b/app/src/main/java/com/vinay/compose_test/ui/theme/Color.kt new file mode 100644 index 0000000..274eb26 --- /dev/null +++ b/app/src/main/java/com/vinay/compose_test/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package com.vinay.compose_test.ui.theme + +import androidx.compose.ui.graphics.Color + + +val Purple200 = Color(0xFFBB86FC) +val Purple700 = Color(0xFF3700B3) +val Teal200 = Color(0xFF03DAC5) +val Black900 = Color(0x88000000) +val Black800 = Color(0xFF161616) + diff --git a/app/src/main/java/com/vinay/compose_test/ui/theme/Shape.kt b/app/src/main/java/com/vinay/compose_test/ui/theme/Shape.kt new file mode 100644 index 0000000..4c50d91 --- /dev/null +++ b/app/src/main/java/com/vinay/compose_test/ui/theme/Shape.kt @@ -0,0 +1,11 @@ +package com.vinay.compose_test.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.ui.unit.dp +import androidx.compose.material.Shapes + +val Shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(4.dp), + large = RoundedCornerShape(0.dp) +) \ No newline at end of file diff --git a/app/src/main/java/com/vinay/compose_test/ui/theme/Theme.kt b/app/src/main/java/com/vinay/compose_test/ui/theme/Theme.kt new file mode 100644 index 0000000..97ce61b --- /dev/null +++ b/app/src/main/java/com/vinay/compose_test/ui/theme/Theme.kt @@ -0,0 +1,34 @@ +package com.vinay.compose_test.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Shapes +import androidx.compose.material.darkColors +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorPalette = darkColors( + primary = Purple200, + primaryVariant = Purple700, + secondary = Teal200, + background = Black800, + surface = Black800, +) + +@Composable +fun ComposetestTheme( + content: @Composable () -> Unit +) { + MaterialTheme( + colors = DarkColorPalette, + typography = Typography, + shapes = Shapes, + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/vinay/compose_test/ui/theme/Type.kt b/app/src/main/java/com/vinay/compose_test/ui/theme/Type.kt new file mode 100644 index 0000000..b0b231a --- /dev/null +++ b/app/src/main/java/com/vinay/compose_test/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.vinay.compose_test.ui.theme + +import androidx.compose.material.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + body1 = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file 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 0000000..2b068d1 --- /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/header_image.png b/app/src/main/res/drawable/header_image.png new file mode 100644 index 0000000..772d341 Binary files /dev/null and b/app/src/main/res/drawable/header_image.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 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 0000000..6f3b755 --- /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 0000000..6f3b755 --- /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 0000000..c209e78 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 0000000..b2dfe3d 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 0000000..4f0f1d6 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 0000000..62b611d 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 0000000..948a307 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 0000000..1b9a695 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 0000000..28d4b77 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 0000000..9287f50 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 0000000..aa7d642 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 0000000..9126ae3 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/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /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 0000000..5b50448 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + Collapsing Toolbar Title + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Proin sed libero enim sed. Suspendisse faucibus interdum posuere lorem. Nisl nunc mi ipsum faucibus vitae aliquet nec. Imperdiet sed euismod nisi porta lorem. Dolor purus non enim praesent. Fermentum leo vel orci porta non pulvinar neque. Fringilla phasellus faucibus scelerisque eleifend donec pretium vulputate. Potenti nullam ac tortor vitae purus faucibus ornare. Aliquet enim tortor at auctor urna nunc id. Nisl pretium fusce id velit ut tortor pretium viverra.\n\nSed nisi lacus sed viverra. Convallis a cras semper auctor neque vitae tempus quam pellentesque. Posuere ac ut consequat semper viverra nam libero justo laoreet. Aliquet enim tortor at auctor urna nunc id cursus. Id consectetur purus ut faucibus pulvinar elementum integer enim. Ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Aliquet bibendum enim facilisis gravida neque convallis a cras. Sed tempus urna et pharetra pharetra massa massa ultricies. At erat pellentesque adipiscing commodo. Odio eu feugiat pretium nibh ipsum. Euismod elementum nisi quis eleifend quam adipiscing.\n\nEgestas tellus rutrum tellus pellentesque eu. Et netus et malesuada fames ac. Pellentesque dignissim enim sit amet venenatis urna cursus eget nunc. Eget velit aliquet sagittis id consectetur purus ut faucibus pulvinar. Nisl pretium fusce id velit ut tortor pretium. Elementum integer enim neque volutpat ac tincidunt vitae semper quis. Tortor vitae purus faucibus ornare suspendisse sed. Lacus sed viverra tellus in hac. Ipsum dolor sit amet consectetur adipiscing elit ut. Elit eget gravida cum sociis natoque penatibus. Vitae aliquet nec ullamcorper sit amet risus nullam. Ut faucibus pulvinar elementum integer. Sit amet porttitor eget dolor. Id volutpat lacus laoreet non curabitur. Bibendum enim facilisis gravida neque convallis a. Et ultrices neque ornare aenean euismod elementum nisi quis. Blandit turpis cursus in hac habitasse platea.\n\nIn aliquam sem fringilla ut morbi tincidunt. Sed velit dignissim sodales ut eu sem integer. Sit amet justo donec enim diam. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Blandit massa enim nec dui nunc mattis enim ut tellus. Nascetur ridiculus mus mauris vitae ultricies. Tristique et egestas quis ipsum suspendisse ultrices gravida dictum. Diam sollicitudin tempor id eu nisl nunc mi. Volutpat odio facilisis mauris sit amet massa vitae tortor condimentum. A erat nam at lectus urna duis convallis convallis tellus. Molestie at elementum eu facilisis sed odio morbi quis commodo.\n\nAc turpis egestas integer eget aliquet nibh praesent tristique. Laoreet sit amet cursus sit amet. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Enim tortor at auctor urna nunc id. Sed adipiscing diam donec adipiscing tristique risus nec. Sollicitudin ac orci phasellus egestas tellus rutrum. Lectus sit amet est placerat in egestas erat imperdiet. Hendrerit gravida rutrum quisque non tellus orci ac auctor augue. In ante metus dictum at tempor. Porta nibh venenatis cras sed felis eget. Sit amet consectetur adipiscing elit pellentesque habitant morbi tristique senectus. Sed augue lacus viverra vitae congue eu. Maecenas volutpat blandit aliquam etiam. Consectetur libero id faucibus nisl tincidunt eget nullam non. + \ 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 0000000..6f4c4dc --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +