주영규 주영규 04-28
[타다당 aos] - 소스 업로드
 - 소스 업로드
@65b73e38b7589aaf075bb51759a0b188d1d5e0e9
 
.gitignore (added)
+++ .gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
 
.idea/.gitignore (added)
+++ .idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
 
.idea/.name (added)
+++ .idea/.name
@@ -0,0 +1,1 @@
+Tadadang-user(파일 끝에 줄바꿈 문자 없음)
 
.idea/compiler.xml (added)
+++ .idea/compiler.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <bytecodeTargetLevel target="17" />
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/deploymentTargetDropDown.xml (added)
+++ .idea/deploymentTargetDropDown.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="deploymentTargetDropDown">
+    <value>
+      <entry key="app">
+        <State />
+      </entry>
+    </value>
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/google-services.json (added)
+++ .idea/google-services.json
@@ -0,0 +1,29 @@
+{
+  "project_info": {
+    "project_number": "626552537534",
+    "project_id": "daissue-5fc74",
+    "storage_bucket": "daissue-5fc74.appspot.com"
+  },
+  "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:626552537534:android:dd4d8ee23dd2eae8f979ef",
+        "android_client_info": {
+          "package_name": "kr.co.daissue.admin"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyCHI6-eh-7Dh1TQDVCkRVeSC1J1zyvhhi0"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
+    }
+  ],
+  "configuration_version": "1"
+}(파일 끝에 줄바꿈 문자 없음)
 
.idea/gradle.xml (added)
+++ .idea/gradle.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+          </set>
+        </option>
+        <option name="resolveExternalAnnotations" value="false" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/inspectionProfiles/Project_Default.xml (added)
+++ .idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,41 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+    <inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
+      <option name="composableFile" value="true" />
+      <option name="previewFile" value="true" />
+    </inspection_tool>
+  </profile>
+</component>(파일 끝에 줄바꿈 문자 없음)
 
.idea/kotlinc.xml (added)
+++ .idea/kotlinc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="KotlinJpsPluginSettings">
+    <option name="version" value="1.9.0" />
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/migrations.xml (added)
+++ .idea/migrations.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectMigrations">
+    <option name="MigrateToGradleLocalJavaHome">
+      <set>
+        <option value="$PROJECT_DIR$" />
+      </set>
+    </option>
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/misc.xml (added)
+++ .idea/misc.xml
@@ -0,0 +1,9 @@
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/other.xml (added)
+++ .idea/other.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="direct_access_persist.xml">
+    <option name="deviceSelectionList">
+      <list>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="27" />
+          <option name="brand" value="DOCOMO" />
+          <option name="codename" value="F01L" />
+          <option name="id" value="F01L" />
+          <option name="manufacturer" value="FUJITSU" />
+          <option name="name" value="F-01L" />
+          <option name="screenDensity" value="360" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1280" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="28" />
+          <option name="brand" value="DOCOMO" />
+          <option name="codename" value="SH-01L" />
+          <option name="id" value="SH-01L" />
+          <option name="manufacturer" value="SHARP" />
+          <option name="name" value="AQUOS sense2 SH-01L" />
+          <option name="screenDensity" value="480" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2160" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="31" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="a51" />
+          <option name="id" value="a51" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy A51" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="akita" />
+          <option name="id" value="akita" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="b0q" />
+          <option name="id" value="b0q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S22 Ultra" />
+          <option name="screenDensity" value="600" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3088" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="32" />
+          <option name="brand" value="google" />
+          <option name="codename" value="bluejay" />
+          <option name="id" value="bluejay" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 6a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="29" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="crownqlteue" />
+          <option name="id" value="crownqlteue" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Note9" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2220" />
+          <option name="screenY" value="1080" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="dm3q" />
+          <option name="id" value="dm3q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S23 Ultra" />
+          <option name="screenDensity" value="600" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3088" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix" />
+          <option name="id" value="felix" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="felix_camera" />
+          <option name="id" value="felix_camera" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Fold (Camera-enabled)" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="2208" />
+          <option name="screenY" value="1840" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="gts8uwifi" />
+          <option name="id" value="gts8uwifi" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Tab S8 Ultra" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="1848" />
+          <option name="screenY" value="2960" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="husky" />
+          <option name="id" value="husky" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8 Pro" />
+          <option name="screenDensity" value="390" />
+          <option name="screenX" value="1008" />
+          <option name="screenY" value="2244" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="motorola" />
+          <option name="codename" value="java" />
+          <option name="id" value="java" />
+          <option name="manufacturer" value="Motorola" />
+          <option name="name" value="G20" />
+          <option name="screenDensity" value="280" />
+          <option name="screenX" value="720" />
+          <option name="screenY" value="1600" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="lynx" />
+          <option name="id" value="lynx" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 7a" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="31" />
+          <option name="brand" value="google" />
+          <option name="codename" value="oriole" />
+          <option name="id" value="oriole" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 6" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="panther" />
+          <option name="id" value="panther" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 7" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="31" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="q2q" />
+          <option name="id" value="q2q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Z Fold3" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1768" />
+          <option name="screenY" value="2208" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="q5q" />
+          <option name="id" value="q5q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy Z Fold5" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1812" />
+          <option name="screenY" value="2176" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="google" />
+          <option name="codename" value="r11" />
+          <option name="id" value="r11" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Watch" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="384" />
+          <option name="screenY" value="384" />
+          <option name="type" value="WEAR_OS" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="30" />
+          <option name="brand" value="google" />
+          <option name="codename" value="redfin" />
+          <option name="id" value="redfin" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 5" />
+          <option name="screenDensity" value="440" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2340" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="34" />
+          <option name="brand" value="google" />
+          <option name="codename" value="shiba" />
+          <option name="id" value="shiba" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel 8" />
+          <option name="screenDensity" value="420" />
+          <option name="screenX" value="1080" />
+          <option name="screenY" value="2400" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="33" />
+          <option name="brand" value="google" />
+          <option name="codename" value="tangorpro" />
+          <option name="id" value="tangorpro" />
+          <option name="manufacturer" value="Google" />
+          <option name="name" value="Pixel Tablet" />
+          <option name="screenDensity" value="320" />
+          <option name="screenX" value="1600" />
+          <option name="screenY" value="2560" />
+        </PersistentDeviceSelectionData>
+        <PersistentDeviceSelectionData>
+          <option name="api" value="29" />
+          <option name="brand" value="samsung" />
+          <option name="codename" value="x1q" />
+          <option name="id" value="x1q" />
+          <option name="manufacturer" value="Samsung" />
+          <option name="name" value="Galaxy S20" />
+          <option name="screenDensity" value="480" />
+          <option name="screenX" value="1440" />
+          <option name="screenY" value="3200" />
+        </PersistentDeviceSelectionData>
+      </list>
+    </option>
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
.idea/vcs.xml (added)
+++ .idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>(파일 끝에 줄바꿈 문자 없음)
 
app/.gitignore (added)
+++ app/.gitignore
@@ -0,0 +1,1 @@
+/build(파일 끝에 줄바꿈 문자 없음)
 
app/build.gradle (added)
+++ app/build.gradle
@@ -0,0 +1,78 @@
+plugins {
+    alias(libs.plugins.androidApplication)
+    alias(libs.plugins.jetbrainsKotlinAndroid)
+    id 'com.google.gms.google-services'
+}
+
+android {
+    namespace 'kr.co.tadadang.user'
+    compileSdk 34
+
+    defaultConfig {
+        applicationId "kr.co.tadadang.user"
+        minSdk 24
+        targetSdk 34
+        versionCode 3
+        versionName "1.2"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        vectorDrawables {
+            useSupportLibrary true
+        }
+        setProperty("archivesBaseName", "tadadang_user")
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+    kotlinOptions {
+        jvmTarget = '1.8'
+    }
+    buildFeatures {
+        compose true
+    }
+    composeOptions {
+        kotlinCompilerExtensionVersion '1.5.1'
+    }
+    packaging {
+        resources {
+            excludes += '/META-INF/{AL2.0,LGPL2.1}'
+        }
+    }
+}
+
+dependencies {
+
+    implementation libs.androidx.core.ktx
+    implementation libs.androidx.lifecycle.runtime.ktx
+    implementation libs.androidx.activity.compose
+    implementation platform(libs.androidx.compose.bom)
+    implementation libs.androidx.ui
+    implementation libs.androidx.ui.graphics
+    implementation libs.androidx.ui.tooling.preview
+    implementation libs.androidx.material3
+    implementation libs.androidx.work.runtime.ktx
+    testImplementation libs.junit
+    androidTestImplementation libs.androidx.junit
+    androidTestImplementation libs.androidx.espresso.core
+    androidTestImplementation platform(libs.androidx.compose.bom)
+    androidTestImplementation libs.androidx.ui.test.junit4
+    debugImplementation libs.androidx.ui.tooling
+    debugImplementation libs.androidx.ui.test.manifest
+
+    implementation platform('com.google.firebase:firebase-bom:33.0.0')
+    implementation 'com.google.firebase:firebase-analytics'
+    implementation 'com.google.firebase:firebase-messaging-ktx'
+    implementation 'com.google.firebase:firebase-messaging-directboot'
+    implementation 'com.squareup.retrofit2:retrofit:2.11.0'
+    implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
+
+    implementation 'com.google.android.gms:play-services-auth:21.1.1'
+}(파일 끝에 줄바꿈 문자 없음)
 
app/google-services.json (added)
+++ app/google-services.json
@@ -0,0 +1,48 @@
+{
+  "project_info": {
+    "project_number": "626552537534",
+    "project_id": "daissue-5fc74",
+    "storage_bucket": "daissue-5fc74.appspot.com"
+  },
+  "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:626552537534:android:dd4d8ee23dd2eae8f979ef",
+        "android_client_info": {
+          "package_name": "kr.co.tadadang.user"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyCHI6-eh-7Dh1TQDVCkRVeSC1J1zyvhhi0"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
+    },
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:626552537534:android:9aa36faabd967876f979ef",
+        "android_client_info": {
+          "package_name": "kr.co.tadadang.user"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyCHI6-eh-7Dh1TQDVCkRVeSC1J1zyvhhi0"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
+    }
+  ],
+  "configuration_version": "1"
+}(파일 끝에 줄바꿈 문자 없음)
 
