diff --git a/.gitignore b/.gitignore
index d0c4686..aa724b7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,13 +13,3 @@
.externalNativeBuild
.cxx
local.properties
-
-.idea/
-
-gradle/
-
-gradle.properties
-
-gradlew
-
-gradlew.bat
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..bcfd775
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+DEMU-ANDROID
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..b86273d
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..b268ef3
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..7b3006b
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000..148fdd2
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/migrations.xml b/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..74dd639
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..931b96c
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DEMU_ANDROID/.gitignore b/DEMU_ANDROID/.gitignore
deleted file mode 100644
index aa724b7..0000000
--- a/DEMU_ANDROID/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-*.iml
-.gradle
-/local.properties
-/.idea/caches
-/.idea/libraries
-/.idea/modules.xml
-/.idea/workspace.xml
-/.idea/navEditor.xml
-/.idea/assetWizardSettings.xml
-.DS_Store
-/build
-/captures
-.externalNativeBuild
-.cxx
-local.properties
diff --git a/DEMU_ANDROID/app/.gitignore b/DEMU_ANDROID/app/.gitignore
deleted file mode 100644
index 42afabf..0000000
--- a/DEMU_ANDROID/app/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/build.gradle.kts b/DEMU_ANDROID/app/build.gradle.kts
deleted file mode 100644
index 155d975..0000000
--- a/DEMU_ANDROID/app/build.gradle.kts
+++ /dev/null
@@ -1,51 +0,0 @@
-plugins {
- alias(libs.plugins.android.application)
- alias(libs.plugins.jetbrains.kotlin.android)
-}
-
-android {
- namespace = "com.example.demu_android"
- compileSdk = 34
-
- defaultConfig {
- applicationId = "com.example.demu_android"
- minSdk = 24
- targetSdk = 34
- versionCode = 1
- versionName = "1.0"
-
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
- }
-
- buildTypes {
- release {
- isMinifyEnabled = 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 {
- dataBinding = true
- }
-}
-
-dependencies {
-
- implementation(libs.androidx.core.ktx)
- implementation(libs.androidx.appcompat)
- implementation(libs.material)
- implementation(libs.androidx.activity)
- implementation(libs.androidx.constraintlayout)
- testImplementation(libs.junit)
- androidTestImplementation(libs.androidx.junit)
- androidTestImplementation(libs.androidx.espresso.core)
-}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/proguard-rules.pro b/DEMU_ANDROID/app/proguard-rules.pro
deleted file mode 100644
index 481bb43..0000000
--- a/DEMU_ANDROID/app/proguard-rules.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-# http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-# public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/androidTest/java/com/example/demu_android/ExampleInstrumentedTest.kt b/DEMU_ANDROID/app/src/androidTest/java/com/example/demu_android/ExampleInstrumentedTest.kt
deleted file mode 100644
index f934aa3..0000000
--- a/DEMU_ANDROID/app/src/androidTest/java/com/example/demu_android/ExampleInstrumentedTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.example.demu_android
-
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.ext.junit.runners.AndroidJUnit4
-
-import org.junit.Test
-import org.junit.runner.RunWith
-
-import org.junit.Assert.*
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-@RunWith(AndroidJUnit4::class)
-class ExampleInstrumentedTest {
- @Test
- fun useAppContext() {
- // Context of the app under test.
- val appContext = InstrumentationRegistry.getInstrumentation().targetContext
- assertEquals("com.example.demu_android", appContext.packageName)
- }
-}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/AndroidManifest.xml b/DEMU_ANDROID/app/src/main/AndroidManifest.xml
deleted file mode 100644
index bcb530d..0000000
--- a/DEMU_ANDROID/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/SplashActivity.kt b/DEMU_ANDROID/app/src/main/java/com/example/demu_android/SplashActivity.kt
deleted file mode 100644
index cbc222c..0000000
--- a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/SplashActivity.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-
-package com.example.demu_android
-
-import android.content.Intent
-import android.os.Bundle
-import android.os.Handler
-import android.os.Looper
-import androidx.activity.enableEdgeToEdge
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-
-class SplashActivity : AppCompatActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- setContentView(R.layout.activity_splash)
-
- moveToMainActivity()
- }
-
- private fun moveToMainActivity() {
- val intent = Intent(this, MainActivity::class.java)
-
- Handler(Looper.getMainLooper()).postDelayed( {
- startActivity(intent)
- }, 3000)
- }
-}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/home/HomeActivity.kt b/DEMU_ANDROID/app/src/main/java/com/example/demu_android/home/HomeActivity.kt
deleted file mode 100644
index 1d41e21..0000000
--- a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/home/HomeActivity.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.example.demu_android.home
-
-import android.os.Bundle
-import androidx.activity.enableEdgeToEdge
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-import com.example.demu_android.R
-
-class HomeActivity : AppCompatActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- setContentView(R.layout.activity_home)
-
- }
-}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/bg_button.xml b/DEMU_ANDROID/app/src/main/res/drawable/bg_button.xml
deleted file mode 100644
index d670a35..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/bg_button.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/bg_inputlayout.xml b/DEMU_ANDROID/app/src/main/res/drawable/bg_inputlayout.xml
deleted file mode 100644
index 9d743f0..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/bg_inputlayout.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
- -
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/button_color_default.xml b/DEMU_ANDROID/app/src/main/res/drawable/button_color_default.xml
deleted file mode 100644
index 28895e9..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/button_color_default.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
- -
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/gradient.png b/DEMU_ANDROID/app/src/main/res/drawable/gradient.png
deleted file mode 100644
index 23c958a..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/drawable/gradient.png and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/ic_demu.xml b/DEMU_ANDROID/app/src/main/res/drawable/ic_demu.xml
deleted file mode 100644
index 0da4c18..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/ic_demu.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/ic_launcher_background.xml b/DEMU_ANDROID/app/src/main/res/drawable/ic_launcher_background.xml
deleted file mode 100644
index 07d5da9..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/ic_launcher_background.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/ic_launcher_foreground.xml b/DEMU_ANDROID/app/src/main/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index 2b068d1..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_disable.xml b/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_disable.xml
deleted file mode 100644
index 1b23432..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_disable.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_enabled.xml b/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_enabled.xml
deleted file mode 100644
index 668c299..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_enabled.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_selector.xml b/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_selector.xml
deleted file mode 100644
index e105893..0000000
--- a/DEMU_ANDROID/app/src/main/res/drawable/password_toggle_selector.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/layout/activity_home.xml b/DEMU_ANDROID/app/src/main/res/layout/activity_home.xml
deleted file mode 100644
index d27c75c..0000000
--- a/DEMU_ANDROID/app/src/main/res/layout/activity_home.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/layout/activity_login.xml b/DEMU_ANDROID/app/src/main/res/layout/activity_login.xml
deleted file mode 100644
index a5f1562..0000000
--- a/DEMU_ANDROID/app/src/main/res/layout/activity_login.xml
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/DEMU_ANDROID/app/src/main/res/layout/activity_splash.xml b/DEMU_ANDROID/app/src/main/res/layout/activity_splash.xml
deleted file mode 100644
index 6dbe162..0000000
--- a/DEMU_ANDROID/app/src/main/res/layout/activity_splash.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/DEMU_ANDROID/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index 6f3b755..0000000
--- a/DEMU_ANDROID/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/DEMU_ANDROID/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index 6f3b755..0000000
--- a/DEMU_ANDROID/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/DEMU_ANDROID/app/src/main/res/mipmap-hdpi/ic_launcher.webp
deleted file mode 100644
index c209e78..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/DEMU_ANDROID/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
deleted file mode 100644
index b2dfe3d..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/DEMU_ANDROID/app/src/main/res/mipmap-mdpi/ic_launcher.webp
deleted file mode 100644
index 4f0f1d6..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/DEMU_ANDROID/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
deleted file mode 100644
index 62b611d..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/DEMU_ANDROID/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
deleted file mode 100644
index 948a307..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/DEMU_ANDROID/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
deleted file mode 100644
index 1b9a695..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/DEMU_ANDROID/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
deleted file mode 100644
index 28d4b77..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/DEMU_ANDROID/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
deleted file mode 100644
index 9287f50..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/DEMU_ANDROID/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
deleted file mode 100644
index aa7d642..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/DEMU_ANDROID/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
deleted file mode 100644
index 9126ae3..0000000
Binary files a/DEMU_ANDROID/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/DEMU_ANDROID/app/src/main/res/values-night/themes.xml b/DEMU_ANDROID/app/src/main/res/values-night/themes.xml
deleted file mode 100644
index e0a24d5..0000000
--- a/DEMU_ANDROID/app/src/main/res/values-night/themes.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/values/colors.xml b/DEMU_ANDROID/app/src/main/res/values/colors.xml
deleted file mode 100644
index 21511af..0000000
--- a/DEMU_ANDROID/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
- #FF000000
- #FFFFFFFF
-
- #ff0000
- #1B69FF
- #1F262C
- #98A4AF
-
- #D2E1FD
- #F9FAFB
- #98A4AF
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/values/strings.xml b/DEMU_ANDROID/app/src/main/res/values/strings.xml
deleted file mode 100644
index c297f44..0000000
--- a/DEMU_ANDROID/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
- DEMU_ANDROID
- LoginActivity
- 회원가입하기
- 로그인
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/values/themes.xml b/DEMU_ANDROID/app/src/main/res/values/themes.xml
deleted file mode 100644
index 6e18210..0000000
--- a/DEMU_ANDROID/app/src/main/res/values/themes.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/xml/backup_rules.xml b/DEMU_ANDROID/app/src/main/res/xml/backup_rules.xml
deleted file mode 100644
index fa0f996..0000000
--- a/DEMU_ANDROID/app/src/main/res/xml/backup_rules.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/xml/data_extraction_rules.xml b/DEMU_ANDROID/app/src/main/res/xml/data_extraction_rules.xml
deleted file mode 100644
index 9ee9997..0000000
--- a/DEMU_ANDROID/app/src/main/res/xml/data_extraction_rules.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/test/java/com/example/demu_android/ExampleUnitTest.kt b/DEMU_ANDROID/app/src/test/java/com/example/demu_android/ExampleUnitTest.kt
deleted file mode 100644
index df0995f..0000000
--- a/DEMU_ANDROID/app/src/test/java/com/example/demu_android/ExampleUnitTest.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.example.demu_android
-
-import org.junit.Test
-
-import org.junit.Assert.*
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-class ExampleUnitTest {
- @Test
- fun addition_isCorrect() {
- assertEquals(4, 2 + 2)
- }
-}
\ No newline at end of file
diff --git a/DEMU_ANDROID/build.gradle.kts b/DEMU_ANDROID/build.gradle.kts
deleted file mode 100644
index f74b04b..0000000
--- a/DEMU_ANDROID/build.gradle.kts
+++ /dev/null
@@ -1,5 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-plugins {
- alias(libs.plugins.android.application) apply false
- alias(libs.plugins.jetbrains.kotlin.android) apply false
-}
\ No newline at end of file
diff --git a/DEMU_ANDROID/settings.gradle.kts b/DEMU_ANDROID/settings.gradle.kts
deleted file mode 100644
index 59db43a..0000000
--- a/DEMU_ANDROID/settings.gradle.kts
+++ /dev/null
@@ -1,24 +0,0 @@
-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 = "DEMU_ANDROID"
-include(":app")
-
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 155d975..5eef6ef 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,6 +1,6 @@
plugins {
alias(libs.plugins.android.application)
- alias(libs.plugins.jetbrains.kotlin.android)
+ alias(libs.plugins.kotlin.android)
}
android {
@@ -48,4 +48,10 @@ dependencies {
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
+
+ implementation (libs.retrofit)
+ implementation(libs.converter.gson)
+
+ implementation ("com.github.bumptech.glide:glide:4.14.2")
+ annotationProcessor ("com.github.bumptech.glide:compiler:4.14.2")
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5fa0b7a..9e4ce4e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
+
+
-
-
-
@@ -30,6 +23,14 @@
+
+
+
+
-
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/Login/LoginActivity.kt b/app/src/main/java/com/example/demu_android/Login/LoginActivity.kt
deleted file mode 100644
index 3284391..0000000
--- a/app/src/main/java/com/example/demu_android/Login/LoginActivity.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.example.demu_android.Login
-
-import android.content.Intent
-import android.graphics.drawable.Drawable
-import android.os.Bundle
-import android.text.Editable
-import android.text.TextWatcher
-import android.view.View
-import android.widget.Toast
-import androidx.activity.enableEdgeToEdge
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.ContextCompat
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-import androidx.core.widget.addTextChangedListener
-import com.example.demu_android.R
-import com.example.demu_android.databinding.ActivityLoginBinding
-import com.example.demu_android.home.HomeActivity
-import com.example.demu_android.utils.isRegexEmail
-import com.example.demu_android.utils.isRegexPassword
-
-class LoginActivity : AppCompatActivity(), View.OnClickListener {
- private val binding: ActivityLoginBinding by lazy {
- ActivityLoginBinding.inflate(layoutInflater)
- }
-
- var emailFlag = false
- var passwordFlag = false
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- setContentView(binding.root)
-
- binding.btnLogin.setOnClickListener(this)
- onEmailListener()
- onPasswordListener()
- }
-
- override fun onClick(v: View?) {
- val loginToHome = Intent(this, HomeActivity::class.java)
- when(v?.id) {
- R.id.btn_login -> {
- if(flagCheck())
- startActivity(loginToHome)
- else
- Toast.makeText(this, "정확히 값을 입력해주세요", Toast.LENGTH_LONG).show()
- }
- }
- }
-
- private fun onEmailListener() {
- binding.tieEmail.addTextChangedListener(object : TextWatcher {
- override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
-
- }
-
- override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
- if (s != null) {
- when {
- s.isEmpty() -> {
- binding.tilEmail.error = "이메일을 입력해주세요"
- }
- !isRegexEmail(s.toString()) -> {
- binding.tilEmail.error = "유효하지 않은 이메일 입니다."
- }
- else -> {
- binding.tilEmail.error = null
- binding.tilEmail.boxStrokeColor = getResources().getColor(R.color.main)
- emailFlag = true
- if (flagCheck())
- binding.btnLogin.setBackgroundDrawable(ContextCompat.getDrawable(baseContext,R.drawable.bg_button))
- else
- binding.btnLogin.setBackgroundDrawable(ContextCompat.getDrawable(baseContext,R.drawable.button_color_nocheck))
- }
- }
- }
- }
-
- override fun afterTextChanged(s: Editable?) {
-
- }
- })
- }
-
- private fun onPasswordListener() {
- binding.tiePassword.addTextChangedListener(object : TextWatcher{
- override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
-
- }
-
- override fun afterTextChanged(s: Editable?) {
- binding.tilEmail.boxStrokeColor = getResources().getColor(R.color.black)
- if (s != null) {
- when {
- s.isEmpty() -> {
- binding.tilPassword.error = "비밀번호를 입력해주세요"
- }
- !isRegexPassword(s.toString()) -> {
- binding.tilPassword.error = "비밀번호 형식이 맞지 않습니다!"
- }
- else -> {
- binding.tilPassword.error = null
- passwordFlag = true
- binding.tilPassword.boxStrokeColor = getResources().getColor(R.color.main)
- // 이거이름 맞춰서 수정
- val resource = if(flagCheck()) R.drawable.bg_button else R.drawable.button_color_nocheck
- binding.btnLogin.setBackgroundDrawable(ContextCompat.getDrawable(baseContext,resource))
- }
- }
- }
- }
-
- override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
-
- }
- })
- }
-
- private fun flagCheck(): Boolean {
- return emailFlag && passwordFlag
- }
-}
diff --git a/app/src/main/java/com/example/demu_android/MainActivity.kt b/app/src/main/java/com/example/demu_android/MainActivity.kt
deleted file mode 100644
index d368a6f..0000000
--- a/app/src/main/java/com/example/demu_android/MainActivity.kt
+++ /dev/null
@@ -1,32 +0,0 @@
- package com.example.demu_android
-
-import android.content.Intent
-import android.os.Bundle
-import android.view.View
-import androidx.activity.enableEdgeToEdge
-import androidx.appcompat.app.AppCompatActivity
-import com.example.demu_android.Login.LoginActivity
-import com.example.demu_android.databinding.ActivityMainBinding
-
-class MainActivity : AppCompatActivity(), View.OnClickListener {
- private val binding: ActivityMainBinding by lazy {
- ActivityMainBinding.inflate(layoutInflater)
- }
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- setContentView(binding.root)
-
- binding.btnStart.setOnClickListener(this)
- }
-
- override fun onClick(v: View?) {
- val mainToLogin = Intent(this, LoginActivity::class.java)
- when(v) {
- binding.btnStart -> {
- startActivity(mainToLogin)
- }
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/data/api/ApiProvider.kt b/app/src/main/java/com/example/demu_android/data/api/ApiProvider.kt
new file mode 100644
index 0000000..4313ad8
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/data/api/ApiProvider.kt
@@ -0,0 +1,22 @@
+package com.example.demu_android.data.api
+
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+
+object ApiProvider {
+ private const val BASE_URL = "https://3.37.219.136:8080"
+ private var retrofit: Retrofit? = null
+
+ private fun getApiInstance(): Retrofit {
+ retrofit = Retrofit.Builder()
+ .baseUrl(BASE_URL)
+ .addConverterFactory(GsonConverterFactory.create())
+ .build()
+
+ return retrofit!!
+ }
+
+ fun getAuthApi(): AuthApi {
+ return getApiInstance().create(AuthApi::class.java)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/data/api/AuthApi.kt b/app/src/main/java/com/example/demu_android/data/api/AuthApi.kt
new file mode 100644
index 0000000..1e7ff4d
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/data/api/AuthApi.kt
@@ -0,0 +1,14 @@
+package com.example.demu_android.data.api
+
+import com.example.demu_android.data.request.auth.SignUpRequest
+import com.example.demu_android.data.response.auth.SignUpResponse
+import retrofit2.Call
+import retrofit2.http.Body
+import retrofit2.http.POST
+
+interface AuthApi {
+ @POST("/public/signup")
+ fun signUp(
+ @Body request: SignUpRequest
+ ): Call
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/data/request/auth/SignUpRequest.kt b/app/src/main/java/com/example/demu_android/data/request/auth/SignUpRequest.kt
new file mode 100644
index 0000000..0a120bf
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/data/request/auth/SignUpRequest.kt
@@ -0,0 +1,9 @@
+package com.example.demu_android.data.request.auth
+
+import com.google.gson.annotations.SerializedName
+
+data class SignUpRequest(
+ @SerializedName("accountId") val accountId: String,
+ @SerializedName("nickname") val nickname: String,
+ @SerializedName("password") val password: String,
+)
diff --git a/app/src/main/java/com/example/demu_android/data/request/dum.kt b/app/src/main/java/com/example/demu_android/data/request/dum.kt
new file mode 100644
index 0000000..511486e
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/data/request/dum.kt
@@ -0,0 +1,4 @@
+package com.example.demu_android.data.request
+
+class dum {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/data/response/auth/SignUpResponse.kt b/app/src/main/java/com/example/demu_android/data/response/auth/SignUpResponse.kt
new file mode 100644
index 0000000..81bd78e
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/data/response/auth/SignUpResponse.kt
@@ -0,0 +1,10 @@
+package com.example.demu_android.data.response.auth
+
+import com.google.gson.annotations.SerializedName
+
+data class SignUpResponse(
+ @SerializedName("access_token") val accessToken: String,
+ @SerializedName("access_expires_at") val accessExpiresAt: String,
+ @SerializedName("refresh_token") val refreshToken: String,
+ @SerializedName("refresh_expires_at") val refreshExpiresAt: String,
+)
diff --git a/app/src/main/java/com/example/demu_android/data/response/dum.kt b/app/src/main/java/com/example/demu_android/data/response/dum.kt
new file mode 100644
index 0000000..61a69f6
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/data/response/dum.kt
@@ -0,0 +1,4 @@
+package com.example.demu_android.data.response
+
+class dum {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/data/sharedpreference/SharedPreferenceManager.kt b/app/src/main/java/com/example/demu_android/data/sharedpreference/SharedPreferenceManager.kt
new file mode 100644
index 0000000..e384bb1
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/data/sharedpreference/SharedPreferenceManager.kt
@@ -0,0 +1,15 @@
+package com.example.demu_android.data.sharedpreference
+
+import android.content.Context
+import android.content.SharedPreferences
+
+object SharedPreferenceManager {
+ private var sharedPreferences: SharedPreferences? = null
+
+ fun getInstance(context: Context): SharedPreferences {
+ if (sharedPreferences == null) {
+ sharedPreferences = context.getSharedPreferences("demu", Context.MODE_PRIVATE)
+ }
+ return sharedPreferences!!
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/Blog/ModelBottomSheet.kt b/app/src/main/java/com/example/demu_android/feature/Blog/ModelBottomSheet.kt
new file mode 100644
index 0000000..257ebf9
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/Blog/ModelBottomSheet.kt
@@ -0,0 +1,25 @@
+package com.example.demu_android.feature.Blog
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.example.demu_android.R
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+
+class ModelBottomSheet(val sia: String) : BottomSheetDialogFragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ super.onCreateView(inflater, container, savedInstanceState)
+ return inflater.inflate(R.layout.list_bottom_sheet_item, container, false)
+ }
+
+ companion object {
+ const val TAG = "BasicBottomModalSheet"
+ val dklsjf = ModelBottomSheet("")
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/Blog/WriteBlogFragment.kt b/app/src/main/java/com/example/demu_android/feature/Blog/WriteBlogFragment.kt
new file mode 100644
index 0000000..3c89d12
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/Blog/WriteBlogFragment.kt
@@ -0,0 +1,267 @@
+package com.example.demu_android.feature.Blog
+
+import android.net.Uri
+import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.Log
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.ListView
+import androidx.activity.result.PickVisualMediaRequest
+import androidx.activity.result.contract.ActivityResultContracts
+import com.bumptech.glide.Glide
+import com.example.demu_android.R
+import com.example.demu_android.databinding.FragmentWriteBlogBinding
+import com.example.demu_android.databinding.ListBottomSheetItemBinding
+import com.example.demu_android.feature.home.HomeFragment
+import com.example.demu_android.feature.recycler.home.WriteBlog.data.Blog
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import com.google.android.material.bottomsheet.BottomSheetDialog
+
+class WriteBlogFragment : Fragment(), View.OnClickListener {
+ private val blogList: MutableList = mutableListOf(
+ // Blog(1092L, "", "", "", 12092L, Enum)
+ )
+ private val binding by lazy {
+ FragmentWriteBlogBinding.inflate(layoutInflater)
+ }
+ private val bottomSheetView by lazy {
+ layoutInflater.inflate(R.layout.list_bottom_sheet_item, null)
+ }
+ private val bottomSheetDialog by lazy {
+ BottomSheetDialog(requireContext())
+ }
+
+ private val pickMultiMedia = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(5)) { uris ->
+ if (uris.isNotEmpty()) {
+ Log.d("TEST", "Number of items selected: ${uris.size}")
+ loadImage(uris[0])
+ } else {
+ Log.d("PhotoPicker", "No media selected")
+ }
+
+ }
+
+ private lateinit var listView: ListView
+
+ private var titleFlag = false
+ private var subFlag = false
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ return binding.root
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ binding.imgDownArrow.setOnClickListener(this)
+ binding.tvSubmit.setOnClickListener(this)
+ binding.tvCancel.setOnClickListener(this)
+
+ binding.cvAddImage.run {
+ setOnClickListener {
+ pickMultiMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
+ }
+ }
+
+ showDropDownMenu()
+ onTitleListener()
+ onSubListener()
+ sendBlogListInfo()
+ showPhotoPicker()
+ }
+
+ override fun onClick(v: View?) {
+ val transaction = activity?.supportFragmentManager?.beginTransaction()
+ val bottomNavigationView = requireActivity().findViewById(R.id.bottom_navigation)
+
+ val bundle = Bundle()
+ bundle.putString("blogTitle", binding.etTitle.text.toString())
+ bundle.putString("blogContent", "")
+ bundle.putString("blog", "")
+
+ val homeFragment = HomeFragment()
+ homeFragment.arguments = bundle
+
+ when(v?.id) {
+ R.id.img_down_arrow -> {
+ showDropDownMenu()
+ }
+ R.id.tv_submit -> {
+ if (blogFlagCheck()) {
+ transaction?.replace(R.id.containers, homeFragment)
+ transaction?.commit()
+ // bottom navigation 보여짐
+ // mainActivity에서 hide(), add() 함수 이용하여 구현
+ bottomNavigationView.visibility = View.VISIBLE
+ }
+ }
+ R.id.tv_cancel -> {
+ transaction?.replace(R.id.containers, HomeFragment())
+ transaction?.commit()
+ bottomNavigationView.visibility = View.VISIBLE
+ }
+ R.id.cv_add_image -> {
+ showPhotoPicker()
+ }
+ }
+ }
+
+ private fun sendBlogListInfo() {
+
+ }
+
+ private fun showPhotoPicker() {
+ }
+
+ private fun showDropDownMenu() {
+ bottomSheetDialog.setContentView(bottomSheetView)
+ val bottomSheetBinding = ListBottomSheetItemBinding.inflate(layoutInflater)
+
+ binding.imgDownArrow.setOnClickListener {
+ bottomSheetDialog.show()
+ }
+
+ bottomSheetView.findViewById(R.id.backend).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "backend"
+ bottomSheetBinding.tvBottomSheetMajor.text = "backend"
+ }
+ bottomSheetView.findViewById(R.id.frontend).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "frontend"
+ }
+ bottomSheetView.findViewById(R.id.ios).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "iOS"
+ }
+ bottomSheetView.findViewById(R.id.aos).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "AOS"
+ }
+ bottomSheetView.findViewById(R.id.ai).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "AI"
+ }
+ bottomSheetView.findViewById(R.id.design_sub).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "design"
+ }
+ bottomSheetView.findViewById(R.id.flutter).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "flutter"
+ }
+ bottomSheetView.findViewById(R.id.full_stack).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "full stack"
+ }
+ bottomSheetView.findViewById(R.id.game).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "game"
+ }
+ bottomSheetView.findViewById(R.id.security).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "security"
+ }
+ bottomSheetView.findViewById(R.id.embedded).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "embedded"
+ }
+ bottomSheetView.findViewById(R.id.devops).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "devops"
+ }
+ bottomSheetView.findViewById(R.id.other_major).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "기타 전공"
+ }
+ bottomSheetView.findViewById(R.id.all_articles).setOnClickListener {
+ bottomSheetDialog.dismiss()
+ binding.tvMajorTitle.text = "전체 글"
+ }
+ }
+
+ private fun onTitleListener() {
+ binding.etTitle.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ if (s != null) {
+ when {
+ s.isEmpty() -> {
+ titleFlag = false
+ if(blogFlagCheck())
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_default))
+ else
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_gray))
+
+ }
+ else -> {
+ titleFlag = true
+ if(blogFlagCheck())
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_default))
+ else
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_gray))
+ }
+ }
+ }
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+ }
+ })
+ }
+
+ private fun onSubListener() {
+ binding.etSub.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ if (s != null) {
+ when {
+ s.isEmpty() -> {
+ subFlag = false
+ if(blogFlagCheck())
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_default))
+ else
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_gray))
+
+ }
+ else -> {
+ subFlag = true
+ if(blogFlagCheck())
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_default))
+ else
+ binding.tvSubmit.setTextColor(resources.getColor(R.color.text_gray))
+ }
+ }
+ }
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+ }
+ })
+ }
+
+ private fun blogFlagCheck(): Boolean {
+ return titleFlag && subFlag
+ }
+
+ private fun loadImage(uri: Uri) {
+ Glide.with(requireContext())
+ .load(uri)
+ .into(binding.imgSelectImg)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/Blog/WriteBlogViewModel.kt b/app/src/main/java/com/example/demu_android/feature/Blog/WriteBlogViewModel.kt
new file mode 100644
index 0000000..b5ebe6a
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/Blog/WriteBlogViewModel.kt
@@ -0,0 +1,19 @@
+package com.example.demu_android.feature.Blog
+
+import android.util.Log
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import com.example.demu_android.feature.recycler.home.WriteBlog.data.Blog
+
+class WriteBlogViewModel : ViewModel() {
+ private val _blogList: MutableLiveData> = MutableLiveData()
+ var blogList: LiveData> =_blogList
+
+ fun addBlogList(blog : List) {
+ Log.d("TEST4",blog.toString())
+ _blogList.value = blog
+ Log.d("TEST2",_blogList.value.toString())
+ Log.d("TEST3",blogList.toString())
+ }
+}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/Login/LoginActivity.kt b/app/src/main/java/com/example/demu_android/feature/Login/LoginActivity.kt
similarity index 87%
rename from DEMU_ANDROID/app/src/main/java/com/example/demu_android/Login/LoginActivity.kt
rename to app/src/main/java/com/example/demu_android/feature/Login/LoginActivity.kt
index d870292..f0711c5 100644
--- a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/Login/LoginActivity.kt
+++ b/app/src/main/java/com/example/demu_android/feature/Login/LoginActivity.kt
@@ -1,7 +1,6 @@
-package com.example.demu_android.Login
+package com.example.demu_android.feature.Login
import android.content.Intent
-import android.graphics.drawable.Drawable
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
@@ -10,15 +9,12 @@ import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-import androidx.core.widget.addTextChangedListener
import com.example.demu_android.R
import com.example.demu_android.databinding.ActivityLoginBinding
-import com.example.demu_android.home.HomeActivity
-import com.example.demu_android.signUp.SignUpActivity
-import com.example.demu_android.utils.isRegexEmail
-import com.example.demu_android.utils.isRegexPassword
+import com.example.demu_android.feature.MainActivity
+import com.example.demu_android.feature.signUp.SignUpActivity
+import com.example.demu_android.feature.utils.isRegexEmail
+import com.example.demu_android.feature.utils.isRegexPassword
class LoginActivity : AppCompatActivity(), View.OnClickListener {
private val binding: ActivityLoginBinding by lazy {
@@ -41,13 +37,15 @@ class LoginActivity : AppCompatActivity(), View.OnClickListener {
}
override fun onClick(v: View?) {
- val loginToHome = Intent(this, HomeActivity::class.java)
+ val loginToHome = Intent(this, MainActivity::class.java)
val loginToSignUp = Intent(this, SignUpActivity::class.java)
when(v?.id) {
R.id.btn_login -> {
- if (flagCheck())
+ if (flagCheck()) {
+ connectSeverLogin()
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(loginToHome)
- else
+ } else
Toast.makeText(this, "정확히 값을 입력해주세요", Toast.LENGTH_LONG).show()
}
R.id.tv_bottom_sign_up -> {
@@ -109,7 +107,6 @@ class LoginActivity : AppCompatActivity(), View.OnClickListener {
binding.tilPassword.error = null
passwordFlag = true
binding.tilEmail.boxStrokeColor = getResources().getColor(R.color.main)
- // 이거이름 맞춰서 수정
val resource = if(flagCheck()) R.drawable.bg_button else R.drawable.button_color_nocheck
binding.btnLogin.setBackgroundDrawable(ContextCompat.getDrawable(baseContext,resource))
}
@@ -126,4 +123,8 @@ class LoginActivity : AppCompatActivity(), View.OnClickListener {
private fun flagCheck(): Boolean {
return emailFlag && passwordFlag
}
+
+ private fun connectSeverLogin() {
+
+ }
}
diff --git a/app/src/main/java/com/example/demu_android/feature/MainActivity.kt b/app/src/main/java/com/example/demu_android/feature/MainActivity.kt
new file mode 100644
index 0000000..342bae2
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/MainActivity.kt
@@ -0,0 +1,55 @@
+package com.example.demu_android.feature
+
+import android.os.Bundle
+import android.view.View
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import com.example.demu_android.feature.Blog.WriteBlogFragment
+import com.example.demu_android.feature.Mypage.MyPageFragment
+import com.example.demu_android.R
+import com.example.demu_android.feature.Search.SearchFragment
+import com.example.demu_android.databinding.ActivityMainBinding
+import com.example.demu_android.feature.home.HomeFragment
+
+class MainActivity : AppCompatActivity() {
+ private val binding by lazy {
+ ActivityMainBinding.inflate(layoutInflater)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+ setContentView(binding.root)
+
+ setBottomNavigationFragment()
+
+ if (savedInstanceState == null) {
+ supportFragmentManager.beginTransaction().replace(R.id.containers, HomeFragment()).commit()
+ }
+ }
+
+ private fun setBottomNavigationFragment() {
+ binding.bottomNavigation.setOnItemSelectedListener { item ->
+ when(item.itemId) {
+ R.id.bottom_home -> {
+ supportFragmentManager.beginTransaction().replace(R.id.containers, HomeFragment()).commit()
+ true
+ }
+ R.id.bottom_search -> {
+ supportFragmentManager.beginTransaction().replace(R.id.containers, SearchFragment()).commit()
+ true
+ }
+ R.id.bottom_blog -> {
+ supportFragmentManager.beginTransaction().replace(R.id.containers, WriteBlogFragment()).commit()
+ binding.bottomNavigation.visibility = View.GONE
+ true
+ }
+ R.id.bottom_my_page -> {
+ supportFragmentManager.beginTransaction().replace(R.id.containers, MyPageFragment()).commit()
+ true
+ }
+ else -> false
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/Mypage/MyPageFragment.kt b/app/src/main/java/com/example/demu_android/feature/Mypage/MyPageFragment.kt
new file mode 100644
index 0000000..196d6d6
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/Mypage/MyPageFragment.kt
@@ -0,0 +1,25 @@
+package com.example.demu_android.feature.Mypage
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import com.example.demu_android.R
+
+
+class MyPageFragment : Fragment() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_my_page, container, false)
+ }
+}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/MainActivity.kt b/app/src/main/java/com/example/demu_android/feature/OnBoardingActivity.kt
similarity index 63%
rename from DEMU_ANDROID/app/src/main/java/com/example/demu_android/MainActivity.kt
rename to app/src/main/java/com/example/demu_android/feature/OnBoardingActivity.kt
index d368a6f..c807888 100644
--- a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/MainActivity.kt
+++ b/app/src/main/java/com/example/demu_android/feature/OnBoardingActivity.kt
@@ -1,16 +1,16 @@
- package com.example.demu_android
+ package com.example.demu_android.feature
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
-import com.example.demu_android.Login.LoginActivity
-import com.example.demu_android.databinding.ActivityMainBinding
+import com.example.demu_android.feature.Login.LoginActivity
+import com.example.demu_android.databinding.ActivityOnboardingBinding
-class MainActivity : AppCompatActivity(), View.OnClickListener {
- private val binding: ActivityMainBinding by lazy {
- ActivityMainBinding.inflate(layoutInflater)
+ class OnBoardingActivity : AppCompatActivity(), View.OnClickListener {
+ private val binding: ActivityOnboardingBinding by lazy {
+ ActivityOnboardingBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
diff --git a/app/src/main/java/com/example/demu_android/feature/Search/SearchFragment.kt b/app/src/main/java/com/example/demu_android/feature/Search/SearchFragment.kt
new file mode 100644
index 0000000..f4cd82d
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/Search/SearchFragment.kt
@@ -0,0 +1,24 @@
+package com.example.demu_android.feature.Search
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.example.demu_android.R
+
+class SearchFragment : Fragment() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_search, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/SplashActivity.kt b/app/src/main/java/com/example/demu_android/feature/SplashActivity.kt
similarity index 75%
rename from app/src/main/java/com/example/demu_android/SplashActivity.kt
rename to app/src/main/java/com/example/demu_android/feature/SplashActivity.kt
index cbc222c..bceb336 100644
--- a/app/src/main/java/com/example/demu_android/SplashActivity.kt
+++ b/app/src/main/java/com/example/demu_android/feature/SplashActivity.kt
@@ -1,5 +1,5 @@
-package com.example.demu_android
+package com.example.demu_android.feature
import android.content.Intent
import android.os.Bundle
@@ -7,8 +7,7 @@ import android.os.Handler
import android.os.Looper
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
+import com.example.demu_android.R
class SplashActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -20,10 +19,10 @@ class SplashActivity : AppCompatActivity() {
}
private fun moveToMainActivity() {
- val intent = Intent(this, MainActivity::class.java)
+ val intent = Intent(this, OnBoardingActivity::class.java)
Handler(Looper.getMainLooper()).postDelayed( {
startActivity(intent)
- }, 3000)
+ }, 1500)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/home/HomeFragment.kt b/app/src/main/java/com/example/demu_android/feature/home/HomeFragment.kt
new file mode 100644
index 0000000..0d0f226
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/home/HomeFragment.kt
@@ -0,0 +1,76 @@
+package com.example.demu_android.feature.home
+
+import android.net.Uri
+import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.GridLayoutManager
+import com.bumptech.glide.Glide
+import com.example.demu_android.feature.Blog.WriteBlogViewModel
+import com.example.demu_android.databinding.FragmentHomeBinding
+import com.example.demu_android.feature.recycler.home.WriteBlog.WriteBlogAdaptor
+import com.example.demu_android.feature.recycler.home.WriteBlog.data.Blog
+import com.example.demu_android.feature.type.Major
+
+class HomeFragment : Fragment(), View.OnClickListener {
+ private val blogList: MutableList = mutableListOf(
+ Blog("안녕하세요", "xptmxmdlqslek", Major.ANDROID)
+ )
+ private val binding by lazy {
+ FragmentHomeBinding.inflate(layoutInflater)
+ }
+
+ private val writeBlogViewModel by lazy {
+ ViewModelProvider(this@HomeFragment)[WriteBlogViewModel::class.java]
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ return binding.root
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val result = arguments?.getString("blogTitle")
+
+ arguments?.let {
+ val blogTitle = it.getString("blogTitle", "")
+ val blogContent = it.getString("blogContent", "")
+ Log.d("TEST",blogTitle)
+
+ blogList.add(Blog(blogTitle, blogContent, Major.ANDROID))
+
+ if (blogTitle.isNotEmpty() && blogContent.isNotEmpty()) {
+
+ }
+ }
+
+ setAddBlogList()
+ observeBlogList()
+ }
+
+ override fun onClick(v: View?) {
+
+ }
+
+ private fun setAddBlogList() {
+ writeBlogViewModel.addBlogList(blogList)
+ }
+
+ private fun observeBlogList() {
+ writeBlogViewModel.blogList.observe(this) {
+ val writeBlogAdaptor = WriteBlogAdaptor(it)
+ val layoutManager = GridLayoutManager(requireContext(), 1)
+ writeBlogAdaptor.notifyDataSetChanged()
+ binding.recycler.layoutManager = layoutManager
+ binding.recycler.adapter = writeBlogAdaptor
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/recycler/dum.kt b/app/src/main/java/com/example/demu_android/feature/recycler/dum.kt
new file mode 100644
index 0000000..7a17238
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/recycler/dum.kt
@@ -0,0 +1,4 @@
+package com.example.demu_android.feature.recycler
+
+class dum {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/recycler/home/WriteBlog/WriteBlogAdaptor.kt b/app/src/main/java/com/example/demu_android/feature/recycler/home/WriteBlog/WriteBlogAdaptor.kt
new file mode 100644
index 0000000..e77a401
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/recycler/home/WriteBlog/WriteBlogAdaptor.kt
@@ -0,0 +1,36 @@
+package com.example.demu_android.feature.recycler.home.WriteBlog
+
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.demu_android.databinding.ListBlogItemBinding
+import com.example.demu_android.feature.recycler.home.WriteBlog.data.Blog
+
+class
+WriteBlogAdaptor(
+ private val items: List,
+) : RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
+ val binding = ListBlogItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+
+ return Holder(binding)
+ }
+
+ override fun getItemCount(): Int {
+ return items.size
+ }
+
+ override fun onBindViewHolder(holder: Holder, position: Int) {
+ holder.bind(items[position])
+ }
+
+ class Holder(
+ private val binding: ListBlogItemBinding
+ ) : RecyclerView.ViewHolder(binding.root) {
+ fun bind(blog: Blog) {
+ binding.tvItemTitle.text = blog.title
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/recycler/home/WriteBlog/data/Blog.kt b/app/src/main/java/com/example/demu_android/feature/recycler/home/WriteBlog/data/Blog.kt
new file mode 100644
index 0000000..f2fc397
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/recycler/home/WriteBlog/data/Blog.kt
@@ -0,0 +1,9 @@
+package com.example.demu_android.feature.recycler.home.WriteBlog.data
+
+import com.example.demu_android.feature.type.Major
+
+data class Blog(
+ val title: String,
+ val content: String,
+ val major: Major
+)
diff --git a/app/src/main/java/com/example/demu_android/feature/recycler/home/dum.kt b/app/src/main/java/com/example/demu_android/feature/recycler/home/dum.kt
new file mode 100644
index 0000000..c745e38
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/recycler/home/dum.kt
@@ -0,0 +1,4 @@
+package com.example.demu_android.feature.recycler.home
+
+class dum {
+}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/signUp/SignUpActivity.kt b/app/src/main/java/com/example/demu_android/feature/signUp/SignUpActivity.kt
similarity index 80%
rename from DEMU_ANDROID/app/src/main/java/com/example/demu_android/signUp/SignUpActivity.kt
rename to app/src/main/java/com/example/demu_android/feature/signUp/SignUpActivity.kt
index 07f7bd6..4b11a42 100644
--- a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/signUp/SignUpActivity.kt
+++ b/app/src/main/java/com/example/demu_android/feature/signUp/SignUpActivity.kt
@@ -1,4 +1,4 @@
-package com.example.demu_android.signUp
+package com.example.demu_android.feature.signUp
import android.content.Intent
import android.os.Bundle
@@ -10,16 +10,20 @@ import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-import com.example.demu_android.Login.LoginActivity
+import com.example.demu_android.feature.Login.LoginActivity
import com.example.demu_android.R
+import com.example.demu_android.data.api.ApiProvider
+import com.example.demu_android.data.request.auth.SignUpRequest
+import com.example.demu_android.data.response.auth.SignUpResponse
import com.example.demu_android.databinding.ActivitySignUpBinding
-import com.example.demu_android.home.HomeActivity
-import com.example.demu_android.utils.isRegexEmail
-import com.example.demu_android.utils.isRegexNickName
-import com.example.demu_android.utils.isRegexPassword
-import kotlin.math.sign
+import com.example.demu_android.feature.MainActivity
+import com.example.demu_android.feature.utils.isRegexEmail
+import com.example.demu_android.feature.utils.isRegexNickName
+import com.example.demu_android.feature.utils.isRegexPassword
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
class SignUpActivity : AppCompatActivity(), View.OnClickListener {
private val binding by lazy {
@@ -30,6 +34,8 @@ class SignUpActivity : AppCompatActivity(), View.OnClickListener {
var passwordFlag = false
var passwordCheckFlag = false
+ private val retrofit = ApiProvider.getAuthApi()
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
@@ -45,14 +51,18 @@ class SignUpActivity : AppCompatActivity(), View.OnClickListener {
}
override fun onClick(v: View?) {
- val signUpToHome = Intent(this, HomeActivity::class.java)
val signUpToLogin = Intent(this, LoginActivity::class.java)
+ val email = binding.tieEmail.toString()
+ val nickName = binding.tieNickName.toString()
+ val password = binding.tiePassword.toString()
+
when(v?.id) {
R.id.btn_sign_up -> {
- if(flagCheck())
- startActivity(signUpToHome)
- else
+ if(flagCheck()) {
+ connectToServer(email, nickName, password)
+
+ } else
Toast.makeText(this, "정확히 값을 입력해주세요", Toast.LENGTH_LONG).show()
}
R.id.tv_bottom_login -> {
@@ -203,4 +213,32 @@ class SignUpActivity : AppCompatActivity(), View.OnClickListener {
private fun flagCheck(): Boolean {
return emailFlag && nickNameFlag && passwordFlag && passwordCheckFlag
}
+
+ private fun connectToServer(email: String, nickName: String, password: String) {
+ val signUpToLogin = Intent(this, LoginActivity::class.java)
+
+ retrofit.signUp(
+ SignUpRequest(
+ accountId = email,
+ nickname = nickName,
+ password = password
+ )
+ ).enqueue(object : Callback {
+ override fun onResponse(
+ call: Call,
+ response: Response
+ ) {
+ when(response.code()) {
+ 200 -> {
+ startActivity(signUpToLogin)
+ }
+ }
+ }
+
+ override fun onFailure(call: Call, t: Throwable) {
+ Log.d("TEST", t.message.toString())
+ Log.d("TEST", t.cause.toString())
+ }
+ })
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/type/Major.kt b/app/src/main/java/com/example/demu_android/feature/type/Major.kt
new file mode 100644
index 0000000..a532d21
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/type/Major.kt
@@ -0,0 +1,5 @@
+package com.example.demu_android.feature.type
+
+enum class Major {
+ BACKEND, ANDROID
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/feature/type/Tier.kt b/app/src/main/java/com/example/demu_android/feature/type/Tier.kt
new file mode 100644
index 0000000..b8c0623
--- /dev/null
+++ b/app/src/main/java/com/example/demu_android/feature/type/Tier.kt
@@ -0,0 +1,5 @@
+package com.example.demu_android.feature.type
+
+enum class Tier {
+ GRADE
+}
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/utils/utils.kt b/app/src/main/java/com/example/demu_android/feature/utils/utils.kt
similarity index 86%
rename from DEMU_ANDROID/app/src/main/java/com/example/demu_android/utils/utils.kt
rename to app/src/main/java/com/example/demu_android/feature/utils/utils.kt
index f8ae0ef..945eed3 100644
--- a/DEMU_ANDROID/app/src/main/java/com/example/demu_android/utils/utils.kt
+++ b/app/src/main/java/com/example/demu_android/feature/utils/utils.kt
@@ -1,4 +1,4 @@
-package com.example.demu_android.utils
+package com.example.demu_android.feature.utils
fun isRegexEmail(email: String): Boolean {
return email.matches("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$".toRegex())
@@ -11,4 +11,8 @@ fun isRegexPassword(password: String): Boolean {
fun isRegexNickName(nickName: String): Boolean {
return nickName.matches("^[\\s\\S]{2,10}$".toRegex())
+}
+
+fun blogFlagCheck() {
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/home/HomeActivity.kt b/app/src/main/java/com/example/demu_android/home/HomeActivity.kt
deleted file mode 100644
index 287e447..0000000
--- a/app/src/main/java/com/example/demu_android/home/HomeActivity.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.example.demu_android.home
-
-import android.os.Bundle
-import androidx.activity.enableEdgeToEdge
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-import com.example.demu_android.R
-
-class HomeActivity : AppCompatActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- setContentView(R.layout.activity_home)
-
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/demu_android/utils/utils.kt b/app/src/main/java/com/example/demu_android/utils/utils.kt
deleted file mode 100644
index f157f0b..0000000
--- a/app/src/main/java/com/example/demu_android/utils/utils.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.example.demu_android.utils
-
-fun isRegexEmail(email: String): Boolean {
- return email.matches("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$".toRegex())
-}
-
-fun isRegexPassword(password: String): Boolean {
- // 8~16글자, 대문자 1개, 소문자 1개, 숫자 1개
- return password.matches("^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@\$!%*#?&])[A-Za-z\\d@\$!%*#?&]{8,16}$".toRegex())
-}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_corner_color.xml b/app/src/main/res/drawable/bg_corner_color.xml
new file mode 100644
index 0000000..a269689
--- /dev/null
+++ b/app/src/main/res/drawable/bg_corner_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/blog_main_img.png b/app/src/main/res/drawable/blog_main_img.png
new file mode 100644
index 0000000..498b9ce
Binary files /dev/null and b/app/src/main/res/drawable/blog_main_img.png differ
diff --git a/app/src/main/res/drawable/drop_down_selector.xml b/app/src/main/res/drawable/drop_down_selector.xml
new file mode 100644
index 0000000..f0c6da8
--- /dev/null
+++ b/app/src/main/res/drawable/drop_down_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add_image.xml b/app/src/main/res/drawable/ic_add_image.xml
new file mode 100644
index 0000000..c9c8eed
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add_image.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_blog_write.xml b/app/src/main/res/drawable/ic_blog_write.xml
new file mode 100644
index 0000000..508631a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_blog_write.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_comment.png b/app/src/main/res/drawable/ic_comment.png
new file mode 100644
index 0000000..5a55bd8
Binary files /dev/null and b/app/src/main/res/drawable/ic_comment.png differ
diff --git a/app/src/main/res/drawable/ic_default_image.xml b/app/src/main/res/drawable/ic_default_image.xml
new file mode 100644
index 0000000..1d76058
--- /dev/null
+++ b/app/src/main/res/drawable/ic_default_image.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_down_arrow.xml b/app/src/main/res/drawable/ic_down_arrow.xml
new file mode 100644
index 0000000..232c9b6
--- /dev/null
+++ b/app/src/main/res/drawable/ic_down_arrow.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_float_button.xml b/app/src/main/res/drawable/ic_float_button.xml
new file mode 100644
index 0000000..ee78c13
--- /dev/null
+++ b/app/src/main/res/drawable/ic_float_button.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_float_plus.xml b/app/src/main/res/drawable/ic_float_plus.xml
new file mode 100644
index 0000000..2eefd5a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_float_plus.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_heart.png b/app/src/main/res/drawable/ic_heart.png
new file mode 100644
index 0000000..a8b249e
Binary files /dev/null and b/app/src/main/res/drawable/ic_heart.png differ
diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml
new file mode 100644
index 0000000..a3f62a8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_logo.png b/app/src/main/res/drawable/ic_logo.png
new file mode 100644
index 0000000..881ebc1
Binary files /dev/null and b/app/src/main/res/drawable/ic_logo.png differ
diff --git a/app/src/main/res/drawable/ic_my_page.xml b/app/src/main/res/drawable/ic_my_page.xml
new file mode 100644
index 0000000..7c6d24e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_my_page.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_progress_bar.xml b/app/src/main/res/drawable/ic_progress_bar.xml
new file mode 100644
index 0000000..8fe3f19
--- /dev/null
+++ b/app/src/main/res/drawable/ic_progress_bar.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_progress_bar_now_state.xml b/app/src/main/res/drawable/ic_progress_bar_now_state.xml
new file mode 100644
index 0000000..ae1cc03
--- /dev/null
+++ b/app/src/main/res/drawable/ic_progress_bar_now_state.xml
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml
new file mode 100644
index 0000000..1d372b0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_search.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_setting.xml b/app/src/main/res/drawable/ic_setting.xml
new file mode 100644
index 0000000..57c9339
--- /dev/null
+++ b/app/src/main/res/drawable/ic_setting.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_tier_bronze.xml b/app/src/main/res/drawable/ic_tier_bronze.xml
new file mode 100644
index 0000000..7849e70
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tier_bronze.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_tier_silver.xml b/app/src/main/res/drawable/ic_tier_silver.xml
new file mode 100644
index 0000000..48f5bf4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_tier_silver.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_write_black.xml b/app/src/main/res/drawable/ic_write_black.xml
new file mode 100644
index 0000000..f536e2c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_write_black.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_write_gray.xml b/app/src/main/res/drawable/ic_write_gray.xml
new file mode 100644
index 0000000..4c57bee
--- /dev/null
+++ b/app/src/main/res/drawable/ic_write_gray.xml
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/menu_color_style.xml b/app/src/main/res/drawable/menu_color_style.xml
new file mode 100644
index 0000000..fa50305
--- /dev/null
+++ b/app/src/main/res/drawable/menu_color_style.xml
@@ -0,0 +1,10 @@
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/button_color_nocheck.xml b/app/src/main/res/drawable/my_page_input_style.xml
similarity index 51%
rename from DEMU_ANDROID/app/src/main/res/drawable/button_color_nocheck.xml
rename to app/src/main/res/drawable/my_page_input_style.xml
index f361cd8..5312d5d 100644
--- a/DEMU_ANDROID/app/src/main/res/drawable/button_color_nocheck.xml
+++ b/app/src/main/res/drawable/my_page_input_style.xml
@@ -2,8 +2,9 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/DEMU_ANDROID/app/src/main/res/drawable/button_color_pressed.xml b/app/src/main/res/drawable/my_page_progress_bar_style.xml
similarity index 64%
rename from DEMU_ANDROID/app/src/main/res/drawable/button_color_pressed.xml
rename to app/src/main/res/drawable/my_page_progress_bar_style.xml
index ba60d84..4308e08 100644
--- a/DEMU_ANDROID/app/src/main/res/drawable/button_color_pressed.xml
+++ b/app/src/main/res/drawable/my_page_progress_bar_style.xml
@@ -2,8 +2,8 @@
-
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/selector_bottom_sheet_color.xml b/app/src/main/res/drawable/selector_bottom_sheet_color.xml
new file mode 100644
index 0000000..ca14c16
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bottom_sheet_color.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/tier_gold.xml b/app/src/main/res/drawable/tier_gold.xml
new file mode 100644
index 0000000..f5c2e06
--- /dev/null
+++ b/app/src/main/res/drawable/tier_gold.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/up_arrow.xml b/app/src/main/res/drawable/up_arrow.xml
new file mode 100644
index 0000000..0b11d08
--- /dev/null
+++ b/app/src/main/res/drawable/up_arrow.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
deleted file mode 100644
index d27c75c..0000000
--- a/app/src/main/res/layout/activity_home.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index f61e08f..c459366 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -8,14 +8,14 @@
android:background="@color/back_white"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".Login.LoginActivity">
+ tools:context=".feature.Login.LoginActivity">
+ app:layout_constraintGuide_begin="90dp" />
@@ -50,8 +50,7 @@
app:errorEnabled="true"
app:errorIconDrawable="@null"
app:hintEnabled="false"
- app:boxStrokeColor="@color/black"
- android:textColorHint="@color/hint_color"
+ android:textColorHint="@color/text_gray"
android:layout_marginHorizontal="18dp"
app:layout_constraintTop_toBottomOf="@id/tv_email"
>
@@ -59,7 +58,7 @@
@@ -94,21 +93,20 @@
style="@style/Widget.Material3.TextInputLayout.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textColorHint="@color/hint_color"
+ android:textColorHint="@color/text_default"
app:hintEnabled="false"
app:layout_constraintTop_toBottomOf="@id/tv_password"
app:passwordToggleEnabled="true"
app:passwordToggleDrawable="@drawable/password_toggle_selector"
app:errorIconDrawable="@null"
app:errorEnabled="true"
- android:layout_marginHorizontal="18dp"
- >
+ android:layout_marginHorizontal="18dp">
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 3ca955b..a94777e 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,69 +1,32 @@
-
+ android:background="@color/back_white"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
-
-
-
-
-
-
-
-
-
-
+ app:layout_constraintStart_toStartOf="parent" />
-
+
-
diff --git a/DEMU_ANDROID/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_onboarding.xml
similarity index 68%
rename from DEMU_ANDROID/app/src/main/res/layout/activity_main.xml
rename to app/src/main/res/layout/activity_onboarding.xml
index 9f29212..34483a2 100644
--- a/DEMU_ANDROID/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_onboarding.xml
@@ -1,46 +1,58 @@
-
+ tools:context=".feature.OnBoardingActivity">
+ app:layout_constraintGuide_begin="54dp" />
-
-
+
+
+
+ app:layout_constraintTop_toBottomOf="@id/tv_onboarding_title_1"
+ app:layout_constraintStart_toStartOf="@id/gl_start" />
-
+
+ tools:context=".feature.Login.LoginActivity">
-
-
+ app:layout_constraintTop_toTopOf="@id/glTop"/>
@@ -71,7 +56,7 @@
@@ -109,7 +94,7 @@
app:errorEnabled="true"
app:errorIconDrawable="@null"
app:hintEnabled="false"
- android:textColorHint="@color/hint_color"
+ android:textColorHint="@color/text_gray"
android:layout_marginHorizontal="18dp"
app:layout_constraintTop_toBottomOf="@id/tv_nick_name"
>
@@ -117,7 +102,7 @@
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
index 6dbe162..6bd271d 100644
--- a/app/src/main/res/layout/activity_splash.xml
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -6,7 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/back_white"
- tools:context=".SplashActivity">
+ tools:context=".feature.SplashActivity">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_my_page.xml b/app/src/main/res/layout/fragment_my_page.xml
new file mode 100644
index 0000000..3b36fb2
--- /dev/null
+++ b/app/src/main/res/layout/fragment_my_page.xml
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml
new file mode 100644
index 0000000..80df266
--- /dev/null
+++ b/app/src/main/res/layout/fragment_search.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_write_blog.xml b/app/src/main/res/layout/fragment_write_blog.xml
new file mode 100644
index 0000000..1277245
--- /dev/null
+++ b/app/src/main/res/layout/fragment_write_blog.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/list_blog_item.xml b/app/src/main/res/layout/list_blog_item.xml
new file mode 100644
index 0000000..8dd8192
--- /dev/null
+++ b/app/src/main/res/layout/list_blog_item.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/list_bottom_sheet_item.xml b/app/src/main/res/layout/list_bottom_sheet_item.xml
new file mode 100644
index 0000000..9dd6067
--- /dev/null
+++ b/app/src/main/res/layout/list_bottom_sheet_item.xml
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/menu_bottom_view.xml b/app/src/main/res/menu/menu_bottom_view.xml
new file mode 100644
index 0000000..0c3ff2f
--- /dev/null
+++ b/app/src/main/res/menu/menu_bottom_view.xml
@@ -0,0 +1,23 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_drop_down_list.xml b/app/src/main/res/menu/menu_drop_down_list.xml
new file mode 100644
index 0000000..169bddc
--- /dev/null
+++ b/app/src/main/res/menu/menu_drop_down_list.xml
@@ -0,0 +1,58 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index e0a24d5..bcb145a 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -1,6 +1,6 @@
-
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 21511af..9898d40 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -5,10 +5,16 @@
#ff0000
#1B69FF
- #1F262C
#98A4AF
#D2E1FD
#F9FAFB
- #98A4AF
+
+ #98A4AF
+ #1F262C
+ #707583
+ #D9D9D9
+
+ #707583
+ #E9E9E9
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e1bd226..295519c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,4 +2,21 @@
DEMU_ANDROID
LoginActivity
회원가입하기
+ 로그인
+
+
+ - backend
+ - frontend
+ - iOS
+ - AOS
+ - AI
+ - design
+ - flutter
+ - full stack
+ - game
+ - security
+ - embedded
+ - devops
+ - 기타 전공
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 6e18210..9d12366 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,10 +1,12 @@
-
-
+
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index f74b04b..922f551 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,5 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
- alias(libs.plugins.jetbrains.kotlin.android) apply false
+ alias(libs.plugins.kotlin.android) apply false
}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..3e0dc03
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,24 @@
+# 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=truex
+# android.enableJetifier=ture
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
new file mode 100644
index 0000000..746b834
--- /dev/null
+++ b/gradle/libs.versions.toml
@@ -0,0 +1,29 @@
+[versions]
+agp = "8.7.0"
+kotlin = "1.9.24"
+coreKtx = "1.13.1"
+junit = "4.13.2"
+junitVersion = "1.2.1"
+espressoCore = "3.6.1"
+appcompat = "1.7.0"
+material = "1.12.0"
+activity = "1.9.3"
+constraintlayout = "2.1.4"
+retrofit = "2.9.0"
+
+[libraries]
+androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
+converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" }
+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-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
+material = { group = "com.google.android.material", name = "material", version.ref = "material" }
+androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
+androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
+retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
+
+[plugins]
+android-application = { id = "com.android.application", version.ref = "agp" }
+kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0eea6d5
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sun Oct 20 19:45:23 KST 2024
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 59db43a..8a396b3 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -19,6 +19,6 @@ dependencyResolutionManagement {
}
}
-rootProject.name = "DEMU_ANDROID"
+rootProject.name = "DEMU-ANDROID"
include(":app")
\ No newline at end of file