From 8408665ae7662ac2152e0b3a53f55df1ad54442b Mon Sep 17 00:00:00 2001 From: kmseongmin <102861243+kmseongmin@users.noreply.github.com> Date: Mon, 20 May 2024 20:23:10 +0900 Subject: [PATCH 1/8] chat room design --- .../front_end_android/RecentCallsFragment.kt | 11 +++++++++-- .../main/res/layout/fragment_recent_calls.xml | 19 ++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Android/app/src/main/java/com/example/front_end_android/RecentCallsFragment.kt b/Android/app/src/main/java/com/example/front_end_android/RecentCallsFragment.kt index 7ece6a3b..974ce042 100644 --- a/Android/app/src/main/java/com/example/front_end_android/RecentCallsFragment.kt +++ b/Android/app/src/main/java/com/example/front_end_android/RecentCallsFragment.kt @@ -5,6 +5,8 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import com.example.front_end_android.databinding.FragmentMyInfoBinding +import com.example.front_end_android.databinding.FragmentRecentCallsBinding // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -20,6 +22,7 @@ class RecentCallsFragment : Fragment() { // TODO: Rename and change types of parameters private var param1: String? = null private var param2: String? = null + lateinit var binding: FragmentRecentCallsBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -33,8 +36,12 @@ class RecentCallsFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_recent_calls, container, false) + binding= FragmentRecentCallsBinding.inflate(inflater) + + + + return binding.root + //return inflater.inflate(R.layout.fragment_recent_calls, container, false) } companion object { diff --git a/Android/app/src/main/res/layout/fragment_recent_calls.xml b/Android/app/src/main/res/layout/fragment_recent_calls.xml index d7cd9894..da31ef3f 100644 --- a/Android/app/src/main/res/layout/fragment_recent_calls.xml +++ b/Android/app/src/main/res/layout/fragment_recent_calls.xml @@ -20,13 +20,22 @@ android:gravity="top" android:layout_marginStart="46dp" /> - + + + + \ No newline at end of file From f99c29a6bb764c7930caa7c0289861b82b2bff6d Mon Sep 17 00:00:00 2001 From: kmseongmin <102861243+kmseongmin@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:11:38 +0900 Subject: [PATCH 2/8] firebase --- Android/.gradle/8.2/checksums/checksums.lock | Bin 17 -> 17 bytes .../.gradle/8.2/checksums/md5-checksums.bin | Bin 18947 -> 23347 bytes .../.gradle/8.2/checksums/sha1-checksums.bin | Bin 44525 -> 82859 bytes .../.gradle/8.2/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.2/fileHashes/resourceHashesCache.bin | Bin 71199 -> 71233 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../buildOutputCleanup/outputFiles.bin | Bin 54851 -> 115142 bytes Android/app/build.gradle.kts | 9 +- Android/app/google-services.json | 29 +++ Android/app/src/main/AndroidManifest.xml | 9 + .../example/front_end_android/TestActivity.kt | 189 ++++-------------- Android/build.gradle.kts | 5 + 12 files changed, 89 insertions(+), 152 deletions(-) create mode 100644 Android/app/google-services.json diff --git a/Android/.gradle/8.2/checksums/checksums.lock b/Android/.gradle/8.2/checksums/checksums.lock index 2818605c027a56afd3fe3fd10984bdc753bd466d..273c2604b529291182b16dc572ccc1a1820f1772 100644 GIT binary patch literal 17 VcmZQ}nAlLaOR@4i0~j#J001zr1XTb4 literal 17 VcmZQ}nAlLaOR@4i0~j#=001#Z1n&R< diff --git a/Android/.gradle/8.2/checksums/md5-checksums.bin b/Android/.gradle/8.2/checksums/md5-checksums.bin index f7d9eeeeb4bf4fd8017c72f4bf340e924c5cc9d0..0a6db8a33d912a6ae03080041e88b2fefdbf4913 100644 GIT binary patch literal 23347 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 SH!A)R-)LYUzS+^^5F-GxSsdd4 diff --git a/Android/.gradle/8.2/checksums/sha1-checksums.bin b/Android/.gradle/8.2/checksums/sha1-checksums.bin index 7b4a0c2cede32134034b7914035bb91525785fb7..dbe2e6ad58e382d65cd0ac44ec78c1cd37631883 100644 GIT binary patch delta 18460 zcmcI~2|SeD+y9K6FvHl_8Dkmy&e-=PDJn!Mv=Ne`lr%z;h#aCtDIrN&lBGv!(e8;9 zg|ZZBkxFT!-us?&kN5WszvuDv|G($+>8`$A-|Ksw?K;;v8t&pK-OXLDETw*a3kMEq zge^Fno*)i~kBXBR)T0P^xT7czZ?^Xr)_}3pe!?I5-yG&s#o@ov`apw}89_5;8@G6R z3B*jhz_1kAHnDZxtKw~!(;+B+j^!kAc=eHf-ho1hlPy^IuIP~-EmZ|YCXPF&54fex z2wMI2VR4n;psm$4U@T1`@Hm9-!0C=dOl26jN#_z%YMaQk z>#HGV!wV)5>`JRK<;^|=i0S+S+OlSZw?(3Nw3W*sruhi?$p#U#DufDpw(#ABp!7@7 zARA|U;M3jp{U6e{F+p5K0xP5(LzNtX7g~p*u~ixi&lP@f={}G9Q;4gN0Ao2bg1|xR ziv5Ak5L5C7tL4bHhbuVSBSt=9^C<7ka&Sa?;h@=2*%@d|Ax+{(MW_Q=`EVZbMou7B zjzYMjbSUfK9Y<)Zp#rkyb`mx#Z6rGfF(4*Q07CL~TEWphb}0{eY#?a7h~>24yF~0U z(^rciuDuIb$x{eMSKgGbUDyXP^#tH4PbQxH_?o{)WnMi5Wi>&Vd=Ra0P^ZN4+Ra=D zDon2DBImg|=|9GrnK-W81~elciY{K3oqp(xvVPI2B8YCXlL&7$(gRhdVn`r!Lm8?EzO!gr(_1bXlI$?l#<2{pjF}I72+fi_yB1$NsikWr4ZHH2FoS=b1A&7USN7t=~@#CtFfkzZG zLZkq7O`iiC6R#vffu9p&!9)MFQ81xoz`^I ztHxT!3NCuwxja@RH@J&V*Pr^_$~4BETMIrT9&QH~#m;+l=sWZvF9KAk9ya1!fpg;v z{2@lEW;wXGKv{H~r_@`Bn@=vndky~7v#%m-A+GQRgi+1Z9`yTPUtnedG3gkVkLH2a z=MsD({Sdcq1$k65?az*s+WpRDOCYG@$1=Wuz^dJG(XZ_gH&X=FR0<(@gN<;|Y?#FG z#+N}eHP}XG^^5s8%w?gS5{1QYQ<4?mTNi&3;;KI;ac7m;!>O~IAa3*$Xe*P6ZFQ#) zRObE?gP@u|a8h=sJ-Rw{{p`Z-vk;WcVR>kmTh^zWuByhwaph4UO_@R{@pn`W8F>Y5 z9r!_^vIn6&EH}U~2s`$uhrzJ2JFyej_`Q0&@B}2Ep9PFn%m`7rHzH5bMKGaeuv&#~ z+da_L;q*2HJ1g{rSn5yrEYMWGxhn!1t5PTNULlE5-#lzNXc~fS6*}$Nv*Sw@^DME2 zZ_~pv?y-8XWwd`p6h?8@2Q;bBi9HkDz2-;38tB<}C-|&FA?O^m-qy6<7-F<2Af!qm zEcSh}ex9HU#2jpZimC^JWM;JfQ4}}C^aenfY8&n*61wF{EBy$pPyt&BX#rcs1F35mj;;kO`W1h)ZRNqB%^ zjX2w}3%n0Te~7j~P<8S^7<>5Dc-&!s55(=#Spj_U-f(h$i7Qrl*ipf1O*4W=znh$&&8~o5T0z90ZEt2T>Bxy}?fDh}o`>Ljoc@W>3lpt0fP;m#eA7OXT9lM8Wa zC(xixCUW0-{F8hmx0ngy%7(!sZFeG1lemaic;^aeDIp8wb#et+nm8PlABdQ}Alkfd z8126+2)7HaasmvS^%9*1^GDBW)$fP?&i<%sGH=BbBBintI9nVbSl(BaX8DzqxH5L{ zYd=>T7!R&07{uE45`%3V4`1>O`xBa0xK(-D+2ILm7Q4i`t-{LWD#NNY`w|Xak^3hDhVpF#sx?n_Ms{}Bl_&2=e=JE3&x0Pud0MGMsCxWYTiDW=-qCl?NL7gr%=juOri^YHHnC}FQ&_+*ghUlr z=c>7^wK7jFR`rmt=(X;mx@OG#C+J;x4Qj`jf!)+70)xbXQ76~InoO?Y`8EmqqjJ4M z(E9{Dv2l_kGh;FSnO6C*Q?Ox$>!MDNN2gD?i*)9`=tI^mI#54lU{|;hFYE&)_*mI+ zweC5|x)yqoLP0}D0R3U*Us?Rf>cBDB#`phJj7`h^M?)dwt&d2>b$iar8i{?C}bn(~6Fb#d=!jDcF<0nSrnTBRzrj{;bq=0kkw!al% zDCxH}G}QtVgEbwFYv)w4e-$FSb6}$W?=k*eh)DuDq?lpH`I}1hopH%?t`vU`{~!e`4BU%U+$Mi zO#C{&)(c;A9M_=+h=PGS>rmu-@s8#hm7$E`cR`a*98F-mv{IvB16-n=XF5b zk_58#bBXd_>x)#jtrKU0xbjkNj%ovO(6HX1N5PzHiR;5+r;-bz&u=s>*=xS4tol1wR1=LKCM zW?KWYP02))(jQMH$CkpBfTzC#Wv00_`be=3Rfqf)daT^fk~dp`OE01c9fBTIb^S z!tw*U2cn=`^U0aEduce4wk3B3#7)D2ytx@cm@{+y1n+T(sip%rb2`ys*td6GrxBJ+ z^gTeVxjT)$TxZ4Q^qqcZVU<`m^q?;bn#^|+q9*nmR2@o#n8to!Wf5dMXX5_88`e)& zLr`Y&In>1>kUP_DTomH+uUL*8}}`RxP2bTvj`>>9pAh=>*Y3xkt4u_g@+nB zUsLG5=?#cc7%aZqwKR`)Yv&F?TwDk^SyBkA=BZygwN?XS5)Hr)!4&4rEvkQi1Y&kg zAj*=Ww(xjoMwKL7EO?X2Ths!!>j_A+45GP53s`BVtVF9AB-7JlSpj$yYY~^d48z0> z3&61DLA9+S=WDikheBJm$qVwLcH@=p6IJNRkNA+x2C-IT+G5?#?zxU9v8}0hj^%i9 zG|4(mghK)v)A&KQ74q5?cxwY?A+|%6c|jS1xy77Z7Pbmo2wHZa$% zrQ5P!7+JkpS@`Xg_KgIz3_+YKcuwN|qY-uUB5y(5Rvfutl8LKw+Fd@mbjd+bDGg-X z-m(ogykTur<1+|BsREV<_S+~6Uw7ZO+2O8p7PQxT4m|BB1gF|NCo=TVf*y%N*$RZ& zkr^T0Z=DUv4M?Gdf|8TgArJk zmR!N&tuIK>A@!AEi$FI73?Lo5KmNjkv^EH8tNMTmyMydEa*$?Ew%zFegZui0G$m+A zcV;==BpFcQR6aTf;zoo?+`z%t;e0-pBcz^yLi=E~?Q(YtwGy2%+sTL9$Q<(K)n8~Z z1LM`&0JpGl?XDj#uY50Ifr)_6 z4#8?snr>Ia?)`w6`ASw$+lrnw%nh%61#x?Q;OSUFkiNP6RLkvZh{@~$6OLqBY-pm& z{((yh5Y*esauD0L)IBh;crCcgvD=0)^ z#$VqrW?JC>mGyg-d;RR)o4Xk2%nPHxk2l&C&hJ=lY8{BIUG$DN#_SW0s{r|(?RKG= zpQo2m!l(4-hu3|ge(&nPHC#pJfXSM`ShJ?Gm}1jt+5f+bf#d5*)M`$HL8n6rn?RWV zs`FZ5apT&^VnKuYMT9}|Qcyd_4D6-`A62o?-7-s=o}*xz909`D@Apk_#k^CXcOJCs zYy&kNYxY0Wbhp^8@~HDZc#d!F_^hm9U6qctEf@=y5?Lr7#D|7Udw<`6ARi z^M<~{Gppv3Gt|7#4HHD*vSmEbsQfyfpT^l{9 zU*q-V`AM3{6_nXC>@|k7cB&Xk`}eGQ1@ns^%lOZtp3BkZ&iSw*Dti`E-QbZot)qCD z+Hss{xx+SR|AqDsEd2R`3xCo&=eg`Fd0WXRwB6!%)e!6$J_e4W09w-_T5JCEbt?Hw ze0es#x1sp^^1;k-qRJ}V;R_fo6Viy+riM5Z76>RMG46SfdE;9Wl_L8C;}>rFSYFv0 zhIxlK5F8ObqS*$ZuGY|Jcio*Bs{Ee27nGDElt_vWki{VbW15vPmF1`%M^yL}B&ofi zj{Ht@`FES8i`K#Hd6c6P(hSkt7@OF1G)!!g1w8hWWCfmX&Z!)1xdA?DjeOhsa#MAz zG_>Os0Rg*YgxGqunWh zzj9;Zr-}QP^SsnU8xNb;U>>Sq54k>1?cwjS3f^9yuRdREp6I3Gs|RkRZ;JkNDFZp& z(QvuoMG?n~Bp~+ToQ5_7*5Pyu`iRa73u>Ci_J{Y>g@*a6uVGp%VaEgy;&AKO#b!oh zXW67|P3e0n@g#k*Xs?TNXkU+mA5zq!9m9THic{YScDj%lzL)&>xGzwbPJDH6$l2-S z=(|<6n4L8Yiu`)&00_n`9WCqE*~wv9C)EFa*9M86lXe)(3$hdkr?Lz+I0r%mInV59 z^C2{-gjDfH+b6?3eUzsG(gcI2(u}+BxSJ-McrAZ;Am&2+A7wd9&XF*&%aHYAngr7` zpuc!QYTJD205yg6bL)HQ{B=mRj}8E@IFrR;kED(%KYI|C;+Q*O7;!1KP62mfpGn(; zmJf~?4X!?XQ^?d1mwgDm{UL+i<9+4QzHL6M_)N5mvGL%C&v_(n^!#GmmHde^Tgizd zt@gG1b|H7T{rVs0EA>G!fkn(1@!Q0}@kJz`uw#pU@PB)Mp|VZVm;N}ZH)Q-SW_O-x z$D<)X)qS7-XTO&}&(xo*q1$K2J+*gp$XSN5Mwu**!+d}eK=Qe0;FEAdKUq;hdij$M zlGHJKd1T7bk(wpIw8JU$PUBrqu=n)d@xsHcZ{G7tY*RaWtsg1Gm@Fz}Nn8Pa^GJ-+ zSKl+&7#Ln#8fJE9eQ46|dzsk5H_HmzwIV-bWFMOPvpw83?IL2=Uxap@IPk3hz5X67 z_F13o27MG(n;XsgUcK5Sx5q@?gCvgcRtcIUD^MJRE2c?3%A|h3FqwD*1APZu9(=W-!gxQT?pl1W@P4bYf&pUqs zSjit1ie_rzoRB2R9%4No&jzyPiCrx=CAX5RlhTPIMum7x45^CICR_(Z%1Bi06^|_r zoQ>IZDj-(OtgSL?=@y3EJg40-Jg2+$fR^!sf{^94f8`TAPVKk>eRw%r3XD z%6R(_86=b7Gd^sLe z?#{a!^F-{)W1n?=+`+|+>lp0?Gd{i*E2h%KEk~0wa5h5&i+1U5l{Ya|?$!PVSt5Q+ z7LN1e@3N+(X{RgK4Wx}7q+f5kd2iF^^Iy$7KiXnq_n_Ex1>Q_pz%GeI-C3ITe!F<^ z<^#_=8Re>6t2le>pm$LltShys9b*P|Q@bp)po{a}4~?od$&1BY*1D8){s^9fc|ZK$ zW1o(N?KaWBq3Itpk&jGz-F;us+?;lGyZd9V&7M$O>{}5w6h9Q#BgPMJ}Da0*Um^{|J%6GS>q-S`#>C(GbBQe@nCXKtm8Tp-U zl^%6743cl{FnMqB*kk? zG2RQ)?6^UNif55-s$GH$jW%U&8M+(y@=XsEqjEA?&ZEerv4`lLz9V|$4}t;jg3$?= z+4({FzO_Fv)-aQW1L$60pCoD00bjkLq=w`#4S_pC2tn45?2r|J_Dn?x(s-viBII{{ z3v02rzUSq%u=!L)lh+$+L^x!rk|9eNE#cTEiQ3|Kjxi_DBvV~fX``l8RW@;~1UXSq zF*Q9%Bl}OKDGntqrljU>Ox~7gqA_PqN{LedCPvd|vhen*Q(4kU&YN;L4oA4J__E`c z$>zT5;EWH57MewAU%<}OG7CGy{Q9pLY+WA@Tw?-th;nKPs;)2^b+{RDZlY8Du9wQX zv#-YD*tPhlKeJSCe?QH;KmxKf7NKsHTbsLnojAMYL3m4J<+YeBL)l)l5on;v#|#%o z+5$W_kYtmW`z5-6IXA@pXyo$yi~hUxWIN8n>+aVDn4vkOzFk<KPy=la=m?)ZHNI-$q`ZnPvfpn6weOb8?*hC|JXk)_z71Ii2d1)g?zH8++^*lS zsnIei?6q8Sg8YOC@^FEQ>70Qyu{&V@d=mB1-hJOQL$v(2CN?dodJyR{s|-Fo9o6lC zcK9+NpUyn3^iqIpx(wr-U6kzk+G81NK%>wyxpDvQ%IH$)S|6P^q-8WAAGXC3vXbM< zigSyHE-NY@h#!)75Iud_9%G?f4Tt08oo4T}CoH#ov*fL{ezT;yzZ`f_9sbzn7e>R* z9bWWjJ#1nh&JZlBY!y$XBzF%Coi}_}DEXlsV}+t~Ay?BrS7|(;?PRe3k!|vA&mSn4 zWiEyW25XtKK6cba>`e2zx^?R%X9r}sIBlWhkl{wh&k#O-r3oFsQ7rT>Z5eS_0WIv>)XLjw~SA7}lusctz#dOkcWEgZSGxnpo&eu$;}xtK=C zqQi@_>dVxrEQWjdbC=Z4oG@8qK}zDP{0})U{PB=x#>b4t?qT|()nfeWygkI5>HAj2 zcWQ)oF%1fzxFi0M##4!W*k= zI0@2Jv1w>CU=`gPJtuGEeso2}=gVVJb!RthYo|f2PBo}S_C=B~d(YCh9k}Ay=@l8# z*0J)0?bW3Pk#8z6+FD4XMrg-6vC5GjIXKw0 z2AZ!k9#|xG9B~Mj`1ycu5p8}_I>KYpa-f)W$+WcJU`^jK22<>BdS?4Edm{43D@E}= zbL0-hh<(`HKH!3dcnO9me06GwvulfYT@X-P%fB>9B*0>c_l^S(;T|mP9D*#-$4nM- z2>-|bx|%WVFRb4SaTQ(1YfTFy;ne$M#^!z&^u>`%`p6-Jjz<>-#>f-JjPWmGkoIp` z8=oy1zZ~f{i&y5Ys^$sV^*BDK_e`zu!mctXCNMZv?7!0fmQ}Z^#LhWljcku`!3Unq z6F-C=+**Tm>?5#?ky#j*wYO!v-v!=9j~|stxb9Wj*qf+<8H{1UOj9##e-~xAsC+!D zS5Kg=>w_mxrvG*1oMDdFH}t>7GWz!}UF=W(u*TyJ$j#Zhq*N2Pp*E zH^IjKQMrn2ow9t+2lYGRchCFjx(P{SsM~I1$ReSa8@2>A4T~`Y+Pjmr+*^&Z-ju5h zlw__ixUVo&1yg$AQ*S6nIW|@7!T0Uij?rqbF5XS`Z^%k)66M&0yl0>x_93YqZ3##j zI3<-EltGJyW{iR-8)XYN>p{#)i1t}^dA))LrN92 z$s)OyUF^-Lua-`G&sE*6=^D7u`}Of#(wi2hSXpx;%E94gAsP9%S$|C>sqypq3l4^h z8eRu4QeEV$qVDLyGNJ5GRi+kB<=|AY-(z*pwVs==%Q$(h?QKGWcSxF1T5%#A{IWmM zLm6qJfyjq#@FDHrvLH85gZ)Q$ z8#~`0#(IWUUr6IiKt61v_;)OH(2+JB4Y$X+t)d3^Ax~P-xiS9Xj^+97`Is1TGejE? znt0j7{w0fw4SqC%Qz?+k$U*A)s;KqBVQVSk@$qM@_|j6jNCsN`0k!tz4_$ky^C?T-!{hk?v;2m7>g`VrY`c@ zfi^+|@?q=bv&|ZVgM&#j;_HqacRrJ9y6XA~!@shG^}zl_lF$F0_lRvIs$QV=tQ0Pp z(ZU~RA1uAp{W+BnDS^@0A0W#QZM-W1V#k<)9b(MZ$BVmd?=F=XUAcF4@^`t3t1c17 znMRoRY^HOZAiCpbz`{22gGm~&b0;x)K0A4B@Fy0$9}rfKD;n)vuqFv}{}Q_AL(5M# z_nLi{Z*&RUQ>?9P??-=rMo=anzlO1}8u%=_hS^x1c-M}7)U|p~TRS6zP7JItdMsgzxo7YF~6j+crbH>3$mi#5Ljo^~*hh z=T^ny8J{1tnXX@kJk2v%$n^B(p1{B+C`Tvk8%$m{Bb$qMV?U}Ur{Ua{(!O`BGZF5ZX_YHi$!VC5`wGk_~`ri z`169iei~J+MQ)EM>k*do`O(D2{5eyd&TGZRR)&p3TDu=Ag_E1^ zY)`!^$m_oT%051$teC`8t1dTY&6$s}ki>@Hz@1iVzO|CSyO3OABT7yBi4-XptXG#6dumm6T77tigh4058B+Px%scm-*RLu zsQ+XvX`=XA`Sq{eTLRIxkyGxc4?JK~1CmJOGs@~r3D_6lPmqG*$ThT-a*=99wrNyS`X}wlNb+|*!c$M-WL0_x>(`huf>veo?@7t z6ts)Af$sm)yL~Z-i@jyzL*-=xyxPtOUiV)=g{_Fk$Ua0GXWqT3EI##9Hg&oZ2Tm2} zTD&`z*mEmJ6(G3=9f2oaOd9Tu-Bg;wz(&=rC10%6E{e7cJBvj6IXKlpRu_6vK^ku! zXpJR-Bk2;z19Mq-JM)!m_A&Df(bT&pcD|MOn`a4bUb)F0F-66mK`|~*WdvZGqzISD zhoy6tysk6zv*3#3AnpykF92CR=*~czObzm3W8HC2ZWljur}V+;>=0t5$;p??#u;}p z8g|TPqM~dxJ4X#qq3F9lMffXiNt|P)i*vqNLRPOlDuv@yjzhj|tcTWy#W&x%c7<0_ zW=;HhNBtP}yc=WbBi2Y$xQxSTvC}S4r6p`K7S@*dylK~tsgA zeU*u&ZnegpZ>j?x54@6^y#w&5mbMdY|oW#dDJJlF#2 zjYr)ozsQtO;hdXrSaiz~eNtGVgg5sbN6hU$rdu5EHuT5kYGX-;XUOZ`1_>4QUf!NC Vt94~NvKY|$>OBnY@aUd2_#d<_$i)Bv delta 569 zcmWlWJxo(!6ozkWAP&}_h5LO#3)TKW>21G@6a+1X5b-i#To{3COmTt@ii5;OoRFF) zy3x3(B#O~Auz@TL4iE=1O^ggG1;G|dA{)f(NuIpJ$;q4dJ#QXY6u-IO2gC&tb!*O? zOKX}sqiL=m^oge&2}P&WnUy95DX6NRVX4|CQ6qRzW8tY)^w*kX9W6M-yhFV7PLT4M zyz}XJ>Li_Y6Rg+8G3q6Q^*Yn_HeSD=&u=mBckVA9Fm}nNB4G0@AXp8UoDIHaEvPU; zcX$=jNrWZCVZrmTVl$j(q(QOJU|}>W#u|I6j3|a9I`a|9X2fQyNoS$S*+(7EsKs*h zCSJp2*ogDpP$XlDM={A_Oi+kf^u*I_#1(x?GO2V{RWBjaV$qyqyjig9P-@O|bXgE; z5sW%yTUHoP*pw1!=37mUTH_?!B%^Ie-{>a*nZ_ c%E%{j_`}_W-g<^66AC^u&eUi83{)!z07&N?761SM delta 31 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 Y|BJ9{SP5rWvHGx*U**h>&)=;1U+%fDA^-pY delta 2840 zcmb_eX;78d8Rm$%vWj}nVX-2MUbg#P;mV?b!VUML#u_JBH5kQclTNf9jiyCYo2f&m z#%PQW`ZXDiE3Swlpfw^<1nSymK|8VPv>kQYj1pWhiemeG-YkuYGx^aw^PF?u<-F%T z%k$o^c}e$U6~22@RY=t11+g_051(KhO;ZNg(d7caC~7cUGmHG$S$2^2>p(t0_OVqOxX{^7+-RexXJ!y9$R zdNVXxJQMWUZ~ij3_Rhb&${(kho0GZJ?PT$Rxy-O48VqsG5O(tghnOCG_QcAU7O%E> zyzb-Io4r#+y7@^8oqSV;!GQ0Uxl~)D=Y}!( zmSGgb(>SjzjVts{w{lKrg!-A|{(8vS-y7jfp&6aQ2t^s3SC>J@MVZ`Y=m?6hjNp_O zYt%K1u~M?cbn{jgb+fbSQj<;Ryc}z#93D~Ek@RaENxxI0sOy_c(UnW_m0Zik5?d@W zJdYVQ=247sQGD4&>slAZ2Ug>Hip`sBf@I>hs1x@}yje~tHkaiy%f@^$%?$O3mFA)X zp82X(8P^W^hk1Q|vc&Wq&GV`rEeg!OW2|6fm{-dfrWrm~IPm9ug@^glT=KN=pxmu- z&i%7)kr_Tdo{wPLlYxbM6m}95_A30A*hh5il~`I;fX}KFhVE0CL1b3jF{(ymUX4Ua ztwPj(!<+Uc5Y zPe|yK3U8m(IL|)wl)}5G>~LMzSa4mUj(udS40cBp=gyzDBF%eZ&$J`r^C;AQE-}AN zqr6R`?1sYa8wDu6DN%IGf$O*2xNut|pk3l}y9af5G_KzvWxtTP@CEgE6-w_Kn0n7Z zWQT!S9gNYTk#%2U_I(3yK2T_Rz{NXR+Byw1v2Q1`9!k_a^sJ5$j@7e-dvzlpMV8>5 z%@KSQYX!wCf)`iRh39&>3w5vg(t6vMVr*B-&uVI|CdrT1B0s*!uH7hJu$l+m*=*@S z-OQex5zvb+r+e`=)b*w=CVMU^eT5X}BCrm!c3h z5q;QH^r0aplzye5R#0oy8A`)beOWQe`qAp&pSn5ysXNo3TS$}?mrFXgNLt4#in|rX z*_xwu+VayvRy#d$F|p!4O8cCdknooGhQ_COdzI+z*S^HwRuy$uRvG`6ZyVh;3xVP9 z<0GE!%q~~y>tZH*9ml+dx$DNmwq9ZGdW}u%B^(9kX;(NyX-i)>sKhK;5ros8Y;L>g&ptg);PJF6eHp*NwZ4E zsdU4!$MHQ>G`^RL=Sjyw)o$2o9HgV&{QXKnV%2Ii)JpQwfp_;ygdEVO4LtBiBwY#~ z_?JvoW=R=q!T&N{1@m}5h?%x diff --git a/Android/app/build.gradle.kts b/Android/app/build.gradle.kts index 35537a4f..22e53132 100644 --- a/Android/app/build.gradle.kts +++ b/Android/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") + id("com.google.gms.google-services") } android { @@ -50,6 +51,8 @@ dependencies { implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.core:core-ktx:+") + implementation("com.google.firebase:firebase-messaging:24.0.0") + implementation("androidx.work:work-runtime-ktx:2.9.0") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") @@ -57,7 +60,7 @@ dependencies { implementation ("com.squareup.retrofit2:converter-gson:2.9.0") implementation ("com.squareup.retrofit2:converter-scalars:2.9.0") implementation ("com.android.volley:volley:1.2.1") - // https://mvnrepository.com/artifact/org.webrtc/google-webrtc + //https://mvnrepository.com/artifact/org.webrtc/google-webrtc //implementation("org.webrtc:google-webrtc:1.0.32006") implementation("com.mesibo.api:webrtc:1.0.5") @@ -71,4 +74,8 @@ dependencies { implementation ("io.grpc:grpc-stub:1.38.1") implementation ("com.google.api:gax:1.58.0") + implementation ("com.google.firebase:firebase-bom:31.3.0") + implementation ("com.google.firebase:firebase-analytics-ktx") + implementation ("com.google.firebase:firebase-messaging:23.0.3") + } \ No newline at end of file diff --git a/Android/app/google-services.json b/Android/app/google-services.json new file mode 100644 index 00000000..c12d4487 --- /dev/null +++ b/Android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "278561057427", + "project_id": "ringo-4a945", + "storage_bucket": "ringo-4a945.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:278561057427:android:56c0f13373217851e07b66", + "android_client_info": { + "package_name": "com.example.front_end_android" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyBDAxuh8PRCxuQxI2tUZ-qu15Uq1AJSStU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/Android/app/src/main/AndroidManifest.xml b/Android/app/src/main/AndroidManifest.xml index 673cc535..436002bb 100644 --- a/Android/app/src/main/AndroidManifest.xml +++ b/Android/app/src/main/AndroidManifest.xml @@ -8,6 +8,15 @@ + + + + + + + = Build.VERSION_CODES.TIRAMISU) { + val permissionCheck = ContextCompat.checkSelfPermission( + this, + android.Manifest.permission.POST_NOTIFICATIONS + ) + if (permissionCheck != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions( + this, + arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), + PERMISSION_REQUEST_CODE + ) + } + } + } - private lateinit var speechRecognizer: SpeechRecognizer - private lateinit var recognitionIntent: Intent - private var isTranslateMode = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityTestBinding.inflate(layoutInflater) setContentView(binding.root) - // AudioManager 객체 생성 - val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager - - // AudioManager를 사용하여 스트림 타입을 통화 볼륨으로 설정 - audioManager.mode = AudioManager.MODE_IN_CALL - - // AudioManager를 사용하여 볼륨 조절 - audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), AudioManager.FLAG_PLAY_SOUND) - - editText = binding.editText - val textToSpeechBtn = binding.textToSpeechBtn - - textToSpeechBtn.setOnClickListener { - textToSpeech = TextToSpeech(this) { status -> - if (status == TextToSpeech.SUCCESS) { - val result = textToSpeech.setLanguage(Locale.getDefault()) - if (result == TextToSpeech.LANG_MISSING_DATA - || result == TextToSpeech.LANG_NOT_SUPPORTED - ) { - Toast.makeText(this, "language is not supported", Toast.LENGTH_LONG).show() - }else{ - if (binding.textView.text.toString().trim().isNotEmpty()) { - textToSpeech.speak( - binding.textView.text.toString().trim(), - TextToSpeech.QUEUE_FLUSH, - null, - null - ) - } else { - Toast.makeText(this, "Required", Toast.LENGTH_LONG).show() - } - } - } - } - } - - // RecognizerIntent 생성 - recognitionIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) - recognitionIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, packageName) // 여분의 키 - // 실제로는 언어 설정에 내가 설정한 언어가 들어가야함 - recognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR") // 언어 설정 - // 새 SpeechRecognizer 를 만드는 팩토리 메서드 - speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this@TestActivity) - speechRecognizer.setRecognitionListener(recognitionListener) // 리스너 설정 - - binding.speechToTextBtn.setOnClickListener { - if(isTranslateMode==false){ - isTranslateMode=true - startListening() - }else{ - isTranslateMode=false - } - } - + permissionCheck() } - private val recognitionListener: RecognitionListener = object : RecognitionListener { - // 말하기 시작할 준비가되면 호출 - override fun onReadyForSpeech(params: Bundle) { - Toast.makeText(applicationContext, "음성인식 시작", Toast.LENGTH_SHORT).show() - //binding.tvState.text = "이제 말씀하세요!" - } - // 말하기 시작했을 때 호출 - override fun onBeginningOfSpeech() { - //binding.tvState.text = "잘 듣고 있어요." - } - // 입력받는 소리의 크기를 알려줌 - override fun onRmsChanged(rmsdB: Float) {} - // 말을 시작하고 인식이 된 단어를 buffer에 담음 - override fun onBufferReceived(buffer: ByteArray) {} - // 말하기를 중지하면 호출 - override fun onEndOfSpeech() { - //binding.tvState.text = "끝!" - // 듣기 재시작 - if(isTranslateMode == true){ - startListening() - }else{ - //stopListening() - //binding.tvState.text = "종료" - } - } - // 오류 발생했을 때 호출 - override fun onError(error: Int) { - val message = when (error) { - SpeechRecognizer.ERROR_AUDIO -> "오디오 에러" - SpeechRecognizer.ERROR_CLIENT -> "클라이언트 에러" - SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> "퍼미션 없음" - SpeechRecognizer.ERROR_NETWORK -> "네트워크 에러" - SpeechRecognizer.ERROR_NETWORK_TIMEOUT -> "네트웍 타임아웃" - SpeechRecognizer.ERROR_NO_MATCH -> "찾을 수 없음" - SpeechRecognizer.ERROR_RECOGNIZER_BUSY -> "RECOGNIZER 가 바쁨" - SpeechRecognizer.ERROR_SERVER -> "서버가 이상함" - SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> "말하는 시간초과" - else -> "알 수 없는 오류임" - } - Toast.makeText(applicationContext, "에러 발생: $message", Toast.LENGTH_SHORT).show() - //binding.tvState.text = "에러 발생: $message" - // 에러 발생 시 듣기 재시작 - if(isTranslateMode == true){ - startListening() - }else{ - //stopListening() - //binding.tvState.text = "종료" - } - } - // 인식 결과가 준비되면 호출 - override fun onResults(results: Bundle) { - // 말을 하면 ArrayList에 단어를 넣고 textView에 단어를 이어줌 - val matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) - for (i in matches!!.indices) { - binding.textView.text = matches[i] - } - - // 인식 결과가 나오면 듣기 재시작 - if(isTranslateMode == true){ - startListening() - }else{ - //stopListening() - //binding.tvState.text = "종료" + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + when (requestCode) { + PERMISSION_REQUEST_CODE -> { + if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(applicationContext, "Permission is denied", Toast.LENGTH_SHORT) + .show() + } else { + Toast.makeText(applicationContext, "Permission is granted", Toast.LENGTH_SHORT) + .show() + } } } - // 부분 인식 결과를 사용할 수 있을 때 호출 - override fun onPartialResults(partialResults: Bundle) {} - // 향후 이벤트를 추가하기 위해 예약 - override fun onEvent(eventType: Int, params: Bundle) {} - } - - private fun startListening() { - //rtcClient?.deleteAudioTrack() - speechRecognizer.startListening(recognitionIntent) // 듣기 시작 - //rtcClient?.addAudioTrack() - } - - private fun stopListening() { - speechRecognizer.stopListening() // 듣기 중지 } } \ No newline at end of file diff --git a/Android/build.gradle.kts b/Android/build.gradle.kts index 1a680f36..e0959f4a 100644 --- a/Android/build.gradle.kts +++ b/Android/build.gradle.kts @@ -1,3 +1,8 @@ +buildscript { + dependencies { + classpath("com.google.gms:google-services:4.4.2") + } +} // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id("com.android.application") version "8.0.2" apply false From 234f344d94ab4cd89745d20405e624b46b74e37e Mon Sep 17 00:00:00 2001 From: kmseongmin <102861243+kmseongmin@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:47:48 +0900 Subject: [PATCH 3/8] firebase --- Android/app/src/main/AndroidManifest.xml | 2 +- .../example/front_end_android/TestActivity.kt | 39 ++----------------- .../app/src/main/res/layout/activity_test.xml | 25 ++---------- 3 files changed, 8 insertions(+), 58 deletions(-) diff --git a/Android/app/src/main/AndroidManifest.xml b/Android/app/src/main/AndroidManifest.xml index 436002bb..14a09ce0 100644 --- a/Android/app/src/main/AndroidManifest.xml +++ b/Android/app/src/main/AndroidManifest.xml @@ -11,7 +11,7 @@ diff --git a/Android/app/src/main/java/com/example/front_end_android/TestActivity.kt b/Android/app/src/main/java/com/example/front_end_android/TestActivity.kt index 80bacdad..272e6f35 100644 --- a/Android/app/src/main/java/com/example/front_end_android/TestActivity.kt +++ b/Android/app/src/main/java/com/example/front_end_android/TestActivity.kt @@ -4,6 +4,7 @@ import android.content.pm.PackageManager import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.view.View import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat @@ -14,49 +15,15 @@ class TestActivity : AppCompatActivity() { private lateinit var binding:ActivityTestBinding private val PERMISSION_REQUEST_CODE = 5000 - - private fun permissionCheck() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - val permissionCheck = ContextCompat.checkSelfPermission( - this, - android.Manifest.permission.POST_NOTIFICATIONS - ) - if (permissionCheck != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions( - this, - arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), - PERMISSION_REQUEST_CODE - ) - } - } - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityTestBinding.inflate(layoutInflater) setContentView(binding.root) - permissionCheck() - } - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - when (requestCode) { - PERMISSION_REQUEST_CODE -> { - if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) { - Toast.makeText(applicationContext, "Permission is denied", Toast.LENGTH_SHORT) - .show() - } else { - Toast.makeText(applicationContext, "Permission is granted", Toast.LENGTH_SHORT) - .show() - } - } - } + fun requestPermission(view: View){ + } } \ No newline at end of file diff --git a/Android/app/src/main/res/layout/activity_test.xml b/Android/app/src/main/res/layout/activity_test.xml index 81335808..f5798e6a 100644 --- a/Android/app/src/main/res/layout/activity_test.xml +++ b/Android/app/src/main/res/layout/activity_test.xml @@ -8,29 +8,12 @@ android:orientation="vertical" tools:context=".TestActivity"> - - -