app/proguard-rules.pro (added)
+++ app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile(파일 끝에 줄바꿈 문자 없음)
 
app/release/tadadang_user-release.aab (Binary) (added)
+++ app/release/tadadang_user-release.aab
Binary file is not shown
 
app/src/androidTest/java/kr/co/tadadang/user/ExampleInstrumentedTest.kt (added)
+++ app/src/androidTest/java/kr/co/tadadang/user/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package kr.co.tadadang.user
+
+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("kr.co.tadadang.user", appContext.packageName)
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/AndroidManifest.xml (added)
+++ app/src/main/AndroidManifest.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.READ_CLIPBOARD" />
+    <uses-permission android:name="android.permission.WRITE_CLIPBOARD" />
+    <uses-permission android:name="android.webkit.PermissionRequest" />
+
+    <application
+        android:allowBackup="true"
+        android:dataExtractionRules="@xml/data_extraction_rules"
+        android:fullBackupContent="@xml/backup_rules"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:usesCleartextTraffic="true"
+        android:theme="@style/Theme.Tadadang"
+        tools:targetApi="31">
+
+        <meta-data
+            android:name="firebase_messaging_auto_init_enabled"
+            android:value="false" />
+        <meta-data
+            android:name="firebase_analytics_collection_enabled"
+            android:value="false" />
+
+        <meta-data
+            android:name="com.google.firebase.messaging.default_notification_channel_id"
+            android:value="@string/default_notification_channel_id" />
+
+        <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
+     See README(https://goo.gl/l4GJaQ) for more. -->
+        <meta-data
+            android:name="com.google.firebase.messaging.default_notification_icon"
+            android:resource="@mipmap/ic_launcher" />
+        <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
+             notification message. See README(https://goo.gl/6BKBk7) for more. -->
+        <meta-data
+            android:name="com.google.firebase.messaging.default_notification_color"
+            android:resource="@color/purple_200" />
+
+        <receiver android:name=".sms.SmsRetrieverReceiver" android:exported="true"
+            android:permission="com.google.android.gms.auth.api.phone.permission.SEND">
+            <intent-filter>
+                <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
+            </intent-filter>
+        </receiver>
+
+        <service
+            android:name=".FCMService"
+            android:exported="false"
+            android:directBootAware="true">
+            <intent-filter>
+                <action android:name="com.google.firebase.MESSAGING_EVENT" />
+            </intent-filter>
+        </service>
+
+        <activity
+            android:name=".MainActivity"
+            android:exported="true"
+            android:label="@string/app_name"
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="adjustPan"
+            android:theme="@style/Theme.Tadadang">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/ic_launcher-playstore.png (Binary) (added)
+++ app/src/main/ic_launcher-playstore.png
Binary file is not shown
 
app/src/main/ic_launcher2-playstore.png (Binary) (added)
+++ app/src/main/ic_launcher2-playstore.png
Binary file is not shown
 
app/src/main/java/kr/co/tadadang/user/Const.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/Const.kt
@@ -0,0 +1,22 @@
+package kr.co.tadadang.user
+
+import kr.co.tadadang.user.native_bridge.ExitApp
+import kr.co.tadadang.user.native_bridge.FcmSubscribe
+import kr.co.tadadang.user.native_bridge.GetPushToken
+import kr.co.tadadang.user.native_bridge.HideIntro
+import kr.co.tadadang.user.native_bridge._BaseBridge
+
+object Const {
+    var IS_TEST = false
+    val PAGE_URL =
+        if (IS_TEST) "192.168.0.69:3000/app"
+//        if (IS_TEST) "https://chattest.kabeadsale.com"
+        else "https://tadadang.com/app"
+
+    val APP_BRIDGE_LIST: Array<_BaseBridge> = arrayOf(
+        HideIntro(),
+        ExitApp(),
+        GetPushToken(),
+        FcmSubscribe()
+    )
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/FCMService.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/FCMService.kt
@@ -0,0 +1,136 @@
+package kr.co.tadadang.user
+
+import android.app.NotificationChannel
+import android.app.NotificationManager
+import android.app.PendingIntent
+import android.content.Context
+import android.content.Intent
+import android.media.RingtoneManager
+import android.os.Build
+import android.util.Log
+import androidx.core.app.NotificationCompat
+import androidx.work.OneTimeWorkRequest
+import androidx.work.WorkManager
+import androidx.work.Worker
+import androidx.work.WorkerParameters
+import com.google.firebase.messaging.FirebaseMessagingService
+import com.google.firebase.messaging.RemoteMessage
+
+class FCMService: FirebaseMessagingService() {
+    // [START receive_message]
+    override fun onMessageReceived(remoteMessage: RemoteMessage) {
+        // TODO(developer): Handle FCM messages here.
+        // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
+        Log.d(TAG, "From: ${remoteMessage.from}")
+
+        // Check if message contains a data payload.
+        if (remoteMessage.data.isNotEmpty()) {
+            Log.d(TAG, "Message data payload: ${remoteMessage.data}")
+
+            // Check if data needs to be processed by long running job
+            if (needsToBeScheduled()) {
+                // For long-running tasks (10 seconds or more) use WorkManager.
+                scheduleJob()
+            } else {
+                // Handle message within 10 seconds
+                handleNow()
+            }
+        }
+
+        // Check if message contains a notification payload.
+        remoteMessage.notification?.let {
+            Log.d(TAG, "Message Notification Body: ${it.body}")
+            it.body?.let { it1 -> sendNotification(it1) }
+        }
+
+        // Also if you intend on generating your own notifications as a result of a received FCM
+        // message, here is where that should be initiated. See sendNotification method below.
+    }
+    // [END receive_message]
+
+    private fun needsToBeScheduled() = true
+
+    // [START on_new_token]
+    /**
+     * Called if the FCM registration token is updated. This may occur if the security of
+     * the previous token had been compromised. Note that this is called when the
+     * FCM registration token is initially generated so this is where you would retrieve the token.
+     */
+    override fun onNewToken(token: String) {
+        Log.d(TAG, "Refreshed token: $token")
+
+        // If you want to send messages to this application instance or
+        // manage this apps subscriptions on the server side, send the
+        // FCM registration token to your app server.
+        sendRegistrationToServer(token)
+    }
+    // [END on_new_token]
+
+    private fun scheduleJob() {
+        // [START dispatch_job]
+        val work = OneTimeWorkRequest.Builder(MyWorker::class.java)
+            .build()
+        WorkManager.getInstance(this)
+            .beginWith(work)
+            .enqueue()
+        // [END dispatch_job]
+    }
+
+    private fun handleNow() {
+        Log.d(TAG, "Short lived task is done.")
+    }
+
+    private fun sendRegistrationToServer(token: String?) {
+        // TODO: Implement this method to send token to your app server.
+        Log.d(TAG, "sendRegistrationTokenToServer($token)")
+    }
+
+    private fun sendNotification(messageBody: String) {
+        val intent = Intent(this, MainActivity::class.java)
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+        val requestCode = 0
+        val pendingIntent = PendingIntent.getActivity(
+            this,
+            requestCode,
+            intent,
+            PendingIntent.FLAG_IMMUTABLE,
+        )
+
+        val channelId = getString(R.string.default_notification_channel_id)
+        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
+        val notificationBuilder = NotificationCompat.Builder(this, channelId)
+            .setSmallIcon(R.mipmap.ic_launcher)
+            .setContentTitle(getString(R.string.app_name))
+            .setContentText(messageBody)
+            .setAutoCancel(true)
+            .setSound(defaultSoundUri)
+            .setContentIntent(pendingIntent)
+            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
+
+        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+
+        // Since android Oreo notification channel is needed.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            val channel = NotificationChannel(
+                channelId,
+                getString(R.string.default_notification_channel_name),
+                NotificationManager.IMPORTANCE_DEFAULT,
+            )
+            notificationManager.createNotificationChannel(channel)
+        }
+
+        val notificationId = 0
+        notificationManager.notify(notificationId, notificationBuilder.build())
+    }
+
+    companion object {
+        private const val TAG = "FCMService"
+    }
+
+    internal class MyWorker(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) {
+        override fun doWork(): Result {
+            // TODO(developer): add long running task here.
+            return Result.success()
+        }
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/MainActivity.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/MainActivity.kt
@@ -0,0 +1,522 @@
+package kr.co.tadadang.user
+
+import android.animation.Animator
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.pm.PackageManager
+import android.content.res.Configuration
+import android.graphics.Color
+import android.net.Uri
+import android.os.Build
+import android.os.Bundle
+import android.provider.MediaStore
+import android.view.Gravity
+import android.view.View
+import android.view.WindowManager
+import android.webkit.CookieManager
+import android.webkit.JavascriptInterface
+import android.webkit.ValueCallback
+import android.webkit.WebChromeClient
+import android.webkit.WebResourceError
+import android.webkit.WebResourceRequest
+import android.webkit.WebSettings
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import android.widget.Toast
+import androidx.activity.ComponentActivity
+import androidx.activity.OnBackPressedCallback
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.core.content.ContextCompat
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import kr.co.tadadang.user.native_bridge.ExitAppVCDelegate
+import kr.co.tadadang.user.native_bridge.HideIntroVCDelegate
+import kr.co.tadadang.user.sms.SmsRetrieverInterface
+import kr.co.tadadang.user.util.AnimationUtil
+
+
+class MainActivity : ComponentActivity(), HideIntroVCDelegate, ExitAppVCDelegate {
+
+    private lateinit var mContext: Context
+    private lateinit var mActivity: MainActivity
+    private lateinit var mWebView: WebView
+
+    private val mCookieManager by lazy { CookieManager.getInstance() }
+
+    private var mToast: Toast? = null
+
+    var mOriUserAgent: String = ""
+
+    private var uploadMessage: ValueCallback<Array<Uri>>? = null
+    val resultLauncher =
+        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
+            if (it.resultCode == RESULT_OK) {
+                var results: Array<Uri>? =
+                    WebChromeClient.FileChooserParams.parseResult(it.resultCode, it.data)
+
+                if (results != null) {
+                    uploadMessage?.onReceiveValue(results)
+                } else {
+                    val uris = ArrayList<Uri>()
+                    if (intent != null) {
+                        val clipData = intent.clipData!!
+                        if (clipData.itemCount > 0) {
+                            var i = 0
+                            val size = clipData.itemCount
+                            while (i < size) {
+                                val uri = clipData.getItemAt(i).uri
+                                uris.add(uri)
+                                i++
+                            }
+                            results = uris.toTypedArray()
+                        }
+                    }
+                    if (results != null) {
+                        uploadMessage?.onReceiveValue(results)
+                    } else {
+                        uploadMessage?.onReceiveValue(null)
+                    }
+                }
+            }
+        }
+
+    @SuppressLint("SetJavaScriptEnabled")
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_main)
+
+        mContext = this
+        mActivity = this
+        mWebView = findViewById(R.id.webview)
+
+        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
+
+        setCookieAllow(mWebView)
+
+        val webSettings = mWebView.settings
+        webSettings.javaScriptEnabled = true
+        webSettings.allowContentAccess = true
+        webSettings.allowFileAccess = true
+        webSettings.allowFileAccessFromFileURLs = true
+        webSettings.allowUniversalAccessFromFileURLs = true
+        webSettings.builtInZoomControls = false
+        webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH)
+        webSettings.domStorageEnabled = true
+        webSettings.textZoom = 100
+        webSettings.cacheMode = WebSettings.LOAD_NO_CACHE
+        webSettings.setSupportMultipleWindows(true)
+        webSettings.javaScriptCanOpenWindowsAutomatically = true
+
+        var versionCode = 0
+        var versionName = ""
+        try {
+            val pInfo = this.packageManager.getPackageInfo(packageName, 0)
+            versionCode = pInfo.versionCode
+            versionName = pInfo.versionName
+        } catch (e: PackageManager.NameNotFoundException) {
+        }
+        mOriUserAgent = webSettings.userAgentString
+        var newUserAgent = mOriUserAgent
+        newUserAgent += ",type:admin"
+        var isDarkMode = false
+        try {
+            val darkModeCheck =
+                mContext.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
+            if (darkModeCheck == Configuration.UI_MODE_NIGHT_YES) {
+                isDarkMode = true
+            }
+        } catch (_: Exception) {
+        }
+        newUserAgent += ",theme:${if (isDarkMode) "dark" else "light"}"
+        newUserAgent += ",os:aos"
+        newUserAgent += ",vercode:$versionCode"
+        newUserAgent += ",vername:$versionName"
+        newUserAgent += ",osver:" + Build.VERSION.SDK_INT
+        newUserAgent += ",:end:"
+        webSettings.userAgentString = newUserAgent
+
+        mWebView.webChromeClient = object : WebChromeClient() {
+            override fun onShowFileChooser(
+                webView: WebView?,
+                filePathCallback: ValueCallback<Array<Uri>>?,
+                fileChooserParams: FileChooserParams?
+            ): Boolean {
+                try {
+                    if (fileChooserParams != null) {
+                        uploadMessage?.onReceiveValue(null)
+                        uploadMessage = null
+
+                        uploadMessage = filePathCallback
+
+                        val isMultiSelect =
+                            fileChooserParams.mode == FileChooserParams.MODE_OPEN_MULTIPLE
+                        if (fileChooserParams.acceptTypes.indexOf(".png") != -1 || fileChooserParams.acceptTypes.indexOf(
+                                "image/*"
+                            ) != -1
+                        ) {
+                            // 이미지 선택기
+                            val galleryIntent = Intent(Intent.ACTION_PICK)
+                            galleryIntent.type = "image/*"
+                            if (isMultiSelect) {
+                                galleryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
+                            }
+                            val intent = Intent.createChooser(galleryIntent, "")
+                            resultLauncher.launch(intent)
+
+                        } else if (fileChooserParams.acceptTypes.indexOf(".avi") != -1 || fileChooserParams.acceptTypes.indexOf(
+                                "video/*"
+                            ) != -1
+                        ) {
+                            // 비디오 선택기
+                            val videoIntent = Intent(
+                                Intent.ACTION_PICK,
+                                MediaStore.Video.Media.EXTERNAL_CONTENT_URI
+                            )
+                            videoIntent.type = "video/*"
+                            if (isMultiSelect) {
+                                videoIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
+                            }
+                            resultLauncher.launch(videoIntent)
+
+                        } else {
+                            // 파일 선택기
+                            val galleryIntent = Intent(Intent.ACTION_PICK)
+                            galleryIntent.type = "video/*, image/*"
+                            if (isMultiSelect) {
+                                galleryIntent.putExtra(
+                                    Intent.EXTRA_ALLOW_MULTIPLE,
+                                    true
+                                )
+                            }
+                            resultLauncher.launch(galleryIntent)
+                        }
+
+                        return true
+                    }
+                } catch (e: Exception) {
+                    uploadMessage = null
+                    e.printStackTrace()
+                }
+                return false
+            }
+        }
+        mWebView.webViewClient = object : WebViewClient() {
+            // 페이지 오류 처리
+            override fun onReceivedError(
+                view: WebView?,
+                request: WebResourceRequest?,
+                error: WebResourceError?
+            ) {
+                showErrorPage(request?.url)
+                super.onReceivedError(view, request, error)
+            }
+
+            override fun onReceivedError(
+                view: WebView?,
+                errorCode: Int,
+                description: String?,
+                failingUrl: String?
+            ) {
+                showErrorPage(Uri.parse(failingUrl))
+                super.onReceivedError(view, errorCode, description, failingUrl)
+            }
+
+            override fun onPageFinished(view: WebView?, url: String?) {
+                CookieManager.getInstance().flush()
+
+                pageFinishedAction(Uri.parse(url))
+                super.onPageFinished(view, url)
+            }
+
+            // 브릿지 처리
+            override fun shouldOverrideUrlLoading(
+                view: WebView?,
+                request: WebResourceRequest?
+            ): Boolean {
+                if (checkUrl(view, request?.url)) {
+                    return true
+                }
+
+                return super.shouldOverrideUrlLoading(view, request)
+            }
+
+            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
+                if (checkUrl(view, Uri.parse(url))) {
+                    return true
+                }
+                return super.shouldOverrideUrlLoading(view, url)
+            }
+        }
+
+        mWebView.setDownloadListener { url, userAgent, contentDisposition, mimeType, contentLength ->
+            val intent = Intent(Intent.ACTION_VIEW)
+            intent.data = Uri.parse(url)
+            startActivity(intent)
+        }
+
+        mCookieManager.acceptCookie()
+        mCookieManager.acceptThirdPartyCookies(mWebView)
+
+        mWebView.addJavascriptInterface(WebAppInterface(), "Android")
+        mWebView.addJavascriptInterface(SmsRetrieverInterface(this, mWebView), "SmsRetriever")
+        mWebView.loadUrl(Const.PAGE_URL)
+
+        val window = window
+        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
+        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
+        window.statusBarColor = Color.parseColor("#0B192F") // 원하는 색상 설정
+        window.decorView.systemUiVisibility = 0 // 기본 상태(어두운 배경에 밝은 글자)
+
+        askNotificationPermission()
+    }
+
+    // Declare the launcher at the top of your Activity/Fragment:
+    private val requestPermissionLauncher = registerForActivityResult(
+        ActivityResultContracts.RequestPermission(),
+    ) { isGranted: Boolean ->
+        if (isGranted) {
+            // FCM SDK (and your app) can post notifications.
+        } else {
+            // TODO: Inform user that that your app will not show notifications.
+        }
+    }
+
+    private fun askNotificationPermission() {
+        // This is only necessary for API level >= 33 (TIRAMISU)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            if (ContextCompat.checkSelfPermission(
+                    this,
+                    android.Manifest.permission.POST_NOTIFICATIONS
+                ) ==
+                PackageManager.PERMISSION_GRANTED
+            ) {
+                // FCM SDK (and your app) can post notifications.
+            } else if (shouldShowRequestPermissionRationale(android.Manifest.permission.POST_NOTIFICATIONS)) {
+                // TODO: display an educational UI explaining to the user the features that will be enabled
+                //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
+                //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
+                //       If the user selects "No thanks," allow the user to continue without notifications.
+            } else {
+                // Directly ask for the permission
+                requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
+            }
+        }
+    }
+    @JavascriptInterface
+    fun copyToClipboard(text: String?) {
+        val clipboard: ClipboardManager =
+            mContext.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
+        val clip = ClipData.newPlainText("Copied Text", text)
+        clipboard.setPrimaryClip(clip)
+
+        // 사용자에게 피드백 제공 (Toast 메시지)
+        //Toast.makeText(mContext, "클립보드에 복사되었습니다!", Toast.LENGTH_SHORT).show()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        onBackground()
+    }
+
+    override fun onPause() {
+        super.onPause()
+        try {
+            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
+        } catch (e: NullPointerException) {
+        }
+        LocalBroadcastManager.getInstance(this).unregisterReceiver(smsReceiver)
+        onBackground()
+    }
+
+    private fun setCookieAllow(webView: WebView) {
+        try {
+            val cookieManager = CookieManager.getInstance()
+            cookieManager.setAcceptCookie(true)
+            webView.settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
+            cookieManager.setAcceptThirdPartyCookies(webView, true)
+        } catch (_: Exception) {
+        }
+    }
+
+    // 페이지 접속 에러 처리
+    fun showErrorPage(uri: Uri?) {
+        if (uri != null && (uri.toString().endsWith("favicon.ico") || uri.toString()
+                .indexOf("sockjs-node") != -1)
+        ) {
+            return
+        }
+        // 에러 처리 부분
+    }
+
+    // 페이지 로드 완료 처리
+    fun pageFinishedAction(uri: Uri?) {
+        // 로드 완료 처리 부분
+    }
+
+    // 링크 주소 인젝션 처리
+    fun checkUrl(webview: WebView?, uri: Uri?): Boolean {
+        // 링크 주소 중간에 가로채기 관련 별도 처리 추가
+        if (uri != null) {
+            if (!uri.toString().startsWith(Const.PAGE_URL)) {
+                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(uri.toString()))
+                startActivity(intent)
+                return true
+            }
+        }
+        return false
+    }
+
+    override fun onBackPressed() {
+        val currentUrl = mWebView.url
+        if (currentUrl != null && (currentUrl.contains("dashboard") || currentUrl.contains("chatlist") || currentUrl.contains("login") || currentUrl.contains("feed") )) {
+            exitAppAction()
+        }else
+        {
+            mWebView.loadUrl("javascript:appBackAction()")
+        }
+
+        //onBackAction()
+//        if (mWebView.canGoBack()) {
+//            // 웹뷰가 뒤로 갈 수 있는 경우
+//            val currentUrl = mWebView.url
+//            if (currentUrl != null && (currentUrl.contains("dashboard") || currentUrl.contains("feed") || currentUrl.contains("chatlist"))) {
+//
+//            }else {
+//                mWebView.loadUrl("javascript:appBackAction()");
+//            }
+//        } else {
+//
+//        }
+        //mWebView.loadUrl("javascript:appBackAction()");
+    }
+
+    private val onBackPressedCallback: OnBackPressedCallback =
+        object : OnBackPressedCallback(true) {
+            override fun handleOnBackPressed() {
+                //onBackAction()
+                this.isEnabled = false
+                onBackPressedDispatcher.onBackPressed()
+            }
+        }
+
+    // 뒤로가기 버튼 처리
+    var back = 0L
+//    private fun onBackAction() {
+//        val layIntro = findViewById<View>(R.id.lay_intro)
+//        if (layIntro.visibility == View.VISIBLE) {
+//            if (System.currentTimeMillis() > back + 2000) {
+//                back = System.currentTimeMillis()
+//                showCenterToast(R.string.backkey_finish)
+//            } else {
+//                hideCenterToast()
+//                finish()
+//            }
+//            return
+//        } else {
+//            mWebView.loadUrl("javascript:appBackAction()")
+//            return
+//        }
+//    }
+
+    private fun onBackground() {
+        mWebView.loadUrl("javascript:appBackground()")
+    }
+
+    private fun onForeground() {
+        mWebView.loadUrl("javascript:appForeground()")
+    }
+
+    inner class WebAppInterface
+    internal constructor() {
+        @JavascriptInterface
+        fun nativeBridge(cmd: String?, data: String?, callback: String?) {
+            if (cmd != null) {
+                for (bridgeItem in Const.APP_BRIDGE_LIST) {
+                    if (bridgeItem.cmd.equals(cmd, true)) {
+                        bridgeItem.startAction(mActivity, mWebView, data, callback)
+                    }
+                }
+            }
+        }
+    }
+
+    private fun showCenterToast(msgRes: Int, duration: Int = Toast.LENGTH_LONG) {
+        hideCenterToast()
+        runOnUiThread {
+            mToast = Toast.makeText(mContext, msgRes, duration)
+            mToast!!.setGravity(Gravity.CENTER, 0, 0)
+            mToast!!.show()
+        }
+    }
+
+    private fun hideCenterToast() {
+        runOnUiThread {
+            if (mToast != null) {
+                mToast!!.cancel()
+                mToast = null
+            }
+        }
+    }
+
+    override fun hideIntroAction() {
+        val layIntro = findViewById<View>(R.id.lay_intro)
+        if (layIntro.visibility == View.VISIBLE) {
+            val ani = AnimationUtil.getAlpha(layIntro, 350, 1f, 0f)
+            if (ani != null) {
+                ani.addListener(object : Animator.AnimatorListener {
+                    override fun onAnimationStart(animation: Animator) {
+                    }
+
+                    override fun onAnimationEnd(animation: Animator) {
+                        layIntro.visibility = View.GONE
+                    }
+
+                    override fun onAnimationCancel(animation: Animator) {
+                        layIntro.visibility = View.GONE
+                    }
+
+                    override fun onAnimationRepeat(animation: Animator) {
+                    }
+                })
+                ani.start()
+            } else {
+                layIntro.visibility = View.GONE
+            }
+        }
+    }
+
+    override fun exitAppAction() {
+        if (System.currentTimeMillis() > back + 2000) {
+            back = System.currentTimeMillis()
+            showCenterToast(R.string.backkey_finish)
+        } else {
+            hideCenterToast()
+            finish()
+        }
+    }
+
+    companion object {
+        private const val TAG = "MainActivity"
+    }
+
+    override fun onResume() {
+        super.onResume()
+        LocalBroadcastManager.getInstance(this)
+            .registerReceiver(smsReceiver, IntentFilter("SMS_CODE_RECEIVED"))
+        onForeground()
+    }
+
+    private val smsReceiver = object : BroadcastReceiver() {
+        override fun onReceive(context: Context?, intent: Intent?) {
+            val smsCode = intent?.getStringExtra("smsCode")
+            smsCode?.let {
+                val smsRetrieverInterface = SmsRetrieverInterface(this@MainActivity, mWebView)
+                smsRetrieverInterface.onSmsReceived(it)
+            }
+        }
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/native_bridge/ExitApp.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/native_bridge/ExitApp.kt
@@ -0,0 +1,20 @@
+package kr.co.tadadang.user.native_bridge
+
+import android.app.Activity
+import android.webkit.WebView
+
+interface ExitAppVCDelegate {
+    fun exitAppAction()
+}
+class ExitApp: _BaseBridge {
+    override val cmd: String
+        get() = "exitApp"
+
+    override fun startAction(activity: Activity?, webView: WebView?, data: String?, callback: String?) {
+        if(activity != null && activity is ExitAppVCDelegate && webView != null) {
+            activity.runOnUiThread {
+                activity.exitAppAction()
+            }
+        }
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/native_bridge/FcmSubscribe.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/native_bridge/FcmSubscribe.kt
@@ -0,0 +1,36 @@
+package kr.co.tadadang.user.native_bridge
+
+import android.app.Activity
+import android.webkit.WebView
+import com.google.firebase.ktx.Firebase
+import com.google.firebase.messaging.ktx.messaging
+import kr.co.tadadang.user.R
+
+class FcmSubscribe : _BaseBridge {
+
+    override val cmd: String
+        get() = "fcmSubscribe"
+
+    override fun startAction(
+        activity: Activity?,
+        webView: WebView?,
+        data: String?,
+        callback: String?
+    ) {
+        if (activity == null || data == null || callback == null) return
+
+        when (data) {
+            "noti" -> handleSubscription(activity, callback, R.string.topic_noti)
+            "marketing" -> handleSubscription(activity, callback, R.string.topic_marketing)
+        }
+    }
+
+    private fun handleSubscription(activity: Activity, callback: String, topicResId: Int) {
+        val topic = activity.getString(topicResId)
+        if (callback == "true") {
+            Firebase.messaging.subscribeToTopic(topic)
+        } else {
+            Firebase.messaging.unsubscribeFromTopic(topic)
+        }
+    }
+}
 
app/src/main/java/kr/co/tadadang/user/native_bridge/GetPushToken.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/native_bridge/GetPushToken.kt
@@ -0,0 +1,96 @@
+package kr.co.tadadang.user.native_bridge
+
+import android.app.Activity
+import android.webkit.WebView
+import com.google.firebase.messaging.FirebaseMessaging
+import kr.co.tadadang.user.Const
+import okhttp3.OkHttpClient
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import retrofit2.http.Body
+import retrofit2.http.Headers
+import retrofit2.http.PUT
+
+class GetPushToken : _BaseBridge {
+    override val cmd: String
+        get() = "getPushToken"
+
+    override fun startAction(
+        activity: Activity?,
+        webView: WebView?,
+        data: String?,
+        callback: String?
+    ) {
+        /*
+                if (callback != null) {
+                    FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
+                        if (activity != null && webView != null) {
+                            activity.runOnUiThread {
+                                if (!task.isSuccessful) {
+                                    webView.loadUrl("javascript:${callback}('');")
+                                } else {
+                                    val token = task.result
+                                    webView.loadUrl("javascript:${callback}('${token}');")
+                                }
+                            }
+                        }
+                    })
+                }
+        */
+
+        if (!data.isNullOrEmpty() && !callback.isNullOrEmpty())
+            pushToken(data, callback.replace("getPushToken_CALLBACK_", ""))
+    }
+
+    // push token
+    private fun pushToken(auth: String, callback: String) {
+        FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
+            if (task.isSuccessful) {
+                val token = task.result
+                sendTokenToServer(auth, token, callback)
+            }
+        }
+    }
+
+    private fun sendTokenToServer(auth: String, token: String, callback: String) {
+        val client = OkHttpClient.Builder().addInterceptor { chain ->
+            val original = chain.request()
+            val requestBuilder = original.newBuilder()
+                .header("Authorization", "Bearer $auth")
+                .header("req-uuid", callback)
+                .method(original.method(), original.body())
+            val request = requestBuilder.build()
+            chain.proceed(request)
+        }.build()
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(Const.PAGE_URL + "/api/")
+            .client(client)
+            .addConverterFactory(GsonConverterFactory.create())
+            .build()
+
+        val apiService = retrofit.create(ApiService::class.java)
+        val tokenRequest = TokenRequest(token, "android")
+
+        apiService.sendToken(tokenRequest).enqueue(object : Callback<Void> {
+            override fun onResponse(call: Call<Void>, response: retrofit2.Response<Void>) {
+                if (response.isSuccessful) {
+                }
+            }
+
+            override fun onFailure(call: Call<Void>, t: Throwable) {
+            }
+        })
+    }
+
+    data class TokenRequest(val token: String, val os: String)
+
+    interface ApiService {
+        @Headers("api-path: adm/push")
+        @PUT(".")
+        fun sendToken(@Body request: TokenRequest): Call<Void>
+    }
+    //
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/native_bridge/HideIntro.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/native_bridge/HideIntro.kt
@@ -0,0 +1,21 @@
+package kr.co.tadadang.user.native_bridge
+
+import android.app.Activity
+import android.webkit.WebView
+
+interface HideIntroVCDelegate {
+    fun hideIntroAction()
+}
+
+class HideIntro: _BaseBridge {
+    override val cmd: String
+        get() = "hideIntro"
+
+    override fun startAction(activity: Activity?, webView: WebView?, data: String?, callback: String?) {
+        if(activity != null && activity is HideIntroVCDelegate && webView != null) {
+            activity.runOnUiThread {
+                activity.hideIntroAction()
+            }
+        }
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/native_bridge/_BaseBridge.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/native_bridge/_BaseBridge.kt
@@ -0,0 +1,10 @@
+package kr.co.tadadang.user.native_bridge
+
+import android.app.Activity
+import android.webkit.WebView
+
+interface _BaseBridge {
+    val cmd: String
+
+    fun startAction(activity: Activity?, webView: WebView?, data: String?, callback: String?)
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/sms/SmsRetrieverInterface.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/sms/SmsRetrieverInterface.kt
@@ -0,0 +1,28 @@
+package kr.co.tadadang.user.sms
+
+import android.content.Context
+import android.util.Log
+import android.webkit.JavascriptInterface
+import android.webkit.WebView
+import com.google.android.gms.auth.api.phone.SmsRetriever
+
+class SmsRetrieverInterface(private val context: Context, private val webView: WebView) {
+    @JavascriptInterface
+    fun startSmsRetriever() {
+        val client = SmsRetriever.getClient(context)
+        val task = client.startSmsRetriever()
+        task.addOnSuccessListener {
+            Log.d("song", "SMS Retriever API 시작 성공")
+        }
+        task.addOnFailureListener { e ->
+            Log.d("song", "SMS Retriever API 시작 실패")
+        }
+    }
+
+    @JavascriptInterface
+    fun onSmsReceived(smsMessage: String) {
+        webView.post {
+            webView.evaluateJavascript("onSmsReceived('$smsMessage')", null)
+        }
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/sms/SmsRetrieverReceiver.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/sms/SmsRetrieverReceiver.kt
@@ -0,0 +1,39 @@
+package kr.co.tadadang.user.sms
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.util.Log
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import com.google.android.gms.auth.api.phone.SmsRetriever
+import com.google.android.gms.common.api.CommonStatusCodes
+import com.google.android.gms.common.api.Status
+
+class SmsRetrieverReceiver : BroadcastReceiver() {
+    override fun onReceive(context: Context?, intent: Intent?) {
+        if (SmsRetriever.SMS_RETRIEVED_ACTION == intent?.action) {
+            val extras = intent.extras
+            val status = extras?.get(SmsRetriever.EXTRA_STATUS) as Status
+
+            when (status.statusCode) {
+                CommonStatusCodes.SUCCESS -> {
+                    val message = extras.get(SmsRetriever.EXTRA_SMS_MESSAGE) as String
+                    val smsCode = parseSmsCode(message)
+                    val localIntent = Intent("SMS_CODE_RECEIVED")
+                    localIntent.putExtra("smsCode", smsCode)
+                    LocalBroadcastManager.getInstance(context!!).sendBroadcast(localIntent)
+                }
+
+                CommonStatusCodes.TIMEOUT -> {
+                    Log.d("song", "CommonStatusCodes TIMEOUT")
+                }
+            }
+        }
+    }
+
+    private fun parseSmsCode(message: String): String {
+        val pattern = "\\d{4}".toRegex()
+        val matchResult = pattern.find(message)
+        return matchResult?.value ?: ""
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/ui/theme/Color.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/ui/theme/Color.kt
@@ -0,0 +1,11 @@
+package kr.co.tadadang.user.ui.theme
+
+import androidx.compose.ui.graphics.Color
+
+val Purple80 = Color(0xFFD0BCFF)
+val PurpleGrey80 = Color(0xFFCCC2DC)
+val Pink80 = Color(0xFFEFB8C8)
+
+val Purple40 = Color(0xFF6650a4)
+val PurpleGrey40 = Color(0xFF625b71)
+val Pink40 = Color(0xFF7D5260)(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/ui/theme/Theme.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/ui/theme/Theme.kt
@@ -0,0 +1,70 @@
+package kr.co.tadadang.user.ui.theme
+
+import android.app.Activity
+import android.os.Build
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.dynamicDarkColorScheme
+import androidx.compose.material3.dynamicLightColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalView
+import androidx.core.view.WindowCompat
+
+private val DarkColorScheme = darkColorScheme(
+    primary = Purple80,
+    secondary = PurpleGrey80,
+    tertiary = Pink80
+)
+
+private val LightColorScheme = lightColorScheme(
+    primary = Purple40,
+    secondary = PurpleGrey40,
+    tertiary = Pink40
+
+    /* Other default colors to override
+    background = Color(0xFFFFFBFE),
+    surface = Color(0xFFFFFBFE),
+    onPrimary = Color.White,
+    onSecondary = Color.White,
+    onTertiary = Color.White,
+    onBackground = Color(0xFF1C1B1F),
+    onSurface = Color(0xFF1C1B1F),
+    */
+)
+
+@Composable
+fun DAISSUEAdminTheme(
+    darkTheme: Boolean = isSystemInDarkTheme(),
+    // Dynamic color is available on Android 12+
+    dynamicColor: Boolean = true,
+    content: @Composable () -> Unit
+) {
+    val colorScheme = when {
+        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
+            val context = LocalContext.current
+            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
+        }
+
+        darkTheme -> DarkColorScheme
+        else -> LightColorScheme
+    }
+    val view = LocalView.current
+    if (!view.isInEditMode) {
+        SideEffect {
+            val window = (view.context as Activity).window
+            window.statusBarColor = colorScheme.primary.toArgb()
+            WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
+        }
+    }
+
+    MaterialTheme(
+        colorScheme = colorScheme,
+        typography = Typography,
+        content = content
+    )
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/ui/theme/Type.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/ui/theme/Type.kt
@@ -0,0 +1,34 @@
+package kr.co.tadadang.user.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,
+        lineHeight = 24.sp,
+        letterSpacing = 0.5.sp
+    )
+    /* Other default text styles to override
+    titleLarge = TextStyle(
+        fontFamily = FontFamily.Default,
+        fontWeight = FontWeight.Normal,
+        fontSize = 22.sp,
+        lineHeight = 28.sp,
+        letterSpacing = 0.sp
+    ),
+    labelSmall = TextStyle(
+        fontFamily = FontFamily.Default,
+        fontWeight = FontWeight.Medium,
+        fontSize = 11.sp,
+        lineHeight = 16.sp,
+        letterSpacing = 0.5.sp
+    )
+    */
+)(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/util/AnimationUtil.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/util/AnimationUtil.kt
@@ -0,0 +1,152 @@
+package kr.co.tadadang.user.util
+
+import android.animation.ObjectAnimator
+import android.view.View
+import android.view.animation.DecelerateInterpolator
+
+object AnimationUtil {
+    fun getTranslationX(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "translationX", *values)
+            ret!!.interpolator = DecelerateInterpolator()
+            ret.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getTranslationY(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "translationY", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getRotation(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "rotation", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getRotationX(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "rotationX", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getRotationY(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "rotationY", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getScaleX(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "scaleX", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getScaleY(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "scaleY", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getPivotX(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "pivotX", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getPivotY(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "pivotY", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getAlpha(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "alpha", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getMoveX(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "x", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+
+    fun getMoveY(v: View, duration: Long, vararg values: Float): ObjectAnimator? {
+        var ret: ObjectAnimator? = null
+        try {
+            ret = ObjectAnimator.ofFloat(v, "y", *values)
+            ret!!.duration = duration
+        } catch (e: Exception) {
+            ret = null
+        }
+
+        return ret
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/java/kr/co/tadadang/user/util/AppSignatureHelper.kt (added)
+++ app/src/main/java/kr/co/tadadang/user/util/AppSignatureHelper.kt
@@ -0,0 +1,69 @@
+package kr.co.tadadang.user.util
+
+import android.content.Context
+import android.content.ContextWrapper
+import android.content.pm.PackageManager
+import android.os.Build
+import android.util.Base64
+import android.util.Log
+import java.nio.charset.StandardCharsets
+import java.security.MessageDigest
+import java.security.NoSuchAlgorithmException
+import java.util.Arrays
+
+class AppSignatureHelper(context: Context) : ContextWrapper(context) {
+    val TAG = AppSignatureHelper::class.java.simpleName
+    private val HASH_TYPE = "SHA-256"
+    val NUM_HASHED_BYTES = 9
+    val NUM_BASE64_CHAR = 11
+
+    init {
+        getAppSignatures()
+    }
+
+    fun getAppSignatures(): ArrayList<String>? {
+        val appCodes = ArrayList<String>()
+        try {
+            val packageName = packageName
+            val packageManager = packageManager
+            val signatures: Array<out android.content.pm.Signature>? =
+                packageManager.getPackageInfo(
+                    packageName,
+                    PackageManager.GET_SIGNATURES
+                ).signatures
+
+            if (signatures != null) {
+                for (signature in signatures) {
+                    val hash = hash(packageName, signature.toCharsString())
+                    if (hash != null) {
+                        appCodes.add(String.format("%s", hash))
+                    }
+                    Log.e(TAG, "Hash $hash")
+                }
+            }
+        } catch (e: PackageManager.NameNotFoundException) {
+            Log.e(TAG, e.toString())
+        }
+        return appCodes
+    }
+
+    private fun hash(packageName: String, signature: String): String? {
+        val appInfo = "$packageName $signature"
+        try {
+            val messageDigest = MessageDigest.getInstance(HASH_TYPE)
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                messageDigest.update(appInfo.toByteArray(StandardCharsets.UTF_8))
+            }
+            var hashSignature = messageDigest.digest()
+
+            hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES)
+            var base64Hash: String =
+                Base64.encodeToString(hashSignature, Base64.NO_PADDING or Base64.NO_WRAP)
+            base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR)
+            return base64Hash
+        } catch (e: NoSuchAlgorithmException) {
+            Log.e(TAG, e.toString())
+        }
+        return null
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/drawable-night-xxhdpi/ic_intro_bottom.png (Binary) (added)
+++ app/src/main/res/drawable-night-xxhdpi/ic_intro_bottom.png
Binary file is not shown
 
app/src/main/res/drawable-xxhdpi/ic_intro_bottom.png (Binary) (added)
+++ app/src/main/res/drawable-xxhdpi/ic_intro_bottom.png
Binary file is not shown
 
app/src/main/res/drawable-xxhdpi/ic_intro_center.png (Binary) (added)
+++ app/src/main/res/drawable-xxhdpi/ic_intro_center.png
Binary file is not shown
 
app/src/main/res/drawable/ic_launcher.png (Binary) (added)
+++ app/src/main/res/drawable/ic_launcher.png
Binary file is not shown
 
app/src/main/res/drawable/ic_launcher_foreground.xml (added)
+++ app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,133 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="98"
+    android:viewportHeight="39">
+  <group android:scaleX="0.46"
+      android:scaleY="0.18306123"
+      android:translateX="26.46"
+      android:translateY="15.930306">
+    <path
+        android:pathData="M23.732,9.775L5.369,4.995L3.015,4.406C1.708,4.079 0.452,5.095 0.498,6.442L1.519,36.099C1.557,37.202 2.472,38.072 3.576,38.056L31.565,37.627C32.154,37.618 32.71,37.354 33.088,36.902L34.932,34.701C35.73,33.747 37.191,33.731 38.01,34.667L39.515,36.387C39.93,36.862 40.544,37.116 41.174,37.074L68.109,35.29C68.505,35.264 68.896,35.356 69.248,35.538C76.774,39.426 90.608,38.977 94.243,34.245C96.609,31.166 95.129,28.653 93.452,27.246C92.754,26.66 92.307,25.768 92.498,24.876L92.679,24.033C92.843,23.268 93.518,22.722 94.3,22.722C95.15,22.722 95.862,22.079 95.949,21.234L96.71,13.823C96.825,12.703 96.005,11.704 94.884,11.599L93.464,11.465C92.541,11.378 91.796,10.677 91.652,9.762L90.876,4.831C90.687,3.63 89.49,2.865 88.32,3.197L65.205,9.763C65.025,9.814 64.839,9.84 64.651,9.84H24.243C24.07,9.84 23.899,9.818 23.732,9.775Z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M24.125,7.811L5.762,3.031L3.408,2.442C2.101,2.116 0.845,3.132 0.891,4.478L1.912,34.135C1.95,35.239 2.864,36.109 3.968,36.092L31.958,35.664C32.547,35.655 33.102,35.39 33.48,34.938L35.324,32.737C36.123,31.783 37.584,31.768 38.403,32.704L39.907,34.423C40.323,34.898 40.936,35.152 41.566,35.11L68.502,33.326C68.897,33.3 69.288,33.392 69.641,33.574C77.167,37.462 91,37.013 94.635,32.281C97.001,29.202 95.521,26.689 93.845,25.282C93.146,24.696 92.7,23.804 92.891,22.912L93.072,22.069C93.235,21.304 93.911,20.758 94.693,20.758C95.543,20.758 96.255,20.115 96.342,19.27L97.103,11.86C97.218,10.74 96.398,9.74 95.277,9.635L93.856,9.501C92.934,9.414 92.188,8.714 92.044,7.799L91.268,2.868C91.079,1.666 89.882,0.901 88.713,1.233L65.598,7.799C65.418,7.85 65.231,7.876 65.044,7.876H24.635C24.463,7.876 24.292,7.854 24.125,7.811Z"
+        android:fillColor="#001534"/>
+    <path
+        android:pathData="M90.868,2.931C90.717,1.97 89.759,1.357 88.823,1.623L65.709,8.189C65.492,8.251 65.269,8.282 65.044,8.282H24.635C24.429,8.282 24.223,8.256 24.023,8.203L5.664,3.424L3.31,2.836C2.264,2.574 1.259,3.387 1.296,4.464L2.317,34.121C2.347,35.004 3.079,35.7 3.962,35.687L31.952,35.258C32.423,35.251 32.867,35.04 33.17,34.678L35.014,32.477C35.972,31.333 37.725,31.314 38.708,32.437L40.212,34.156C40.545,34.536 41.036,34.74 41.54,34.706L68.475,32.922C68.952,32.89 69.416,33.002 69.827,33.214C73.509,35.116 78.773,35.971 83.579,35.755C85.978,35.648 88.244,35.274 90.126,34.642C92.015,34.008 93.475,33.127 94.314,32.034C95.433,30.578 95.614,29.303 95.362,28.249C95.105,27.174 94.383,26.264 93.585,25.593C92.809,24.943 92.263,23.909 92.495,22.828L92.675,21.984C92.879,21.033 93.72,20.353 94.693,20.353C95.335,20.353 95.873,19.868 95.939,19.229L96.7,11.818C96.792,10.922 96.136,10.123 95.239,10.039L93.818,9.905C92.712,9.801 91.817,8.96 91.644,7.862L90.868,2.931ZM88.602,0.843C90.006,0.445 91.442,1.363 91.669,2.805L92.445,7.736C92.56,8.468 93.157,9.028 93.894,9.098L95.315,9.232C96.66,9.358 97.644,10.557 97.506,11.901L96.745,19.312C96.637,20.364 95.751,21.164 94.693,21.164C94.102,21.164 93.592,21.576 93.468,22.154L93.287,22.997C93.137,23.699 93.483,24.45 94.105,24.972C94.983,25.708 95.839,26.758 96.15,28.061C96.466,29.384 96.204,30.905 94.957,32.528C93.979,33.802 92.346,34.751 90.384,35.41C88.414,36.072 86.07,36.455 83.615,36.565C78.715,36.785 73.299,35.92 69.455,33.935C69.161,33.783 68.843,33.71 68.529,33.73L41.593,35.515C40.837,35.565 40.101,35.26 39.602,34.69L38.098,32.971C37.443,32.222 36.274,32.235 35.635,32.997L33.791,35.199C33.338,35.741 32.671,36.058 31.964,36.069L3.974,36.497C2.65,36.517 1.552,35.473 1.507,34.149L0.486,4.492C0.43,2.876 1.938,1.657 3.506,2.049L5.864,2.639L24.227,7.419C24.36,7.454 24.497,7.471 24.635,7.471H65.044C65.194,7.471 65.343,7.451 65.487,7.41L88.602,0.843Z"
+        android:fillColor="#ffffff"
+        android:fillType="evenOdd"/>
+    <path
+        android:pathData="M5.349,6.99L23.726,11.304V16.799L10.726,14.377V19.222L23.726,18.04V22.118H11.376V25.959L23.726,23.89L25.381,30.272L6.294,31.809L5.349,6.99Z"
+        android:fillColor="#00F500"/>
+    <path
+        android:pathData="M27.035,31.514L24.671,11.127H32.707L30.875,19.104L34.776,17.627L36.312,24.186L31.348,23.477L30.048,31.514H27.035Z"
+        android:fillColor="#00F500"/>
+    <path
+        android:pathData="M36.667,11.186H52.622L54.926,17.567H44.94V23.181L55.635,24.067V30.154L40.39,31.04L36.667,11.186Z"
+        android:fillColor="#00F500"/>
+    <path
+        android:pathData="M57.467,31.041L55.931,10.418H62.726L62.076,18.986L67.276,20.759L62.076,23.182L63.849,31.041H57.467Z"
+        android:fillColor="#00F500"/>
+    <path
+        android:pathData="M67.157,10.854L79.543,7.699L81.145,14.318L72.837,14.562L73.566,16.73H82.193L82.994,22.236H69.191L67.157,10.854Z"
+        android:fillColor="#00F500"/>
+    <path
+        android:pathData="M85.032,22.472L82.641,7.161L88.097,5.809L88.833,13.187L92.45,12.88L91.898,17.799H89.262V22.472H85.032Z"
+        android:fillColor="#00F500"/>
+    <path
+        android:pathData="M71.786,26.92C72.424,25.722 75.323,23.994 80.598,23.896C87.192,23.772 89.844,25.992 90.458,26.92C91.386,28.322 90.519,31.796 83.556,32.105C76.592,32.414 69.463,31.277 71.786,26.92ZM77.691,27.647C77.947,27.316 78.913,26.644 80.736,26.611C83.013,26.568 84.014,27.288 84.142,27.647C84.269,28.007 84.163,29.319 81.757,29.425C79.352,29.531 76.584,29.256 77.691,27.647Z"
+        android:fillColor="#F5A700"
+        android:fillType="evenOdd"/>
+    <path
+        android:pathData="M9.713,26.127H7.865V27.975H9.713V26.127Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M59.966,15.297H61.814V13.449H59.966V15.297Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M87.055,18.275H88.903V20.123H87.055V18.275Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M9.713,27.976H7.865V29.824H9.713V27.976Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M59.966,13.449H61.814V11.601H59.966V13.449Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M87.055,20.123H88.903V21.971H87.055V20.123Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M11.561,27.976H9.713V29.824H11.561V27.976Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M58.118,13.449H59.966V11.601H58.118V13.449Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M85.207,20.123H87.055V21.971H85.207V20.123Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M6.688,15.527H8.651V13.564H6.688V15.527Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M6.688,13.564H10.613V11.601H6.688V13.564Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M54.633,25.343H50.937V27.191H54.633V25.343Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M73.822,17.49H71.859V19.453H73.822V17.49Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M78.926,9.246H75V11.209H78.926V9.246Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M91.489,13.957H89.526V15.92H91.489V13.957Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M87.563,7.282H85.6V11.208H87.563V7.282Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M71.859,15.527H69.896V17.49H71.859V15.527Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M45.947,12.778H43.984V14.741H45.947V12.778Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M42.807,12.778H38.881V14.741H42.807V12.778Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M47.518,27.306H45.555V29.269H47.518V27.306Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M8.65,11.602H12.576V9.639H8.65V11.602Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M52.783,27.19H49.087V29.038H52.783V27.19Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M73.822,19.453H69.896V21.416H73.822V19.453Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M20.018,29.808H23.714V27.96H20.018V29.808Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M58.118,30.446H60.081V26.52H58.118V30.446Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M74.215,30.839H76.178V28.876H74.215V30.839Z"
+        android:fillColor="#B87D00"/>
+    <path
+        android:pathData="M83.244,26.521H85.207V24.558H83.244V26.521Z"
+        android:fillColor="#B87D00"/>
+    <path
+        android:pathData="M85.207,28.483H89.133V26.52H85.207V28.483Z"
+        android:fillColor="#B87D00"/>
+    <path
+        android:pathData="M27.103,13.957H31.028V11.994H27.103V13.957Z"
+        android:fillColor="#00D300"/>
+    <path
+        android:pathData="M29.065,15.919H31.028V13.956H29.065V15.919Z"
+        android:fillColor="#00D300"/>
+  </group>
+</vector>
 
app/src/main/res/drawable/icon.xml (added)
+++ app/src/main/res/drawable/icon.xml
@@ -0,0 +1,128 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="98dp"
+    android:height="39dp"
+    android:viewportWidth="98"
+    android:viewportHeight="39">
+  <path
+      android:pathData="M23.732,9.775L5.369,4.995L3.015,4.406C1.708,4.079 0.452,5.095 0.498,6.442L1.519,36.099C1.557,37.202 2.472,38.072 3.576,38.056L31.565,37.627C32.154,37.618 32.71,37.354 33.088,36.902L34.932,34.701C35.73,33.747 37.191,33.731 38.01,34.667L39.515,36.387C39.93,36.862 40.544,37.116 41.174,37.074L68.109,35.29C68.505,35.264 68.896,35.356 69.248,35.538C76.774,39.426 90.608,38.977 94.243,34.245C96.609,31.166 95.129,28.653 93.452,27.246C92.754,26.66 92.307,25.768 92.498,24.876L92.679,24.033C92.843,23.268 93.518,22.722 94.3,22.722C95.15,22.722 95.862,22.079 95.949,21.234L96.71,13.823C96.825,12.703 96.005,11.704 94.884,11.599L93.464,11.465C92.541,11.378 91.796,10.677 91.652,9.762L90.876,4.831C90.687,3.63 89.49,2.865 88.32,3.197L65.205,9.763C65.025,9.814 64.839,9.84 64.651,9.84H24.243C24.07,9.84 23.899,9.818 23.732,9.775Z"
+      android:fillColor="#000000"/>
+  <path
+      android:pathData="M24.125,7.811L5.762,3.031L3.408,2.442C2.101,2.116 0.845,3.132 0.891,4.478L1.912,34.135C1.95,35.239 2.864,36.109 3.968,36.092L31.958,35.664C32.547,35.655 33.102,35.39 33.48,34.938L35.324,32.737C36.123,31.783 37.584,31.768 38.403,32.704L39.907,34.423C40.323,34.898 40.936,35.152 41.566,35.11L68.502,33.326C68.897,33.3 69.288,33.392 69.641,33.574C77.167,37.462 91,37.013 94.635,32.281C97.001,29.202 95.521,26.689 93.845,25.282C93.146,24.696 92.7,23.804 92.891,22.912L93.072,22.069C93.235,21.304 93.911,20.758 94.693,20.758C95.543,20.758 96.255,20.115 96.342,19.27L97.103,11.86C97.218,10.74 96.398,9.74 95.277,9.635L93.856,9.501C92.934,9.414 92.188,8.714 92.044,7.799L91.268,2.868C91.079,1.666 89.882,0.901 88.713,1.233L65.598,7.799C65.418,7.85 65.231,7.876 65.044,7.876H24.635C24.463,7.876 24.292,7.854 24.125,7.811Z"
+      android:fillColor="#001534"/>
+  <path
+      android:pathData="M90.868,2.931C90.717,1.97 89.759,1.357 88.823,1.623L65.709,8.189C65.492,8.251 65.269,8.282 65.044,8.282H24.635C24.429,8.282 24.223,8.256 24.023,8.203L5.664,3.424L3.31,2.836C2.264,2.574 1.259,3.387 1.296,4.464L2.317,34.121C2.347,35.004 3.079,35.7 3.962,35.687L31.952,35.258C32.423,35.251 32.867,35.04 33.17,34.678L35.014,32.477C35.972,31.333 37.725,31.314 38.708,32.437L40.212,34.156C40.545,34.536 41.036,34.74 41.54,34.706L68.475,32.922C68.952,32.89 69.416,33.002 69.827,33.214C73.509,35.116 78.773,35.971 83.579,35.755C85.978,35.648 88.244,35.274 90.126,34.642C92.015,34.008 93.475,33.127 94.314,32.034C95.433,30.578 95.614,29.303 95.362,28.249C95.105,27.174 94.383,26.264 93.585,25.593C92.809,24.943 92.263,23.909 92.495,22.828L92.675,21.984C92.879,21.033 93.72,20.353 94.693,20.353C95.335,20.353 95.873,19.868 95.939,19.229L96.7,11.818C96.792,10.922 96.136,10.123 95.239,10.039L93.818,9.905C92.712,9.801 91.817,8.96 91.644,7.862L90.868,2.931ZM88.602,0.843C90.006,0.445 91.442,1.363 91.669,2.805L92.445,7.736C92.56,8.468 93.157,9.028 93.894,9.098L95.315,9.232C96.66,9.358 97.644,10.557 97.506,11.901L96.745,19.312C96.637,20.364 95.751,21.164 94.693,21.164C94.102,21.164 93.592,21.576 93.468,22.154L93.287,22.997C93.137,23.699 93.483,24.45 94.105,24.972C94.983,25.708 95.839,26.758 96.15,28.061C96.466,29.384 96.204,30.905 94.957,32.528C93.979,33.802 92.346,34.751 90.384,35.41C88.414,36.072 86.07,36.455 83.615,36.565C78.715,36.785 73.299,35.92 69.455,33.935C69.161,33.783 68.843,33.71 68.529,33.73L41.593,35.515C40.837,35.565 40.101,35.26 39.602,34.69L38.098,32.971C37.443,32.222 36.274,32.235 35.635,32.997L33.791,35.199C33.338,35.741 32.671,36.058 31.964,36.069L3.974,36.497C2.65,36.517 1.552,35.473 1.507,34.149L0.486,4.492C0.43,2.876 1.938,1.657 3.506,2.049L5.864,2.639L24.227,7.419C24.36,7.454 24.497,7.471 24.635,7.471H65.044C65.194,7.471 65.343,7.451 65.487,7.41L88.602,0.843Z"
+      android:fillColor="#ffffff"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M5.349,6.99L23.726,11.304V16.799L10.726,14.377V19.222L23.726,18.04V22.118H11.376V25.959L23.726,23.89L25.381,30.272L6.294,31.809L5.349,6.99Z"
+      android:fillColor="#00F500"/>
+  <path
+      android:pathData="M27.035,31.514L24.671,11.127H32.707L30.875,19.104L34.776,17.627L36.312,24.186L31.348,23.477L30.048,31.514H27.035Z"
+      android:fillColor="#00F500"/>
+  <path
+      android:pathData="M36.667,11.186H52.622L54.926,17.567H44.94V23.181L55.635,24.067V30.154L40.39,31.04L36.667,11.186Z"
+      android:fillColor="#00F500"/>
+  <path
+      android:pathData="M57.467,31.041L55.931,10.418H62.726L62.076,18.986L67.276,20.759L62.076,23.182L63.849,31.041H57.467Z"
+      android:fillColor="#00F500"/>
+  <path
+      android:pathData="M67.157,10.854L79.543,7.699L81.145,14.318L72.837,14.562L73.566,16.73H82.193L82.994,22.236H69.191L67.157,10.854Z"
+      android:fillColor="#00F500"/>
+  <path
+      android:pathData="M85.032,22.472L82.641,7.161L88.097,5.809L88.833,13.187L92.45,12.88L91.898,17.799H89.262V22.472H85.032Z"
+      android:fillColor="#00F500"/>
+  <path
+      android:pathData="M71.786,26.92C72.424,25.722 75.323,23.994 80.598,23.896C87.192,23.772 89.844,25.992 90.458,26.92C91.386,28.322 90.519,31.796 83.556,32.105C76.592,32.414 69.463,31.277 71.786,26.92ZM77.691,27.647C77.947,27.316 78.913,26.644 80.736,26.611C83.013,26.568 84.014,27.288 84.142,27.647C84.269,28.007 84.163,29.319 81.757,29.425C79.352,29.531 76.584,29.256 77.691,27.647Z"
+      android:fillColor="#F5A700"
+      android:fillType="evenOdd"/>
+  <path
+      android:pathData="M9.713,26.127H7.865V27.975H9.713V26.127Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M59.966,15.297H61.814V13.449H59.966V15.297Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M87.055,18.275H88.903V20.123H87.055V18.275Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M9.713,27.976H7.865V29.824H9.713V27.976Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M59.966,13.449H61.814V11.601H59.966V13.449Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M87.055,20.123H88.903V21.971H87.055V20.123Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M11.561,27.976H9.713V29.824H11.561V27.976Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M58.118,13.449H59.966V11.601H58.118V13.449Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M85.207,20.123H87.055V21.971H85.207V20.123Z"
+      android:fillColor="#ffffff"/>
+  <path
+      android:pathData="M6.688,15.527H8.651V13.564H6.688V15.527Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M6.688,13.564H10.613V11.601H6.688V13.564Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M54.633,25.343H50.937V27.191H54.633V25.343Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M73.822,17.49H71.859V19.453H73.822V17.49Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M78.926,9.246H75V11.209H78.926V9.246Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M91.489,13.957H89.526V15.92H91.489V13.957Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M87.563,7.282H85.6V11.208H87.563V7.282Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M71.859,15.527H69.896V17.49H71.859V15.527Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M45.947,12.778H43.984V14.741H45.947V12.778Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M42.807,12.778H38.881V14.741H42.807V12.778Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M47.518,27.306H45.555V29.269H47.518V27.306Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M8.65,11.602H12.576V9.639H8.65V11.602Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M52.783,27.19H49.087V29.038H52.783V27.19Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M73.822,19.453H69.896V21.416H73.822V19.453Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M20.018,29.808H23.714V27.96H20.018V29.808Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M58.118,30.446H60.081V26.52H58.118V30.446Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M74.215,30.839H76.178V28.876H74.215V30.839Z"
+      android:fillColor="#B87D00"/>
+  <path
+      android:pathData="M83.244,26.521H85.207V24.558H83.244V26.521Z"
+      android:fillColor="#B87D00"/>
+  <path
+      android:pathData="M85.207,28.483H89.133V26.52H85.207V28.483Z"
+      android:fillColor="#B87D00"/>
+  <path
+      android:pathData="M27.103,13.957H31.028V11.994H27.103V13.957Z"
+      android:fillColor="#00D300"/>
+  <path
+      android:pathData="M29.065,15.919H31.028V13.956H29.065V15.919Z"
+      android:fillColor="#00D300"/>
+</vector>
 
app/src/main/res/layout/activity_main.xml (added)
+++ app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+
+    <WebView
+        android:id="@+id/webview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
+        />
+
+    <FrameLayout
+        android:id="@+id/lay_intro"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
+        android:visibility="visible"
+        android:background="@mipmap/ic_launcher_background">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+            <FrameLayout
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:layout_height="match_parent">
+                <ImageView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:src="@drawable/icon"/>
+            </FrameLayout>
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_weight="0"
+                android:layout_marginBottom="26dp"
+                android:layout_gravity="center_horizontal"
+                android:src="@drawable/ic_intro_bottom"
+                android:visibility="gone"
+                android:layout_height="wrap_content"/>
+        </LinearLayout>
+    </FrameLayout>
+</FrameLayout>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (added)
+++ app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@mipmap/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (added)
+++ app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@mipmap/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/mipmap-hdpi/ic_launcher.png (Binary) (added)
+++ app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary file is not shown
 
app/src/main/res/mipmap-hdpi/ic_launcher_background.png (Binary) (added)
+++ app/src/main/res/mipmap-hdpi/ic_launcher_background.png
Binary file is not shown
 
app/src/main/res/mipmap-hdpi/ic_launcher_round.png (Binary) (added)
+++ app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary file is not shown
 
app/src/main/res/mipmap-mdpi/ic_launcher.png (Binary) (added)
+++ app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary file is not shown
 
app/src/main/res/mipmap-mdpi/ic_launcher_background.png (Binary) (added)
+++ app/src/main/res/mipmap-mdpi/ic_launcher_background.png
Binary file is not shown
 
app/src/main/res/mipmap-mdpi/ic_launcher_round.png (Binary) (added)
+++ app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary file is not shown
 
app/src/main/res/mipmap-xhdpi/ic_launcher.png (Binary) (added)
+++ app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary file is not shown
 
app/src/main/res/mipmap-xhdpi/ic_launcher_background.png (Binary) (added)
+++ app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
Binary file is not shown
 
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (Binary) (added)
+++ app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary file is not shown
 
app/src/main/res/mipmap-xxhdpi/ic_launcher.png (Binary) (added)
+++ app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary file is not shown
 
app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png (Binary) (added)
+++ app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
Binary file is not shown
 
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (Binary) (added)
+++ app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary file is not shown
 
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (Binary) (added)
+++ app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary file is not shown
 
app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png (Binary) (added)
+++ app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
Binary file is not shown
 
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (Binary) (added)
+++ app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary file is not shown
 
app/src/main/res/values-night/colors.xml (added)
+++ app/src/main/res/values-night/colors.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="primitive_background">#1F1F1F</color>
+    <color name="app_statusbar_color">#101010</color>
+    <bool name="app_window_lightstatusbar">false</bool>
+</resources>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/values/colors.xml (added)
+++ app/src/main/res/values/colors.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="purple_200">#FFBB86FC</color>
+    <color name="purple_500">#FF6200EE</color>
+    <color name="purple_700">#FF3700B3</color>
+    <color name="teal_200">#FF03DAC5</color>
+    <color name="teal_700">#FF018786</color>
+    <color name="black">#FF000000</color>
+    <color name="white">#FFFFFFFF</color>
+
+    <color name="primitive_background">#FFFFFF</color>
+    <color name="app_statusbar_color">#E9E9E9</color>
+    <bool name="app_window_lightstatusbar">true</bool>
+
+</resources>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/values/strings.xml (added)
+++ app/src/main/res/values/strings.xml
@@ -0,0 +1,12 @@
+<resources>
+    <string name="app_name">타다당</string>
+    <string name="default_notification_channel_id">Default</string>
+    <string name="default_notification_channel_name">@string/app_name</string>
+
+    <string name="backkey_finish">뒤로가기 버튼을 한번 더 누르시면 앱이 종료됩니다.</string>
+    <string name="webview_fileselect">첨부하기</string>
+    <string name="webview_fileselect_picture">사진</string>
+
+    <string name="topic_noti">noti</string>
+    <string name="topic_marketing">marketing</string>
+</resources>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/values/themes.xml (added)
+++ app/src/main/res/values/themes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="Theme.Tadadang" parent="android:Theme.Material.Light.NoActionBar">
+        <item name="android:windowBackground">@color/primitive_background</item>
+        <item name="android:statusBarColor">@color/app_statusbar_color</item>
+        <item name="android:windowLightStatusBar">@bool/app_window_lightstatusbar</item>
+        <item name="android:navigationBarColor">@android:color/transparent</item>
+    </style>
+</resources>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/xml/backup_rules.xml (added)
+++ app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample backup rules file; uncomment and customize as necessary.
+   See https://developer.android.com/guide/topics/data/autobackup
+   for details.
+   Note: This file is ignored for devices older that API 31
+   See https://developer.android.com/about/versions/12/backup-restore
+-->
+<full-backup-content>
+    <!--
+   <include domain="sharedpref" path="."/>
+   <exclude domain="sharedpref" path="device.xml"/>
+-->
+</full-backup-content>(파일 끝에 줄바꿈 문자 없음)
 
app/src/main/res/xml/data_extraction_rules.xml (added)
+++ app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample data extraction rules file; uncomment and customize as necessary.
+   See https://developer.android.com/about/versions/12/backup-restore#xml-changes
+   for details.
+-->
+<data-extraction-rules>
+    <cloud-backup>
+        <!-- TODO: Use <include> and <exclude> to control what is backed up.
+        <include .../>
+        <exclude .../>
+        -->
+    </cloud-backup>
+    <!--
+    <device-transfer>
+        <include .../>
+        <exclude .../>
+    </device-transfer>
+    -->
+</data-extraction-rules>(파일 끝에 줄바꿈 문자 없음)
 
app/src/test/java/kr/co/tadadang/user/ExampleUnitTest.kt (added)
+++ app/src/test/java/kr/co/tadadang/user/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package kr.co.tadadang.user
+
+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)
+    }
+}(파일 끝에 줄바꿈 문자 없음)
 
build.gradle (added)
+++ build.gradle
@@ -0,0 +1,7 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+    alias(libs.plugins.androidApplication) apply false
+    alias(libs.plugins.jetbrainsKotlinAndroid) apply false
+
+    id 'com.google.gms.google-services' version '4.4.1' apply false
+}(파일 끝에 줄바꿈 문자 없음)
 
google-services.json (added)
+++ google-services.json
@@ -0,0 +1,48 @@
+{
+  "project_info": {
+    "project_number": "626552537534",
+    "project_id": "daissue-5fc74",
+    "storage_bucket": "daissue-5fc74.appspot.com"
+  },
+  "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:626552537534:android:dd4d8ee23dd2eae8f979ef",
+        "android_client_info": {
+          "package_name": "kr.co.daissue.admin"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyCHI6-eh-7Dh1TQDVCkRVeSC1J1zyvhhi0"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
+    },
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:626552537534:android:9aa36faabd967876f979ef",
+        "android_client_info": {
+          "package_name": "kr.co.daissue.user"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyCHI6-eh-7Dh1TQDVCkRVeSC1J1zyvhhi0"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
+    }
+  ],
+  "configuration_version": "1"
+}(파일 끝에 줄바꿈 문자 없음)
 
gradle.properties (added)
+++ 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. For more details, visit
+# https://developer.android.com/r/tools/gradle-multi-project-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(파일 끝에 줄바꿈 문자 없음)
 
gradle/libs.versions.toml (added)
+++ gradle/libs.versions.toml
@@ -0,0 +1,33 @@
+[versions]
+agp = "8.3.1"
+kotlin = "1.9.0"
+coreKtx = "1.13.0"
+junit = "4.13.2"
+junitVersion = "1.1.5"
+espressoCore = "3.5.1"
+lifecycleRuntimeKtx = "2.7.0"
+activityCompose = "1.9.0"
+composeBom = "2023.08.00"
+workRuntimeKtx = "2.9.0"
+
+[libraries]
+androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
+junit = { group = "junit", name = "junit", version.ref = "junit" }
+androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
+androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
+androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
+androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
+androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
+androidx-ui = { group = "androidx.compose.ui", name = "ui" }
+androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
+androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
+androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
+androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
+androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
+androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
+androidx-work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "workRuntimeKtx" }
+
+[plugins]
+androidApplication = { id = "com.android.application", version.ref = "agp" }
+jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
+
 
gradle/wrapper/gradle-wrapper.jar (Binary) (added)
+++ gradle/wrapper/gradle-wrapper.jar
Binary file is not shown
 
gradle/wrapper/gradle-wrapper.properties (added)
+++ gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Apr 26 15:21:31 KST 2024
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
 
gradlew (added)
+++ 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" "$@"
 
gradlew.bat (added)
+++ 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
 
settings.gradle (added)
+++ settings.gradle
@@ -0,0 +1,23 @@
+pluginManagement {
+    repositories {
+        google {
+            content {
+                includeGroupByRegex("com\\.android.*")
+                includeGroupByRegex("com\\.google.*")
+                includeGroupByRegex("androidx.*")
+            }
+        }
+        mavenCentral()
+        gradlePluginPortal()
+    }
+}
+dependencyResolutionManagement {
+    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
+rootProject.name = "Tadadang-user"
+include ':app'
Add a comment
List