diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16dcd12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Log/OS Files +*.log + +# Android Studio generated files and folders +captures/ +.externalNativeBuild/ +.cxx/ +*.apk +output.json + +# IntelliJ +*.iml +.idea/ +misc.xml +deploymentTargetDropDown.xml +render.experimental.xml + +# Keystore files +*.jks +*.keystore + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Android Profiling +*.hprof \ No newline at end of file diff --git a/README.md b/README.md index e69de29..daecbe0 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,5 @@ +Лабораторная работа по android, выполненная с помощью Jetpack Compose + + +![Alt text](screens/screen1.jpg) +![Alt text](screens/screen2.jpg) \ No newline at end of file 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..c1c7a1e --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,69 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.example.android_ck' + compileSdk 34 + + defaultConfig { + applicationId "com.example.android_ck" + minSdk 24 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled true + } + } + 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.12.0' + implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0') + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2' + implementation 'androidx.activity:activity-compose:1.8.0' + 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.material3:material3' + 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' + implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2' + implementation 'androidx.activity:activity-compose:1.8.0' + implementation "androidx.compose.runtime:runtime-livedata:1.6.0-alpha08" + implementation "androidx.compose.runtime:runtime-rxjava2:1.6.0-alpha08" + implementation "com.google.accompanist:accompanist-systemuicontroller:0.27.0" + implementation 'com.google.android.material:material:1.10.0' +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/android_ck/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/android_ck/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..0088fb4 --- /dev/null +++ b/app/src/androidTest/java/com/example/android_ck/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.android_ck + +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.example.android_ck", 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..8e27b49 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/android_ck/MainActivity.kt b/app/src/main/java/com/example/android_ck/MainActivity.kt new file mode 100644 index 0000000..034ab02 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/MainActivity.kt @@ -0,0 +1,51 @@ +package com.example.android_ck + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.core.view.WindowCompat +import com.example.android_ck.ui.theme.AppTheme +import com.google.accompanist.systemuicontroller.rememberSystemUiController + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + WindowCompat.setDecorFitsSystemWindows(window, false) + setContent { + MainScreen() + } + } +} + +@Composable +fun MainScreen() { + MaterialTheme { + + ApplySystemBarColors() + + Surface( + color = AppTheme.BgColors.primary, + modifier = Modifier.fillMaxSize(), + ) { + DotaScreen() + } + } +} + +@Composable +private fun ApplySystemBarColors(){ + val systemUiController = rememberSystemUiController() + + SideEffect { + systemUiController.setStatusBarColor(color = Color.Transparent) + systemUiController.setNavigationBarColor(color = Color.Transparent) + } +} diff --git a/app/src/main/java/com/example/android_ck/ui/theme/Color.kt b/app/src/main/java/com/example/android_ck/ui/theme/Color.kt new file mode 100644 index 0000000..69e0330 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/Color.kt @@ -0,0 +1,20 @@ +package com.example.android_ck.ui.theme + +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.ui.graphics.Color + + +val LightColorScheme = lightColorScheme( + primary = Color(color = 0xFF6750A4), + secondary = Color(color = 0xFF625B71), + tertiary = Color(color = 0xFF7D5260), + background = Color(color = 0xFFFFFBFE) +) + +val DarkColorScheme = darkColorScheme( + primary = Color(color = 0xFFD0BCFF), + secondary = Color(color = 0xFFCCC2DC), + tertiary = Color(color = 0xFFEFB8C8), + background = Color(color = 0xFF1C1B1F) +) diff --git a/app/src/main/java/com/example/android_ck/ui/theme/Fonts.kt b/app/src/main/java/com/example/android_ck/ui/theme/Fonts.kt new file mode 100644 index 0000000..33bd979 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/Fonts.kt @@ -0,0 +1,12 @@ +package com.example.android_ck.ui.theme + +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import com.example.android_ck.R + +internal val FontFamily = FontFamily( + Font(R.font.sk_modernist_regular_font), + Font(R.font.sk_modernist_mono_font, weight = FontWeight.Medium), + Font(R.font.sk_modernist_bold_font, weight = FontWeight.Bold) +) \ No newline at end of file diff --git a/app/src/main/java/com/example/android_ck/ui/theme/Shape.kt b/app/src/main/java/com/example/android_ck/ui/theme/Shape.kt new file mode 100644 index 0000000..01c9eb1 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/Shape.kt @@ -0,0 +1,11 @@ +package com.example.android_ck.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Shapes +import androidx.compose.ui.unit.dp + +val Shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(4.dp), + large = RoundedCornerShape(0.dp) +) diff --git a/app/src/main/java/com/example/android_ck/ui/theme/Theme.kt b/app/src/main/java/com/example/android_ck/ui/theme/Theme.kt new file mode 100644 index 0000000..db90259 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/Theme.kt @@ -0,0 +1,155 @@ +package com.example.android_ck.ui.theme + +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.ui.text.TextStyle +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.PlatformTextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.LineHeightStyle +import androidx.compose.ui.unit.sp + +object AppTheme { + object BgColors{ + val primary = Color(color = 0xFF050B18) + val grey = Color(color = 0xFF1F2430) + val secondery = Color(color = 0xFF4682B4).copy(alpha = 0.24f) + val divider = Color(color = 0xFF1A1F29) + val circuit = Color(color = 0x3DFFFFFF) + val third = Color(color = 0x76FFFFFF) + val white = Color(color = 0xFFFFFBFE) + + } + object TextColors{ + val primary = Color(color = 0xFFFFFBFE) + val grey = Color(color = 0xFF45454D) + val secondery = Color(color = 0xFFEEF2FB) + val blue = Color(color = 0xFF41A0E7) + val darkGrey = Color(color = 0xFF050B18) + val third = Color(color = 0x66FFFFFF) + val fourth = Color(color = 0xFFA8ADB7) + } + + + object TextStyle{ + + val Bold_20_26 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontWeight = FontWeight.Bold, + fontSize = 20.sp, + lineHeight = 26.sp, + letterSpacing = 0.5.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + + val Regular_12_05 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontSize = 12.sp, + letterSpacing = 0.5.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + + val Regular_12_19 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontWeight = FontWeight.Bold, + fontSize = 12.sp, + lineHeight = 19.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + + val Mon_10 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontWeight = FontWeight.Medium, + fontSize = 10.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + + val Bold_16 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontWeight = FontWeight.Bold, + fontSize = 16.sp, + letterSpacing = 0.6.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + + val Bold_48 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontWeight = FontWeight.Bold, + fontSize = 48.sp, + letterSpacing = 0.6.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + + val Regular_16 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontSize = 16.sp, + letterSpacing = 0.5.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + + val Regular_12_20 + @Composable + get() = + TextStyle( + fontFamily = FontFamily, + fontSize = 12.sp, + lineHeight = 20.sp, + letterSpacing = 0.5.sp, + platformStyle = PlatformTextStyle(includeFontPadding = false), + lineHeightStyle = LineHeightStyle( + LineHeightStyle.Alignment.Proportional, + LineHeightStyle.Trim.None + ), + ) + } +} diff --git a/app/src/main/java/com/example/android_ck/ui/theme/Type.kt b/app/src/main/java/com/example/android_ck/ui/theme/Type.kt new file mode 100644 index 0000000..26f5270 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/Type.kt @@ -0,0 +1,28 @@ +package com.example.android_ck.ui.theme + +import androidx.compose.material3.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( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp + ) + /* Other default text styles to override + button = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.W500, + fontSize = 14.sp + ), + caption = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 12.sp + ) + */ +) diff --git a/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/CommentBlock.kt b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/CommentBlock.kt new file mode 100644 index 0000000..4d0b26c --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/CommentBlock.kt @@ -0,0 +1,84 @@ +package com.example.android_ck + +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Text +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.example.android_ck.ui.theme.AppTheme + + +@Composable +fun CommentBlock( + CommentUi: CommentUi, + modifier: Modifier = Modifier, +){ + Column(modifier = modifier){ + Row{ + Box( + modifier = Modifier + .clip(CircleShape) + .size(36.dp) + ){ + Image( + painter = painterResource(CommentUi.image), + contentDescription = null, + contentScale = ContentScale.Crop, + ) + } + Column(modifier = Modifier + .offset(16.dp) + ){ + Text( + text = CommentUi.name, + style = AppTheme.TextStyle.Regular_16, + color = AppTheme.TextColors.primary + ) + Text( + text = CommentUi.date, + style = AppTheme.TextStyle.Regular_12_05, + color = AppTheme.TextColors.third, + modifier = Modifier.padding(top = 4.dp), + ) + } + + } + Text( + text = CommentUi.text, + style = AppTheme.TextStyle.Regular_12_20, + color = AppTheme.TextColors.fourth, + modifier = Modifier + .padding(top = 16.dp, bottom = 14.dp) + ) + } +} + +@Preview +@Composable +fun CommentBlockPreview(){ + val comments = listOf( + CommentUi( + image = R.drawable.avatar1, + name = stringResource(R.string.userName1), + date = stringResource(R.string.date1), + text = stringResource(R.string.comment1) + ), + ) + + CommentBlock( + CommentUi = comments[0], + modifier = Modifier + .padding( + start = 24.dp, + end = 24.dp, + top = 16.dp, + ) + ) +} diff --git a/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/CommentUi.kt b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/CommentUi.kt new file mode 100644 index 0000000..070a4d7 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/CommentUi.kt @@ -0,0 +1,7 @@ +package com.example.android_ck + +data class CommentUi( + val name: String, + val image: Int, + val date: String, + val text: String) diff --git a/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/DotaScreen.kt b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/DotaScreen.kt new file mode 100644 index 0000000..924ae74 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/DotaScreen.kt @@ -0,0 +1,159 @@ +package com.example.android_ck + +import android.widget.Toast +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.Divider +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.material3.Text +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.android_ck.ui.theme.AppTheme + +@Composable +fun DotaScreen() { + val context = LocalContext.current + val lazyListState = rememberLazyListState() + val comments = listOf( + CommentUi( + image = R.drawable.avatar1, + name = stringResource(R.string.userName1), + date = stringResource(R.string.date1), + text = stringResource(R.string.comment1) + ), + CommentUi( + image = R.drawable.avatar2, + name = stringResource(R.string.userName2), + date = stringResource(R.string.date2), + text = stringResource(R.string.comment2) + ) + ) + + LazyColumn( + state = lazyListState, + modifier = Modifier.fillMaxSize(), + ){ + item { + DotaScreenHeader() + } + + item { + ScrollableChipsRow( + items = listOf(stringResource(R.string.obj1), + stringResource(R.string.obj2), + stringResource(R.string.obj3), + stringResource(R.string.obj4), + stringResource(R.string.obj5), + stringResource(R.string.obj6), + stringResource(R.string.obj7)), + modifier = Modifier.padding(top = 16.dp, bottom = 16.dp), + contentPadding = PaddingValues(start = 24.dp, end = 24.dp), + ) + } + item{ + Text( + text = stringResource(R.string.describe), + style = AppTheme.TextStyle.Regular_12_19, + color = AppTheme.TextColors.secondery, + modifier = Modifier.padding( + start = 24.dp, + end = 24.dp, + top = 14.dp, + bottom = 14.dp, + ) + + ) + } + item{ + VideoPreviewRow( + previewRelist = listOf( + R.drawable.bg_video1, + R.drawable.bg_video2, + ), + contentPadding = PaddingValues(start = 24.dp, end = 24.dp) + ) + } + item{ + Text( + text = stringResource(R.string.review), + style = AppTheme.TextStyle.Bold_16, + color = AppTheme.TextColors.primary, + modifier = Modifier.padding( + start = 24.dp, + end = 24.dp, + top = 20.dp, + bottom = 12.dp, + ) + ) + RatingBlock( + rating = 4.9f, + reviewCount = stringResource(R.string.rating), + modifier = Modifier.padding( + start = 24.dp, + end = 24.dp, + bottom = 16.dp, + ) + ) + } + itemsIndexed(comments){index, item -> + CommentBlock( + item, + modifier = Modifier + .padding( + start = 24.dp, + end = 24.dp, + top = 16.dp, + ) + ) + if (index Unit, +){ + Box(modifier = modifier){ + Image( + painter = painter, + contentDescription = null, + contentScale = ContentScale.FillBounds, + modifier = Modifier + .fillMaxWidth() + .height(354.dp) + ) + content() + } +} + +@Composable +private fun DotaLogo( + painter: Painter, + modifier: Modifier = Modifier, + content: @Composable () -> Unit, +){ + Box(modifier = modifier + .width(88.dp) + .height(95.dp) + .background(color = Color.Black, shape = RoundedCornerShape(13.5.dp)) + .border( + width = 2.dp, + color = AppTheme.BgColors.grey, + shape = RoundedCornerShape(13.5.dp) + ) + ){ + Image( + painter = painter, + contentDescription = null, + contentScale = ContentScale.FillBounds, + modifier = Modifier + .fillMaxSize() + .padding(17.dp) + .aspectRatio(1f) + ) + content() + } +} + +@Composable +private fun Stars( + painter: Painter, + modifier: Modifier = Modifier, + content: @Composable () -> Unit, +){ + Box(modifier = modifier){ + Image( + painter = painter, + contentDescription = null, + contentScale = ContentScale.FillBounds, + modifier = Modifier + .width(76.dp) + .height(12.dp) + ) + content() + } +} + +@Preview +@Composable +fun DotaScreenHeaderPreview(){ + Surface(color = AppTheme.BgColors.primary) + { + DotaScreenHeader() + } +} diff --git a/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/PrimaryOvalButton.kt b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/PrimaryOvalButton.kt new file mode 100644 index 0000000..19c348b --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/PrimaryOvalButton.kt @@ -0,0 +1,66 @@ +package com.example.android_ck + +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import android.widget.Toast +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.material3.Text +import androidx.compose.ui.Alignment +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.example.android_ck.ui.theme.AppTheme + +@Composable +fun PrimaryButton( + text: String, + onClick: () -> Unit, + modifier: Modifier = Modifier, +){ + Button( + onClick = onClick, + colors = ButtonDefaults.buttonColors(Color(0xFFF4D144)), + modifier = modifier + .fillMaxWidth() + .padding( + vertical = 40.dp) + .height(64.dp), + shape = RoundedCornerShape(12.dp), + ){ + Text( + text = text, + style = AppTheme.TextStyle.Bold_20_26, + color = AppTheme.TextColors.darkGrey, + modifier = Modifier.wrapContentSize(Alignment.Center), + ) + } +} + +@Preview +@Composable +fun PrimaryButtonPreview(){ + + val context = LocalContext.current + PrimaryButton( + text = stringResource(R.string.install), + onClick = { + Toast.makeText(context, "CLICKED", Toast.LENGTH_LONG).show() + }, + modifier = Modifier + .fillMaxWidth() + .padding( + start = 24.dp, + end = 24.dp, + top = 20.dp, + bottom = 40.dp, + ) + ) +} diff --git a/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/RatingBlock.kt b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/RatingBlock.kt new file mode 100644 index 0000000..1e4cded --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/RatingBlock.kt @@ -0,0 +1,60 @@ +package com.example.android_ck + +import androidx.compose.foundation.Image +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.material3.Text +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.android_ck.ui.theme.AppTheme +import android.widget.RatingBar; +import androidx.compose.foundation.layout.* +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource + +@Composable +fun RatingBlock( + rating: Float, + reviewCount: String, + modifier: Modifier = Modifier, +){ + Row(modifier = modifier) + { + Text( + text = rating.toString(), + style = AppTheme.TextStyle.Bold_48, + color = AppTheme.TextColors.primary, + ) + Column(modifier = Modifier.offset(16.dp, 17.dp)) { + Image( + painter = painterResource(R.drawable.raiting), + contentDescription = null, + modifier = Modifier + .width(76.dp) + .height(12.dp), + ) + Text( + text = reviewCount, + style = AppTheme.TextStyle.Regular_12_05, + color = AppTheme.TextColors.primary, + modifier = Modifier + .padding(top = 7.dp) + ) + } + + } +} + +@Preview +@Composable +fun RatingBlockPreview(){ + RatingBlock( + rating = 4.9f, + reviewCount = stringResource(R.string.rating), + modifier = Modifier.padding( + start = 24.dp, + end = 24.dp, + bottom = 16.dp, + ) + ) +} diff --git a/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/ScrollableChipsRow.kt b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/ScrollableChipsRow.kt new file mode 100644 index 0000000..0e0f7da --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/ScrollableChipsRow.kt @@ -0,0 +1,67 @@ +package com.example.android_ck + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.android_ck.ui.theme.AppTheme + +@Composable +fun ScrollableChipsRow( + items: List, + modifier: Modifier = Modifier, + contentPadding: PaddingValues, +){ + LazyRow( + horizontalArrangement = Arrangement.spacedBy(10.dp), + contentPadding = contentPadding, + modifier = modifier, + ){ + items(items) { item -> + Chip(content = item, + backgroundColor = AppTheme.BgColors.secondery) + } + } +} + +@Composable +fun Chip( + content: String, + backgroundColor: Color +) { + Box( + modifier = Modifier + .clip(shape = RoundedCornerShape(100)) + .background(backgroundColor) + .padding(horizontal = 8.dp, vertical = 4.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = content, + style = AppTheme.TextStyle.Mon_10, + color = AppTheme.TextColors.blue) + } +} + +@Preview +@Composable +fun ScrollableChipsRowPrewiew(){ + ScrollableChipsRow( + items = listOf(stringResource(R.string.obj1), + stringResource(R.string.obj2), + stringResource(R.string.obj3)), + modifier = Modifier + .padding(top = 16.dp, bottom = 16.dp), + contentPadding = PaddingValues(start = 24.dp, end = 24.dp) + ) +} diff --git a/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/VideoPreviewRow.kt b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/VideoPreviewRow.kt new file mode 100644 index 0000000..6b7c517 --- /dev/null +++ b/app/src/main/java/com/example/android_ck/ui/theme/dotascreen/VideoPreviewRow.kt @@ -0,0 +1,81 @@ +package com.example.android_ck + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.android_ck.ui.theme.AppTheme + +@Composable +fun VideoPreviewRow( + previewRelist: List, + contentPadding: PaddingValues, +){ + LazyRow( + horizontalArrangement = Arrangement.spacedBy(15.dp), + contentPadding = contentPadding, + ) { + items(previewRelist) { item -> + Box( + modifier = Modifier + .width(240.dp) + .height(135.dp) + .clip(shape = RoundedCornerShape(14.dp)), + + ) { + Image( + painter = painterResource(item), + contentDescription = null, + contentScale = ContentScale.FillBounds, + modifier = Modifier + .fillMaxSize(), + ) + Box( + modifier = Modifier + .clip(CircleShape) + .align(Alignment.Center) + .size(48.dp) + .background(AppTheme.BgColors.third) + .blur(1.5.dp) + .border( + width = 0.7.dp, + color = AppTheme.BgColors.circuit, + shape = CircleShape + ) + ){ + Image( + painter = painterResource(R.drawable.arrow_right), + contentDescription = "play", + modifier = Modifier + .align(Alignment.Center) + .width(24.dp) + .height(24.dp) + ) + } + } + } + } +} + +@Preview +@Composable +fun VideoPreviewRowReview(){ + VideoPreviewRow( + previewRelist = listOf( + R.drawable.bg_video1, + R.drawable.bg_video2,), + contentPadding = PaddingValues(start = 24.dp, end = 24.dp)) +} 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/arrow_right.png b/app/src/main/res/drawable/arrow_right.png new file mode 100644 index 0000000..0852a93 Binary files /dev/null and b/app/src/main/res/drawable/arrow_right.png differ diff --git a/app/src/main/res/drawable/avatar1.webp b/app/src/main/res/drawable/avatar1.webp new file mode 100644 index 0000000..6fb9a3f Binary files /dev/null and b/app/src/main/res/drawable/avatar1.webp differ diff --git a/app/src/main/res/drawable/avatar2.webp b/app/src/main/res/drawable/avatar2.webp new file mode 100644 index 0000000..eded924 Binary files /dev/null and b/app/src/main/res/drawable/avatar2.webp differ diff --git a/app/src/main/res/drawable/bg_header.webp b/app/src/main/res/drawable/bg_header.webp new file mode 100644 index 0000000..8b33cf6 Binary files /dev/null and b/app/src/main/res/drawable/bg_header.webp differ diff --git a/app/src/main/res/drawable/bg_video1.webp b/app/src/main/res/drawable/bg_video1.webp new file mode 100644 index 0000000..59e1ed3 Binary files /dev/null and b/app/src/main/res/drawable/bg_video1.webp differ diff --git a/app/src/main/res/drawable/bg_video2.webp b/app/src/main/res/drawable/bg_video2.webp new file mode 100644 index 0000000..2d8c3f3 Binary files /dev/null and b/app/src/main/res/drawable/bg_video2.webp differ diff --git a/app/src/main/res/drawable/dota_logo.webp b/app/src/main/res/drawable/dota_logo.webp new file mode 100644 index 0000000..ba29fa4 Binary files /dev/null and b/app/src/main/res/drawable/dota_logo.webp 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/drawable/raiting.webp b/app/src/main/res/drawable/raiting.webp new file mode 100644 index 0000000..2f72cbd Binary files /dev/null and b/app/src/main/res/drawable/raiting.webp differ diff --git a/app/src/main/res/drawable/star.webp b/app/src/main/res/drawable/star.webp new file mode 100644 index 0000000..922aa9a Binary files /dev/null and b/app/src/main/res/drawable/star.webp differ diff --git a/app/src/main/res/font/monseratt_font.xml b/app/src/main/res/font/monseratt_font.xml new file mode 100644 index 0000000..eaffbb4 --- /dev/null +++ b/app/src/main/res/font/monseratt_font.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/font/montserrat_regular.ttf b/app/src/main/res/font/montserrat_regular.ttf new file mode 100644 index 0000000..aa9033a Binary files /dev/null and b/app/src/main/res/font/montserrat_regular.ttf differ diff --git a/app/src/main/res/font/sk_modernist_bold.otf b/app/src/main/res/font/sk_modernist_bold.otf new file mode 100644 index 0000000..c212b96 Binary files /dev/null and b/app/src/main/res/font/sk_modernist_bold.otf differ diff --git a/app/src/main/res/font/sk_modernist_bold_font.xml b/app/src/main/res/font/sk_modernist_bold_font.xml new file mode 100644 index 0000000..63ce6ef --- /dev/null +++ b/app/src/main/res/font/sk_modernist_bold_font.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/font/sk_modernist_mono.otf b/app/src/main/res/font/sk_modernist_mono.otf new file mode 100644 index 0000000..741c470 Binary files /dev/null and b/app/src/main/res/font/sk_modernist_mono.otf differ diff --git a/app/src/main/res/font/sk_modernist_mono_font.xml b/app/src/main/res/font/sk_modernist_mono_font.xml new file mode 100644 index 0000000..175cc80 --- /dev/null +++ b/app/src/main/res/font/sk_modernist_mono_font.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/font/sk_modernist_regular.otf b/app/src/main/res/font/sk_modernist_regular.otf new file mode 100644 index 0000000..d21c2c9 Binary files /dev/null and b/app/src/main/res/font/sk_modernist_regular.otf differ diff --git a/app/src/main/res/font/sk_modernist_regular_font.xml b/app/src/main/res/font/sk_modernist_regular_font.xml new file mode 100644 index 0000000..7f6a5ae --- /dev/null +++ b/app/src/main/res/font/sk_modernist_regular_font.xml @@ -0,0 +1,13 @@ + + + + \ 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 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ 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..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ 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..ca1931b --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..816490e --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,24 @@ + + Android_CK + DoTA 2 + 70M + MOBA + MULTIPLAYER + STRATEGY + Drab Majesty + Cold Cave + Lifeover + The Door + Dota 2 is a multiplayer online battle arena (MOBA) game which has two teams of five players compete to collectively destroy + a large structure defended by the opposing team known as the "Ancient", whilst defending their own. + Review & Rating + 70M Reviews + Install + "Once you start to learn its secrets, there’s a wild and exciting variety of play here that’s unmatched, even by its peers." + "Once you start to learn its secrets, there’s a wild and exciting variety of play here that’s unmatched, even by its peers." + Auguste Conte + Jang Marcelino + February 14, 2019 + February 14, 2019 + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..c1d5d15 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/example/android_ck/ExampleUnitTest.kt b/app/src/test/java/com/example/android_ck/ExampleUnitTest.kt new file mode 100644 index 0000000..41adca3 --- /dev/null +++ b/app/src/test/java/com/example/android_ck/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.example.android_ck + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..800a4fb --- /dev/null +++ b/build.gradle @@ -0,0 +1,10 @@ +buildscript { + ext { + compose_ui_version = '1.3.2' + } +}// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id 'com.android.application' version '7.3.1' apply false + id 'com.android.library' version '7.3.1' apply false + id 'org.jetbrains.kotlin.android' version '1.7.20' apply false +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..3c5031e --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..093d05b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Oct 31 22:21:18 GMT+06:00 2023 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/screens/screen1.jpg b/screens/screen1.jpg new file mode 100644 index 0000000..6878653 Binary files /dev/null and b/screens/screen1.jpg differ diff --git a/screens/screen2.jpg b/screens/screen2.jpg new file mode 100644 index 0000000..cc4a78c Binary files /dev/null and b/screens/screen2.jpg differ diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..76fffd7 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = "Android_CK" +include ':app'