From e57d2d3fda33f248ee6cdd57108b28401b3e3007 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Mon, 24 Jun 2024 14:44:20 +0900 Subject: [PATCH 01/57] =?UTF-8?q?Docs[README.md]:=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=A6=AC=EB=93=9C=EB=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index cc0acc5a..16df0449 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ # android-contacts +# 1단계 - 연락처 추가 +## 기능 요구사항 +간단한 연락처를 구현한다. +- 연락처를 추가한다. +- 이름과 전화번호는 필수 값이다. + - 입력하지 않으면 토스트 메시지를 보여준다. +- 전화번호 입력은 숫자만 가능하다. +- 더보기를 눌러 입력 폼을 확장할 수 있다. + - 생일, 성별, 메모 입력 폼이 등장한다. + - 성별을 둘 중 하나를 선택할 수 있다. +- 저장 버튼을 누르면 '저장이 완료 되었습니다' 라는 토스트 메시지를 보여준다. +- 취소 버튼을 누르면 '취소 되었습니다' 라는 토스트 메시지를 보여준다. \ No newline at end of file From eb1bce61575b24302922bd1bf19789590281e4ca Mon Sep 17 00:00:00 2001 From: jmc98 Date: Mon, 24 Jun 2024 14:56:47 +0900 Subject: [PATCH 02/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=96=BC=EA=B5=B4=20=EC=95=84=EC=9D=B4=EC=BD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- app/src/main/res/layout/activity_main.xml | 17 +++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 16df0449..2b92fe00 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,6 @@ - 생일, 성별, 메모 입력 폼이 등장한다. - 성별을 둘 중 하나를 선택할 수 있다. - 저장 버튼을 누르면 '저장이 완료 되었습니다' 라는 토스트 메시지를 보여준다. -- 취소 버튼을 누르면 '취소 되었습니다' 라는 토스트 메시지를 보여준다. \ No newline at end of file +- 취소 버튼을 누르면 '취소 되었습니다' 라는 토스트 메시지를 보여준다. +### 세부 사항 +- 아이콘 출처 : https://www.flaticon.com/search?word=face \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 24d17df2..62ae92c7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - - + - + + From 98e505532524cef4ece1624b55b93d024e29eaf5 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Mon, 24 Jun 2024 15:03:53 +0900 Subject: [PATCH 03/57] =?UTF-8?q?Design[colors.xml]:=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=AF=BC=ED=8A=B8=EC=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/colors.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 768b058a..1fcd286a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,4 +2,5 @@ #FF000000 #FFFFFFFF + #DFF3F6 From 8ac5326c2e18d7747acdce3af91191855c6f1982 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Mon, 24 Jun 2024 15:05:15 +0900 Subject: [PATCH 04/57] =?UTF-8?q?Design[face.png]:=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=96=BC=EA=B5=B4=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/face.png | Bin 0 -> 10772 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/src/main/res/drawable/face.png diff --git a/app/src/main/res/drawable/face.png b/app/src/main/res/drawable/face.png new file mode 100644 index 0000000000000000000000000000000000000000..6f699b0f16299b0facdcdd047164419c6ff708dd GIT binary patch literal 10772 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 jw Date: Mon, 24 Jun 2024 15:05:50 +0900 Subject: [PATCH 05/57] =?UTF-8?q?Design[text=5Fbackground.xml]:=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=9E=85=EB=A0=A5=EC=B0=BD=20=EB=B0=B1?= =?UTF-8?q?=EA=B7=B8=EB=9D=BC=EC=9A=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/text_background.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/src/main/res/drawable/text_background.xml diff --git a/app/src/main/res/drawable/text_background.xml b/app/src/main/res/drawable/text_background.xml new file mode 100644 index 00000000..45d451ec --- /dev/null +++ b/app/src/main/res/drawable/text_background.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file From 53b6d61b1f5505989a643fea802cb5f5f4336057 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Mon, 24 Jun 2024 16:04:13 +0900 Subject: [PATCH 06/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20activity=5Fmain.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 97 ++++++++++++++++++++++- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 62ae92c7..4549873f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - + android:layout_margin="20dp" + android:src="@drawable/face" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toTopOf="@+id/namePhoneMail" + app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + + + + + + - + From a433b8cfbe3386a83933294c940db37f8fd149d6 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 00:09:50 +0900 Subject: [PATCH 07/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20more.xml=20=EB=B6=80=EB=B6=84=EC=9D=84=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=ED=95=A9=EB=B3=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 40 ++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4549873f..2e3f8a83 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -28,7 +28,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/face" - app:layout_constraintBottom_toTopOf="@+id/birthSexMemo"> + app:layout_constraintBottom_toTopOf="@+id/more"> + + + + + + + + + From b6ca6dc0c7f085c6bcb970cea39c70ca86021fc3 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 00:24:58 +0900 Subject: [PATCH 08/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=83=9D=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 생일 editText를 텍스트뷰로 변경 --- app/src/main/res/layout/activity_main.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2e3f8a83..652b2875 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -87,13 +87,16 @@ android:layout_marginRight="15dp" android:visibility="gone"> - + android:hint="생일" + android:gravity="left|center" + android:textSize="18dp" + /> Date: Tue, 25 Jun 2024 14:49:03 +0900 Subject: [PATCH 09/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 라디오 버튼 추가, 데이트피커를 넣었다가 뺌 --- app/src/main/res/layout/activity_main.xml | 300 ++++++++++++---------- 1 file changed, 167 insertions(+), 133 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 652b2875..ce2f67aa 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,148 +1,182 @@ - - - - - - - + android:layout_height="match_parent"> - - - + + - - - - - + + + + + + + + + - - - - - - - - + + + + + + - - + + + + + + + + + + + + + + + + + + + - - + android:layout_height="60dp" + android:orientation="horizontal" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> + + + + + + + + + + - - - - - - - - - From 439e8bfa812ed0bfc65c91ba4e6a6deff182153c Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 14:49:50 +0900 Subject: [PATCH 10/57] =?UTF-8?q?Feat[]:=20=EC=B6=94=EA=B0=80=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 27 +++++++++++++++++++ .../campus/tech/kakao/contacts/Contact.kt | 20 ++++++++++++++ .../campus/tech/kakao/contacts/ContactDao.kt | 23 ++++++++++++++++ .../tech/kakao/contacts/ContactDatabase.kt | 10 +++++++ 4 files changed, 80 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/contacts/Contact.kt create mode 100644 app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt create mode 100644 app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c5add08f..348359e4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") + id ("org.jetbrains.kotlin.kapt") } android { @@ -44,4 +45,30 @@ dependencies { testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + + val room_version = "2.6.1" + + implementation("androidx.room:room-runtime:$room_version") + annotationProcessor("androidx.room:room-compiler:$room_version") + + // To use Kotlin annotation processing tool (kapt) + kapt("androidx.room:room-compiler:$room_version") + + // optional - Kotlin Extensions and Coroutines support for Room + implementation("androidx.room:room-ktx:$room_version") + + // optional - RxJava2 support for Room + implementation("androidx.room:room-rxjava2:$room_version") + + // optional - RxJava3 support for Room + implementation("androidx.room:room-rxjava3:$room_version") + + // optional - Guava support for Room, including Optional and ListenableFuture + implementation("androidx.room:room-guava:$room_version") + + // optional - Test helpers + testImplementation("androidx.room:room-testing:$room_version") + + // optional - Paging 3 Integration + implementation("androidx.room:room-paging:$room_version") } diff --git a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt new file mode 100644 index 00000000..33ce2786 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt @@ -0,0 +1,20 @@ +package campus.tech.kakao.contacts + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +class Contact ( + @PrimaryKey(autoGenerate = true) val id: Int, + @ColumnInfo(name = "name") val name: String, + @ColumnInfo(name = "phone") val phone: String, + @ColumnInfo(name = "email") val email: String, + @ColumnInfo(name = "birth") val birth: String, + @ColumnInfo(name = "sex") val sex: String, + @ColumnInfo(name = "memo") val memo: String +){ + constructor(name: String, phone: String, email: String, birth: String, sex: String, memo: String): + this(0, name, phone, email, birth, sex, memo) + +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt b/app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt new file mode 100644 index 00000000..80b57f43 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt @@ -0,0 +1,23 @@ +package campus.tech.kakao.contacts + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy.Companion.REPLACE +import androidx.room.Query + +@Dao +interface ContactDao { + @Insert(onConflict = REPLACE) + fun insert(contact: Contact) + + @Query("SELECT * FROM Contact") + fun getAll(): List + + @Query("SELECT * FROM Contact WHERE id = :id") + fun getById(id: Int): Contact + + @Query("DELETE FROM Contact WHERE id = :id") + fun deleteById(id: Int) + +} + diff --git a/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt b/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt new file mode 100644 index 00000000..5a6d590c --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt @@ -0,0 +1,10 @@ +package campus.tech.kakao.contacts + +import androidx.room.Database +import androidx.room.RoomDatabase + +@Database(entities = [Contact::class], version = 1) +abstract class ContactDatabase: RoomDatabase() { + abstract fun contactDao(): ContactDao + +} \ No newline at end of file From a1a780aa639cb8d2139d214c9a2665bc11d93df2 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 14:50:17 +0900 Subject: [PATCH 11/57] =?UTF-8?q?Design[face.png]:=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EC=96=BC=EA=B5=B4=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/face.png | Bin 10772 -> 1995 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/drawable/face.png b/app/src/main/res/drawable/face.png index 6f699b0f16299b0facdcdd047164419c6ff708dd..4831c1b69061c0092f6f8628fde9899231c97049 100644 GIT binary patch literal 1995 zcmV;+2Q>JJP)Px+g-Jv~RCr$PU0ZhBHV_>s-AA33#NJ3H$NkVQ67NDEbt-owbyiYkAGO#HMCwqC zgt;>q5R^@wlasWB@R&Pu=K&B3G=Hi}AXFWF9-L+XDl5SZzzjfT2~-|_wtyLc$`YtN z{A>X;0GB1OTCH#B7rLQ6-Ry~e<(47P4bjP;UE2fy9seB~`X2w^f_B?KHZPTBoE&~~ z7QjN^FK8J8-4ew=xt|D1)6jOYpzl)yWD)@MguZIEJ6Gtb@9(ArMpXcQ`@H@V0*xW` zOMpZ${`$6gEQxrk?2bT=bP-musT2pGrJKKtt)N`TyU@_%_Slrs&Vp{6 zKufFdX&U-kDpGO>ps=Ieg;%<>a&x9H${PEU7P1sQ$OuZ<<2!tyLZU8JF)~xwxd>`X&F0xsjv=<1Bx$^z=8os2{N8XGt`UmC8nUU77nBV^ThDW$vP&0c09xMs2SI))eDJ$3O+zmsklMPCIZ164No1B&HUofa@KE?D z_jA(48E?Be1A)LhVxCn^1qfz;U;+T8o^#XyF6!v04bG8wzuYoc)F)W7bh8r%qnD!) zJ97uAhxdI?N)8qf*c!YxTR?07X}uE7nE*hw|C~lxf$L&*B^`C^KNRuy^qf<|Xg-jb z;ajXgO+knd&+)#8DH|=JuZU(aK*duhXet1-{C%Vzyeus`GY1fkmhpe)9*?ZVV=N2W zvD4@O?kr_k=57Lgk?LIMlrKd^Dgc%bYYsb;g|_fYA5UuaxbSKCU8$fp(d|u@6~F+1 zCU~O3pv6QvTlmw_8W4X8x6!Nx1^|f!`U9h!-%`LymJF}7Z8$X`G-0p?0EvEL7-raz z5qTd4WJ1SXU>ec@&?KD+XRe1MfSL_>Q|v7HhTJVk6mUr%$o44&0LbMWQK0()Ja<@2 ztO9ARks}w^y=i1VC=EdXAhAC(sa_k`nvFDecglLdr%#TDex+d{>qY@c(vLKg!Smvp zFU_Za?7cm{(uLN;zxxNXIEjmS1D~=6=oVV12mlyy_MBz!BFq%!2p|AiaX4)q>QpDk9z+`a{NtP~wJQf8dop8}{ z#JM9DP!a&d!HYba0HA39K$Tc5y@&uv*&dQ^X9`H<(OUga0)QMxDb-S1!HQax007Bh z%>7HsiO5E@003o?=Po+2(oV8)|B{bE*g*zBUWA#W8JLt7Aq$Yg(31U&5hCzbrwqX1 zdV%CI^qfeD1vuEq_fN!5uSjs|ABcdUb50@vEFg)i5w4Ro_1c~T)C~C+2moL(vmdxN z!FThOloF*+3;=+Jq?G$w1)YenTxw(x00<4Ch`$9OJQ)E7K#FzcepM`<2IU zQ~;n>kaMNXR6#)~7}M@&r6E?xvixlpauZ6f;UA)i101iA3?Kd zA83wmA}T_7->Us)09q@6?u5JM1P!FyENeGeK(B&{T-I@wr{qv8k6N5@G{+1;1VP>_ z=orrJ+5ih>YQLjcm&x(==aU6M1VM3p{Tj;FDCbAbSH}G36d@Y`?o>1BDT4q;JDnU| zO7JcK7+y`yy5vYpDN=jG{9S~f6$K3!Wx09K>pB@pz?YsIU+~V_1JBNcQ;Ri#z};1G z&>Gt8t=T=IbD^LihO76-zp@vfX-)B?KBGZ%Wa3XdP%>CGkQM}dk}c-<|akFe3q zhf2c7NcaZD-Gb;xeAwRYb8@c_UtQ0i)1SOTFZ;X5tfiy2q5#A^0oc&DI?=-4bLabF zd4MDc2TGELaDC2NpL55YW-`Ss;EaQw@{jn8{;u1o0Q8;o#I73~g>I@*(8WaPP)8Ck z!qb?vvTgCuSDH^13m8tyDO8l!+C4X4U5O5$X*US~hJK>JjaQQrdVjr>1K=kxe*S4H zZqolr+moNO<$U3gD$tMl=WI2$_)gnS+5+AKCNlt)QJw*q0jMm2%EQkVFauCo0+olK dEub<0{{aFD2&^8x>l*+7002ovPDHLkV1nmSlWqV2 literal 10772 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 jw Date: Tue, 25 Jun 2024 14:52:14 +0900 Subject: [PATCH 12/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4,=20=EB=8B=AC=EB=A0=A5,=20=EB=8D=94=EB=B3=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 생일 클릭 시 달력 보이게 하는 것, 더보기 클릭 시 추가 정보 입력 창 보이게 하는 것 추가 --- .../tech/kakao/contacts/MainActivity.kt | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 7aae79fe..2d17c29a 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -1,11 +1,86 @@ package campus.tech.kakao.contacts +import android.app.DatePickerDialog import android.os.Bundle +import android.view.View +import android.widget.DatePicker +import android.widget.TextView +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.room.Room +import java.util.Calendar class MainActivity : AppCompatActivity() { + private lateinit var birth: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + // Initialize UI elements + val name = findViewById(R.id.name) + val phone = findViewById(R.id.phone) + val mail = findViewById(R.id.mail) + birth = findViewById(R.id.birth) + val sex = findViewById(R.id.sex) + val memo = findViewById(R.id.memo) + val save = findViewById(R.id.save) + val cancel = findViewById(R.id.cancel) + val birthSexMemo = findViewById(R.id.birthSexMemo) + val moreText = findViewById(R.id.moreText) + birth.setOnClickListener { + showDatePickerDialog() + } + moreText.setOnClickListener { + if (moreText.visibility == View.VISIBLE) { + moreText.visibility = View.GONE + birthSexMemo.visibility = View.VISIBLE + } else { + moreText.visibility = View.VISIBLE + birthSexMemo.visibility = View.GONE + } + } + // Initialize database + val database = Room.databaseBuilder( + applicationContext, + ContactDatabase::class.java, "database-name" + ).allowMainThreadQueries().build() + // Set click listener for save button + save.setOnClickListener { + if (name.text.toString() == "") { + Toast.makeText(this, "이름은 필수 값입니다", Toast.LENGTH_SHORT).show() + } + else if (phone.text.toString() == "") { + Toast.makeText(this, "전화 번호는 필수 값입니다", Toast.LENGTH_SHORT).show() + } + else{ + // Insert data into database + val contact = Contact( + name.text.toString(), + phone.text.toString(), + mail.text.toString(), + birth.text.toString(), + sex.text.toString(), + memo.text.toString() + ) + database.contactDao().insert(contact) + Toast.makeText(this, "저장이 완료 되었습니다", Toast.LENGTH_SHORT).show() + } + + } + // Set click listener for cancel button + cancel.setOnClickListener { + Toast.makeText(this, "취소 되었습니다", Toast.LENGTH_SHORT).show() + } + + } + + // Show date picker dialog + fun showDatePickerDialog() { + val calendar = Calendar.getInstance() + val datePicker = DatePickerDialog( + this, {DatePicker, year:Int, month:Int, dayOfMonth:Int -> + val selectedDate = "$year.${month+1}.$dayOfMonth" + birth.text = selectedDate + }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)) + datePicker.show() } } From 23f9cd2f20b5933c61802b725730b60118c6fe71 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 15:05:33 +0900 Subject: [PATCH 13/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=20=ED=83=80?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전화번호 타입을 String에서 Int로 변경 --- app/src/main/java/campus/tech/kakao/contacts/Contact.kt | 4 ++-- .../main/java/campus/tech/kakao/contacts/MainActivity.kt | 6 +++--- app/src/main/res/layout/activity_main.xml | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt index 33ce2786..ad89aa22 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt @@ -8,13 +8,13 @@ import androidx.room.PrimaryKey class Contact ( @PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "name") val name: String, - @ColumnInfo(name = "phone") val phone: String, + @ColumnInfo(name = "phone") val phone: Int, @ColumnInfo(name = "email") val email: String, @ColumnInfo(name = "birth") val birth: String, @ColumnInfo(name = "sex") val sex: String, @ColumnInfo(name = "memo") val memo: String ){ - constructor(name: String, phone: String, email: String, birth: String, sex: String, memo: String): + constructor(name: String, phone: Int, email: String, birth: String, sex: String, memo: String): this(0, name, phone, email, birth, sex, memo) } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 2d17c29a..ca2ac5f9 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -45,17 +45,17 @@ class MainActivity : AppCompatActivity() { ).allowMainThreadQueries().build() // Set click listener for save button save.setOnClickListener { - if (name.text.toString() == "") { + if (name.text.isEmpty()) { Toast.makeText(this, "이름은 필수 값입니다", Toast.LENGTH_SHORT).show() } - else if (phone.text.toString() == "") { + else if (phone.text.isEmpty()) { Toast.makeText(this, "전화 번호는 필수 값입니다", Toast.LENGTH_SHORT).show() } else{ // Insert data into database val contact = Contact( name.text.toString(), - phone.text.toString(), + phone.text.toString().toInt(), mail.text.toString(), birth.text.toString(), sex.text.toString(), diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ce2f67aa..f266b21b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -47,7 +47,8 @@ android:layout_height="50dp" android:layout_marginBottom="20dp" android:background="@drawable/text_background" - android:hint="전화번호" /> + android:hint="전화번호" + android:inputType="number"/> Date: Tue, 25 Jun 2024 15:11:48 +0900 Subject: [PATCH 14/57] =?UTF-8?q?Refactor[MainActivity.kt]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20UI=20=EC=84=A0=EC=96=B8=20=EC=9C=84=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UI 선언 위치를 onCreate 밖으로 빼냄 --- .../tech/kakao/contacts/MainActivity.kt | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index ca2ac5f9..49880765 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -4,6 +4,8 @@ import android.app.DatePickerDialog import android.os.Bundle import android.view.View import android.widget.DatePicker +import android.widget.EditText +import android.widget.RadioButton import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -11,21 +13,36 @@ import androidx.room.Room import java.util.Calendar class MainActivity : AppCompatActivity() { + // Declare UI elements + private lateinit var name: EditText + private lateinit var phone: EditText + private lateinit var mail: EditText private lateinit var birth: TextView + private lateinit var sex: TextView + private lateinit var female: RadioButton + private lateinit var male: RadioButton + private lateinit var memo: EditText + private lateinit var save: TextView + private lateinit var cancel: TextView + private lateinit var moreText: TextView + private lateinit var birthSexMemo: View + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Initialize UI elements - val name = findViewById(R.id.name) - val phone = findViewById(R.id.phone) - val mail = findViewById(R.id.mail) - birth = findViewById(R.id.birth) - val sex = findViewById(R.id.sex) - val memo = findViewById(R.id.memo) - val save = findViewById(R.id.save) - val cancel = findViewById(R.id.cancel) - val birthSexMemo = findViewById(R.id.birthSexMemo) - val moreText = findViewById(R.id.moreText) + name = findViewById(R.id.name) + phone = findViewById(R.id.phone) + mail = findViewById(R.id.mail) + birth = findViewById(R.id.birth) + sex = findViewById(R.id.sex) + female = findViewById(R.id.female) + male = findViewById(R.id.male) + memo = findViewById(R.id.memo) + save = findViewById(R.id.save) + cancel = findViewById(R.id.cancel) + birthSexMemo = findViewById(R.id.birthSexMemo) + moreText = findViewById(R.id.moreText) birth.setOnClickListener { showDatePickerDialog() } @@ -52,6 +69,7 @@ class MainActivity : AppCompatActivity() { Toast.makeText(this, "전화 번호는 필수 값입니다", Toast.LENGTH_SHORT).show() } else{ + if (female.isChecked) // Insert data into database val contact = Contact( name.text.toString(), From 5f098c67ea7f9527f567f314eaa3d9b027d1ff03 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 15:16:48 +0900 Subject: [PATCH 15/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=84=B1=EB=B3=84=20=EC=84=A0=ED=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/campus/tech/kakao/contacts/MainActivity.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 49880765..9ef8772b 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -18,7 +18,7 @@ class MainActivity : AppCompatActivity() { private lateinit var phone: EditText private lateinit var mail: EditText private lateinit var birth: TextView - private lateinit var sex: TextView + private lateinit var sex:String private lateinit var female: RadioButton private lateinit var male: RadioButton private lateinit var memo: EditText @@ -35,7 +35,6 @@ class MainActivity : AppCompatActivity() { phone = findViewById(R.id.phone) mail = findViewById(R.id.mail) birth = findViewById(R.id.birth) - sex = findViewById(R.id.sex) female = findViewById(R.id.female) male = findViewById(R.id.male) memo = findViewById(R.id.memo) @@ -69,14 +68,19 @@ class MainActivity : AppCompatActivity() { Toast.makeText(this, "전화 번호는 필수 값입니다", Toast.LENGTH_SHORT).show() } else{ - if (female.isChecked) + if (female.isChecked) { + sex = "여자" + } + else if (male.isChecked) { + sex = "남자" + } // Insert data into database val contact = Contact( name.text.toString(), phone.text.toString().toInt(), mail.text.toString(), birth.text.toString(), - sex.text.toString(), + sex, memo.text.toString() ) database.contactDao().insert(contact) From 29e0327053a826dd40c76185bb4fa49deb339d85 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 19:26:22 +0900 Subject: [PATCH 16/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/contacts/Contact.kt | 10 +++--- .../tech/kakao/contacts/ContactDatabase.kt | 5 +-- .../tech/kakao/contacts/MainActivity.kt | 35 +++++++++++++++++-- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt index ad89aa22..e3b4728e 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt @@ -9,12 +9,12 @@ class Contact ( @PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "name") val name: String, @ColumnInfo(name = "phone") val phone: Int, - @ColumnInfo(name = "email") val email: String, - @ColumnInfo(name = "birth") val birth: String, - @ColumnInfo(name = "sex") val sex: String, - @ColumnInfo(name = "memo") val memo: String + @ColumnInfo(name = "email") val email: String?, + @ColumnInfo(name = "birth") val birth: String?, + @ColumnInfo(name = "sex") val sex: String?, + @ColumnInfo(name = "memo") val memo: String? ){ - constructor(name: String, phone: Int, email: String, birth: String, sex: String, memo: String): + constructor(name: String, phone: Int, email: String?, birth: String?, sex: String?, memo: String?): this(0, name, phone, email, birth, sex, memo) } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt b/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt index 5a6d590c..14d4876f 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt @@ -2,9 +2,10 @@ package campus.tech.kakao.contacts import androidx.room.Database import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase -@Database(entities = [Contact::class], version = 1) +@Database(entities = [Contact::class], version = 2) abstract class ContactDatabase: RoomDatabase() { abstract fun contactDao(): ContactDao - } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 9ef8772b..963d4765 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -2,14 +2,16 @@ package campus.tech.kakao.contacts import android.app.DatePickerDialog import android.os.Bundle +import android.util.Log import android.view.View -import android.widget.DatePicker import android.widget.EditText import android.widget.RadioButton import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.room.Room +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase import java.util.Calendar class MainActivity : AppCompatActivity() { @@ -18,7 +20,7 @@ class MainActivity : AppCompatActivity() { private lateinit var phone: EditText private lateinit var mail: EditText private lateinit var birth: TextView - private lateinit var sex:String + private var sex:String? = null private lateinit var female: RadioButton private lateinit var male: RadioButton private lateinit var memo: EditText @@ -27,6 +29,31 @@ class MainActivity : AppCompatActivity() { private lateinit var moreText: TextView private lateinit var birthSexMemo: View + val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + "CREATE TABLE new_Contact (" + + "id INTEGER PRIMARY KEY NOT NULL, " + + "name TEXT NOT NULL, " + + "phone INTEGER NOT NULL, " + + "email TEXT, " + + "birth TEXT, " + + "sex TEXT, " + + "memo TEXT)" + ) + // 데이터 복사 + database.execSQL( + "INSERT INTO new_Contact (id, name, phone, email, birth, sex, memo) " + + "SELECT id, name, CAST(phone AS INTEGER), email, birth, sex, memo FROM Contact") + // 이전 테이블 제거 + database.execSQL("DROP TABLE Contact") + + // 새 테이블 이름 바꾸기 + database.execSQL("ALTER TABLE new_Contact RENAME TO Contact") + } + } + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -58,7 +85,8 @@ class MainActivity : AppCompatActivity() { val database = Room.databaseBuilder( applicationContext, ContactDatabase::class.java, "database-name" - ).allowMainThreadQueries().build() + ).addMigrations(MIGRATION_1_2).allowMainThreadQueries().build() + // Set click listener for save button save.setOnClickListener { if (name.text.isEmpty()) { @@ -85,6 +113,7 @@ class MainActivity : AppCompatActivity() { ) database.contactDao().insert(contact) Toast.makeText(this, "저장이 완료 되었습니다", Toast.LENGTH_SHORT).show() + Log.d("MainActivity", database.contactDao().getAll().toString()) } } From 7e92386714de4dac02fb518d9ad32da5cdacf76c Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 25 Jun 2024 22:13:22 +0900 Subject: [PATCH 17/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20loadAllData()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 데이터베이스의 모든 데이터를 로그로 출력하는 함수 생성 --- .../campus/tech/kakao/contacts/MainActivity.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 963d4765..7664037f 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -53,7 +53,6 @@ class MainActivity : AppCompatActivity() { } } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -113,15 +112,27 @@ class MainActivity : AppCompatActivity() { ) database.contactDao().insert(contact) Toast.makeText(this, "저장이 완료 되었습니다", Toast.LENGTH_SHORT).show() - Log.d("MainActivity", database.contactDao().getAll().toString()) } } // Set click listener for cancel button + fun loadAllData(){ + if (database.contactDao() == null){ + Log.d("contacttest", "null") + } + else{ + val list = database.contactDao().getAll() + list.forEach { + Log.d("contacttest", ""+it.id+", "+it.name+", "+it.phone+", "+it.email+", "+it.birth+", "+it.sex+" ") + } + } + } cancel.setOnClickListener { Toast.makeText(this, "취소 되었습니다", Toast.LENGTH_SHORT).show() +// loadAllData() } + } // Show date picker dialog @@ -134,4 +145,6 @@ class MainActivity : AppCompatActivity() { }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)) datePicker.show() } + + } From 538061a63ebff590732c3de4e7fa69e722984470 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Wed, 26 Jun 2024 15:50:32 +0900 Subject: [PATCH 18/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=8A=A4=ED=81=AC=EB=A1=A4=EB=B7=B0=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메인 화면을 스크롤뷰로 변경하였음. 또한 키보드를 사용 시 취소, 저장 버튼이 키보드 바로 위에 오게끔 하였음. --- app/src/main/res/layout/activity_main.xml | 321 ++++++++++++---------- 1 file changed, 172 insertions(+), 149 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f266b21b..f051e9ae 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,183 +1,206 @@ - - + + + android:layout_height="0dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toTopOf="@id/cancelSave"> - - - - - + android:layout_height="match_parent"> - - - - + android:layout_height="100dp" + android:layout_margin="20dp" + android:src="@drawable/face" + app:layout_constraintBottom_toTopOf="@+id/namePhoneMail" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - - + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:layout_marginRight="15dp" + android:orientation="vertical" + app:layout_constraintBottom_toTopOf="@+id/more" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/face"> + + - + - - - + + + + android:layout_height="wrap_content" + android:layout_marginLeft="15dp" + android:layout_marginRight="15dp" + android:orientation="vertical" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/namePhoneMail"> + + + + + android:layout_marginLeft="15dp" + android:layout_marginRight="15dp" + android:orientation="vertical" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/namePhoneMail" + app:layout_constraintBottom_toBottomOf="parent"> + - + + - - - + android:layout_height="50dp" + android:background="@drawable/text_background" + android:gravity="left|center" + android:hint="성별" + android:textSize="18dp" /> + + + + + + + + + + + + + + - - - + + + + + + + + + + - - - - - - - - - - - From 393bb25e17707bd1fb1876052838238dda2c31e1 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 15:22:19 +0900 Subject: [PATCH 19/57] =?UTF-8?q?Docs[README.md]:=20=EC=B6=94=EA=B0=80=202?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EC=84=A4=EB=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메인 화면을 스크롤뷰로 변경하였음. 또한 키보드를 사용 시 취소, 저장 버튼이 키보드 바로 위에 오게끔 하였음. --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b92fe00..58b62fd7 100644 --- a/README.md +++ b/README.md @@ -11,5 +11,13 @@ - 성별을 둘 중 하나를 선택할 수 있다. - 저장 버튼을 누르면 '저장이 완료 되었습니다' 라는 토스트 메시지를 보여준다. - 취소 버튼을 누르면 '취소 되었습니다' 라는 토스트 메시지를 보여준다. -### 세부 사항 -- 아이콘 출처 : https://www.flaticon.com/search?word=face \ No newline at end of file + +# 2단계 - 연락처 목록 +## 기능 요구사항 +간단한 연락처를 구현한다. +- 연락처 등록 화면을 구현한다. +- 연락처를 저장하면 목록에 추가된다. +- 저장된 연락처가 많을 경우 목록은 스크롤 되어야 한다. +- 추가된 연락처를 선택하여 상세 화면을 볼 수 있다. +- 연락처 작성 중 뒤로가기 버튼을 누르면 확인 팝업이 나타난다. +- 추가된 연락처는 앱을 다시 실행하면 유지되지 않는다. \ No newline at end of file From 85887d7de52b8495d426a506ed5931735d63227a Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 15:28:29 +0900 Subject: [PATCH 20/57] =?UTF-8?q?Refactor[]:=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=93=A4=20=EC=9D=B4=EB=A6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2단계에 따른 1단계 파일들 이름 변경. --- app/src/main/AndroidManifest.xml | 2 +- .../tech/kakao/contacts/{MainActivity.kt => AddContact.kt} | 4 ++-- .../res/layout/{activity_main.xml => activity_addcontact.xml} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename app/src/main/java/campus/tech/kakao/contacts/{MainActivity.kt => AddContact.kt} (98%) rename app/src/main/res/layout/{activity_main.xml => activity_addcontact.xml} (99%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 89dc9d8b..2101d44b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ android:theme="@style/Theme.Contacts" tools:targetApi="31"> diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt similarity index 98% rename from app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt rename to app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index 7664037f..d926785f 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -14,7 +14,7 @@ import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase import java.util.Calendar -class MainActivity : AppCompatActivity() { +class AddContact : AppCompatActivity() { // Declare UI elements private lateinit var name: EditText private lateinit var phone: EditText @@ -55,7 +55,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + setContentView(R.layout.activity_addcontact) // Initialize UI elements name = findViewById(R.id.name) phone = findViewById(R.id.phone) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_addcontact.xml similarity index 99% rename from app/src/main/res/layout/activity_main.xml rename to app/src/main/res/layout/activity_addcontact.xml index f051e9ae..6aea4643 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_addcontact.xml @@ -7,7 +7,7 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity" + tools:context=".AddContact" > Date: Thu, 27 Jun 2024 15:47:46 +0900 Subject: [PATCH 21/57] =?UTF-8?q?Design[colors.xml]:=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EA=B8=88=EC=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추가 버튼에 사용될 금색 추가. --- app/src/main/res/values/colors.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1fcd286a..54652950 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,4 +3,5 @@ #FF000000 #FFFFFFFF #DFF3F6 + #FEC008 From 71aca7a4b9e16430ef3863a4cdfddc526f94c6d2 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 17:04:48 +0900 Subject: [PATCH 22/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=B4=88=EA=B8=B0=20=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 21 ++++++++++++++- app/src/main/res/layout/activity_main.xml | 32 +++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/layout/activity_main.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2101d44b..794c583c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,25 @@ android:supportsRtl="true" android:theme="@style/Theme.Contacts" tools:targetApi="31"> + + + + + + + + + + + + + + @@ -23,4 +42,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..0e37a6d1 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file From 6744323d9c27f077c5e881be4399f39413213981 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 17:09:52 +0900 Subject: [PATCH 23/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EC=B6=94=EA=B0=80=20=EB=B2=84=ED=8A=BC=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0e37a6d1..d498fa42 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -19,7 +19,7 @@ android:layout_gravity="center" android:visibility="visible"/> Date: Thu, 27 Jun 2024 17:16:28 +0900 Subject: [PATCH 24/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20addButton=20=ED=81=B4=EB=A6=AD=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=EB=84=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit addButton(추가 버튼) 클릭 시 연락처 추가 화면 호출 --- .../tech/kakao/contacts/MainActivity.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt new file mode 100644 index 00000000..e6396152 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -0,0 +1,24 @@ +package campus.tech.kakao.contacts + +import android.content.Intent +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.google.android.material.floatingactionbutton.FloatingActionButton + + +class MainActivity : AppCompatActivity() { + + private lateinit var addButton: FloatingActionButton + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + addButton = findViewById(R.id.addButton) + addButton.setOnClickListener { + startActivity( + Intent(this, AddContact::class.java) + ) + } + } +} \ No newline at end of file From 8c815ea2cb78bf5d0f25055897802f233c9c56fe Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 17:52:35 +0900 Subject: [PATCH 25/57] =?UTF-8?q?Design[name=5Ffirst=5Fbackground.xml]:=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=9B=90?= =?UTF-8?q?=ED=98=95=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EB=B0=B1=EA=B7=B8?= =?UTF-8?q?=EB=9D=BC=EC=9A=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/name_first_background.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 app/src/main/res/drawable/name_first_background.xml diff --git a/app/src/main/res/drawable/name_first_background.xml b/app/src/main/res/drawable/name_first_background.xml new file mode 100644 index 00000000..883f15c2 --- /dev/null +++ b/app/src/main/res/drawable/name_first_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file From fde6d935e9114b45b16a8c3932d500f06e0f3166 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 18:16:53 +0900 Subject: [PATCH 26/57] =?UTF-8?q?Design[contact=5Fitem=5Fbackground.xml]:?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EB=B0=B1?= =?UTF-8?q?=EA=B7=B8=EB=9D=BC=EC=9A=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/contact_item_background.xml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 app/src/main/res/drawable/contact_item_background.xml diff --git a/app/src/main/res/drawable/contact_item_background.xml b/app/src/main/res/drawable/contact_item_background.xml new file mode 100644 index 00000000..ca270c44 --- /dev/null +++ b/app/src/main/res/drawable/contact_item_background.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file From de866a6781317e39a7007caaa99e387102af1b2d Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 18:17:19 +0900 Subject: [PATCH 27/57] =?UTF-8?q?Design[contact=5Fitem.xml]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EB=94=94=EC=9E=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/contact_item.xml | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 app/src/main/res/layout/contact_item.xml diff --git a/app/src/main/res/layout/contact_item.xml b/app/src/main/res/layout/contact_item.xml new file mode 100644 index 00000000..a1e321a8 --- /dev/null +++ b/app/src/main/res/layout/contact_item.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + \ No newline at end of file From 485b61da64f64d1ecefe11ffe3de628badc17e96 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 18:18:15 +0900 Subject: [PATCH 28/57] =?UTF-8?q?Design[contact=5Fitem.xml]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/contact_item.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/contact_item.xml b/app/src/main/res/layout/contact_item.xml index a1e321a8..d3ca95fd 100644 --- a/app/src/main/res/layout/contact_item.xml +++ b/app/src/main/res/layout/contact_item.xml @@ -30,6 +30,7 @@ android:textSize="20dp" /> Date: Thu, 27 Jun 2024 18:36:05 +0900 Subject: [PATCH 29/57] =?UTF-8?q?Feat[RecyclerViewAdapter.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=96=B4=EB=8C=91=ED=84=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakao/contacts/RecyclerViewAdapter.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt diff --git a/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt new file mode 100644 index 00000000..ebbbb4c7 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt @@ -0,0 +1,48 @@ +package campus.tech.kakao.contacts + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast +import androidx.recyclerview.widget.RecyclerView + +class RecyclerViewAdapter( + val contact_list: List, + val inflater: LayoutInflater, + val context: Context +) : RecyclerView.Adapter(){ + + inner class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){ + val name_first: TextView + val name:TextView + init { + name_first = itemView.findViewById(R.id.nameFirst) + name = itemView.findViewById(R.id.name) + //클릭 리스너 생성 + itemView.setOnClickListener { + val position = adapterPosition + //adapterPosition을 통해 포지션을 받음. + val contact = contact_list.get(position) + Toast.makeText(context, ""+contact.name+" "+contact.phone, Toast.LENGTH_SHORT).show() + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = inflater.inflate(R.layout.contact_item, parent, false) + return ViewHolder(view) + } + + //데이터를 아이템뷰의 뷰컴포넌트와 바인딩함. + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val name_first_word = contact_list.get(position).name[0] + holder.name_first.text = name_first_word.toString() + holder.name.text = contact_list.get(position).name + } + + override fun getItemCount(): Int { + return contact_list.size + } +} \ No newline at end of file From 6a61f371d998936ae0db9f6449b7436f155d4513 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 20:26:24 +0900 Subject: [PATCH 30/57] =?UTF-8?q?Refactor[]:=20=EC=9D=B4=EB=8F=99=20MIGRAT?= =?UTF-8?q?ION=5F1=5F2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MIGRATION_1_2을 AddContact에서 Contact로 옮김. --- .../campus/tech/kakao/contacts/AddContact.kt | 28 ++----------------- .../campus/tech/kakao/contacts/Contact.kt | 27 ++++++++++++++++++ 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index d926785f..d6296b12 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -10,8 +10,7 @@ import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.room.Room -import androidx.room.migration.Migration -import androidx.sqlite.db.SupportSQLiteDatabase +import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_1_2 import java.util.Calendar class AddContact : AppCompatActivity() { @@ -29,29 +28,6 @@ class AddContact : AppCompatActivity() { private lateinit var moreText: TextView private lateinit var birthSexMemo: View - val MIGRATION_1_2 = object : Migration(1, 2) { - override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL( - "CREATE TABLE new_Contact (" + - "id INTEGER PRIMARY KEY NOT NULL, " + - "name TEXT NOT NULL, " + - "phone INTEGER NOT NULL, " + - "email TEXT, " + - "birth TEXT, " + - "sex TEXT, " + - "memo TEXT)" - ) - // 데이터 복사 - database.execSQL( - "INSERT INTO new_Contact (id, name, phone, email, birth, sex, memo) " + - "SELECT id, name, CAST(phone AS INTEGER), email, birth, sex, memo FROM Contact") - // 이전 테이블 제거 - database.execSQL("DROP TABLE Contact") - - // 새 테이블 이름 바꾸기 - database.execSQL("ALTER TABLE new_Contact RENAME TO Contact") - } - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -147,4 +123,6 @@ class AddContact : AppCompatActivity() { } + + } diff --git a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt index e3b4728e..3e977928 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt @@ -3,6 +3,8 @@ package campus.tech.kakao.contacts import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase @Entity class Contact ( @@ -17,4 +19,29 @@ class Contact ( constructor(name: String, phone: Int, email: String?, birth: String?, sex: String?, memo: String?): this(0, name, phone, email, birth, sex, memo) + companion object { + val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + "CREATE TABLE new_Contact (" + + "id INTEGER PRIMARY KEY NOT NULL, " + + "name TEXT NOT NULL, " + + "phone INTEGER NOT NULL, " + + "email TEXT, " + + "birth TEXT, " + + "sex TEXT, " + + "memo TEXT)" + ) + // 데이터 복사 + database.execSQL( + "INSERT INTO new_Contact (id, name, phone, email, birth, sex, memo) " + + "SELECT id, name, CAST(phone AS INTEGER), email, birth, sex, memo FROM Contact") + // 이전 테이블 제거 + database.execSQL("DROP TABLE Contact") + + // 새 테이블 이름 바꾸기 + database.execSQL("ALTER TABLE new_Contact RENAME TO Contact") + } + } + } } \ No newline at end of file From 9d1325b094ac19d9a6e2d6a10e62d6fb625da6a0 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 21:15:17 +0900 Subject: [PATCH 31/57] =?UTF-8?q?Refactor[]:=20=EB=B3=80=EA=B2=BD=20phone?= =?UTF-8?q?=20=ED=83=80=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전화번호의 타입을 String으로 변경 --- app/src/main/java/campus/tech/kakao/contacts/AddContact.kt | 4 ++-- app/src/main/java/campus/tech/kakao/contacts/Contact.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index d6296b12..b0d492fc 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -80,7 +80,7 @@ class AddContact : AppCompatActivity() { // Insert data into database val contact = Contact( name.text.toString(), - phone.text.toString().toInt(), + phone.text.toString(), mail.text.toString(), birth.text.toString(), sex, @@ -105,7 +105,7 @@ class AddContact : AppCompatActivity() { } cancel.setOnClickListener { Toast.makeText(this, "취소 되었습니다", Toast.LENGTH_SHORT).show() -// loadAllData() + loadAllData() } diff --git a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt index 3e977928..7c74e826 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt @@ -10,13 +10,13 @@ import androidx.sqlite.db.SupportSQLiteDatabase class Contact ( @PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "name") val name: String, - @ColumnInfo(name = "phone") val phone: Int, + @ColumnInfo(name = "phone") val phone: String, @ColumnInfo(name = "email") val email: String?, @ColumnInfo(name = "birth") val birth: String?, @ColumnInfo(name = "sex") val sex: String?, @ColumnInfo(name = "memo") val memo: String? ){ - constructor(name: String, phone: Int, email: String?, birth: String?, sex: String?, memo: String?): + constructor(name: String, phone: String, email: String?, birth: String?, sex: String?, memo: String?): this(0, name, phone, email, birth, sex, memo) companion object { From 2cbba187ba36787aa82eb3625012deb705286972 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 21:22:55 +0900 Subject: [PATCH 32/57] =?UTF-8?q?Refactor[]:=20=EC=B6=94=EA=B0=80=20MIGRAT?= =?UTF-8?q?ION=5F2=5F3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전화번호 타입 변경에 따른 MIGRATION_2_3 추가 --- .../campus/tech/kakao/contacts/AddContact.kt | 3 ++- .../campus/tech/kakao/contacts/Contact.kt | 23 +++++++++++++++++++ .../tech/kakao/contacts/ContactDatabase.kt | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index b0d492fc..7b2bf857 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -11,6 +11,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.room.Room import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_1_2 +import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_2_3 import java.util.Calendar class AddContact : AppCompatActivity() { @@ -60,7 +61,7 @@ class AddContact : AppCompatActivity() { val database = Room.databaseBuilder( applicationContext, ContactDatabase::class.java, "database-name" - ).addMigrations(MIGRATION_1_2).allowMainThreadQueries().build() + ).addMigrations(MIGRATION_1_2, MIGRATION_2_3).allowMainThreadQueries().build() // Set click listener for save button save.setOnClickListener { diff --git a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt index 7c74e826..063672fc 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt @@ -39,6 +39,29 @@ class Contact ( // 이전 테이블 제거 database.execSQL("DROP TABLE Contact") + // 새 테이블 이름 바꾸기 + database.execSQL("ALTER TABLE new_Contact RENAME TO Contact") + } + } + val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + "CREATE TABLE new_Contact (" + + "id INTEGER PRIMARY KEY NOT NULL, " + + "name TEXT NOT NULL, " + + "phone TEXT NOT NULL, " + + "email TEXT, " + + "birth TEXT, " + + "sex TEXT, " + + "memo TEXT)" + ) + // 데이터 복사 + database.execSQL( + "INSERT INTO new_Contact (id, name, phone, email, birth, sex, memo) " + + "SELECT id, name, CAST(phone AS TEXT), email, birth, sex, memo FROM Contact") + // 이전 테이블 제거 + database.execSQL("DROP TABLE Contact") + // 새 테이블 이름 바꾸기 database.execSQL("ALTER TABLE new_Contact RENAME TO Contact") } diff --git a/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt b/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt index 14d4876f..83eded81 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/ContactDatabase.kt @@ -5,7 +5,7 @@ import androidx.room.RoomDatabase import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -@Database(entities = [Contact::class], version = 2) +@Database(entities = [Contact::class], version = 3) abstract class ContactDatabase: RoomDatabase() { abstract fun contactDao(): ContactDao } \ No newline at end of file From 5eb63bb6d80679f1ceae4033e85f3b044b0296f5 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 21:25:41 +0900 Subject: [PATCH 33/57] =?UTF-8?q?Feat[ContactDao.kt]:=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20deleteAll?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 요구사항 만족을 위한 데이터베이스 초기화 --- app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt b/app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt index 80b57f43..944ecf69 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/ContactDao.kt @@ -19,5 +19,8 @@ interface ContactDao { @Query("DELETE FROM Contact WHERE id = :id") fun deleteById(id: Int) + @Query("DELETE FROM Contact") + fun deleteAll() + } From 3cb8dfa51004c72fb9f280bfd6026fceaa8d0592 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Thu, 27 Jun 2024 21:28:20 +0900 Subject: [PATCH 34/57] =?UTF-8?q?Design[activity=5Fmain.xml]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=B4=88=EA=B8=B0=20=EC=95=88=EB=82=B4=20=EB=AC=B8?= =?UTF-8?q?=EA=B5=AC=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d498fa42..92d36233 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -13,11 +13,13 @@ + Date: Thu, 27 Jun 2024 21:31:48 +0900 Subject: [PATCH 35/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=ED=9B=84=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=B4=EC=9D=B4=EB=8A=94=20=EA=B8=B0=EB=8A=A5,=20=EC=97=B0?= =?UTF-8?q?=EB=9D=BD=EC=B2=98=20=EC=B6=94=EA=B0=80=20=ED=9B=84=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EC=95=88=EB=82=B4=20=EB=AC=B8=EA=B5=AC=20=EC=95=88?= =?UTF-8?q?=20=EB=B3=B4=EC=9D=B4=EA=B2=8C=20=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/contacts/MainActivity.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index e6396152..76705435 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -2,23 +2,59 @@ package campus.tech.kakao.contacts import android.content.Intent import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.room.Room +import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_1_2 +import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_2_3 import com.google.android.material.floatingactionbutton.FloatingActionButton class MainActivity : AppCompatActivity() { private lateinit var addButton: FloatingActionButton + private lateinit var guidePhrase: TextView + + lateinit var database: ContactDatabase override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + guidePhrase = findViewById(R.id.guidePhrase) + + // Initialize database + database = Room.databaseBuilder( + applicationContext, + ContactDatabase::class.java, "database-name" + ).addMigrations(MIGRATION_1_2, MIGRATION_2_3).allowMainThreadQueries().build() + + database.contactDao().deleteAll() + + //연락처 추가 버튼 addButton = findViewById(R.id.addButton) addButton.setOnClickListener { startActivity( Intent(this, AddContact::class.java) ) } + + } + + override fun onResume() { + super.onResume() + val contactList = database.contactDao().getAll() + if (contactList.isNotEmpty()) { + guidePhrase.visibility = View.GONE + } + val recyclerView = findViewById(R.id.recyclerView) + recyclerView.adapter = RecyclerViewAdapter( + contactList, LayoutInflater.from(this), this) + recyclerView.layoutManager = LinearLayoutManager(this) } } \ No newline at end of file From 55257d1511454eba292c702208b83e1657626e6e Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 11:54:57 +0900 Subject: [PATCH 36/57] =?UTF-8?q?Design[activity=5Fcontact=5Fdetail.xml]:?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A0=95=EB=B3=B4=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/activity_contact_detail.xml | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 app/src/main/res/layout/activity_contact_detail.xml diff --git a/app/src/main/res/layout/activity_contact_detail.xml b/app/src/main/res/layout/activity_contact_detail.xml new file mode 100644 index 00000000..ff828e32 --- /dev/null +++ b/app/src/main/res/layout/activity_contact_detail.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 38604d8a0fd07e4547c2787c3bc73c44b62a77c3 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 12:11:06 +0900 Subject: [PATCH 37/57] =?UTF-8?q?Feat[RecyclerViewAdapter.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 연락처를 클릭 시 연락처의 ID를 상세 정보 페이지에 보내면서 호출. --- .../campus/tech/kakao/contacts/RecyclerViewAdapter.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt index ebbbb4c7..e30b628c 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt @@ -1,6 +1,7 @@ package campus.tech.kakao.contacts import android.content.Context +import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -25,7 +26,9 @@ class RecyclerViewAdapter( val position = adapterPosition //adapterPosition을 통해 포지션을 받음. val contact = contact_list.get(position) - Toast.makeText(context, ""+contact.name+" "+contact.phone, Toast.LENGTH_SHORT).show() +// Toast.makeText(context, ""+contact.name+" "+contact.phone, Toast.LENGTH_SHORT).show() + val intent = Intent(context, ContactDetail::class.java) + intent.putExtra("contact-id", contact.id) } } } @@ -45,4 +48,6 @@ class RecyclerViewAdapter( override fun getItemCount(): Int { return contact_list.size } -} \ No newline at end of file +} + + From 00f28d472bbb1b6392d6ef55f3669193bdde480e Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 12:53:53 +0900 Subject: [PATCH 38/57] =?UTF-8?q?Feat[AddContact.kt]:=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20loadAllData=20=EB=A9=94=EB=AA=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit loadAllData 함수 로그에 메모도 표시 --- app/src/main/java/campus/tech/kakao/contacts/AddContact.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index 7b2bf857..7ff2edf9 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -100,7 +100,7 @@ class AddContact : AppCompatActivity() { else{ val list = database.contactDao().getAll() list.forEach { - Log.d("contacttest", ""+it.id+", "+it.name+", "+it.phone+", "+it.email+", "+it.birth+", "+it.sex+" ") + Log.d("contacttest", ""+it.id+", "+it.name+", "+it.phone+", "+it.email+", "+it.birth+", "+it.sex+", "+it.memo) } } } From 7bf2f1d9839985067061e0ef7af698766b900992 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 12:58:02 +0900 Subject: [PATCH 39/57] =?UTF-8?q?Fix[RecyclerViewAdapter.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20startActivity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt index e30b628c..4e54817c 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import android.widget.Toast +import androidx.core.content.ContextCompat.startActivity import androidx.recyclerview.widget.RecyclerView class RecyclerViewAdapter( @@ -29,6 +30,7 @@ class RecyclerViewAdapter( // Toast.makeText(context, ""+contact.name+" "+contact.phone, Toast.LENGTH_SHORT).show() val intent = Intent(context, ContactDetail::class.java) intent.putExtra("contact-id", contact.id) + startActivity(context, intent, null) } } } From 61123332345b1b9d874bb6ceb0acfee5a2ca3317 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 13:10:18 +0900 Subject: [PATCH 40/57] =?UTF-8?q?Feat[ContactDetail.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=84=B8=EB=B6=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=95=A1=ED=8B=B0=EB=B9=84=ED=8B=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/contacts/ContactDetail.kt | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/contacts/ContactDetail.kt diff --git a/app/src/main/java/campus/tech/kakao/contacts/ContactDetail.kt b/app/src/main/java/campus/tech/kakao/contacts/ContactDetail.kt new file mode 100644 index 00000000..10d5f90c --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/contacts/ContactDetail.kt @@ -0,0 +1,73 @@ +package campus.tech.kakao.contacts + +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.room.Room + +class ContactDetail : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //UI 선언 + setContentView(R.layout.activity_contact_detail) + val name = findViewById(R.id.name) + val phone = findViewById(R.id.phone) + val email = findViewById(R.id.mail) + val emailLayout = findViewById(R.id.mailLayout) + val birth = findViewById(R.id.birth) + val birthLayout = findViewById(R.id.birthLayout) + val sex = findViewById(R.id.sex) + val sexLayout = findViewById(R.id.sexLayout) + val memo = findViewById(R.id.memo) + val memoLayout = findViewById(R.id.memoLayout) + + //데이터베이스 선언 + val database = Room.databaseBuilder( + applicationContext, + ContactDatabase::class.java, "database-name" + ).addMigrations(Contact.MIGRATION_1_2, Contact.MIGRATION_2_3).allowMainThreadQueries().build() + //인텐트를 통해 ID 받기 + val intent = intent + val id = intent.extras?.getInt("contact-id") + Log.d("contacttest", "id : "+id) + + //ID에 해당하는 데이터 불러오기 + if (id != null) { + val contact = database.contactDao().getById(id) + if (contact != null) { + Log.d("contacttest", "detail : "+contact.id+", "+contact.name+", "+contact.phone+", "+contact.email+", "+contact.birth+", "+contact.sex+", "+contact.memo) + if (contact.name != null && contact.name.isNotEmpty()) { + name.text = contact.name + } + if (contact.phone != null && contact.phone.isNotEmpty()) { + phone.text = contact.phone + } + if (contact.email!=null && contact.email.isNotEmpty()) { + email.text = contact.email + emailLayout.visibility = View.VISIBLE + } + if (contact.birth != null && contact.birth.isNotEmpty()) { + birth.text = contact.birth + birthLayout.visibility = View.VISIBLE + } + if (contact.sex != null && contact.sex.isNotEmpty()) { + sex.text = contact.sex + sexLayout.visibility = View.VISIBLE + } + if (contact.memo != null && contact.memo.isNotEmpty()) { + memo.text = contact.memo + memoLayout.visibility = View.VISIBLE + } + } + else{ + Log.d("contacttest", "contact is null") + } + } + else{ + Log.d("contacttest", "id("+id+") is null") + } + + } +} \ No newline at end of file From 1d930dfacc5d15464e2aeaea48f609d972775bd1 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 13:42:28 +0900 Subject: [PATCH 41/57] =?UTF-8?q?Feat[AddContact.kt]:=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EC=8B=9C=20=EC=95=A1=ED=8B=B0=EB=B9=84?= =?UTF-8?q?=ED=8B=B0=20=EC=A2=85=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/contacts/AddContact.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index 7ff2edf9..00f57632 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -89,6 +89,7 @@ class AddContact : AppCompatActivity() { ) database.contactDao().insert(contact) Toast.makeText(this, "저장이 완료 되었습니다", Toast.LENGTH_SHORT).show() + finish() } } From a0d1fc075b7dee203f8558b1ec760f6fa6eed0c8 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 13:42:59 +0900 Subject: [PATCH 42/57] =?UTF-8?q?Feat[AddContact.kt]:=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EC=B7=A8=EC=86=8C=20=EC=8B=9C=20=EC=95=A1=ED=8B=B0=EB=B9=84?= =?UTF-8?q?=ED=8B=B0=20=EC=A2=85=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/contacts/AddContact.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index 00f57632..35aee528 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -108,6 +108,7 @@ class AddContact : AppCompatActivity() { cancel.setOnClickListener { Toast.makeText(this, "취소 되었습니다", Toast.LENGTH_SHORT).show() loadAllData() + finish() } From ce8f6751f7ba266c390cddf29f765a5cf685ad9a Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 14:04:13 +0900 Subject: [PATCH 43/57] =?UTF-8?q?Design[popup=5Fmessage.xml]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EC=8B=9C=20=ED=99=95=EC=9D=B8=20=ED=8C=9D=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/popup_message.xml | 40 +++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 app/src/main/res/layout/popup_message.xml diff --git a/app/src/main/res/layout/popup_message.xml b/app/src/main/res/layout/popup_message.xml new file mode 100644 index 00000000..d8a6330e --- /dev/null +++ b/app/src/main/res/layout/popup_message.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file From 27e456d5f8ffde30d82ad30e8a259dce8377a4fe Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 14:42:50 +0900 Subject: [PATCH 44/57] =?UTF-8?q?Feat[AddContact.kt]:=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EC=97=B0=EB=9D=BD=EC=B2=98=20=EC=9E=91=EC=84=B1=20=EC=8B=9C?= =?UTF-8?q?=20=ED=99=95=EC=9D=B8=20=ED=8C=9D=EC=97=85=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/contacts/AddContact.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index 35aee528..c5eef5c5 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -3,11 +3,15 @@ package campus.tech.kakao.contacts import android.app.DatePickerDialog import android.os.Bundle import android.util.Log +import android.view.KeyEvent import android.view.View +import android.view.ViewGroup import android.widget.EditText +import android.widget.PopupWindow import android.widget.RadioButton import android.widget.TextView import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.room.Room import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_1_2 @@ -112,6 +116,8 @@ class AddContact : AppCompatActivity() { } + + } // Show date picker dialog @@ -125,7 +131,28 @@ class AddContact : AppCompatActivity() { datePicker.show() } + fun popupMessage(){ + //팝업 UI 설정 + val popupView = layoutInflater.inflate(R.layout.popup_message, null) + val write = popupView.findViewById(R.id.write) + val exit = popupView.findViewById(R.id.exit) + val popupBuilder = AlertDialog.Builder(this).setView(popupView) + val popupWindow = popupBuilder.show() + write.setOnClickListener { + popupWindow.dismiss() + } + exit.setOnClickListener { + finish() + } + } + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + popupMessage() + return true + } + return false + } } From 30f8c1316d7fed565dcc0593a1006d576ab12ed2 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 15:04:00 +0900 Subject: [PATCH 45/57] =?UTF-8?q?Refactor[AddContact.kt]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20onKeyDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 뒤로 가기 버튼이 눌리고, 정보를 하나라도 입력했을 때 팝업창 띄움. --- app/src/main/java/campus/tech/kakao/contacts/AddContact.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index c5eef5c5..35dc8dca 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -148,11 +148,16 @@ class AddContact : AppCompatActivity() { } } + //뒤로 가기 버튼 클릭 시 override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { + if (keyCode == KeyEvent.KEYCODE_BACK + && (name.text.isNotEmpty() || phone.text.isNotEmpty() + || mail.text.isNotEmpty() || birth.text.isNotEmpty() + || (female.isChecked || male.isChecked) || memo.text.isNotEmpty())) { popupMessage() return true } + finish() return false } } From 9f528c85466b0a03c8235833e017270bbf6a7315 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 15:21:05 +0900 Subject: [PATCH 46/57] =?UTF-8?q?Refactor[AddContact.kt]:=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20showDatePickerDialog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 생일 입력 시 월과 일의 입력 포맷을 00으로 설정함. --- .../java/campus/tech/kakao/contacts/AddContact.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index 35dc8dca..e5ad64ac 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -16,6 +16,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.room.Room import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_1_2 import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_2_3 +import java.time.Month import java.util.Calendar class AddContact : AppCompatActivity() { @@ -125,8 +126,15 @@ class AddContact : AppCompatActivity() { val calendar = Calendar.getInstance() val datePicker = DatePickerDialog( this, {DatePicker, year:Int, month:Int, dayOfMonth:Int -> - val selectedDate = "$year.${month+1}.$dayOfMonth" - birth.text = selectedDate + var Month = "${month + 1}" + if (month < 9) { + Month = "0${Month}" + } + var Day = "${dayOfMonth}" + if (dayOfMonth < 10) { + Day = "0${Day}" + } + birth.text = "${year}.${Month}.${Day}" }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)) datePicker.show() } From fd1029df842058a51716161090fee12a0c1a4a4c Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 15:29:53 +0900 Subject: [PATCH 47/57] =?UTF-8?q?Feat[MainActivity.kt]:=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20onKeyDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 뒤로 가기 버튼 클릭 후 다시 앱을 실행했을 때 간헐적으로 앱이 디스트로이 되지 않는 경우가 발생. 이 경우 연락처 초기화가 이루어 지지 않음. 따라서 뒤로 가기 버튼 클릭 시 데이터베이스 초기화 실행 --- .../java/campus/tech/kakao/contacts/MainActivity.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 76705435..5777cbe9 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -3,6 +3,7 @@ package campus.tech.kakao.contacts import android.content.Intent import android.os.Bundle import android.util.Log +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.widget.TextView @@ -52,9 +53,19 @@ class MainActivity : AppCompatActivity() { if (contactList.isNotEmpty()) { guidePhrase.visibility = View.GONE } + else{ + guidePhrase.visibility = View.VISIBLE + } val recyclerView = findViewById(R.id.recyclerView) recyclerView.adapter = RecyclerViewAdapter( contactList, LayoutInflater.from(this), this) recyclerView.layoutManager = LinearLayoutManager(this) } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + database.contactDao().deleteAll() + } + return super.onKeyDown(keyCode, event) + } } \ No newline at end of file From 1d0f244335e2b56d7dc5fe0b1bd0bfa705e4c84f Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 15:31:21 +0900 Subject: [PATCH 48/57] Chore --- app/build.gradle.kts | 8 ++++- app/src/main/AndroidManifest.xml | 3 ++ app/src/main/res/navigation/nav_graph.xml | 28 +++++++++++++++ app/src/main/res/values-land/dimens.xml | 3 ++ app/src/main/res/values-v23/themes.xml | 9 +++++ app/src/main/res/values-w1240dp/dimens.xml | 3 ++ app/src/main/res/values-w600dp/dimens.xml | 3 ++ app/src/main/res/values/dimens.xml | 3 ++ app/src/main/res/values/strings.xml | 42 ++++++++++++++++++++++ 9 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/navigation/nav_graph.xml create mode 100644 app/src/main/res/values-land/dimens.xml create mode 100644 app/src/main/res/values-v23/themes.xml create mode 100644 app/src/main/res/values-w1240dp/dimens.xml create mode 100644 app/src/main/res/values-w600dp/dimens.xml create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 348359e4..5576559d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,6 +34,9 @@ android { kotlinOptions { jvmTarget = "17" } + buildFeatures { + viewBinding = true + } } dependencies { @@ -42,7 +45,10 @@ dependencies { implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") - testImplementation("junit:junit:4.13.2") + implementation("androidx.activity:activity:1.9.0") + implementation("androidx.navigation:navigation-fragment-ktx:2.6.0") + implementation("androidx.navigation:navigation-ui-ktx:2.6.0") + testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 794c583c..845cdd02 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,9 @@ android:supportsRtl="true" android:theme="@style/Theme.Contacts" tools:targetApi="31"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml new file mode 100644 index 00000000..22d7f004 --- /dev/null +++ b/app/src/main/res/values-land/dimens.xml @@ -0,0 +1,3 @@ + + 48dp + \ No newline at end of file diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml new file mode 100644 index 00000000..b1fed486 --- /dev/null +++ b/app/src/main/res/values-v23/themes.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values-w1240dp/dimens.xml b/app/src/main/res/values-w1240dp/dimens.xml new file mode 100644 index 00000000..d73f4a35 --- /dev/null +++ b/app/src/main/res/values-w1240dp/dimens.xml @@ -0,0 +1,3 @@ + + 200dp + \ No newline at end of file diff --git a/app/src/main/res/values-w600dp/dimens.xml b/app/src/main/res/values-w600dp/dimens.xml new file mode 100644 index 00000000..22d7f004 --- /dev/null +++ b/app/src/main/res/values-w600dp/dimens.xml @@ -0,0 +1,3 @@ + + 48dp + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 00000000..125df871 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,3 @@ + + 16dp + \ 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 a805abf4..daae0dd0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,45 @@ Contacts + + First Fragment + Second Fragment + Next + Previous + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris + volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus + dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad + litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend + diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a, + ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n + Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus + egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed + neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada + fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae, + molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor + bibendum, vel congue leo egestas.\n\n + Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit + amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel, + molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer + interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at + lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula, + in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque + est.\n\n + Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh. + Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui + non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In + eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc, + quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra + ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a + placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus + convallis.\n\n + Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et + malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa + gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper, + libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper + sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus + libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus + vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim. + \ No newline at end of file From 956c9757ceb37bd009ca16eaa9875d90f6bf248f Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 15:37:39 +0900 Subject: [PATCH 49/57] =?UTF-8?q?Comment:=20=EC=B6=94=EA=B0=80=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EB=B0=8F=20=EC=84=A4=EB=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/campus/tech/kakao/contacts/AddContact.kt | 15 ++++++++++----- .../java/campus/tech/kakao/contacts/Contact.kt | 1 + .../campus/tech/kakao/contacts/MainActivity.kt | 4 ++-- .../tech/kakao/contacts/RecyclerViewAdapter.kt | 1 + 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index e5ad64ac..0b653012 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -53,6 +53,7 @@ class AddContact : AppCompatActivity() { birth.setOnClickListener { showDatePickerDialog() } + // 더보기 버튼 클릭 시 moreText.setOnClickListener { if (moreText.visibility == View.VISIBLE) { moreText.visibility = View.GONE @@ -68,7 +69,7 @@ class AddContact : AppCompatActivity() { ContactDatabase::class.java, "database-name" ).addMigrations(MIGRATION_1_2, MIGRATION_2_3).allowMainThreadQueries().build() - // Set click listener for save button + // 저장 버튼 클릭 시 save.setOnClickListener { if (name.text.isEmpty()) { Toast.makeText(this, "이름은 필수 값입니다", Toast.LENGTH_SHORT).show() @@ -98,7 +99,7 @@ class AddContact : AppCompatActivity() { } } - // Set click listener for cancel button + // 연락처 데이터 로그에 표시 fun loadAllData(){ if (database.contactDao() == null){ Log.d("contacttest", "null") @@ -110,6 +111,7 @@ class AddContact : AppCompatActivity() { } } } + //취소 버튼 클릭 시 cancel.setOnClickListener { Toast.makeText(this, "취소 되었습니다", Toast.LENGTH_SHORT).show() loadAllData() @@ -121,11 +123,12 @@ class AddContact : AppCompatActivity() { } - // Show date picker dialog + // 생일 선택 팝업창 fun showDatePickerDialog() { val calendar = Calendar.getInstance() val datePicker = DatePickerDialog( this, {DatePicker, year:Int, month:Int, dayOfMonth:Int -> + //월과 일 포맷을 00으로 설정 var Month = "${month + 1}" if (month < 9) { Month = "0${Month}" @@ -138,7 +141,7 @@ class AddContact : AppCompatActivity() { }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)) datePicker.show() } - + //팝업창 설정 fun popupMessage(){ //팝업 UI 설정 val popupView = layoutInflater.inflate(R.layout.popup_message, null) @@ -147,10 +150,11 @@ class AddContact : AppCompatActivity() { val popupBuilder = AlertDialog.Builder(this).setView(popupView) val popupWindow = popupBuilder.show() - + //작성하기 버튼 클릭 시 팝업창 닫기 write.setOnClickListener { popupWindow.dismiss() } + //나가기 버튼 클릭 시 연락처 목록으로 이동 exit.setOnClickListener { finish() } @@ -158,6 +162,7 @@ class AddContact : AppCompatActivity() { //뒤로 가기 버튼 클릭 시 override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + //뒤로 가기 버튼 클릭하고 나머지 텍스트가 있을 경우 if (keyCode == KeyEvent.KEYCODE_BACK && (name.text.isNotEmpty() || phone.text.isNotEmpty() || mail.text.isNotEmpty() || birth.text.isNotEmpty() diff --git a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt index 063672fc..f67db21c 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/Contact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/Contact.kt @@ -20,6 +20,7 @@ class Contact ( this(0, name, phone, email, birth, sex, memo) companion object { + // 테이블 변경 사항 val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL( diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 5777cbe9..4b0df1ab 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -46,7 +46,7 @@ class MainActivity : AppCompatActivity() { } } - + //연락처 추가 후 연락처 목록 갱신 override fun onResume() { super.onResume() val contactList = database.contactDao().getAll() @@ -61,7 +61,7 @@ class MainActivity : AppCompatActivity() { contactList, LayoutInflater.from(this), this) recyclerView.layoutManager = LinearLayoutManager(this) } - + //뒤로 가기 버튼 클릭 시 연락처 초기화 override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if (keyCode == KeyEvent.KEYCODE_BACK) { database.contactDao().deleteAll() diff --git a/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt index 4e54817c..b228285a 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/RecyclerViewAdapter.kt @@ -29,6 +29,7 @@ class RecyclerViewAdapter( val contact = contact_list.get(position) // Toast.makeText(context, ""+contact.name+" "+contact.phone, Toast.LENGTH_SHORT).show() val intent = Intent(context, ContactDetail::class.java) + //인텐트에 id 넘겨줌 intent.putExtra("contact-id", contact.id) startActivity(context, intent, null) } From 0f33cb8399410c742fd541bf74f6de77a89a1a62 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Fri, 28 Jun 2024 22:36:14 +0900 Subject: [PATCH 50/57] =?UTF-8?q?Fix[AddContact.kt]:=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20onKeyDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 뒤로 가기 버튼 이외 버튼 클릭 시 종료되는 현상 수정 --- app/src/main/java/campus/tech/kakao/contacts/AddContact.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt index 0b653012..efe3bbff 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt @@ -170,7 +170,9 @@ class AddContact : AppCompatActivity() { popupMessage() return true } - finish() + else if (keyCode == KeyEvent.KEYCODE_BACK){ + finish() + } return false } } From 9e33dcc5019e4ffcb963894234881695a75471fe Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 2 Jul 2024 23:53:36 +0900 Subject: [PATCH 51/57] =?UTF-8?q?Chore[build.gradle.kts]:=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=9D=98=EC=A1=B4=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 의존성 제거. --- app/build.gradle.kts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5576559d..cd416f47 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -59,22 +59,4 @@ dependencies { // To use Kotlin annotation processing tool (kapt) kapt("androidx.room:room-compiler:$room_version") - - // optional - Kotlin Extensions and Coroutines support for Room - implementation("androidx.room:room-ktx:$room_version") - - // optional - RxJava2 support for Room - implementation("androidx.room:room-rxjava2:$room_version") - - // optional - RxJava3 support for Room - implementation("androidx.room:room-rxjava3:$room_version") - - // optional - Guava support for Room, including Optional and ListenableFuture - implementation("androidx.room:room-guava:$room_version") - - // optional - Test helpers - testImplementation("androidx.room:room-testing:$room_version") - - // optional - Paging 3 Integration - implementation("androidx.room:room-paging:$room_version") } From 201f87cfba343f9a21eb76d318e829c61de1be07 Mon Sep 17 00:00:00 2001 From: jmc98 Date: Tue, 2 Jul 2024 23:56:24 +0900 Subject: [PATCH 52/57] =?UTF-8?q?Rename[AddContactActivity.kt]:=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20AddContactActivity=20=EC=9D=B4=EB=A6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../kakao/contacts/{AddContact.kt => AddContactActivity.kt} | 5 +---- app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt | 3 +-- app/src/main/res/layout/activity_addcontact.xml | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) rename app/src/main/java/campus/tech/kakao/contacts/{AddContact.kt => AddContactActivity.kt} (98%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 845cdd02..9a5f663b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,7 +35,7 @@ diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContactActivity.kt similarity index 98% rename from app/src/main/java/campus/tech/kakao/contacts/AddContact.kt rename to app/src/main/java/campus/tech/kakao/contacts/AddContactActivity.kt index efe3bbff..fc94c4b8 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContact.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContactActivity.kt @@ -5,9 +5,7 @@ import android.os.Bundle import android.util.Log import android.view.KeyEvent import android.view.View -import android.view.ViewGroup import android.widget.EditText -import android.widget.PopupWindow import android.widget.RadioButton import android.widget.TextView import android.widget.Toast @@ -16,10 +14,9 @@ import androidx.appcompat.app.AppCompatActivity import androidx.room.Room import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_1_2 import campus.tech.kakao.contacts.Contact.Companion.MIGRATION_2_3 -import java.time.Month import java.util.Calendar -class AddContact : AppCompatActivity() { +class AddContactActivity : AppCompatActivity() { // Declare UI elements private lateinit var name: EditText private lateinit var phone: EditText diff --git a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt index 4b0df1ab..8d96e702 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/MainActivity.kt @@ -2,7 +2,6 @@ package campus.tech.kakao.contacts import android.content.Intent import android.os.Bundle -import android.util.Log import android.view.KeyEvent import android.view.LayoutInflater import android.view.View @@ -41,7 +40,7 @@ class MainActivity : AppCompatActivity() { addButton = findViewById(R.id.addButton) addButton.setOnClickListener { startActivity( - Intent(this, AddContact::class.java) + Intent(this, AddContactActivity::class.java) ) } diff --git a/app/src/main/res/layout/activity_addcontact.xml b/app/src/main/res/layout/activity_addcontact.xml index 6aea4643..8d86a552 100644 --- a/app/src/main/res/layout/activity_addcontact.xml +++ b/app/src/main/res/layout/activity_addcontact.xml @@ -7,7 +7,7 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".AddContact" + tools:context=".AddContactActivity" > Date: Wed, 3 Jul 2024 00:00:16 +0900 Subject: [PATCH 53/57] =?UTF-8?q?Refactor[AddContactActivity.kt]:=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B7=B0=20=EA=B0=9D=EC=B2=B4=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 뷰의 요소들을 할당하는 함수 생성 --- .../tech/kakao/contacts/AddContactActivity.kt | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/contacts/AddContactActivity.kt b/app/src/main/java/campus/tech/kakao/contacts/AddContactActivity.kt index fc94c4b8..bb08eb5c 100644 --- a/app/src/main/java/campus/tech/kakao/contacts/AddContactActivity.kt +++ b/app/src/main/java/campus/tech/kakao/contacts/AddContactActivity.kt @@ -35,18 +35,7 @@ class AddContactActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_addcontact) - // Initialize UI elements - name = findViewById(R.id.name) - phone = findViewById(R.id.phone) - mail = findViewById(R.id.mail) - birth = findViewById(R.id.birth) - female = findViewById(R.id.female) - male = findViewById(R.id.male) - memo = findViewById(R.id.memo) - save = findViewById(R.id.save) - cancel = findViewById(R.id.cancel) - birthSexMemo = findViewById(R.id.birthSexMemo) - moreText = findViewById(R.id.moreText) + setupUI() birth.setOnClickListener { showDatePickerDialog() } @@ -118,6 +107,20 @@ class AddContactActivity : AppCompatActivity() { + } + + private fun setupUI() { + name = findViewById(R.id.name) + phone = findViewById(R.id.phone) + mail = findViewById(R.id.mail) + birth = findViewById(R.id.birth) + female = findViewById(R.id.female) + male = findViewById(R.id.male) + memo = findViewById(R.id.memo) + save = findViewById(R.id.save) + cancel = findViewById(R.id.cancel) + birthSexMemo = findViewById(R.id.birthSexMemo) + moreText = findViewById(R.id.moreText) } // 생일 선택 팝업창 From 5f00c86967a52b1da1437a7b23473b0f550ee4f1 Mon Sep 17 00:00:00 2001 From: Joo Min Chul <56069969+joominchul@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:36:04 +0900 Subject: [PATCH 54/57] =?UTF-8?q?fix:=20=EB=A7=A4=EB=8B=88=ED=8E=98?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EC=9D=B8=20=EC=95=A1=ED=8B=B0?= =?UTF-8?q?=EB=B9=84=ED=8B=B02=20=EB=93=B1=EB=A1=9D=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9a5f663b..5d8f4158 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:name=".ContactDetail" android:exported="false" /> @@ -25,15 +25,6 @@ - - - - - - - From 14c9c0ad7c0b41ae2be26c14abb44b01cb3994b5 Mon Sep 17 00:00:00 2001 From: Joo Min Chul <56069969+joominchul@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:44:52 +0900 Subject: [PATCH 55/57] =?UTF-8?q?=EC=8B=A4=ED=96=89=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0 \354\204\240\355\203\235 \354\213\234.png" | Bin 0 -> 13282 bytes ...264\355\201\264\353\237\254\353\267\260.png" | Bin 0 -> 14732 bytes ...4 \354\236\205\353\240\245 \354\213\234.png" | Bin 0 -> 20108 bytes ...5 \355\233\204 \353\252\250\354\212\265.png" | Bin 0 -> 7474 bytes ...45\353\220\234 \354\240\225\353\263\264.png" | Bin 0 -> 11048 bytes ...10\352\270\260 \355\231\224\353\251\264.png" | Bin 0 -> 6814 bytes ...24\352\260\200 \355\231\224\353\251\264.png" | Bin 0 -> 10482 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\353\215\224\353\263\264\352\270\260 \354\204\240\355\203\235 \354\213\234.png" create mode 100644 "\353\246\254\354\202\254\354\235\264\355\201\264\353\237\254\353\267\260.png" create mode 100644 "\354\203\235\354\235\274 \354\236\205\353\240\245 \354\213\234.png" create mode 100644 "\354\240\200\354\236\245 \355\233\204 \353\252\250\354\212\265.png" create mode 100644 "\354\240\200\354\236\245\353\220\234 \354\240\225\353\263\264.png" create mode 100644 "\354\264\210\352\270\260 \355\231\224\353\251\264.png" create mode 100644 "\354\266\224\352\260\200 \355\231\224\353\251\264.png" diff --git "a/\353\215\224\353\263\264\352\270\260 \354\204\240\355\203\235 \354\213\234.png" "b/\353\215\224\353\263\264\352\270\260 \354\204\240\355\203\235 \354\213\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..8f3bf677f343c0249b3d024f603da88f4c4b7b39 GIT binary patch literal 13282 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 literal 0 HcmV?d00001 diff --git "a/\353\246\254\354\202\254\354\235\264\355\201\264\353\237\254\353\267\260.png" "b/\353\246\254\354\202\254\354\235\264\355\201\264\353\237\254\353\267\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..b263498aff0f9c442c7b835afd34d0395a2e8fb5 GIT binary patch literal 14732 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 literal 0 HcmV?d00001 diff --git "a/\354\203\235\354\235\274 \354\236\205\353\240\245 \354\213\234.png" "b/\354\203\235\354\235\274 \354\236\205\353\240\245 \354\213\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..c3695cc5e4aae3b5d275cd5aeb97a0cd8422b098 GIT binary patch literal 20108 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 literal 0 HcmV?d00001 diff --git "a/\354\240\200\354\236\245 \355\233\204 \353\252\250\354\212\265.png" "b/\354\240\200\354\236\245 \355\233\204 \353\252\250\354\212\265.png" new file mode 100644 index 0000000000000000000000000000000000000000..5e6f467098d01592e06efb69ab924a9d23002b62 GIT binary patch literal 7474 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 literal 0 HcmV?d00001 diff --git "a/\354\240\200\354\236\245\353\220\234 \354\240\225\353\263\264.png" "b/\354\240\200\354\236\245\353\220\234 \354\240\225\353\263\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..1c92de0c89f52838f77d1bb667fafcc46b02c8bc GIT binary patch literal 11048 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 Ah5!Hn literal 0 HcmV?d00001 diff --git "a/\354\266\224\352\260\200 \355\231\224\353\251\264.png" "b/\354\266\224\352\260\200 \355\231\224\353\251\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..4af452e23388314b5b8a1e86f6a8192d747cbdcb GIT binary patch literal 10482 zcmeHtXH-*dn=TyzK?Q*q5wOsE?^Q*l3DP2jfRqFQDKEV@MTH1R2@q;PdL;A`x*)wo zdM`o%DFI37b>f*bYn}D2IkUc5bI!l-$6m=!_P&#SKX<#X>xnXau0>CKhn9qdgkJmE z6C)B5QhpK=vd7n`h@aHYMR5>cNIi|T9+9Ai?rsoIC>%8OHAqM*;^@w8D2eAZ?$69U zNk|wv{v4#;ZbkMaB>W$=pJfiX{Y*M9ulC#o1*B=31xKK?EEE*`CC4A9>JK9> zW)2)WJa9*43(i_kZV4B$GMgAaX(ppB3Zwma?^^CXj=XE6j{@+E@XXKigFC$8_JqN; zi-0V`_JD$JCAUI$rh<|K?^-=6-))`Sug4HAZ!Vk*kuXqI!5}un^ZhehTM;0pw>SBQ zYAS!atXrjbOy6l}^UC2YcxVn?=`t&;0A3O>LYn0&EsH5BX%*;a3$|W1wBw3Z8A`0J zhd3p_C-doN@GJQwU%8P4j30+7?lyVmoA#Tb)@ocY6yf4Og8`$3%A~7XacXA$=O+Z^ zpN-~>jLZ4Od>L`7r>`BSb0cpDT+;G}N}7jUUHBetS1MsYzXdP#^6BDcyyvohA8t>J z7#HeSm949D_+#Te&cjG+l|3hf&C6efi#$}MpywxikVS-sI*yk_mX-nQG$6qjH5VNv z{H#{);nHpkbK~bObM-G4f_GH_Lg|%R)$xk(*sWPWtm5YDC@9oB@O*Whb*lW>=kN_s zF8uH1#pg*^!F!RVAF9+yYeFsp*wkzykj&7isQ8xP(`RK?&D;;|;+iB5^$nncvm7Gn zp_ZO8W5vd`*$(mZjlTWAB1ewinx2q|E~TPyNUQ{hmb$pE|~i)H#lJsqVz(vH}x7_A(Nq$P-lj#wan--VKtBj9fbl9`!Bg|B%S5 zvo%qQJtqvozQigU)w(S5(y?B0XDWFg(rw~fvPLdLHD_v^*I6Op6IJj37Z?7?t;TTlLa5N&N;dM|n-%6X>wLN;Z#hYKR_os*@VpOl@ zTnj$^GJ1d*DD*Zr=V`n_^finAOtq_BBVe?^pelO;KA1E}{7J@vLLW35jWVkUu||)m z9{w8cP<`*YUD3R~f(Q5G?EF&=utCfr1G)t+#DvsvDWwyQ zwM5^Ayn4_0j&bLuW(lA*t5DZB;VY=|xfPpAmutbBL%1DvyBCwLU6!3_Ph6lw#+%ue zd0eTyuCld~-L946d_&Ft?kQ>Wj_Yq`!OayR2?k4OM2l zmlEFX-XN^^TZg*TmC8!(FO~0n=>0}rSJ6SQdi?vbfqI$uRps)67+(wTNJ-@&9Gtu1$4gR2~uLtg(EzK*{U-wrE; z8JC&3Wn{*atvMxho;Dvx=N075usxXNoSWFW;qa^TF|HK}DBCyx3(8U{E%L1}E7<61 zj6k3-BYznmS7;whXLEL4-f`h8wjthkQBH5@sCs9XV`c~!#Q@_pOtB6?&mAoVXW^_A zwmwyDx3Ff3gnaN@?(KFt`ufq|_jvvBRnp2?_R=ARLqrdS(TnMi1|REI4f`RKGqoav6cD34Z4IUI{WZd<~R(#0UB(PL^jO)N9oV!{?P2~#$k^gX)8zWv8<(AX>N@1^Vj64PGcyMePJ3vvgqL0B~wc={v zx5m_-3;oTT5yXeTu||yJcn&4s`ZU1eLNIpBmrBvpVr4Dy$2=?jgB(Nxj-ikQ$ zjkQ7^wf-hbI{VRNH69@)AYR{a)m|F{NzVMNCLy7*yt2$AqcDzoJe6xMrI34OG-qt?4x&B)jY+tU&ExuelH1;wE>tI7MK`KF;^ zhp>BtD{)>qIsK~*gc7rLt|Ta92PjTE#K4QrL#cnm+m$@zfS zD?dg>!Kioc@VZ#kR{peAofq2oqSTj%m-h_~B`^yC`o`F-`_jC(9)*Caa`%^vpTkC< zb3RKkkRYQqZNJXychKtA7YAjT{wxqDn&mp3(afYoaCGVqmMSS8Gn4 zdSTa_mmZ+E+o8Cnes{e(_vNHs6pPiD_w=jD&TgNDM4Px@Bewt;XZY{E4=Ad4TI!kt zqqgup+@$1gH)So|8Zu-)zyrzmgld07$a5`t*Kruz@bDXai&)z;d9E_WTl6N&mX~c; z>ld0=3y@_n#p0TID=|Vt0VYFWaUj!pXNT8`lT1*@Wvco`SF_r}cr=_8Hfik-Yv!!> zK9fD!+%n(!n1VL*vb|bS!RUGiHdR)6Vv%l;-eYYhut67Rom^8#qjzFD3Ox~mQD;(3 zv$uYDlYx{ua$u^UuB&y+@#MHJW1y5@&eA)^>-FS9ZFHBxY59|_68}+%#}J!?|D$cE zV(T*0>=qcPRt4$#VsN1qatU^XTc~r))Ko1>{g(ZU$zx5%Y(if62{oA@ZK*|-g;^PB z%c=9Z>LtZlamL>Kx&L81T1<*!i5PlGd3hFD>)uI1qId4>lbueu%x-t?tXpw9ish!T zNUjBD`A&Rhe0+VtS-On*T4Y$XWPvH6rSR;wAE?;)L#)RH;#+N#>k3t%ih$v0S4_U~ z8AGk5v~XLHWXf%9i{dDmRB2J+)9WeeyXbx&zQIq_YjeruHP15{ z;y{D_UQBYX3;axK@HY;M*Sf1e-x(_t6X+E%n*F3oEOQ{G(e}Qf-oqeFDSk4RV`tim z_gY!~G2@2s8?HKP)5yOKi@d&dDIMUvztR_avrqKXm3^YU^L#z)?_@8hb*|^{Po50T z?FSBm0X>TbYNMllPRp@L_7=~9b#5s#Ta&#btNm{faG>+RN+q+9&bve#tF87cyxTo^{He?8E|2I0ITb0h=EPSZ&{nn3&!Eovbb!sL4N{KIVo<@}L_>b9 z@`%2owrdxbkugQp|6)8TZ;GB?u)=riqGaS06St>G0D<#Lk z$IIPUpe8pPtU2&Cqs}U@8JQ#KUL`IV15fas>NuL6cxHar`^gRTWwO2>X#eljj<-N9!gp7fh@1~JZY>_m48h*%B zHAH^Rh-d6^ouf~UiSO1V8RdagIz_36LrWh-P59F-~T8_V_g1mFdQ_r0i9 z<{!1Ok}~rQ)MOcwbEf-Qh(VqgYV9^#&(tbR;YuyEqb}d7>C1z`BM}j5f2=~s!=>m` z&o)I>t{(YsUw+67OhFw!@a9KOe2p(#ABvAu6HEU3_4nxUsU!we{)-Q;v`c*^(2|=Wf@yxA#-Ps0vs`o!_SYyh+d?%>y+6-s@MD>*V0v&+Bv>#pv(bk-Gp0=s157)i(`69q-Fr8-qmqwd zt#OD8^-Bw*^)Z%olKo%a8LFtb6e-HwxGYV2#i$G_Z9D0RiN(#Jjb0yY!R~6hez-#c zM~E6i+PqOysV}4A4BTbfpkdLB1qZj-*RQtb_Sdsfw=JMVcH|f5CHcOEw6kkUl;B|g zI_Oom+{vcz8#l+f@*HF&1VY#cTLnsr@KfAFCaNm`xoSlRE z4*n3z^X!iGu)QMn=#G(_)_~hUs+hY5c;5R}_9>DdC4TVPvvvI>sf0FysUoa}BEfecev18y|yopO49{S*91I>GT_ zmDmJqm|4#VxHYLk*`FIeSt8m*P@99^@H!0>u#fvEtPr;;Tr`289?m)9WA`pAAE6ZI$^}{>$^Mu z<-=I%N@#fC%Gx0QWZw~G=G}6iL9f7hSaRAJjGVS_;! zzO3MHwF7nW7t>K#FV+bDh#An-OBTS zgsT%>Dpl8F>9KG!vV@>=HK;IkHtQ#kQ*&Y+yM8`(rJf4EHP9!CiMu0!oJ`JWL)ln7 z_CMY^)0s;qr|2jZl?gN7IgeV;qG=G#Lc5{#k!BvfXx1rk5ySV*8t2u>VX0XUhVhyl*|c(>$nA~d0EhL#_wu!>GA3VgkkDL_J)k#eWMD7#`eT>w>=^Ht9!x!=KW=rIwB7+wuLGCV3PFGJX{W zP~0xb*a#TRxF`)0_cubbXiafxYu8}Ut1$7ZT3ipKNTJ;7Tx7IP+cV8T)pS|Ywe#N~ zc)>4`xbGHG9&-}S%_|w3;zPv^_YjC!niAHhaS6ocH>&|VJB!NNxRbW^QY5|ZGdrrm zVk9ESN*Pm#oq&r64y#K>$jv}Bon9*e2g)-;MbiynUE)BJr4+IGKI~D= zt1d}6bSY37)Jh-fnlRt!6SxV)wP)8DJL`UV8neyq8N)7%uTDKr5!X8Sg8+2x)Fl$` z{twWB8El9eX8iJAC^J^4cKw!mXAv`#5WOuE_b}ll=K%GpoxWAUn?4M0Mi?z*NWjw- z?)kL=nGhEJp6jk5hslwr$TDe7vOC#>62)xKTQ`bm84_^&mz(2dVpXlDCEt@bPVSK8T7M@ORN&F{c_Y;FquBmJS4 z!2S(NN=kfdoNB`HF$J4n*T&ArqulyknF2%BPBa5$l0o{hJ%BcbW-DWA>Lt5m%g@_7 z!;yQrr9>id=UUin01v4tXA5yeOwP>2#gcsVF&*h7ziIBZM}mm>N33V|oxG$8nMo!u zK7Nt`Jr;6f=~mahm+;5kJi`{r5^N+4mfmWU4^$1Mek?=;^~RF{$lVc)D!ACBDS3d9 zQVh8aQW-(=tL>S`KZ`0&1CY9|HaTy^dg8Yq?R1h0>XfFw)Q0LOy}L)Z{GM18R0lRi z*$GwG_z)3r&%O-caCw9gjN-Pg0cre;c}&em>M@IUnvX@BK|`9#2*K?L)-cK9q4m4j z%l`>{HK82C5LoMtDlojyy?Dyn0{A^0hCFyeBO@adGGVJuB+^hnb(fj)h4-I!Yd7l_ zw=2AzC#ST&AP{Y?Enp_m@D{l0JnX!~x!Zac)N5_!iu!7G(ugGeA-qgF{#8?#P1^qB zzS0Kw#xycTq|Rk=fkT9ao!wc^v#IDV)8@j1M4$~-V9?c|oTT%nN#h_~!C2O9s=mxs zmPFCioYk$OQ0Zv2$-mZeECCO;(1k3{m?G_Gk_0NjqrAS~tx<)V)i(2rjcngq%*sM8 z?AzMHNA8IXs;Vgo0TYakwpFW0e-!JG35tnfm~JbK)vhk)q>XGerP~2sW$ycvvb~hT7E2w`QZAlIk4|ylui@spS=hhIfk4k|nDzDJhv( zj!9o9rp zriyvyDA)M70LXIgga44FnzgnNFr~jEm4uclES~Y zYIz(F1O=szgJiMbThG-grPh-a>T+!;^95=6le5Skd}+vbCKgWbcT6{5{K;xR_2C@y z2S{Q$4T}EXgzW$M7mRKh5;4Ky-+N7zhryztzrf=?aF;|jt9Pic5==5otl_X#nv};% zK1r@B0X?-Mz`2D4mY}1|>&h$F74kqzfAU7}%syI)3{g-dJBe6c>2JMxKWwwKkG#)o zFZxXRBBx3iZT;cz5k641439u-63* zP{8MGu@is)klCGmuW8P;8RoEGxAwwxwDn>1&Xaw+{VBTrvMzHAO9KQm)XSfBrNHJH z4$7N2;zITc2#lbN3xk33TSWB00BSgP0maEbx+CMVnMHapt@zjScrgG2)4?|z?lh8q z47rt^m@zFK-s8-ay{(fY!KXlyME;MI8PRQwwtaOo0%7FFnHcm(Y7;^|H-PLW4RJw` z38Gf!UG^mM?&BAh&|~#M^+q~8cjM<(xYDx|YT^U4SVcFSY zNVAKdPM67|7o9L2-x)RsG^3#eab5(sKX9i5?=Cb;+G2H4Yi?7`N9Y8Ae~YL)g81#> z1~%@z*1h)4^aHV&fc)<)MatGyJ*9Q?_mxIRL8X8Fd_Qv2u>6jktFWAZ%knWV!fVPsn^EpQc}mEYfaO&4qI zt_B;ncD8vMZ>egP_oIct+s<}x*sgsDi?$6f%{k)=n&OxaEnt@R!1m*NwN|Y|E(a&A z54`Bg;`jHXH*6oAO4xwt?YlIZl|9~x7^ENOE335w848Pd!0);9^75uU?lDDtv#@L# zl0Vy(+`HIgeDJpW-f1itwCB&Jk%9# z{tpP(e-~cfcyDfaWDVNJmKj~EoZvcMA^ahNwsKHF0OQRtRyQ!fl*I=n08P6ye;=x#$|Sz%Y_o=~OezNhMxd;5u3$pTyk z2^D3nPFn?UYDc~vifpU#(9E#O-tGxPmW)%gwNSPnm z*yLD-td2|i{kZ4vdQ9i)_ImB4Zc#yRA?QLzVP(6uvH6EEQR9(yTi7Pn{1Q`L*QN~? zfY9OUCwQd;h7<5u^C2SQuYgWdk5lu<*p(=*9`8x3heUKrKTRpF*Wargx_q|6L)>LB z7qmiOYh`G-ltmhId2Cnn=?>0?CoTl%-8g9d`%CGWWNZJ?Vj#fQ&Te(#jLSW+`ML5> zzhY2hEixzfmZ3(|L6>uFFBdDT!xmqrS8fn~_=$OQKn(G|ZwEVpD>woZ6BDi_Q3WIS z)8{}9mB^PJ(zWwe)ZE;BL|kOB7NNIw#03C3)_sZH-pION3$_nwUE94cEBmyo314~l z?fws1`M5))*wdt~f(M_ji!H*!K;Mt=f8PZN&>HhPPKLK|& zvn~c~nNuN$MY5O(3^Z;9t}OV-?8+DAvW(Tb%wjJ;aQbL94agTIiva7>CX3?58W^R; zA8Y9$r&7>XuTc_|&Ki+U%vwNaIEzV=<5YPLJ=fyk`8O(}f5Ly-r@GVfC}9b&7q={?Dq8W|0d}-xZljG-KE%1e^K-l}9Z?+=K96x56TE;uMg7wRd4z3V{+O z2%!FC`HRPnBh}hH^vuL@{Qf>}Qj56f=Z*gwpsF2}&N6sMRxeR>{yc^B3fwD3-1_AM zKq}DE(Sh4&ETtZjwHJg#~*l~42@}LW{m_Ng*vics;CBbVi_3g~KMD=Yn zBAXXG-iCP$C|>ZU&eSN4;WQ@i{WRg8lR)I&H010)+~B#Oy1VWquJH@FeC2 zzbEKEpHla@VV>|jyi%E3{-%s7LQiPv!|r--Qg60L`-%8Bms&#|B?c3U20zZV6+(me zR^NWHbzgPy==?(3V33o-*{lM}EJ4A{SZ(?V_BZR=LjeJ8MkdD9Dg(8YgDtuGW*LB$ zYgQ29pe{s&$5{4kKq4tAJ9}5B=-Q{ZwBOEi!1ne%OH$8~!z&2AIyoUBT|B-i+}HJnUznH$7kJwIcBWb{=xsW<6xM4P~d=2Sawj|8jB>DsaGL&F#^s=clev oW&DYhC{fP;A6-`mdqw{K@P*e`VRtxjpCXC2=JO}0N3SCO4W?_5e*gdg literal 0 HcmV?d00001 From 68c4c2a3464ca4739024fb51b1463823bc498e8f Mon Sep 17 00:00:00 2001 From: Joo Min Chul <56069969+joominchul@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:47:53 +0900 Subject: [PATCH 56/57] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 58b62fd7..af27caa4 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,14 @@ ## 기능 요구사항 간단한 연락처를 구현한다. - 연락처를 추가한다. +- - 이름과 전화번호는 필수 값이다. - 입력하지 않으면 토스트 메시지를 보여준다. - 전화번호 입력은 숫자만 가능하다. - 더보기를 눌러 입력 폼을 확장할 수 있다. +- - 생일, 성별, 메모 입력 폼이 등장한다. + - - 성별을 둘 중 하나를 선택할 수 있다. - 저장 버튼을 누르면 '저장이 완료 되었습니다' 라는 토스트 메시지를 보여준다. - 취소 버튼을 누르면 '취소 되었습니다' 라는 토스트 메시지를 보여준다. @@ -15,9 +18,13 @@ # 2단계 - 연락처 목록 ## 기능 요구사항 간단한 연락처를 구현한다. + - 연락처 등록 화면을 구현한다. - 연락처를 저장하면 목록에 추가된다. +- - 저장된 연락처가 많을 경우 목록은 스크롤 되어야 한다. +- - 추가된 연락처를 선택하여 상세 화면을 볼 수 있다. +- - 연락처 작성 중 뒤로가기 버튼을 누르면 확인 팝업이 나타난다. -- 추가된 연락처는 앱을 다시 실행하면 유지되지 않는다. \ No newline at end of file +- 추가된 연락처는 앱을 다시 실행하면 유지되지 않는다. From ba6053e29d3ec745f7a8f0a48ef21c645a84c346 Mon Sep 17 00:00:00 2001 From: Joo Min Chul <56069969+joominchul@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:49:04 +0900 Subject: [PATCH 57/57] Update README.md --- README.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index af27caa4..5a9dde07 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,19 @@ ## 기능 요구사항 간단한 연락처를 구현한다. - 연락처를 추가한다. -- + + + - 이름과 전화번호는 필수 값이다. - 입력하지 않으면 토스트 메시지를 보여준다. - 전화번호 입력은 숫자만 가능하다. - 더보기를 눌러 입력 폼을 확장할 수 있다. -- + + - 생일, 성별, 메모 입력 폼이 등장한다. - - + + + - 성별을 둘 중 하나를 선택할 수 있다. - 저장 버튼을 누르면 '저장이 완료 되었습니다' 라는 토스트 메시지를 보여준다. - 취소 버튼을 누르면 '취소 되었습니다' 라는 토스트 메시지를 보여준다. @@ -18,12 +23,18 @@ # 2단계 - 연락처 목록 ## 기능 요구사항 간단한 연락처를 구현한다. + + - 연락처 등록 화면을 구현한다. - 연락처를 저장하면 목록에 추가된다. -- -- 저장된 연락처가 많을 경우 목록은 스크롤 되어야 한다. -- + + + + 저장된 연락처가 많을 경우 목록은 스크롤 되어야 한다. + + + - 추가된 연락처를 선택하여 상세 화면을 볼 수 있다. - - 연락처 작성 중 뒤로가기 버튼을 누르면 확인 팝업이 나타난다.