+++ .gitignore
... | ... | @@ -0,0 +1,15 @@ |
| 1 | +*.iml | |
| 2 | +.gradle | |
| 3 | +/local.properties | |
| 4 | +/.idea/caches | |
| 5 | +/.idea/libraries | |
| 6 | +/.idea/modules.xml | |
| 7 | +/.idea/workspace.xml | |
| 8 | +/.idea/navEditor.xml | |
| 9 | +/.idea/assetWizardSettings.xml | |
| 10 | +.DS_Store | |
| 11 | +/build | |
| 12 | +/captures | |
| 13 | +.externalNativeBuild | |
| 14 | +.cxx | |
| 15 | +local.properties |
+++ app/.gitignore
... | ... | @@ -0,0 +1,1 @@ |
| 1 | +/build(No newline at end of file) |
+++ app/build.gradle.kts
... | ... | @@ -0,0 +1,54 @@ |
| 1 | +plugins { | |
| 2 | + alias(libs.plugins.android.application) | |
| 3 | + alias(libs.plugins.kotlin.compose) | |
| 4 | +} | |
| 5 | + | |
| 6 | +android { | |
| 7 | + namespace = "kr.co.app4ad.photoslide" | |
| 8 | + compileSdk { | |
| 9 | + version = release(37) | |
| 10 | + } | |
| 11 | + | |
| 12 | + defaultConfig { | |
| 13 | + applicationId = "kr.co.app4ad.photoslide" | |
| 14 | + minSdk = 24 | |
| 15 | + targetSdk = 37 | |
| 16 | + versionCode = 1 | |
| 17 | + versionName = "1.0" | |
| 18 | + | |
| 19 | + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" | |
| 20 | + } | |
| 21 | + | |
| 22 | + buildTypes { | |
| 23 | + release { | |
| 24 | + optimization { | |
| 25 | + enable = false | |
| 26 | + } | |
| 27 | + } | |
| 28 | + } | |
| 29 | + compileOptions { | |
| 30 | + sourceCompatibility = JavaVersion.VERSION_11 | |
| 31 | + targetCompatibility = JavaVersion.VERSION_11 | |
| 32 | + } | |
| 33 | + buildFeatures { | |
| 34 | + compose = true | |
| 35 | + } | |
| 36 | +} | |
| 37 | + | |
| 38 | +dependencies { | |
| 39 | + implementation(platform(libs.androidx.compose.bom)) | |
| 40 | + implementation(libs.androidx.activity.compose) | |
| 41 | + implementation(libs.androidx.compose.material3) | |
| 42 | + implementation(libs.androidx.compose.ui) | |
| 43 | + implementation(libs.androidx.compose.ui.graphics) | |
| 44 | + implementation(libs.androidx.compose.ui.tooling.preview) | |
| 45 | + implementation(libs.androidx.core.ktx) | |
| 46 | + implementation(libs.androidx.lifecycle.runtime.ktx) | |
| 47 | + testImplementation(libs.junit) | |
| 48 | + androidTestImplementation(platform(libs.androidx.compose.bom)) | |
| 49 | + androidTestImplementation(libs.androidx.compose.ui.test.junit4) | |
| 50 | + androidTestImplementation(libs.androidx.espresso.core) | |
| 51 | + androidTestImplementation(libs.androidx.junit) | |
| 52 | + debugImplementation(libs.androidx.compose.ui.test.manifest) | |
| 53 | + debugImplementation(libs.androidx.compose.ui.tooling) | |
| 54 | +}(No newline at end of file) |
+++ app/src/androidTest/java/kr/co/app4ad/photoslide/ExampleInstrumentedTest.kt
... | ... | @@ -0,0 +1,24 @@ |
| 1 | +package kr.co.app4ad.photoslide | |
| 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("kr.co.app4ad.photoslide", appContext.packageName) | |
| 23 | + } | |
| 24 | +}(No newline at end of file) |
+++ app/src/main/AndroidManifest.xml
... | ... | @@ -0,0 +1,28 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + xmlns:tools="http://schemas.android.com/tools"> | |
| 4 | + | |
| 5 | + <application | |
| 6 | + android:allowBackup="true" | |
| 7 | + android:dataExtractionRules="@xml/data_extraction_rules" | |
| 8 | + android:fullBackupContent="@xml/backup_rules" | |
| 9 | + android:icon="@mipmap/ic_launcher" | |
| 10 | + android:label="@string/app_name" | |
| 11 | + android:roundIcon="@mipmap/ic_launcher_round" | |
| 12 | + android:supportsRtl="true" | |
| 13 | + android:theme="@style/Theme.PhotoSlide"> | |
| 14 | + <activity | |
| 15 | + android:name=".MainActivity" | |
| 16 | + android:exported="true" | |
| 17 | + android:label="@string/app_name" | |
| 18 | + android:theme="@style/Theme.PhotoSlide" | |
| 19 | + android:windowSoftInputMode="adjustResize"> | |
| 20 | + <intent-filter> | |
| 21 | + <action android:name="android.intent.action.MAIN" /> | |
| 22 | + | |
| 23 | + <category android:name="android.intent.category.LAUNCHER" /> | |
| 24 | + </intent-filter> | |
| 25 | + </activity> | |
| 26 | + </application> | |
| 27 | + | |
| 28 | +</manifest>(No newline at end of file) |
+++ app/src/main/java/kr/co/app4ad/photoslide/MainActivity.kt
... | ... | @@ -0,0 +1,47 @@ |
| 1 | +package kr.co.app4ad.photoslide | |
| 2 | + | |
| 3 | +import android.os.Bundle | |
| 4 | +import androidx.activity.ComponentActivity | |
| 5 | +import androidx.activity.compose.setContent | |
| 6 | +import androidx.activity.enableEdgeToEdge | |
| 7 | +import androidx.compose.foundation.layout.fillMaxSize | |
| 8 | +import androidx.compose.foundation.layout.padding | |
| 9 | +import androidx.compose.material3.Scaffold | |
| 10 | +import androidx.compose.material3.Text | |
| 11 | +import androidx.compose.runtime.Composable | |
| 12 | +import androidx.compose.ui.Modifier | |
| 13 | +import androidx.compose.ui.tooling.preview.Preview | |
| 14 | +import kr.co.app4ad.photoslide.ui.theme.PhotoSlideTheme | |
| 15 | + | |
| 16 | +class MainActivity : ComponentActivity() { | |
| 17 | + override fun onCreate(savedInstanceState: Bundle?) { | |
| 18 | + super.onCreate(savedInstanceState) | |
| 19 | + enableEdgeToEdge() | |
| 20 | + setContent { | |
| 21 | + PhotoSlideTheme { | |
| 22 | + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> | |
| 23 | + Greeting( | |
| 24 | + name = "Android", | |
| 25 | + modifier = Modifier.padding(innerPadding) | |
| 26 | + ) | |
| 27 | + } | |
| 28 | + } | |
| 29 | + } | |
| 30 | + } | |
| 31 | +} | |
| 32 | + | |
| 33 | +@Composable | |
| 34 | +fun Greeting(name: String, modifier: Modifier = Modifier) { | |
| 35 | + Text( | |
| 36 | + text = "Hello $name!", | |
| 37 | + modifier = modifier | |
| 38 | + ) | |
| 39 | +} | |
| 40 | + | |
| 41 | +@Preview(showBackground = true) | |
| 42 | +@Composable | |
| 43 | +fun GreetingPreview() { | |
| 44 | + PhotoSlideTheme { | |
| 45 | + Greeting("Android") | |
| 46 | + } | |
| 47 | +}(No newline at end of file) |
+++ app/src/main/java/kr/co/app4ad/photoslide/ui/theme/Color.kt
... | ... | @@ -0,0 +1,11 @@ |
| 1 | +package kr.co.app4ad.photoslide.ui.theme | |
| 2 | + | |
| 3 | +import androidx.compose.ui.graphics.Color | |
| 4 | + | |
| 5 | +val Purple80 = Color(0xFFD0BCFF) | |
| 6 | +val PurpleGrey80 = Color(0xFFCCC2DC) | |
| 7 | +val Pink80 = Color(0xFFEFB8C8) | |
| 8 | + | |
| 9 | +val Purple40 = Color(0xFF6650a4) | |
| 10 | +val PurpleGrey40 = Color(0xFF625b71) | |
| 11 | +val Pink40 = Color(0xFF7D5260)(No newline at end of file) |
+++ app/src/main/java/kr/co/app4ad/photoslide/ui/theme/Theme.kt
... | ... | @@ -0,0 +1,58 @@ |
| 1 | +package kr.co.app4ad.photoslide.ui.theme | |
| 2 | + | |
| 3 | +import android.app.Activity | |
| 4 | +import android.os.Build | |
| 5 | +import androidx.compose.foundation.isSystemInDarkTheme | |
| 6 | +import androidx.compose.material3.MaterialTheme | |
| 7 | +import androidx.compose.material3.darkColorScheme | |
| 8 | +import androidx.compose.material3.dynamicDarkColorScheme | |
| 9 | +import androidx.compose.material3.dynamicLightColorScheme | |
| 10 | +import androidx.compose.material3.lightColorScheme | |
| 11 | +import androidx.compose.runtime.Composable | |
| 12 | +import androidx.compose.ui.platform.LocalContext | |
| 13 | + | |
| 14 | +private val DarkColorScheme = darkColorScheme( | |
| 15 | + primary = Purple80, | |
| 16 | + secondary = PurpleGrey80, | |
| 17 | + tertiary = Pink80 | |
| 18 | +) | |
| 19 | + | |
| 20 | +private val LightColorScheme = lightColorScheme( | |
| 21 | + primary = Purple40, | |
| 22 | + secondary = PurpleGrey40, | |
| 23 | + tertiary = Pink40 | |
| 24 | + | |
| 25 | + /* Other default colors to override | |
| 26 | + background = Color(0xFFFFFBFE), | |
| 27 | + surface = Color(0xFFFFFBFE), | |
| 28 | + onPrimary = Color.White, | |
| 29 | + onSecondary = Color.White, | |
| 30 | + onTertiary = Color.White, | |
| 31 | + onBackground = Color(0xFF1C1B1F), | |
| 32 | + onSurface = Color(0xFF1C1B1F), | |
| 33 | + */ | |
| 34 | +) | |
| 35 | + | |
| 36 | +@Composable | |
| 37 | +fun PhotoSlideTheme( | |
| 38 | + darkTheme: Boolean = isSystemInDarkTheme(), | |
| 39 | + // Dynamic color is available on Android 12+ | |
| 40 | + dynamicColor: Boolean = true, | |
| 41 | + content: @Composable () -> Unit | |
| 42 | +) { | |
| 43 | + val colorScheme = when { | |
| 44 | + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { | |
| 45 | + val context = LocalContext.current | |
| 46 | + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) | |
| 47 | + } | |
| 48 | + | |
| 49 | + darkTheme -> DarkColorScheme | |
| 50 | + else -> LightColorScheme | |
| 51 | + } | |
| 52 | + | |
| 53 | + MaterialTheme( | |
| 54 | + colorScheme = colorScheme, | |
| 55 | + typography = Typography, | |
| 56 | + content = content | |
| 57 | + ) | |
| 58 | +}(No newline at end of file) |
+++ app/src/main/java/kr/co/app4ad/photoslide/ui/theme/Type.kt
... | ... | @@ -0,0 +1,34 @@ |
| 1 | +package kr.co.app4ad.photoslide.ui.theme | |
| 2 | + | |
| 3 | +import androidx.compose.material3.Typography | |
| 4 | +import androidx.compose.ui.text.TextStyle | |
| 5 | +import androidx.compose.ui.text.font.FontFamily | |
| 6 | +import androidx.compose.ui.text.font.FontWeight | |
| 7 | +import androidx.compose.ui.unit.sp | |
| 8 | + | |
| 9 | +// Set of Material typography styles to start with | |
| 10 | +val Typography = Typography( | |
| 11 | + bodyLarge = TextStyle( | |
| 12 | + fontFamily = FontFamily.Default, | |
| 13 | + fontWeight = FontWeight.Normal, | |
| 14 | + fontSize = 16.sp, | |
| 15 | + lineHeight = 24.sp, | |
| 16 | + letterSpacing = 0.5.sp | |
| 17 | + ) | |
| 18 | + /* Other default text styles to override | |
| 19 | + titleLarge = TextStyle( | |
| 20 | + fontFamily = FontFamily.Default, | |
| 21 | + fontWeight = FontWeight.Normal, | |
| 22 | + fontSize = 22.sp, | |
| 23 | + lineHeight = 28.sp, | |
| 24 | + letterSpacing = 0.sp | |
| 25 | + ), | |
| 26 | + labelSmall = TextStyle( | |
| 27 | + fontFamily = FontFamily.Default, | |
| 28 | + fontWeight = FontWeight.Medium, | |
| 29 | + fontSize = 11.sp, | |
| 30 | + lineHeight = 16.sp, | |
| 31 | + letterSpacing = 0.5.sp | |
| 32 | + ) | |
| 33 | + */ | |
| 34 | +)(No newline at end of file) |
+++ app/src/main/keepRules/rules.keep
... | ... | @@ -0,0 +1,12 @@ |
| 1 | +# Add project specific R8 rules here. | |
| 2 | +# AGP will combine all keep rule files in src/main/keepRules to pass to R8 | |
| 3 | +# | |
| 4 | +# For more details, see | |
| 5 | +# https://d.android.com/r/tools/r8/keep-rules | |
| 6 | + | |
| 7 | +# If your project uses WebView with JS, uncomment the following | |
| 8 | +# and specify the fully qualified class name to the JavaScript interface | |
| 9 | +# class: | |
| 10 | +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { | |
| 11 | +# public *; | |
| 12 | +#}(No newline at end of file) |
+++ app/src/main/res/drawable/ic_launcher_background.xml
... | ... | @@ -0,0 +1,170 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | + android:width="108dp" | |
| 4 | + android:height="108dp" | |
| 5 | + android:viewportWidth="108" | |
| 6 | + android:viewportHeight="108"> | |
| 7 | + <path | |
| 8 | + android:fillColor="#3DDC84" | |
| 9 | + android:pathData="M0,0h108v108h-108z" /> | |
| 10 | + <path | |
| 11 | + android:fillColor="#00000000" | |
| 12 | + android:pathData="M9,0L9,108" | |
| 13 | + android:strokeWidth="0.8" | |
| 14 | + android:strokeColor="#33FFFFFF" /> | |
| 15 | + <path | |
| 16 | + android:fillColor="#00000000" | |
| 17 | + android:pathData="M19,0L19,108" | |
| 18 | + android:strokeWidth="0.8" | |
| 19 | + android:strokeColor="#33FFFFFF" /> | |
| 20 | + <path | |
| 21 | + android:fillColor="#00000000" | |
| 22 | + android:pathData="M29,0L29,108" | |
| 23 | + android:strokeWidth="0.8" | |
| 24 | + android:strokeColor="#33FFFFFF" /> | |
| 25 | + <path | |
| 26 | + android:fillColor="#00000000" | |
| 27 | + android:pathData="M39,0L39,108" | |
| 28 | + android:strokeWidth="0.8" | |
| 29 | + android:strokeColor="#33FFFFFF" /> | |
| 30 | + <path | |
| 31 | + android:fillColor="#00000000" | |
| 32 | + android:pathData="M49,0L49,108" | |
| 33 | + android:strokeWidth="0.8" | |
| 34 | + android:strokeColor="#33FFFFFF" /> | |
| 35 | + <path | |
| 36 | + android:fillColor="#00000000" | |
| 37 | + android:pathData="M59,0L59,108" | |
| 38 | + android:strokeWidth="0.8" | |
| 39 | + android:strokeColor="#33FFFFFF" /> | |
| 40 | + <path | |
| 41 | + android:fillColor="#00000000" | |
| 42 | + android:pathData="M69,0L69,108" | |
| 43 | + android:strokeWidth="0.8" | |
| 44 | + android:strokeColor="#33FFFFFF" /> | |
| 45 | + <path | |
| 46 | + android:fillColor="#00000000" | |
| 47 | + android:pathData="M79,0L79,108" | |
| 48 | + android:strokeWidth="0.8" | |
| 49 | + android:strokeColor="#33FFFFFF" /> | |
| 50 | + <path | |
| 51 | + android:fillColor="#00000000" | |
| 52 | + android:pathData="M89,0L89,108" | |
| 53 | + android:strokeWidth="0.8" | |
| 54 | + android:strokeColor="#33FFFFFF" /> | |
| 55 | + <path | |
| 56 | + android:fillColor="#00000000" | |
| 57 | + android:pathData="M99,0L99,108" | |
| 58 | + android:strokeWidth="0.8" | |
| 59 | + android:strokeColor="#33FFFFFF" /> | |
| 60 | + <path | |
| 61 | + android:fillColor="#00000000" | |
| 62 | + android:pathData="M0,9L108,9" | |
| 63 | + android:strokeWidth="0.8" | |
| 64 | + android:strokeColor="#33FFFFFF" /> | |
| 65 | + <path | |
| 66 | + android:fillColor="#00000000" | |
| 67 | + android:pathData="M0,19L108,19" | |
| 68 | + android:strokeWidth="0.8" | |
| 69 | + android:strokeColor="#33FFFFFF" /> | |
| 70 | + <path | |
| 71 | + android:fillColor="#00000000" | |
| 72 | + android:pathData="M0,29L108,29" | |
| 73 | + android:strokeWidth="0.8" | |
| 74 | + android:strokeColor="#33FFFFFF" /> | |
| 75 | + <path | |
| 76 | + android:fillColor="#00000000" | |
| 77 | + android:pathData="M0,39L108,39" | |
| 78 | + android:strokeWidth="0.8" | |
| 79 | + android:strokeColor="#33FFFFFF" /> | |
| 80 | + <path | |
| 81 | + android:fillColor="#00000000" | |
| 82 | + android:pathData="M0,49L108,49" | |
| 83 | + android:strokeWidth="0.8" | |
| 84 | + android:strokeColor="#33FFFFFF" /> | |
| 85 | + <path | |
| 86 | + android:fillColor="#00000000" | |
| 87 | + android:pathData="M0,59L108,59" | |
| 88 | + android:strokeWidth="0.8" | |
| 89 | + android:strokeColor="#33FFFFFF" /> | |
| 90 | + <path | |
| 91 | + android:fillColor="#00000000" | |
| 92 | + android:pathData="M0,69L108,69" | |
| 93 | + android:strokeWidth="0.8" | |
| 94 | + android:strokeColor="#33FFFFFF" /> | |
| 95 | + <path | |
| 96 | + android:fillColor="#00000000" | |
| 97 | + android:pathData="M0,79L108,79" | |
| 98 | + android:strokeWidth="0.8" | |
| 99 | + android:strokeColor="#33FFFFFF" /> | |
| 100 | + <path | |
| 101 | + android:fillColor="#00000000" | |
| 102 | + android:pathData="M0,89L108,89" | |
| 103 | + android:strokeWidth="0.8" | |
| 104 | + android:strokeColor="#33FFFFFF" /> | |
| 105 | + <path | |
| 106 | + android:fillColor="#00000000" | |
| 107 | + android:pathData="M0,99L108,99" | |
| 108 | + android:strokeWidth="0.8" | |
| 109 | + android:strokeColor="#33FFFFFF" /> | |
| 110 | + <path | |
| 111 | + android:fillColor="#00000000" | |
| 112 | + android:pathData="M19,29L89,29" | |
| 113 | + android:strokeWidth="0.8" | |
| 114 | + android:strokeColor="#33FFFFFF" /> | |
| 115 | + <path | |
| 116 | + android:fillColor="#00000000" | |
| 117 | + android:pathData="M19,39L89,39" | |
| 118 | + android:strokeWidth="0.8" | |
| 119 | + android:strokeColor="#33FFFFFF" /> | |
| 120 | + <path | |
| 121 | + android:fillColor="#00000000" | |
| 122 | + android:pathData="M19,49L89,49" | |
| 123 | + android:strokeWidth="0.8" | |
| 124 | + android:strokeColor="#33FFFFFF" /> | |
| 125 | + <path | |
| 126 | + android:fillColor="#00000000" | |
| 127 | + android:pathData="M19,59L89,59" | |
| 128 | + android:strokeWidth="0.8" | |
| 129 | + android:strokeColor="#33FFFFFF" /> | |
| 130 | + <path | |
| 131 | + android:fillColor="#00000000" | |
| 132 | + android:pathData="M19,69L89,69" | |
| 133 | + android:strokeWidth="0.8" | |
| 134 | + android:strokeColor="#33FFFFFF" /> | |
| 135 | + <path | |
| 136 | + android:fillColor="#00000000" | |
| 137 | + android:pathData="M19,79L89,79" | |
| 138 | + android:strokeWidth="0.8" | |
| 139 | + android:strokeColor="#33FFFFFF" /> | |
| 140 | + <path | |
| 141 | + android:fillColor="#00000000" | |
| 142 | + android:pathData="M29,19L29,89" | |
| 143 | + android:strokeWidth="0.8" | |
| 144 | + android:strokeColor="#33FFFFFF" /> | |
| 145 | + <path | |
| 146 | + android:fillColor="#00000000" | |
| 147 | + android:pathData="M39,19L39,89" | |
| 148 | + android:strokeWidth="0.8" | |
| 149 | + android:strokeColor="#33FFFFFF" /> | |
| 150 | + <path | |
| 151 | + android:fillColor="#00000000" | |
| 152 | + android:pathData="M49,19L49,89" | |
| 153 | + android:strokeWidth="0.8" | |
| 154 | + android:strokeColor="#33FFFFFF" /> | |
| 155 | + <path | |
| 156 | + android:fillColor="#00000000" | |
| 157 | + android:pathData="M59,19L59,89" | |
| 158 | + android:strokeWidth="0.8" | |
| 159 | + android:strokeColor="#33FFFFFF" /> | |
| 160 | + <path | |
| 161 | + android:fillColor="#00000000" | |
| 162 | + android:pathData="M69,19L69,89" | |
| 163 | + android:strokeWidth="0.8" | |
| 164 | + android:strokeColor="#33FFFFFF" /> | |
| 165 | + <path | |
| 166 | + android:fillColor="#00000000" | |
| 167 | + android:pathData="M79,19L79,89" | |
| 168 | + android:strokeWidth="0.8" | |
| 169 | + android:strokeColor="#33FFFFFF" /> | |
| 170 | +</vector> |
+++ app/src/main/res/drawable/ic_launcher_foreground.xml
... | ... | @@ -0,0 +1,30 @@ |
| 1 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" | |
| 2 | + xmlns:aapt="http://schemas.android.com/aapt" | |
| 3 | + android:width="108dp" | |
| 4 | + android:height="108dp" | |
| 5 | + android:viewportWidth="108" | |
| 6 | + android:viewportHeight="108"> | |
| 7 | + <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> | |
| 8 | + <aapt:attr name="android:fillColor"> | |
| 9 | + <gradient | |
| 10 | + android:endX="85.84757" | |
| 11 | + android:endY="92.4963" | |
| 12 | + android:startX="42.9492" | |
| 13 | + android:startY="49.59793" | |
| 14 | + android:type="linear"> | |
| 15 | + <item | |
| 16 | + android:color="#44000000" | |
| 17 | + android:offset="0.0" /> | |
| 18 | + <item | |
| 19 | + android:color="#00000000" | |
| 20 | + android:offset="1.0" /> | |
| 21 | + </gradient> | |
| 22 | + </aapt:attr> | |
| 23 | + </path> | |
| 24 | + <path | |
| 25 | + android:fillColor="#FFFFFF" | |
| 26 | + android:fillType="nonZero" | |
| 27 | + android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" | |
| 28 | + android:strokeWidth="1" | |
| 29 | + android:strokeColor="#00000000" /> | |
| 30 | +</vector>(No newline at end of file) |
+++ app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
... | ... | @@ -0,0 +1,6 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |
| 3 | + <background android:drawable="@drawable/ic_launcher_background" /> | |
| 4 | + <foreground android:drawable="@drawable/ic_launcher_foreground" /> | |
| 5 | + <monochrome android:drawable="@drawable/ic_launcher_foreground" /> | |
| 6 | +</adaptive-icon>(No newline at end of file) |
+++ app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
... | ... | @@ -0,0 +1,6 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |
| 3 | + <background android:drawable="@drawable/ic_launcher_background" /> | |
| 4 | + <foreground android:drawable="@drawable/ic_launcher_foreground" /> | |
| 5 | + <monochrome android:drawable="@drawable/ic_launcher_foreground" /> | |
| 6 | +</adaptive-icon>(No newline at end of file) |
+++ app/src/main/res/mipmap-hdpi/ic_launcher.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-mdpi/ic_launcher.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-xhdpi/ic_launcher.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
| Binary file is not shown |
+++ app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
| Binary file is not shown |
+++ app/src/main/res/values/colors.xml
... | ... | @@ -0,0 +1,10 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<resources> | |
| 3 | + <color name="purple_200">#FFBB86FC</color> | |
| 4 | + <color name="purple_500">#FF6200EE</color> | |
| 5 | + <color name="purple_700">#FF3700B3</color> | |
| 6 | + <color name="teal_200">#FF03DAC5</color> | |
| 7 | + <color name="teal_700">#FF018786</color> | |
| 8 | + <color name="black">#FF000000</color> | |
| 9 | + <color name="white">#FFFFFFFF</color> | |
| 10 | +</resources>(No newline at end of file) |
+++ app/src/main/res/values/strings.xml
... | ... | @@ -0,0 +1,3 @@ |
| 1 | +<resources> | |
| 2 | + <string name="app_name">PhotoSlide</string> | |
| 3 | +</resources>(No newline at end of file) |
+++ app/src/main/res/values/themes.xml
... | ... | @@ -0,0 +1,5 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?> | |
| 2 | +<resources> | |
| 3 | + | |
| 4 | + <style name="Theme.PhotoSlide" parent="android:Theme.Material.Light.NoActionBar" /> | |
| 5 | +</resources>(No newline at end of file) |
+++ app/src/main/res/xml/backup_rules.xml
... | ... | @@ -0,0 +1,13 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?><!-- | |
| 2 | + Sample backup rules file; uncomment and customize as necessary. | |
| 3 | + See https://developer.android.com/guide/topics/data/autobackup | |
| 4 | + for details. | |
| 5 | + Note: This file is ignored for devices older than API 31 | |
| 6 | + See https://developer.android.com/about/versions/12/backup-restore | |
| 7 | +--> | |
| 8 | +<full-backup-content> | |
| 9 | + <!-- | |
| 10 | + <include domain="sharedpref" path="."/> | |
| 11 | + <exclude domain="sharedpref" path="device.xml"/> | |
| 12 | +--> | |
| 13 | +</full-backup-content>(No newline at end of file) |
+++ app/src/main/res/xml/data_extraction_rules.xml
... | ... | @@ -0,0 +1,19 @@ |
| 1 | +<?xml version="1.0" encoding="utf-8"?><!-- | |
| 2 | + Sample data extraction rules file; uncomment and customize as necessary. | |
| 3 | + See https://developer.android.com/about/versions/12/backup-restore#xml-changes | |
| 4 | + for details. | |
| 5 | +--> | |
| 6 | +<data-extraction-rules> | |
| 7 | + <cloud-backup> | |
| 8 | + <!-- TODO: Use <include> and <exclude> to control what is backed up. | |
| 9 | + <include .../> | |
| 10 | + <exclude .../> | |
| 11 | + --> | |
| 12 | + </cloud-backup> | |
| 13 | + <!-- | |
| 14 | + <device-transfer> | |
| 15 | + <include .../> | |
| 16 | + <exclude .../> | |
| 17 | + </device-transfer> | |
| 18 | + --> | |
| 19 | +</data-extraction-rules>(No newline at end of file) |
+++ app/src/test/java/kr/co/app4ad/photoslide/ExampleUnitTest.kt
... | ... | @@ -0,0 +1,17 @@ |
| 1 | +package kr.co.app4ad.photoslide | |
| 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 | +}(No newline at end of file) |
+++ build.gradle.kts
... | ... | @@ -0,0 +1,5 @@ |
| 1 | +// Top-level build file where you can add configuration options common to all sub-projects/modules. | |
| 2 | +plugins { | |
| 3 | + alias(libs.plugins.android.application) apply false | |
| 4 | + alias(libs.plugins.kotlin.compose) apply false | |
| 5 | +}(No newline at end of file) |
+++ gradle.properties
... | ... | @@ -0,0 +1,19 @@ |
| 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. For more details, visit | |
| 12 | +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects | |
| 13 | +# org.gradle.parallel=true | |
| 14 | +# When enabled, the Configuration Cache allows Gradle to skip the configuration | |
| 15 | +# phase entirely if nothing that affects the build configuration (such as build scripts) | |
| 16 | +# has changed. Additionally, Gradle applies performance optimizations to task execution. | |
| 17 | +org.gradle.configuration-cache=true | |
| 18 | +# Kotlin code style for this project: "official" or "obsolete": | |
| 19 | +kotlin.code.style=official(No newline at end of file) |
+++ gradle/gradle-daemon-jvm.properties
... | ... | @@ -0,0 +1,12 @@ |
| 1 | +#This file is generated by updateDaemonJvm | |
| 2 | +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/cf726b4a1c84b50457225f9bba6d7650/redirect | |
| 3 | +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect | |
| 4 | +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/cf726b4a1c84b50457225f9bba6d7650/redirect | |
| 5 | +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect | |
| 6 | +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/c2dd35c9d0aaf0ba6ad0791320f99dfc/redirect | |
| 7 | +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/e5810bd7fd1f8a586644409d395a7e55/redirect | |
| 8 | +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/cf726b4a1c84b50457225f9bba6d7650/redirect | |
| 9 | +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/fa1e318c287360478e3c83a9a3ef1007/redirect | |
| 10 | +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/7b3c4877c0749019e6805bb61e421497/redirect | |
| 11 | +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/d76df094a9cbbabd3b08251f9e61444a/redirect | |
| 12 | +toolchainVersion=25 |
+++ gradle/libs.versions.toml
... | ... | @@ -0,0 +1,31 @@ |
| 1 | +[versions] | |
| 2 | +agp = "9.3.2" | |
| 3 | +coreKtx = "1.10.1" | |
| 4 | +junit = "4.13.2" | |
| 5 | +junitVersion = "1.1.5" | |
| 6 | +espressoCore = "3.5.1" | |
| 7 | +lifecycleRuntimeKtx = "2.6.1" | |
| 8 | +activityCompose = "1.8.0" | |
| 9 | +kotlin = "2.2.10" | |
| 10 | +composeBom = "2026.02.01" | |
| 11 | + | |
| 12 | +[libraries] | |
| 13 | +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } | |
| 14 | +junit = { group = "junit", name = "junit", version.ref = "junit" } | |
| 15 | +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } | |
| 16 | +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } | |
| 17 | +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } | |
| 18 | +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } | |
| 19 | +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } | |
| 20 | +androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } | |
| 21 | +androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } | |
| 22 | +androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } | |
| 23 | +androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } | |
| 24 | +androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } | |
| 25 | +androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } | |
| 26 | +androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } | |
| 27 | + | |
| 28 | +[plugins] | |
| 29 | +android-application = { id = "com.android.application", version.ref = "agp" } | |
| 30 | +kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } | |
| 31 | + |
+++ gradle/wrapper/gradle-wrapper.jar
| Binary file is not shown |
+++ gradle/wrapper/gradle-wrapper.properties
... | ... | @@ -0,0 +1,9 @@ |
| 1 | +#Sun Aug 30 13:26:48 KST 2026 | |
| 2 | +distributionBase=GRADLE_USER_HOME | |
| 3 | +distributionPath=wrapper/dists | |
| 4 | +distributionSha256Sum=553c78f50dafcd54d65b9a444649057857469edf836431389695608536d6b746 | |
| 5 | +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip | |
| 6 | +networkTimeout=10000 | |
| 7 | +validateDistributionUrl=true | |
| 8 | +zipStoreBase=GRADLE_USER_HOME | |
| 9 | +zipStorePath=wrapper/dists |
+++ gradlew
... | ... | @@ -0,0 +1,251 @@ |
| 1 | +#!/bin/sh | |
| 2 | + | |
| 3 | +# | |
| 4 | +# Copyright © 2015 the original 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 | +# SPDX-License-Identifier: Apache-2.0 | |
| 19 | +# | |
| 20 | + | |
| 21 | +############################################################################## | |
| 22 | +# | |
| 23 | +# Gradle start up script for POSIX generated by Gradle. | |
| 24 | +# | |
| 25 | +# Important for running: | |
| 26 | +# | |
| 27 | +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | |
| 28 | +# noncompliant, but you have some other compliant shell such as ksh or | |
| 29 | +# bash, then to run this script, type that shell name before the whole | |
| 30 | +# command line, like: | |
| 31 | +# | |
| 32 | +# ksh Gradle | |
| 33 | +# | |
| 34 | +# Busybox and similar reduced shells will NOT work, because this script | |
| 35 | +# requires all of these POSIX shell features: | |
| 36 | +# * functions; | |
| 37 | +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | |
| 38 | +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; | |
| 39 | +# * compound commands having a testable exit status, especially «case»; | |
| 40 | +# * various built-in commands including «command», «set», and «ulimit». | |
| 41 | +# | |
| 42 | +# Important for patching: | |
| 43 | +# | |
| 44 | +# (2) This script targets any POSIX shell, so it avoids extensions provided | |
| 45 | +# by Bash, Ksh, etc; in particular arrays are avoided. | |
| 46 | +# | |
| 47 | +# The "traditional" practice of packing multiple parameters into a | |
| 48 | +# space-separated string is a well documented source of bugs and security | |
| 49 | +# problems, so this is (mostly) avoided, by progressively accumulating | |
| 50 | +# options in "$@", and eventually passing that to Java. | |
| 51 | +# | |
| 52 | +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | |
| 53 | +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | |
| 54 | +# see the in-line comments for details. | |
| 55 | +# | |
| 56 | +# There are tweaks for specific operating systems such as AIX, CygWin, | |
| 57 | +# Darwin, MinGW, and NonStop. | |
| 58 | +# | |
| 59 | +# (3) This script is generated from the Groovy template | |
| 60 | +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | |
| 61 | +# within the Gradle project. | |
| 62 | +# | |
| 63 | +# You can find Gradle at https://github.com/gradle/gradle/. | |
| 64 | +# | |
| 65 | +############################################################################## | |
| 66 | + | |
| 67 | +# Attempt to set APP_HOME | |
| 68 | + | |
| 69 | +# Resolve links: $0 may be a link | |
| 70 | +app_path=$0 | |
| 71 | + | |
| 72 | +# Need this for daisy-chained symlinks. | |
| 73 | +while | |
| 74 | + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path | |
| 75 | + [ -h "$app_path" ] | |
| 76 | +do | |
| 77 | + ls=$( ls -ld "$app_path" ) | |
| 78 | + link=${ls#*' -> '} | |
| 79 | + case $link in #( | |
| 80 | + /*) app_path=$link ;; #( | |
| 81 | + *) app_path=$APP_HOME$link ;; | |
| 82 | + esac | |
| 83 | +done | |
| 84 | + | |
| 85 | +# This is normally unused | |
| 86 | +# shellcheck disable=SC2034 | |
| 87 | +APP_BASE_NAME=${0##*/} | |
| 88 | +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) | |
| 89 | +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit | |
| 90 | + | |
| 91 | +# Use the maximum available, or set MAX_FD != -1 to use that value. | |
| 92 | +MAX_FD=maximum | |
| 93 | + | |
| 94 | +warn () { | |
| 95 | + echo "$*" | |
| 96 | +} >&2 | |
| 97 | + | |
| 98 | +die () { | |
| 99 | + echo | |
| 100 | + echo "$*" | |
| 101 | + echo | |
| 102 | + exit 1 | |
| 103 | +} >&2 | |
| 104 | + | |
| 105 | +# OS specific support (must be 'true' or 'false'). | |
| 106 | +cygwin=false | |
| 107 | +msys=false | |
| 108 | +darwin=false | |
| 109 | +nonstop=false | |
| 110 | +case "$( uname )" in #( | |
| 111 | + CYGWIN* ) cygwin=true ;; #( | |
| 112 | + Darwin* ) darwin=true ;; #( | |
| 113 | + MSYS* | MINGW* ) msys=true ;; #( | |
| 114 | + NONSTOP* ) nonstop=true ;; | |
| 115 | +esac | |
| 116 | + | |
| 117 | +CLASSPATH="\\\"\\\"" | |
| 118 | + | |
| 119 | + | |
| 120 | +# Determine the Java command to use to start the JVM. | |
| 121 | +if [ -n "$JAVA_HOME" ] ; then | |
| 122 | + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |
| 123 | + # IBM's JDK on AIX uses strange locations for the executables | |
| 124 | + JAVACMD=$JAVA_HOME/jre/sh/java | |
| 125 | + else | |
| 126 | + JAVACMD=$JAVA_HOME/bin/java | |
| 127 | + fi | |
| 128 | + if [ ! -x "$JAVACMD" ] ; then | |
| 129 | + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | |
| 130 | + | |
| 131 | +Please set the JAVA_HOME variable in your environment to match the | |
| 132 | +location of your Java installation." | |
| 133 | + fi | |
| 134 | +else | |
| 135 | + JAVACMD=java | |
| 136 | + if ! command -v java >/dev/null 2>&1 | |
| 137 | + then | |
| 138 | + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |
| 139 | + | |
| 140 | +Please set the JAVA_HOME variable in your environment to match the | |
| 141 | +location of your Java installation." | |
| 142 | + fi | |
| 143 | +fi | |
| 144 | + | |
| 145 | +# Increase the maximum file descriptors if we can. | |
| 146 | +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | |
| 147 | + case $MAX_FD in #( | |
| 148 | + max*) | |
| 149 | + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. | |
| 150 | + # shellcheck disable=SC2039,SC3045 | |
| 151 | + MAX_FD=$( ulimit -H -n ) || | |
| 152 | + warn "Could not query maximum file descriptor limit" | |
| 153 | + esac | |
| 154 | + case $MAX_FD in #( | |
| 155 | + '' | soft) :;; #( | |
| 156 | + *) | |
| 157 | + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. | |
| 158 | + # shellcheck disable=SC2039,SC3045 | |
| 159 | + ulimit -n "$MAX_FD" || | |
| 160 | + warn "Could not set maximum file descriptor limit to $MAX_FD" | |
| 161 | + esac | |
| 162 | +fi | |
| 163 | + | |
| 164 | +# Collect all arguments for the java command, stacking in reverse order: | |
| 165 | +# * args from the command line | |
| 166 | +# * the main class name | |
| 167 | +# * -classpath | |
| 168 | +# * -D...appname settings | |
| 169 | +# * --module-path (only if needed) | |
| 170 | +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | |
| 171 | + | |
| 172 | +# For Cygwin or MSYS, switch paths to Windows format before running java | |
| 173 | +if "$cygwin" || "$msys" ; then | |
| 174 | + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | |
| 175 | + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | |
| 176 | + | |
| 177 | + JAVACMD=$( cygpath --unix "$JAVACMD" ) | |
| 178 | + | |
| 179 | + # Now convert the arguments - kludge to limit ourselves to /bin/sh | |
| 180 | + for arg do | |
| 181 | + if | |
| 182 | + case $arg in #( | |
| 183 | + -*) false ;; # don't mess with options #( | |
| 184 | + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath | |
| 185 | + [ -e "$t" ] ;; #( | |
| 186 | + *) false ;; | |
| 187 | + esac | |
| 188 | + then | |
| 189 | + arg=$( cygpath --path --ignore --mixed "$arg" ) | |
| 190 | + fi | |
| 191 | + # Roll the args list around exactly as many times as the number of | |
| 192 | + # args, so each arg winds up back in the position where it started, but | |
| 193 | + # possibly modified. | |
| 194 | + # | |
| 195 | + # NB: a `for` loop captures its iteration list before it begins, so | |
| 196 | + # changing the positional parameters here affects neither the number of | |
| 197 | + # iterations, nor the values presented in `arg`. | |
| 198 | + shift # remove old arg | |
| 199 | + set -- "$@" "$arg" # push replacement arg | |
| 200 | + done | |
| 201 | +fi | |
| 202 | + | |
| 203 | + | |
| 204 | +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |
| 205 | +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |
| 206 | + | |
| 207 | +# Collect all arguments for the java command: | |
| 208 | +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, | |
| 209 | +# and any embedded shellness will be escaped. | |
| 210 | +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be | |
| 211 | +# treated as '${Hostname}' itself on the command line. | |
| 212 | + | |
| 213 | +set -- \ | |
| 214 | + "-Dorg.gradle.appname=$APP_BASE_NAME" \ | |
| 215 | + -classpath "$CLASSPATH" \ | |
| 216 | + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ | |
| 217 | + "$@" | |
| 218 | + | |
| 219 | +# Stop when "xargs" is not available. | |
| 220 | +if ! command -v xargs >/dev/null 2>&1 | |
| 221 | +then | |
| 222 | + die "xargs is not available" | |
| 223 | +fi | |
| 224 | + | |
| 225 | +# Use "xargs" to parse quoted args. | |
| 226 | +# | |
| 227 | +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. | |
| 228 | +# | |
| 229 | +# In Bash we could simply go: | |
| 230 | +# | |
| 231 | +# readarray ARGS < <( xargs -n1 <<<"$var" ) && | |
| 232 | +# set -- "${ARGS[@]}" "$@" | |
| 233 | +# | |
| 234 | +# but POSIX shell has neither arrays nor command substitution, so instead we | |
| 235 | +# post-process each arg (as a line of input to sed) to backslash-escape any | |
| 236 | +# character that might be a shell metacharacter, then use eval to reverse | |
| 237 | +# that process (while maintaining the separation between arguments), and wrap | |
| 238 | +# the whole thing up as a single "set" statement. | |
| 239 | +# | |
| 240 | +# This will of course break if any of these variables contains a newline or | |
| 241 | +# an unmatched quote. | |
| 242 | +# | |
| 243 | + | |
| 244 | +eval "set -- $( | |
| 245 | + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | |
| 246 | + xargs -n1 | | |
| 247 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | |
| 248 | + tr '\n' ' ' | |
| 249 | + )" '"$@"' | |
| 250 | + | |
| 251 | +exec "$JAVACMD" "$@" |
+++ gradlew.bat
... | ... | @@ -0,0 +1,94 @@ |
| 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 | +@rem SPDX-License-Identifier: Apache-2.0 | |
| 17 | +@rem | |
| 18 | + | |
| 19 | +@if "%DEBUG%"=="" @echo off | |
| 20 | +@rem ########################################################################## | |
| 21 | +@rem | |
| 22 | +@rem Gradle startup script for Windows | |
| 23 | +@rem | |
| 24 | +@rem ########################################################################## | |
| 25 | + | |
| 26 | +@rem Set local scope for the variables with windows NT shell | |
| 27 | +if "%OS%"=="Windows_NT" setlocal | |
| 28 | + | |
| 29 | +set DIRNAME=%~dp0 | |
| 30 | +if "%DIRNAME%"=="" set DIRNAME=. | |
| 31 | +@rem This is normally unused | |
| 32 | +set APP_BASE_NAME=%~n0 | |
| 33 | +set APP_HOME=%DIRNAME% | |
| 34 | + | |
| 35 | +@rem Resolve any "." and ".." in APP_HOME to make it shorter. | |
| 36 | +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
| |
| 37 | + | |
| 38 | +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |
| 39 | +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | |
| 40 | + | |
| 41 | +@rem Find java.exe | |
| 42 | +if defined JAVA_HOME goto findJavaFromJavaHome | |
| 43 | + | |
| 44 | +set JAVA_EXE=java.exe | |
| 45 | +%JAVA_EXE% -version >NUL 2>&1 | |
| 46 | +if %ERRORLEVEL% equ 0 goto execute | |
| 47 | + | |
| 48 | +echo. 1>&2 | |
| 49 | +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 | |
| 50 | +echo. 1>&2 | |
| 51 | +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 | |
| 52 | +echo location of your Java installation. 1>&2 | |
| 53 | + | |
| 54 | +goto fail | |
| 55 | + | |
| 56 | +:findJavaFromJavaHome | |
| 57 | +set JAVA_HOME=%JAVA_HOME:"=% | |
| 58 | +set JAVA_EXE=%JAVA_HOME%/bin/java.exe | |
| 59 | + | |
| 60 | +if exist "%JAVA_EXE%" goto execute | |
| 61 | + | |
| 62 | +echo. 1>&2 | |
| 63 | +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 | |
| 64 | +echo. 1>&2 | |
| 65 | +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 | |
| 66 | +echo location of your Java installation. 1>&2 | |
| 67 | + | |
| 68 | +goto fail | |
| 69 | + | |
| 70 | +:execute | |
| 71 | +@rem Setup the command line | |
| 72 | + | |
| 73 | +set CLASSPATH= | |
| 74 | + | |
| 75 | + | |
| 76 | +@rem Execute Gradle | |
| 77 | +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* | |
| 78 | + | |
| 79 | +:end | |
| 80 | +@rem End local scope for the variables with windows NT shell | |
| 81 | +if %ERRORLEVEL% equ 0 goto mainEnd | |
| 82 | + | |
| 83 | +:fail | |
| 84 | +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | |
| 85 | +rem the _cmd.exe /c_ return code! | |
| 86 | +set EXIT_CODE=%ERRORLEVEL% | |
| 87 | +if %EXIT_CODE% equ 0 set EXIT_CODE=1 | |
| 88 | +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% | |
| 89 | +exit /b %EXIT_CODE% | |
| 90 | + | |
| 91 | +:mainEnd | |
| 92 | +if "%OS%"=="Windows_NT" endlocal | |
| 93 | + | |
| 94 | +:omega |
+++ settings.gradle.kts
... | ... | @@ -0,0 +1,26 @@ |
| 1 | +pluginManagement { | |
| 2 | + repositories { | |
| 3 | + google { | |
| 4 | + content { | |
| 5 | + includeGroupByRegex("com\\.android.*") | |
| 6 | + includeGroupByRegex("com\\.google.*") | |
| 7 | + includeGroupByRegex("androidx.*") | |
| 8 | + } | |
| 9 | + } | |
| 10 | + mavenCentral() | |
| 11 | + gradlePluginPortal() | |
| 12 | + } | |
| 13 | +} | |
| 14 | +plugins { | |
| 15 | + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" | |
| 16 | +} | |
| 17 | +dependencyResolutionManagement { | |
| 18 | + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) | |
| 19 | + repositories { | |
| 20 | + google() | |
| 21 | + mavenCentral() | |
| 22 | + } | |
| 23 | +} | |
| 24 | + | |
| 25 | +rootProject.name = "PhotoSlide" | |
| 26 | +include(":app") |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?