From 6f1cf5ff2db52a99d653a5cde8d40e8b8443a750 Mon Sep 17 00:00:00 2001 From: AnranYus Date: Sun, 8 Jun 2025 09:41:07 +0800 Subject: [PATCH] feat: data process --- ...hared-iosArm64Cinterop-cinMain-c9Gnmg.klib | Bin 0 -> 80689 bytes ...ore-datastore-1.1.7-commonMain-X_H3Ng.klib | Bin 0 -> 2222 bytes ...atastore-core-1.1.7-commonMain-3X5hEg.klib | Bin 0 -> 7809 bytes ...ore-core-okio-1.1.7-commonMain-o1WRng.klib | Bin 0 -> 4858 bytes ...e-preferences-1.1.7-commonMain-f3oI8w.klib | Bin 0 -> 2791 bytes ...ferences-core-1.1.7-commonMain-hildbA.klib | Bin 0 -> 5805 bytes ...eup.okio-okio-3.4.0-commonMain-FFE3Tg.klib | Bin 0 -> 14028 bytes ...oin-koin-core-4.0.3-commonMain-LKCCMw.klib | Bin 0 -> 46549 bytes ...linx-datetime-0.6.2-commonMain-fgfANw.klib | Bin 0 -> 32113 bytes ...kotlin-compiler-7621307791481117302.salive | 0 androidApp/build.gradle.kts | 1 + .../whitefish/ring/android/MainActivity.kt | 1 + iosApp/iosApp/Libs/Modules/DeviceCenter.h | 3 +- shared/build.gradle.kts | 24 ++- .../com/whitefish/ring/DeviceManager.kt | 56 +++--- .../com/whitefish/ring/Platform.android.kt | 1 + .../com/whitefish/ring/bt/BleManager.kt | 2 + .../whitefish/ring/data/DataStore.android.kt | 19 +++ .../ring/data/DeviceDataProvider.android.kt | 29 ++++ .../kotlin/com/whitefish/ring/App.kt | 25 ++- .../com/whitefish/ring/bean/ui/HeartRate.kt | 3 + .../com/whitefish/ring/bean/ui/SleepState.kt | 9 + .../com/whitefish/ring/data/DataStore.kt | 20 +++ .../whitefish/ring/data/DeviceDataProvider.kt | 11 ++ .../whitefish/ring/data/MockDataProvider.kt | 14 ++ .../whitefish/ring/device/IDeviceManager.kt | 13 +- .../ComposeMultiplatformBasicLineChart.kt | 10 +- .../whitefish/ring/ui/guide/DeviceScreen.kt | 38 +++-- .../ring/ui/guide/DeviceViewModel.kt | 43 +++-- .../ring/ui/guide/GuideNavigationScreen.kt | 49 ++++-- .../ring/ui/guide/GuideScreensPreviews.kt | 6 +- .../ring/ui/guide/NavigationViewModel.kt | 41 +++++ .../whitefish/ring/ui/guide/RegisterScreen.kt | 159 +++++++++--------- .../ring/ui/guide/SearchingScreen.kt | 137 ++++++++------- .../whitefish/ring/ui/guide/WelcomeScreen.kt | 124 +++++++------- .../whitefish/ring/ui/home/HomeViewModel.kt | 22 ++- .../ring/ui/home/state/StateScreen.kt | 2 +- .../ring/ui/home/state/StateViewModel.kt | 48 ++++-- .../kotlin/com/whitefish/ring/utils/Utils.kt | 26 +++ .../com/whitefish/ring/DeviceManager.kt | 101 ++++++++--- .../kotlin/com/whitefish/ring/Platform.ios.kt | 38 +++++ .../com/whitefish/ring/data/DataStore.ios.kt | 33 ++++ .../ring/data/DeviceDataProvider.ios.kt | 123 ++++++++++++++ .../kotlin/com/whitefish/ring/utils/Utils.kt | 15 ++ 44 files changed, 896 insertions(+), 350 deletions(-) create mode 100644 .kotlin/metadata/kotlinCInteropLibraries/shared-iosArm64Cinterop-cinMain-c9Gnmg.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-1.1.7-commonMain-X_H3Ng.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-core-1.1.7-commonMain-3X5hEg.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-core-okio-1.1.7-commonMain-o1WRng.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-preferences-1.1.7-commonMain-f3oI8w.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-preferences-core-1.1.7-commonMain-hildbA.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/com.squareup.okio-okio-3.4.0-commonMain-FFE3Tg.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/io.insert-koin-koin-core-4.0.3-commonMain-LKCCMw.klib create mode 100644 .kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-datetime-0.6.2-commonMain-fgfANw.klib delete mode 100644 .kotlin/sessions/kotlin-compiler-7621307791481117302.salive create mode 100644 shared/src/androidMain/kotlin/com/whitefish/ring/data/DataStore.android.kt create mode 100644 shared/src/androidMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.android.kt create mode 100644 shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/HeartRate.kt create mode 100644 shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/SleepState.kt create mode 100644 shared/src/commonMain/kotlin/com/whitefish/ring/data/DataStore.kt create mode 100644 shared/src/commonMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.kt create mode 100644 shared/src/commonMain/kotlin/com/whitefish/ring/data/MockDataProvider.kt create mode 100644 shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/NavigationViewModel.kt create mode 100644 shared/src/commonMain/kotlin/com/whitefish/ring/utils/Utils.kt create mode 100644 shared/src/iosMain/kotlin/com/whitefish/ring/data/DataStore.ios.kt create mode 100644 shared/src/iosMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.ios.kt create mode 100644 shared/src/iosMain/kotlin/com/whitefish/ring/utils/Utils.kt diff --git a/.kotlin/metadata/kotlinCInteropLibraries/shared-iosArm64Cinterop-cinMain-c9Gnmg.klib b/.kotlin/metadata/kotlinCInteropLibraries/shared-iosArm64Cinterop-cinMain-c9Gnmg.klib new file mode 100644 index 0000000000000000000000000000000000000000..c1c45497cff4731bf8548150f43786301ba5cc02 GIT binary patch literal 80689 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�BRNu(7@lSN2$DnD0o!i5!4m~%xOD&ym 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≺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 literal 0 HcmV?d00001 diff --git a/.kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-1.1.7-commonMain-X_H3Ng.klib b/.kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-1.1.7-commonMain-X_H3Ng.klib new file mode 100644 index 0000000000000000000000000000000000000000..0f066960e4dfa1804585bd8894c6cb47c0724614 GIT binary patch literal 2222 zcmWIWW@Zs#;Nak3U|?_rVg%q|;ABWiO-n4zDbWuNVP#-s5cw{|%n;zs4pPg&1XUS; z(*OY^19B7dGSgCvOW+3i_89UtDDW_R-*;3%k+F}^k8+(JW?ptmVo4%-z7@x2Qf_`qX-+EK(~pHV zdwS}4>gb)+_v-aOcmC|z^PhdsoY}lNX~QFrGv1n~&iky~Ak?(+%Y&@B5_2AW0tfcN zXwd>gpeJ1LdPE7E^#zH^*@@|?@rijUMfsU273BHMfGDF4;I`;x=j9^2oFtGmA*tfP z(H~vi%7*$&HSCR-GJ*YdSZN8D7|>55c>SeAjOBWuXe%zsFG?lPht?!oVh|6v5Y@9> zPvP(0MPla-3klX4DiRG!XB^BnGjy{wi!@I%U~d*sZf2P*d|2I0Oizt@ zntaR}{v8r=g`5ZPEM_l1r>^Iw1`gbd(oZL}0Rwgw-oTZ^=I^5X{E~QR${{Z}RR|hu z5RV#eNQs0I?Ea>1fv0>xxAWk2zYvl|MXAO4rA5i9#rWOK$Rq+xameKztRMrGcc=iP z^b7Dt)s9@ofJ!?A02QS$?HFYrx-lSaFjs&IBm{U0WWtQWES}KKK`tpk#SsGNGh#6Z zt#Cp&4Wt|9Dp2Wy0PC=shP$jmHyAnNgUS{J-~`%-;av=aag;RZ)_{zKxgS)DAV3>2 z)?h1B(5*nuWuP(y0bY}61+EeW-A0fNFi(MUF9JMf#u9ee^D?@j$e9h4cM-sfg^;0W oIT_t(kWn!Af^sVYEJiXKOWqCeW@Q5@<_5x5K(D<6DraB-0E?&nsQ>@~ literal 0 HcmV?d00001 diff --git a/.kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-core-1.1.7-commonMain-3X5hEg.klib b/.kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-core-1.1.7-commonMain-3X5hEg.klib new file mode 100644 index 0000000000000000000000000000000000000000..ef815db542170b14920c272aff880711160224ff GIT binary patch literal 7809 zcmcgxXH-*J+YP-J>0Ll-KnMXGf=H2Gf*>t`2!yT_4K0X(Q~~L|1*8gy2q<0Y9TX{2 z1?f$Cm7;!R-f>_Uoq1>8wZ5Ho*UFD`_kQ+0XPtBJel%3Eu&Ds}`1k+-K<4;50X~2L zU~XY)>TK&IsH2SozyMI~QD6ZyRPoSb0hqsy)c7d@`6&WBQ+pdr3rDBliJ+lEgbzT( z@_Q-rk1mpmZ{w$?%aKqN<>fq^*TbuyCHc1DCgxb7B+R`rK%C>t+3f4u`%!{n{(-3Z zIJTe(LcNc# zpBH-WRH3#u_P5PVolO6oW!fJx**Tay+gkkYd^)O3S(#s%U!Yx3K4im*adg-8){tP%bE_X$bIxGbD z*U3PIz3fpt_LuON9@&3X*&S1}+oo0)#-{e>2nQQ;4i1RGS|^vgE`lAjsS>9Y7{voCA@zAE4U2bEdWnMF#89Q6DN>z|;NdK$ zABl_>duw_**zt1NG?T7tB^6_g89*HtV~cy1N7bD)|VV{6JLd;`nN6 z>fqQ5`GYjle0tp)TiVS|k%(XN6|!%|L-Xg>=~?ndvabr*jmq~G<*o%AU8Lb(qAxD& z)2Ih(6De%?Xci>)ueBj*x_~4hf`W;aOLeip9c`1sw?6zkH)k_2(w%xSxg$AZymILn)y%NxJuCX@GT*8)=Eu^x4 zFc2r*Khr~?-5H>hSl-F0lFy!V!@i-d{toH@;74~!DhD6lDs?ePX_ZvT8k206a0La9 z4_0`a!Xwhq7`dg3*o{&)R7BCKZMhvUkyh!sv`OuaFYt@L0k9Xu zH5;N?d3_QC4z_f0>o3$NKL{{NmjIGfg7pu=2=^ksAlZT2QK3Q=) zgr`>_&pA(Eq?S4A@gz1lJr@zYCrEqujb zle5+hJXE*IBL%1$0T{B@&Y7Q`o@vl{+B*Ajb+{0`zO2V0JRfRMtWwQ9P>HZ~EG1;U zrkxd-jA!!Dfnq5Fqb5!W^2VYr_K~g?XI*AjUz$(-Mm3}OC;o|YHJeFC-UHi=35awx0lmlR0^^+_u0ZV-W6qR zfhjK)();I&1d~74kKVF^3X@sp*;R&+jwY3ES{4I1d%D7Dn?o^x2|9VPYTV6+j1*~U zv9{mB`_;rOFXAQMN^B+Y1Vvy0>OHTa~{kO+W89EqaCmUSlf;W*>I&*-XN#%xW)O4p#UqhoaQg~42 zdW_Tt&1=|`YKU09tORvpv-7*f;yhoc47Mt%q{HYRt^GWK%$@Tv-h4em3IoUwI0q^gom%#O4pPd7m~H_d(#~} zEip}K9x{cvlUt502gY~=9(pl}jY_M(KNuo_)rO;Dj_yJ%KaUc2HrV31Cp_OR7QQ|Y zNmzl;XD?rfa`$#T9AfI)EmGv%y9@D53Ky^Dm=D+%=bq1Dn%@^|qT#4*YNe|d*iVbT z2O{)bKY}z6_PS2BWs49**Fi#mh z+)0%^k|BRMbe?%iwqYzeVimgSzZ%z+P(~3R6_>#M%*IGFcHb$A1bk5*{EJ>21Bv;C z5YjyUtmqi__yOfWpt9i6{q-$}chXZn{TbQ3*7er-SL~dxKvjH0MAg|>%~96ZT>(2S zrEc1)FE9p3!PNuSibk0Ht{g5Gq!R3L2Fn-xlE?G;K4np3zk37HG2H7xsMRl^TuQD8P=yx1eGjP!0hm+V#`wz%RB3_A`>F?s4Zdk7x8UcQ`G!+264v ztJnop7izM49H+p-@xR@R@Mkas;{_5KshRG zK<+Ag#B5ny&avUVW38=yRp-Oz{HZt3>AXA~To`r+F9$$jpJL5?Zi!)*zTgGk3=EE1 z{`lC6viqE!j{G#1&H2Z-RQ9kKQvE62sCO@89eQwOzIj$wh;22{&i_iJYwyr2HH>UI z(@HX8arm)tkW5fYV_-_2OW9ShxxMq8S*}9TSGR^|m-A>_Xur-<52sgi=Mmpf*^_r0 zLUO4udgtPw4-GEDF|~TcE7&@s=JE^Q9S%vH^qLF@e=E&3<>m*~`5O7@AJu{=sVurM z%bvMb3Tl=0OG~ZvhQ!L0WH>-~sy+Zy;u@b3nC026cD#pf8Z9$Cyup;(d9WMcibFMB zgiuu(e-PWfKqw(a#Beo{+ReN#F+vRd*h<(mz9zv2WvCNL`l9vvqT1+(rLABSsAaA> zTf^{&i^^U=%DaPUZ7-|07uDWnU$c-X9O2gD7G`$j3mfT7RM+EA8)jc{MyT5GsK2(y zOO8|Ok3-w8Y6nTsw)L9V@U>r(6MOE)Q_Gl(H&L#Km_~fyRz&5udspVBkZcxT zNQ~LSy1%TlidUXC^%`$pXq~g^^}-wrQ%vtUNQrwa7S2to)xG*P$;Fx|3BR^7`JfT* zPEVqgBPe*rLXe!l{r0vSm>T|6u7$}`W)~+asV@JUgy(oFAW3*Y`M#D1f=Lx3GX$^; zGL2LwQ}O+p8}C723$+2Y-E2s5Cn$UAiCm*ut7aR1osN?uTSA?maSom=)-b(R)*wAq zV(o8K(xSjo^tz;_20!e)GxIk;9G$ztK$?D9<*6&|g!|*RfgZ7KH9HjE!-EW#Lc7jW zaii=pI;C&-6)td3AXs;e*-EfpVW(P-DJ;AMj9XZ|)E24V-0K!PkrN3q&mZ)x229iWfX>}i+b3{%r>8V!K zmmmS1Tbcy|-g$rmi=$lXFn0*$1XX#C^6etYqz!`V@Jqw~kNV~^W%MMKzwB|GpAv8v z*AHA+aRRUOFOCgKZV*1jX- z8~;0pyW(x03t(2g+J}bcIEC73*0MH;U2_SP$xNFYeAXSF2baFBPQ9}E}!C ztKrU3kYLAKQ2X~ zOq}x~nsWLZ7CMP3xL|H}NCE)dV*0Bj<{y4&|L0><=+7UU&RW;5QOZ!QeNFSQGaaJQ z*OSl9y%IU16)vqwRIg+ph6Fdd_(2EhOD@MEWXYPsC+4SS>SeoGzF^nrtC(f5SkAxx znC4bHY(DW2=jq*+#3^67l$;|_v{3g}Vazb-oLW0EK4qgCS0lk^*&J9H9p2@EkFi(M zk-LK353#%9OT-@{wQbnzm~)A_rMJ&_&M9Gl*s|cjNX*CGj!sQWNxuJ z^6}g+e_8ojz4!dkA)G8ds%?xz$_gksO^+;}<^s@Zgz2y&NlRCazC7&pf8QSrKjR#CU>xD1Kb_*+gIAl}k@6y%iZV3|%;Np+7C+%IQEr#A z9j`IR(lSrA#5>^SS}GwihnC=Lb&<4~vihS_6t9?hwccWD6RpBHZ3@Rc`TaX!1qj%{ z)brn*>!hUR<_3zB53z zD*wqTd(x)Bu7bp)o%~v8(#_W4l6!;Zgk+hQJhX=z%ED>}wu$8Fsk8PH?+anz3t>hl z-EJXC$ddHu)>KLx3%hDpY2yrZ#qy#*G%4f1L0Sk-cr9MxO>gjwaDWZ20~nh|7!VC< z70G6n`srwZKvr?Jz7YT3Yp_api{vfEvb>K&4(NsbL}zi`>NpI|!1}9&E&ea^8UgF$ zT+Y@4;rQ=DE2aNQ5@h^c{SPUQM`W#fBZ$1kt`&+RvmOIn_lw9C*CEz4S!%fcIG@gd zU;|SV9+ay?k)5|N6r?!ehKzX|g6at9+a|+rnmD}gTJur=U|pH*NUST0C#9b7%ZIcX z<(xWS_F$_q#;3MEeKKG*hiLxf9JiRJFD0Z0el2VH{H?nrAkoGR$=WoWd|NRu#F%E- zmSSw!7wMghwXBt3gCx#L5e=*z#1knJ$C#OEo`CnsEixPHgtXrM_RCCR>3`lQg6d?}l>mR~7Wz|FdCNi;sg&I$Hy z1tsu+^9sf%J(H0xwwpKwnY^i$mf#TcF9Ejh8;kz*>3Ob~x?6`XT2Suu;Mu z#N7tzHGq9-$J=?;j{O&joy$E1>XAD{=*7}oYJt3r0RVhCzJ8uZv;1i05DpGb#=ix& z|87BW{4FiW_z#mkeJY#9_%)pLc|<--dK^p=|7AEyaY_hb;ppIuFthlZMT~(-bsY4b zZbN+UFQD5Hf5e}f5*n(1y!~|Qk8VPo0NvsEe*2$V5@%`9w|%by-6A-_((&K#G=FXw zoaH$k(4!j!ClEPa27lr?(=Is6hQ9lIRp?Ov1aE)D_VbAUEb-~Q9UbYPfcIGMPi6jz z_$LAXSs66#_xjP{{RwjZ8<`(P`DZ0gN9gD`iW3kWZ_y_~7+X2{?E4ZK63JoWlrWT} z6ec_AQ-&yo5yA;g%cykb*GV(RQu*V1=K5XN%yqr*eLwg6{^og}+YG_RE)3%0;sSv{ zdh~}8Tp(_c3(D2e&kLt&@f!yS3=)1P$ObY)Z~|*V>%OiuTMF9>CcSO5jF&-{~Ym*K8A!yh) zmK~mGZ^n5z2{@%V1=cpakBgU4QzbxkH3;jz=pt<^fNY{`5?)o8%8!um0PfTmhry!O zrf|&VFYGj3-%Q^N0 zu{HN%NpP~YS*~wU?`^3e`SZpSFPm_=QRBwFH>1Y{tM|{GhPInQ>eFI|oD!L1 z3FRiW&j|AaO8xBV&b2W!WOxA|M5225O|?hkL0SRAKTE%7*j?(H?8^q7$XH8^TXf^K ziuCchc+ErO{_KK+c=ka_;V7<4HqJBu)e(^Y1dZFHHV1p|)XS z1)1d%x$-S9xp>HWQ7?jd`8Ca`H82RVSoX6G-Olp9@IKw?1M){D zvo8GFcxoM9%I}t#JUFlyQB!Emr*g3}y;1Kyud(wO=b2z@P1 zYm6Z?yCVvSqVkf_&n>6|)M9&nA`U73rc3%>=2>P7Znpg-786!E2Ip&waOlxXX& zYtzgxX4Utb5(kFP1cx_kxQLB%l!v{oD3F_eckd+x(^h0B{R}d}<})fYIOVh5suNC5 z7>{yK^?>K!ktMc~I&AMWHRD4n+d*vzO<$eQrwZa>Lf8^WAiT)4UfOfKsyiLrX?4@NsG-3gCqOSQcfJe1$&+bD9sD(bfP^lm+gX>vwM62U#Tdmd_$Uf8OeeQc;D({rS+ zf^uv9U2h`|>wUdFujeu*4Ww-Xct%q-!c|G9nm=(Aa)!9alccU0ybY;rKHWLzpmfQ= zRbf=M^Aj7;Eu3N>UOmJC0(Ek)HsYBnQbat}Nzam~*fwIy=|v!F(tG6PGIKDzat-_WAg^sy|J4RlAeC;)yW=nnG$Q zS;6)|6^FW_&KSLfn9yn!`w^kKx6)mvIEQ_+0r%7f~~>d_KP~?Fw;;7{xTJW#S4t^(R1fr zHGe@SA}q=mY5wGZ97hslp6;>Q(X8?E;MreVT!C`SKtZ2aQg{%NK!HDkV&{p;qtia5J zKHw!70i*LRk-G$V1!uuZ1Hdli54Z+KT>TN6re^zJ!Y9U{s#51Cr33{1=Z-(Gl4=fg-f1c4Vl4Aq#>mPWh0Hy!{ literal 0 HcmV?d00001 diff --git a/.kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-preferences-1.1.7-commonMain-f3oI8w.klib b/.kotlin/metadata/kotlinTransformedMetadataLibraries/androidx.datastore-datastore-preferences-1.1.7-commonMain-f3oI8w.klib new file mode 100644 index 0000000000000000000000000000000000000000..65225f43b46ea5be1f2f9c08b4bb08b834116f52 GIT binary patch literal 2791 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 C+qxzI literal 0 HcmV?d00001 diff --git a/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.squareup.okio-okio-3.4.0-commonMain-FFE3Tg.klib b/.kotlin/metadata/kotlinTransformedMetadataLibraries/com.squareup.okio-okio-3.4.0-commonMain-FFE3Tg.klib new file mode 100644 index 0000000000000000000000000000000000000000..cec8d70af58c0d92fe97dbf83a3cd9dd176c2378 GIT binary patch literal 14028 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 ABLDyZ literal 0 HcmV?d00001 diff --git a/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.insert-koin-koin-core-4.0.3-commonMain-LKCCMw.klib b/.kotlin/metadata/kotlinTransformedMetadataLibraries/io.insert-koin-koin-core-4.0.3-commonMain-LKCCMw.klib new file mode 100644 index 0000000000000000000000000000000000000000..83d940829a6847a2b07ae8129cd10b4a1b7e9958 GIT binary patch literal 46549 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 F{{dtU`EdXM literal 0 HcmV?d00001 diff --git a/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-datetime-0.6.2-commonMain-fgfANw.klib b/.kotlin/metadata/kotlinTransformedMetadataLibraries/org.jetbrains.kotlinx-kotlinx-datetime-0.6.2-commonMain-fgfANw.klib new file mode 100644 index 0000000000000000000000000000000000000000..015cc1cd6fa0b2c8dbbf90f9f00618166a3efdd6 GIT binary patch literal 32113 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

Qc%?A6wygwLsHXU{!75%@CEPF$ReM9^p+)+MF&T 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 literal 0 HcmV?d00001 diff --git a/.kotlin/sessions/kotlin-compiler-7621307791481117302.salive b/.kotlin/sessions/kotlin-compiler-7621307791481117302.salive deleted file mode 100644 index e69de29..0000000 diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index bb6ab19..ae5f8ee 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -37,6 +37,7 @@ android { } dependencies { + implementation(fileTree("../shared/libs")) implementation(projects.shared) implementation(libs.compose.ui) implementation(libs.compose.ui.tooling.preview) diff --git a/androidApp/src/main/java/com/whitefish/ring/android/MainActivity.kt b/androidApp/src/main/java/com/whitefish/ring/android/MainActivity.kt index d62964b..d1d2f00 100644 --- a/androidApp/src/main/java/com/whitefish/ring/android/MainActivity.kt +++ b/androidApp/src/main/java/com/whitefish/ring/android/MainActivity.kt @@ -24,6 +24,7 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) PermissionManager.permissionChecker = permissionChecker PermissionManager.checkPermission(this) + (obtainDeviceManager() as DeviceManager).init(this) setContent { App() } diff --git a/iosApp/iosApp/Libs/Modules/DeviceCenter.h b/iosApp/iosApp/Libs/Modules/DeviceCenter.h index 8833d5a..152a95d 100644 --- a/iosApp/iosApp/Libs/Modules/DeviceCenter.h +++ b/iosApp/iosApp/Libs/Modules/DeviceCenter.h @@ -56,8 +56,7 @@ typedef NS_ENUM(NSUInteger, SYNC_FINISH) { // 受限模式回调 //@property(copy, nonatomic)void (^ _Nullable bindFinishCbk)(BOOL isBindLimit); --(void)registWithisCustomBleManage:(BOOL)isCustomBleManage -; +-(void)registWithisCustomBleManage:(BOOL)isCustomBleManage; diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 12440f9..da47a1f 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -20,8 +20,8 @@ kotlin { } } iosArm64().apply { - compilations.getByName("main"){ - val cin by cinterops.creating{ + compilations.getByName("main") { + val cin by cinterops.creating { definitionFile.set(project.file("Ring.def")) packageName("com.whitefish.ring.objc") val files = project.fileTree("../iosApp/iosApp/Libs").files.filter { it.extension == "h" } @@ -44,15 +44,19 @@ kotlin { framework { baseName = "shared" isStatic = true - freeCompilerArgs += listOf( - "-linker-option", "-L${project.projectDir.parent}/iosApp/iosApp/Libs", - "-linker-option", "-lRingSDK_2.0.2" - ) + freeCompilerArgs += + listOf( + "-linker-option", + "-L${project.projectDir.parent}/iosApp/iosApp/Libs", + "-linker-option", + "-lRingSDK_2.0.2", + ) } } sourceSets { commonMain.dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.2") implementation("io.github.aakira:napier:2.7.1") implementation(compose.runtime) implementation(compose.foundation) @@ -64,6 +68,10 @@ kotlin { implementation(libs.androidx.lifecycle.runtimeCompose) implementation(libs.lifecycle.viewmodel.compose) implementation(libs.vico.multiplatform) + implementation("androidx.datastore:datastore:1.1.7") + implementation("androidx.datastore:datastore-preferences:1.1.7") + implementation(project.dependencies.platform("io.insert-koin:koin-bom:4.0.3")) + implementation("io.insert-koin:koin-core") } commonTest.dependencies { @@ -78,7 +86,7 @@ android { defaultConfig { minSdk = 29 } - lint{ + lint { disable.add("NullSafeMutableLiveData") } compileOptions { @@ -90,7 +98,7 @@ android { ksp(libs.androidx.room.compiler) implementation(libs.android.database.sqlcipher) implementation(fileTree("libs")) - implementation ("com.google.accompanist:accompanist-permissions:0.37.3") + implementation("com.google.accompanist:accompanist-permissions:0.37.3") } } dependencies { diff --git a/shared/src/androidMain/kotlin/com/whitefish/ring/DeviceManager.kt b/shared/src/androidMain/kotlin/com/whitefish/ring/DeviceManager.kt index 15d2bc4..78901e6 100644 --- a/shared/src/androidMain/kotlin/com/whitefish/ring/DeviceManager.kt +++ b/shared/src/androidMain/kotlin/com/whitefish/ring/DeviceManager.kt @@ -32,17 +32,21 @@ class DeviceManager() : IDeviceManager(), OnBleConnectionListener, OnSleepDataLo const val STATE_DEVICE_CONNECTING = -2 const val STATE_DEVICE_CONNECTED = -1 } - private val context = Application.INSTANTS!! + private val app = Application.INSTANTS!! private var isRegisterBattery = false val batteryLevel = MutableLiveData(STATE_DEVICE_DISCONNECTED to 0) private val sycProgress = MutableLiveData(0) var isSyncingData: Boolean = false + private lateinit var context: Context + + private val scope = CoroutineScope(Dispatchers.IO) // var homeViewModel: demo.linktop.nexring.ui.HomeViewModel? = null // var workoutDetailViewModel: demo.linktop.nexring.ui.workout.WorkoutDetailViewModel? = null - init { + fun init(context: Context){ registerCb() + this.context = context } override fun onBleState(state: Int) { bleStateListeners().forEach { @@ -131,18 +135,18 @@ class DeviceManager() : IDeviceManager(), OnBleConnectionListener, OnSleepDataLo } fun registerCb() { - context.bleManager.addOnBleConnectionListener(this) + app.bleManager.addOnBleConnectionListener(this) NexRingManager.get().sleepApi().setOnSleepDataLoadListener(this) } fun unregisterCb() { NexRingManager.get().sleepApi().setOnSleepDataLoadListener(null) - context.bleManager.removeOnBleConnectionListener(this) + app.bleManager.removeOnBleConnectionListener(this) } override fun connect(address: String) { - with(context.bleManager) { + with(app.bleManager) { when (bleState.value) { BluetoothProfile.STATE_DISCONNECTED -> { batteryLevel.postValue(STATE_DEVICE_CONNECTING to 0) @@ -171,47 +175,45 @@ class DeviceManager() : IDeviceManager(), OnBleConnectionListener, OnSleepDataLo } } - override fun bind() { + override fun bind(onBound: () -> Unit) { NexRingManager.get() .deviceApi() .getBindState { if (it) { //todo bind dialog -// AlertDialog.Builder(this@DeviceActivity) -// .setCancelable(false) -// .setTitle(R.string.dialog_title_restricted_mode) -// .setMessage(R.string.dialog_msg_restricted_mode) -// .setNegativeButton(android.R.string.cancel) { _, _ -> -// -// }.setPositiveButton(android.R.string.ok) { _, _ -> -// Logger.i("reset device") -// deviceAdapter.clear() -// NexRingManager.get() -// .deviceApi() -// .factoryReset() -// switchUI(true) -// postDelay { -// Thread.sleep(200) -// DeviceManager.INSTANCE.scan(this@DeviceActivity) -// } -// isConnecting = false -// }.create().show() + AlertDialog.Builder(context) + .setCancelable(false) + .setTitle(R.string.dialog_title_restricted_mode) + .setMessage(R.string.dialog_msg_restricted_mode) + .setNegativeButton(android.R.string.cancel) { _, _ -> + + }.setPositiveButton(android.R.string.ok) { _, _ -> + onResetDeviceWhenBind.invoke() + NexRingManager.get() + .deviceApi() + .factoryReset() + }.create().show() } else { NexRingManager.get() .deviceApi() .bind { + onBound.invoke() //todo bind result } } } } + override fun getCurrentMac(): String? { + return app.bleManager.connectedDevice?.address + } + override fun startScan() { val bluetoothAdapter = (context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager).adapter if (bluetoothAdapter.isEnabled) { - if (!context.bleManager.isScanning) { - context.bleManager.startScan(20 * 1000L, + if (!app.bleManager.isScanning) { + app.bleManager.startScan(20 * 1000L, object : OnBleScanCallback { @SuppressLint("MissingPermission") override fun onScanning(result: BleDevice) { diff --git a/shared/src/androidMain/kotlin/com/whitefish/ring/Platform.android.kt b/shared/src/androidMain/kotlin/com/whitefish/ring/Platform.android.kt index eacc34c..ec456c2 100644 --- a/shared/src/androidMain/kotlin/com/whitefish/ring/Platform.android.kt +++ b/shared/src/androidMain/kotlin/com/whitefish/ring/Platform.android.kt @@ -65,3 +65,4 @@ private val DeviceInstance = DeviceManager() actual fun obtainDeviceManager(): IDeviceManager { return DeviceInstance } + diff --git a/shared/src/androidMain/kotlin/com/whitefish/ring/bt/BleManager.kt b/shared/src/androidMain/kotlin/com/whitefish/ring/bt/BleManager.kt index 536f62d..85d9a83 100644 --- a/shared/src/androidMain/kotlin/com/whitefish/ring/bt/BleManager.kt +++ b/shared/src/androidMain/kotlin/com/whitefish/ring/bt/BleManager.kt @@ -97,6 +97,7 @@ class BleManager(val app: Application) { var bleState = MutableStateFlow(0) var connectedDevice: BluetoothDevice? = null + private set private val _oemStepComplete = MutableStateFlow(false) val oemStepComplete = _oemStepComplete.asStateFlow() @@ -386,6 +387,7 @@ class BleManager(val app: Application) { } } _oemStepComplete.value = true + Napier.i("OEM_STEP_PROCESS_COMPLETED") } } diff --git a/shared/src/androidMain/kotlin/com/whitefish/ring/data/DataStore.android.kt b/shared/src/androidMain/kotlin/com/whitefish/ring/data/DataStore.android.kt new file mode 100644 index 0000000..0fcf586 --- /dev/null +++ b/shared/src/androidMain/kotlin/com/whitefish/ring/data/DataStore.android.kt @@ -0,0 +1,19 @@ +package com.whitefish.ring.data + +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import com.whitefish.ring.Application + + +private var dataStoreInstance: DataStore? = null +private val lock = Any() + +actual fun obtainDataStore(): DataStore = synchronized(lock) { + dataStoreInstance ?: createDataStore { + Application.INSTANTS!!.filesDir.resolve(dataStoreFileName).absolutePath + }.also { dataStoreInstance = it } +} + + + + diff --git a/shared/src/androidMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.android.kt b/shared/src/androidMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.android.kt new file mode 100644 index 0000000..c013587 --- /dev/null +++ b/shared/src/androidMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.android.kt @@ -0,0 +1,29 @@ +package com.whitefish.ring.data + +import com.whitefish.ring.bean.ui.HeartRate +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.withContext +import lib.linktop.nexring.api.NexRingManager +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + + +actual suspend fun getHeartRate( + start: Long, + end: Long +): List = withContext(Dispatchers.IO){ + val macAddress = mac() // 先挂起获取mac + suspendCoroutine { coroutine -> + macAddress?.let { + NexRingManager.get().sleepApi().getHrList( + it, + start, + end, + ) { + val result = it?.second?.map { HeartRate(it.ts,it.value) } + coroutine.resume(result?:emptyList()) + } + } + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/App.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/App.kt index 1cb5414..8b2470f 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/App.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/App.kt @@ -1,23 +1,30 @@ +@file:Suppress("ktlint:standard:no-wildcard-imports") + package com.whitefish.ring import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.* import androidx.compose.ui.Modifier -import com.whitefish.ring.ui.guide.DeviceScreen +import com.whitefish.ring.device.IDeviceManager import com.whitefish.ring.ui.guide.GuideNavigationScreen import com.whitefish.ring.ui.home.HomeScreen import org.jetbrains.compose.ui.tooling.preview.Preview +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module @Composable @Preview fun App() { MaterialTheme { -// HomeScreen( -// modifier = Modifier -// ) -// DeviceScreen{ -// -// } - GuideNavigationScreen() + + var guideComplete by remember { mutableStateOf(false) } + + if (guideComplete){ + HomeScreen() + }else{ + GuideNavigationScreen { + guideComplete = true + } + } } -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/HeartRate.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/HeartRate.kt new file mode 100644 index 0000000..d3c2801 --- /dev/null +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/HeartRate.kt @@ -0,0 +1,3 @@ +package com.whitefish.ring.bean.ui + +data class HeartRate (val time: Long,val value: Int) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/SleepState.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/SleepState.kt new file mode 100644 index 0000000..bd7dd5f --- /dev/null +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/bean/ui/SleepState.kt @@ -0,0 +1,9 @@ +package com.whitefish.ring.bean.ui + +import com.whitefish.app.ui.chart.sleep.SleepSegment +import kotlinx.datetime.Clock + +data class SleepState ( + val totalSeconds: Int, //秒 + val segments: List +) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/data/DataStore.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/data/DataStore.kt new file mode 100644 index 0000000..9ff35cf --- /dev/null +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/data/DataStore.kt @@ -0,0 +1,20 @@ +package com.whitefish.ring.data + +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.PreferenceDataStoreFactory +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.stringPreferencesKey +import okio.Path.Companion.toPath + + +expect fun obtainDataStore(): DataStore +internal const val dataStoreFileName = "dice.preferences_pb" + + +val address = stringPreferencesKey("mac") + + +fun createDataStore(producePath: () -> String): DataStore = + PreferenceDataStoreFactory.createWithPath( + produceFile = { producePath().toPath() } + ) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.kt new file mode 100644 index 0000000..e747a79 --- /dev/null +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.kt @@ -0,0 +1,11 @@ +package com.whitefish.ring.data + +import com.whitefish.ring.bean.ui.HeartRate +import com.whitefish.ring.bean.ui.SleepState +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.last +import kotlinx.coroutines.flow.map + +suspend fun mac() = obtainDataStore().data.map { it[address] }.first() +expect suspend fun getHeartRate(start: Long,end: Long): List +expect suspend fun getSleep(start: Long, end: Long): SleepState \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/data/MockDataProvider.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/data/MockDataProvider.kt new file mode 100644 index 0000000..f3c676a --- /dev/null +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/data/MockDataProvider.kt @@ -0,0 +1,14 @@ +package com.whitefish.ring.data + +object MockDataProvider { + + fun heartRate(start: Long, end: Long): List { + return listOf( + com.whitefish.ring.bean.ui.HeartRate(value = 60, time = start), + com.whitefish.ring.bean.ui.HeartRate(value = 65, time = start + 1000), + com.whitefish.ring.bean.ui.HeartRate(value = 70, time = start + 2000), + com.whitefish.ring.bean.ui.HeartRate(value = 75, time = end - 1000), + com.whitefish.ring.bean.ui.HeartRate(value = 80, time = end) + ) + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/device/IDeviceManager.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/device/IDeviceManager.kt index 7fd2eec..b5e8a01 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/device/IDeviceManager.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/device/IDeviceManager.kt @@ -1,9 +1,7 @@ package com.whitefish.ring.device import com.whitefish.ring.bean.ui.Device -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow abstract class IDeviceManager { @@ -15,6 +13,9 @@ abstract class IDeviceManager { val blePowerState = MutableStateFlow(false) // ios的蓝牙是懒加载的,安卓则无此特性 private val bleStateListeners = arrayListOf<(Int) -> Unit>() + protected var onResetDeviceWhenBind:()-> Unit = {} + protected var autoConnect = false + fun bleStateListeners() = bleStateListeners @@ -22,9 +23,15 @@ abstract class IDeviceManager { bleStateListeners.add(event) } + fun setOnResetDeviceOnBind(event:() -> Unit) { + onResetDeviceWhenBind = event + } + abstract fun startScan() abstract fun stopScan() abstract fun connect(mac: String) - abstract fun bind() + abstract fun bind(onBound:() -> Unit = {}) + abstract fun getCurrentMac(): String? + abstract fun setAutoConnect(enable: Boolean) } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/chart/ComposeMultiplatformBasicLineChart.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/chart/ComposeMultiplatformBasicLineChart.kt index 85c8f2e..6e76671 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/chart/ComposeMultiplatformBasicLineChart.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/chart/ComposeMultiplatformBasicLineChart.kt @@ -7,6 +7,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import com.patrykandpatrick.vico.multiplatform.cartesian.CartesianChartHost +import com.patrykandpatrick.vico.multiplatform.cartesian.VicoZoomState +import com.patrykandpatrick.vico.multiplatform.cartesian.Zoom import com.patrykandpatrick.vico.multiplatform.cartesian.data.CartesianChartModelProducer import com.patrykandpatrick.vico.multiplatform.cartesian.data.lineSeries import com.patrykandpatrick.vico.multiplatform.cartesian.layer.LineCartesianLayer @@ -17,12 +19,14 @@ import com.patrykandpatrick.vico.multiplatform.common.Fill import com.patrykandpatrick.vico.multiplatform.common.fill @Composable -fun ComposeMultiplatformBasicLineChart(modifier: Modifier = Modifier) { +fun ComposeMultiplatformBasicLineChart(data: List, modifier: Modifier = Modifier) { val modelProducer = remember { CartesianChartModelProducer() } LaunchedEffect(Unit) { modelProducer.runTransaction { // Learn more: https://patrykandpatrick.com/z5ah6v. - lineSeries { series(13, 8, 7, 12, 0, 1, 15, 14, 0, 11, 6, 12, 0, 11, 12, 11) } + if (data.isNotEmpty()) { + lineSeries { series(data) } + } } } CartesianChartHost( @@ -48,6 +52,6 @@ fun ComposeMultiplatformBasicLineChart(modifier: Modifier = Modifier) { ), modelProducer = modelProducer, modifier = modifier, - + zoomState = VicoZoomState(false, Zoom.Content,Zoom.Content,Zoom.Content) ) } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceScreen.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceScreen.kt index e3ad73a..cc90335 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceScreen.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceScreen.kt @@ -22,13 +22,19 @@ import com.whitefish.ring.device.IDeviceManager import org.jetbrains.compose.ui.tooling.preview.Preview @Composable -fun DeviceScreen(onBind:() -> Unit){ - val viewModel: DeviceViewModel = viewModel { DeviceViewModel() } +fun DeviceScreen( + viewModel: DeviceViewModel = viewModel { DeviceViewModel() }, onDeviceReset: () -> Unit, + onBind: () -> Unit +) { + viewModel.init() + viewModel.setOnDeviceReset(onDeviceReset) + val uiState by viewModel.uiState.collectAsState() - val bindState by viewModel.manager.bleReadyStateFlow.collectAsState() + val bindState by viewModel.bindSuccess.collectAsState() - if (bindState){ + if (bindState) { onBind.invoke() + return } Box( @@ -52,20 +58,20 @@ fun DeviceScreen(onBind:() -> Unit){ .padding(top = 60.dp, bottom = 40.dp), textAlign = TextAlign.Center ) - + // 设备列表 LazyColumn( verticalArrangement = Arrangement.spacedBy(16.dp), modifier = Modifier.weight(1f) ) { items(uiState.deviceList) { device -> - DeviceItem(device = device){ + DeviceItem(device = device) { viewModel.connect(it.mac) } } } } - + // 底部提示 Text( text = "连接失败?", @@ -79,7 +85,7 @@ fun DeviceScreen(onBind:() -> Unit){ } @Composable -private fun DeviceItem(device: Device,onClick:(Device)-> Unit) { +private fun DeviceItem(device: Device, onClick: (Device) -> Unit) { Card( modifier = Modifier .fillMaxWidth() @@ -115,9 +121,9 @@ private fun DeviceItem(device: Device,onClick:(Device)-> Unit) { fontSize = 24.sp ) } - + Spacer(modifier = Modifier.width(16.dp)) - + // 设备信息 Column( modifier = Modifier.weight(1f) @@ -128,9 +134,9 @@ private fun DeviceItem(device: Device,onClick:(Device)-> Unit) { fontWeight = FontWeight.Medium, color = Color(0xFF333333) ) - + Spacer(modifier = Modifier.height(4.dp)) - + Text( text = "设备号:${device.mac}", fontSize = 14.sp, @@ -143,8 +149,8 @@ private fun DeviceItem(device: Device,onClick:(Device)-> Unit) { @Composable @Preview -fun Device(){ - DeviceScreen{ - - } +fun Device() { +// DeviceScreen { +// +// } } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceViewModel.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceViewModel.kt index 90c16dc..75e36e0 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceViewModel.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/DeviceViewModel.kt @@ -1,13 +1,12 @@ package com.whitefish.ring.ui.guide -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.datastore.preferences.core.edit import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.whitefish.ring.bean.ui.Device -import com.whitefish.ring.device.IDeviceManager +import com.whitefish.ring.data.address +import com.whitefish.ring.data.mac +import com.whitefish.ring.data.obtainDataStore import com.whitefish.ring.obtainDeviceManager import io.github.aakira.napier.Napier import kotlinx.coroutines.flow.MutableStateFlow @@ -15,8 +14,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -class DeviceViewModel: ViewModel() { -// var currentStep by remember { mutableStateOf(GuideStep.WELCOME) } +class DeviceViewModel : ViewModel() { class UiState( val deviceList: List = emptyList() @@ -25,12 +23,12 @@ class DeviceViewModel: ViewModel() { val manager = obtainDeviceManager() private val _uiState = MutableStateFlow(UiState()) val uiState = _uiState.asStateFlow() - - init { - Napier.i { "DeviceViewModel initializing..." } - - viewModelScope.launch { + val bindSuccess = MutableStateFlow(false) + + fun init() { + viewModelScope.launch { + _uiState.value = UiState(emptyList()) launch { manager.deviceList.collectLatest { Napier.i { "new device:${it}" } @@ -40,7 +38,7 @@ class DeviceViewModel: ViewModel() { launch { manager.blePowerState.collectLatest { - if (it){ + if (it) { manager.startScan() } } @@ -49,16 +47,29 @@ class DeviceViewModel: ViewModel() { launch { manager.bleReadyStateFlow.collectLatest { Napier.i { "ble ready:${it}" } - if (it){ - manager.bind() + if (it && mac().isNullOrEmpty()) { + manager.bind { + bindSuccess.value = true + viewModelScope.launch { + obtainDataStore().edit { settings -> + manager.getCurrentMac()?.let { + settings[address] = it + } + } + } + } } } } } } - fun connect(mac: String){ + fun connect(mac: String) { manager.connect(mac) } + + fun setOnDeviceReset(event: () -> Unit) { + manager.setOnResetDeviceOnBind(event) + } } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideNavigationScreen.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideNavigationScreen.kt index 160a656..4a24d71 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideNavigationScreen.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideNavigationScreen.kt @@ -2,35 +2,48 @@ package com.whitefish.ring.ui.guide import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel enum class GuideStep { WELCOME, REGISTER, CONNECTION_GUIDE, DEVICE_LIST, + + // WEIGHT_SELECTION, // 开屏提问设置1 - 体重选择 +// FITNESS_GOALS, // 开屏提问设置2 - 运动目标 +// EXERCISE_PREFERENCES, // 开屏提问设置3 - 运动方式偏好 +// FAVORITE_EXERCISES, // 开屏提问设置4 - 喜欢的运动 +// REMINDER_SETUP, // 开屏提问设置5 - 运动提醒设置 +// PLAN_GENERATED, // 生成计划 PERSONAL_INFO, WEARING_FINGER, DOMINANT_HAND, - } @Composable fun GuideNavigationScreen( modifier: Modifier = Modifier, + viewModel: NavigationViewModel = viewModel { NavigationViewModel() }, onGuideComplete: () -> Unit = {}, - ) { var currentStep by remember { mutableStateOf(GuideStep.WELCOME) } + val bound by viewModel.bound.collectAsState() + if (bound) { + // 如果已经连接设备,直接跳转到主界面 + onGuideComplete() + return + } when (currentStep) { GuideStep.WELCOME -> { WelcomeScreen( onStartClick = { currentStep = GuideStep.REGISTER - } + }, ) } - + GuideStep.REGISTER -> { RegisterScreen( onLoginClick = { phoneNumber, verificationCode -> @@ -38,25 +51,27 @@ fun GuideNavigationScreen( if (phoneNumber.isNotEmpty() && verificationCode.isNotEmpty()) { currentStep = GuideStep.CONNECTION_GUIDE } - } + }, ) } - + GuideStep.CONNECTION_GUIDE -> { ConnectionGuideScreen( onNextClick = { currentStep = GuideStep.DEVICE_LIST - } + }, ) } - GuideStep.DEVICE_LIST -> { - DeviceScreen{ + DeviceScreen(onDeviceReset = { + viewModel.clearCache() + currentStep = GuideStep.CONNECTION_GUIDE + }, onBind = { currentStep = GuideStep.PERSONAL_INFO - } + }) } - + GuideStep.PERSONAL_INFO -> { PersonalInfoScreen( onNextClick = { @@ -70,10 +85,10 @@ fun GuideNavigationScreen( }, onHeightClick = { // 这里可以打开身高选择器 - } + }, ) } - + GuideStep.WEARING_FINGER -> { WearingFingerScreen( onNextClick = { @@ -81,10 +96,10 @@ fun GuideNavigationScreen( }, onFingerSelected = { position -> // 保存选择的佩戴位置 - } + }, ) } - + GuideStep.DOMINANT_HAND -> { DominantHandScreen( onNextClick = { @@ -93,8 +108,8 @@ fun GuideNavigationScreen( }, onHandSelected = { hand -> // 保存选择的惯用手 - } + }, ) } } -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideScreensPreviews.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideScreensPreviews.kt index 9fb1042..44140ed 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideScreensPreviews.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/GuideScreensPreviews.kt @@ -62,9 +62,9 @@ fun AllGuideScreensPreview() { .fillMaxWidth() .height(600.dp) ) { - DeviceScreen{ - - } +// DeviceScreen{ +// +// } } } diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/NavigationViewModel.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/NavigationViewModel.kt new file mode 100644 index 0000000..dadc876 --- /dev/null +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/NavigationViewModel.kt @@ -0,0 +1,41 @@ +package com.whitefish.ring.ui.guide + +import androidx.datastore.preferences.core.edit +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.whitefish.ring.data.address +import com.whitefish.ring.data.obtainDataStore +import io.github.aakira.napier.Napier +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch + +class NavigationViewModel: ViewModel() { + private val _bound = MutableStateFlow(false) + val bound = _bound.asStateFlow() + + init { + checkAlreadyConnected() + + } + + fun checkAlreadyConnected() { + viewModelScope.launch { + obtainDataStore().data.map { it[address] }.collectLatest { + _bound.value = !it.isNullOrEmpty() + Napier.i { "connect state:${!it.isNullOrEmpty()}" } + } + } + } + + fun clearCache(){ + viewModelScope.launch { + obtainDataStore().edit { + it[address] = "" + } + } + + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/RegisterScreen.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/RegisterScreen.kt index e3b7404..6bbcd0f 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/RegisterScreen.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/RegisterScreen.kt @@ -3,131 +3,131 @@ package com.whitefish.ring.ui.guide import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.jetbrains.compose.ui.tooling.preview.Preview @Composable -fun RegisterScreen( - onLoginClick: (phoneNumber: String, verificationCode: String) -> Unit = { _, _ -> } -) { +fun RegisterScreen(onLoginClick: (phoneNumber: String, verificationCode: String) -> Unit = { _, _ -> }) { var phoneNumber by remember { mutableStateOf("") } var verificationCode by remember { mutableStateOf("") } var isCodeSent by remember { mutableStateOf(false) } - + Box( - modifier = Modifier - .fillMaxSize() - .background(Color(0xFFF5F5F5)) + modifier = + Modifier + .fillMaxSize() + .background(Color(0xFFF5F5F5)), ) { Column( - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 24.dp), - horizontalAlignment = Alignment.CenterHorizontally + modifier = + Modifier + .fillMaxSize() + .padding(horizontal = 24.dp), + horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(modifier = Modifier.height(120.dp)) - + // 戒指图片占位符 Box( - modifier = Modifier - .size(160.dp) - .background( - Color(0xFFE5E5E5), - RoundedCornerShape(80.dp) - ), - contentAlignment = Alignment.Center + modifier = + Modifier + .size(160.dp) + .background( + Color(0xFFE5E5E5), + RoundedCornerShape(80.dp), + ), + contentAlignment = Alignment.Center, ) { Text( text = "💍", - fontSize = 64.sp + fontSize = 64.sp, ) } - + Spacer(modifier = Modifier.height(40.dp)) - + // 欢迎标题 Column( - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Text( text = "Hi,", fontSize = 28.sp, fontWeight = FontWeight.Medium, color = Color(0xFF333333), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) - + Text( text = "欢迎来到Acti", fontSize = 28.sp, fontWeight = FontWeight.Medium, color = Color(0xFF333333), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) } - + Spacer(modifier = Modifier.height(60.dp)) - + // 手机号输入框 Column( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { Text( text = "手机号", fontSize = 16.sp, fontWeight = FontWeight.Medium, color = Color(0xFF333333), - modifier = Modifier.padding(bottom = 8.dp) + modifier = Modifier.padding(bottom = 8.dp), ) - + OutlinedTextField( value = phoneNumber, onValueChange = { phoneNumber = it }, placeholder = { Text( text = "请输入您的手机号", - color = Color(0xFF999999) + color = Color(0xFF999999), ) }, modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp), - colors = OutlinedTextFieldDefaults.colors( - focusedBorderColor = Color(0xFF007AFF), - unfocusedBorderColor = Color(0xFFE5E5E5), - focusedContainerColor = Color.White, - unfocusedContainerColor = Color.White - ), - singleLine = true + colors = + OutlinedTextFieldDefaults.colors( + focusedBorderColor = Color(0xFF007AFF), + unfocusedBorderColor = Color(0xFFE5E5E5), + focusedContainerColor = Color.White, + unfocusedContainerColor = Color.White, + ), + singleLine = true, ) } - + Spacer(modifier = Modifier.height(24.dp)) - + // 验证码输入框 Column( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { Text( text = "验证码", fontSize = 16.sp, fontWeight = FontWeight.Medium, color = Color(0xFF333333), - modifier = Modifier.padding(bottom = 8.dp) + modifier = Modifier.padding(bottom = 8.dp), ) - + Row( modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { OutlinedTextField( value = verificationCode, @@ -135,73 +135,80 @@ fun RegisterScreen( placeholder = { Text( text = "请输入验证码", - color = Color(0xFF999999) + color = Color(0xFF999999), ) }, modifier = Modifier.weight(1f), shape = RoundedCornerShape(12.dp), - colors = OutlinedTextFieldDefaults.colors( - focusedBorderColor = Color(0xFF007AFF), - unfocusedBorderColor = Color(0xFFE5E5E5), - focusedContainerColor = Color.White, - unfocusedContainerColor = Color.White - ), - singleLine = true + colors = + OutlinedTextFieldDefaults.colors( + focusedBorderColor = Color(0xFF007AFF), + unfocusedBorderColor = Color(0xFFE5E5E5), + focusedContainerColor = Color.White, + unfocusedContainerColor = Color.White, + ), + singleLine = true, ) - + Spacer(modifier = Modifier.width(12.dp)) - + TextButton( - onClick = { + onClick = { if (phoneNumber.isNotEmpty()) { isCodeSent = true } }, - enabled = phoneNumber.isNotEmpty() + enabled = phoneNumber.isNotEmpty(), ) { Text( text = if (isCodeSent) "重新发送验证码" else "获取验证码", fontSize = 14.sp, - color = if (phoneNumber.isNotEmpty()) Color(0xFF007AFF) else Color(0xFF999999) + color = if (phoneNumber.isNotEmpty()) Color(0xFF007AFF) else Color(0xFF999999), ) } } } - + Spacer(modifier = Modifier.height(16.dp)) - + // 提示文字 Text( text = "未注册的手机号码会自动创建新账号", fontSize = 12.sp, color = Color(0xFF999999), textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) - + Spacer(modifier = Modifier.height(40.dp)) - + // 登录按钮 Button( onClick = { onLoginClick(phoneNumber, verificationCode) }, enabled = phoneNumber.isNotEmpty() && verificationCode.isNotEmpty(), - modifier = Modifier - .fillMaxWidth() - .height(56.dp), + modifier = + Modifier + .fillMaxWidth() + .height(56.dp), shape = RoundedCornerShape(28.dp), - colors = ButtonDefaults.buttonColors( - containerColor = if (phoneNumber.isNotEmpty() && verificationCode.isNotEmpty()) - Color(0xFF007AFF) else Color(0xFFCCCCCC), - contentColor = Color.White - ) + colors = + ButtonDefaults.buttonColors( + containerColor = + if (phoneNumber.isNotEmpty() && verificationCode.isNotEmpty()) { + Color(0xFF007AFF) + } else { + Color(0xFFCCCCCC) + }, + contentColor = Color.White, + ), ) { Text( text = "登录", fontSize = 18.sp, - fontWeight = FontWeight.Medium + fontWeight = FontWeight.Medium, ) } - + Spacer(modifier = Modifier.weight(1f)) } } @@ -211,4 +218,4 @@ fun RegisterScreen( @Preview fun RegisterScreenPreview() { RegisterScreen() -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/SearchingScreen.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/SearchingScreen.kt index 43b4c7e..60113fc 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/SearchingScreen.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/SearchingScreen.kt @@ -20,38 +20,41 @@ import org.jetbrains.compose.ui.tooling.preview.Preview @Composable fun SearchTip( onDeviceNotFoundClick: () -> Unit = {}, - onDeviceFound: () -> Unit = {} + onDeviceFound: () -> Unit = {}, ) { // 旋转动画 val infiniteTransition = rememberInfiniteTransition() val rotation by infiniteTransition.animateFloat( initialValue = 0f, targetValue = 360f, - animationSpec = infiniteRepeatable( - animation = tween(2000, easing = LinearEasing), - repeatMode = RepeatMode.Restart - ) + animationSpec = + infiniteRepeatable( + animation = tween(2000, easing = LinearEasing), + repeatMode = RepeatMode.Restart, + ), ) - + // 模拟搜索过程,5秒后跳转到设备列表 LaunchedEffect(Unit) { kotlinx.coroutines.delay(5000) onDeviceFound() } - + Box( - modifier = Modifier - .fillMaxSize() - .background(Color(0xFFF5F5F5)) + modifier = + Modifier + .fillMaxSize() + .background(Color(0xFFF5F5F5)), ) { Column( - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 24.dp), - horizontalAlignment = Alignment.CenterHorizontally + modifier = + Modifier + .fillMaxSize() + .padding(horizontal = 24.dp), + horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(modifier = Modifier.height(120.dp)) - + // 标题 Text( text = "正在搜索设备...", @@ -59,100 +62,104 @@ fun SearchTip( fontWeight = FontWeight.Medium, color = Color(0xFF333333), textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) - + Spacer(modifier = Modifier.height(80.dp)) - + // 搜索动画 Box( - modifier = Modifier - .size(200.dp) - .background( - Color.White, - RoundedCornerShape(100.dp) - ), - contentAlignment = Alignment.Center + modifier = + Modifier + .size(200.dp) + .background( + Color.White, + RoundedCornerShape(100.dp), + ), + contentAlignment = Alignment.Center, ) { // 外圆环 - 旋转动画 Box( - modifier = Modifier - .size(160.dp) - .rotate(rotation) - .background( - Color.Transparent - ), - contentAlignment = Alignment.Center + modifier = + Modifier + .size(160.dp) + .rotate(rotation) + .background( + Color.Transparent, + ), + contentAlignment = Alignment.Center, ) { // 虚线圆环效果 repeat(8) { index -> Box( - modifier = Modifier - .size(8.dp) - .background( - Color(0xFF007AFF), - RoundedCornerShape(4.dp) - ) - .offset( - x = (70 * kotlin.math.cos(index * 45.0 * kotlin.math.PI / 180)).dp, - y = (70 * kotlin.math.sin(index * 45.0 * kotlin.math.PI / 180)).dp - ) + modifier = + Modifier + .size(8.dp) + .background( + Color(0xFF007AFF), + RoundedCornerShape(4.dp), + ).offset( + x = (70 * kotlin.math.cos(index * 45.0 * kotlin.math.PI / 180)).dp, + y = (70 * kotlin.math.sin(index * 45.0 * kotlin.math.PI / 180)).dp, + ), ) } } - + // 中心搜索图标 Box( - modifier = Modifier - .size(80.dp) - .background( - Color(0xFF007AFF), - RoundedCornerShape(40.dp) - ), - contentAlignment = Alignment.Center + modifier = + Modifier + .size(80.dp) + .background( + Color(0xFF007AFF), + RoundedCornerShape(40.dp), + ), + contentAlignment = Alignment.Center, ) { Text( text = "🔍", fontSize = 32.sp, - color = Color.White + color = Color.White, ) } } - + Spacer(modifier = Modifier.height(60.dp)) - + // 进度指示器 LinearProgressIndicator( - modifier = Modifier - .fillMaxWidth() - .height(4.dp), + modifier = + Modifier + .fillMaxWidth() + .height(4.dp), color = Color(0xFF007AFF), - trackColor = Color(0xFFE5E5E5) + trackColor = Color(0xFFE5E5E5), ) - + Spacer(modifier = Modifier.height(24.dp)) - + // 提示文字 Text( text = "请确保戒指在充电状态并且靠近手机", fontSize = 16.sp, color = Color(0xFF666666), textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) - + Spacer(modifier = Modifier.weight(1f)) - + // 找不到设备链接 TextButton( onClick = onDeviceNotFoundClick, - modifier = Modifier.padding(bottom = 40.dp) + modifier = Modifier.padding(bottom = 40.dp), ) { Text( text = "找不到设备?", fontSize = 16.sp, color = Color(0xFF007AFF), - textDecoration = TextDecoration.Underline + textDecoration = TextDecoration.Underline, ) } } @@ -163,4 +170,4 @@ fun SearchTip( @Preview fun SearchingScreenPreview() { SearchTip() -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/WelcomeScreen.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/WelcomeScreen.kt index 1ed9d5d..5ccc7b8 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/WelcomeScreen.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/guide/WelcomeScreen.kt @@ -1,6 +1,5 @@ package com.whitefish.ring.ui.guide -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape @@ -16,139 +15,144 @@ import androidx.compose.ui.unit.sp import org.jetbrains.compose.ui.tooling.preview.Preview @Composable -fun WelcomeScreen( - onStartClick: () -> Unit = {} -) { +fun WelcomeScreen(onStartClick: () -> Unit = {}) { var isChecked by remember { mutableStateOf(false) } - + Box( - modifier = Modifier - .fillMaxSize() - .background(Color(0xFFF5F5F5)) + modifier = + Modifier + .fillMaxSize() + .background(Color(0xFFF5F5F5)), ) { Column( - modifier = Modifier - .fillMaxSize() - .padding(horizontal = 24.dp), - horizontalAlignment = Alignment.CenterHorizontally + modifier = + Modifier + .fillMaxSize() + .padding(horizontal = 24.dp), + horizontalAlignment = Alignment.CenterHorizontally, ) { Spacer(modifier = Modifier.height(120.dp)) - + // 主标题 Text( text = "Acti", fontSize = 48.sp, fontWeight = FontWeight.Bold, color = Color(0xFF333333), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) - + Spacer(modifier = Modifier.height(24.dp)) - + // 副标题 Text( text = "赋能每一个动作", fontSize = 18.sp, fontWeight = FontWeight.Normal, color = Color(0xFF666666), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) - + Spacer(modifier = Modifier.height(16.dp)) - + // 英文副标题 Text( text = "Empower Every Move", fontSize = 16.sp, fontWeight = FontWeight.Normal, color = Color(0xFF999999), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) - + Spacer(modifier = Modifier.weight(1f)) - + // 戒指图片占位符 Box( - modifier = Modifier - .size(200.dp) - .background( - Color(0xFFE5E5E5), - RoundedCornerShape(16.dp) - ), - contentAlignment = Alignment.Center + modifier = + Modifier + .size(200.dp) + .background( + Color(0xFFE5E5E5), + RoundedCornerShape(16.dp), + ), + contentAlignment = Alignment.Center, ) { Text( text = "💍", - fontSize = 80.sp + fontSize = 80.sp, ) } - + Spacer(modifier = Modifier.weight(1f)) - + // 协议同意checkbox Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - verticalAlignment = Alignment.CenterVertically + modifier = + Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically, ) { Checkbox( checked = isChecked, onCheckedChange = { isChecked = it }, - colors = CheckboxDefaults.colors( - checkedColor = Color(0xFF007AFF) - ) + colors = + CheckboxDefaults.colors( + checkedColor = Color(0xFF007AFF), + ), ) - + Spacer(modifier = Modifier.width(8.dp)) - + Text( text = "我已阅读并同意", fontSize = 14.sp, - color = Color(0xFF666666) + color = Color(0xFF666666), ) - + Text( text = "《用户协议》", fontSize = 14.sp, - color = Color(0xFF007AFF) + color = Color(0xFF007AFF), ) - + Text( text = "和", fontSize = 14.sp, - color = Color(0xFF666666) + color = Color(0xFF666666), ) - + Text( text = "《隐私政策》", fontSize = 14.sp, - color = Color(0xFF007AFF) + color = Color(0xFF007AFF), ) } - + Spacer(modifier = Modifier.height(24.dp)) - + // 立即使用按钮 Button( onClick = onStartClick, enabled = isChecked, - modifier = Modifier - .fillMaxWidth() - .height(56.dp), + modifier = + Modifier + .fillMaxWidth() + .height(56.dp), shape = RoundedCornerShape(28.dp), - colors = ButtonDefaults.buttonColors( - containerColor = if (isChecked) Color(0xFF007AFF) else Color(0xFFCCCCCC), - contentColor = Color.White - ) + colors = + ButtonDefaults.buttonColors( + containerColor = if (isChecked) Color(0xFF007AFF) else Color(0xFFCCCCCC), + contentColor = Color.White, + ), ) { Text( text = "立即使用", fontSize = 18.sp, - fontWeight = FontWeight.Medium + fontWeight = FontWeight.Medium, ) } - + Spacer(modifier = Modifier.height(40.dp)) } } @@ -158,4 +162,4 @@ fun WelcomeScreen( @Preview fun WelcomeScreenPreview() { WelcomeScreen() -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/HomeViewModel.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/HomeViewModel.kt index 5880e8b..4921d7e 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/HomeViewModel.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/HomeViewModel.kt @@ -2,8 +2,13 @@ package com.whitefish.ring.ui.home import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.whitefish.ring.data.MockDataProvider +import com.whitefish.ring.data.getHeartRate +import com.whitefish.ring.data.mac import com.whitefish.ring.device.IDeviceManager import com.whitefish.ring.obtainDeviceManager +import com.whitefish.ring.utils.nowMilliseconds +import com.whitefish.ring.utils.today import io.github.aakira.napier.Napier import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow @@ -11,6 +16,10 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import kotlinx.datetime.TimeZone +import kotlinx.datetime.atTime +import kotlinx.datetime.toInstant +import kotlin.time.Duration.Companion.milliseconds data class HomeUiState( val selectedTab: HomeTab = HomeTab.STATE, @@ -28,19 +37,18 @@ class HomeViewModel : ViewModel() { viewModelScope.launch { launch { manager.blePowerState.collectLatest { - if (it){ + + if (!mac().isNullOrEmpty()){ + manager.setAutoConnect(true) + } + + if (it) { Napier.i { "start scan" } manager.startScan() } } } - launch { - manager.deviceList.collectLatest { - Napier.i { "deviceList:${it}" } - } - } - } } diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateScreen.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateScreen.kt index 6157da1..fa9bcf3 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateScreen.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateScreen.kt @@ -105,7 +105,7 @@ private fun StateCard( ) } when (val type = card.type) { - is StateCardType.HeartRate -> ComposeMultiplatformBasicLineChart() + is StateCardType.HeartRate -> ComposeMultiplatformBasicLineChart(type.data) is StateCardType.SleepState -> SleepChart( type.data, modifier = Modifier.fillMaxSize() diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateViewModel.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateViewModel.kt index 030286b..c8166c8 100644 --- a/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateViewModel.kt +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/ui/home/state/StateViewModel.kt @@ -1,12 +1,27 @@ package com.whitefish.ring.ui.home.state import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.whitefish.app.ui.chart.sleep.createSampleSleepData +import com.whitefish.ring.data.MockDataProvider +import com.whitefish.ring.data.getHeartRate +import com.whitefish.ring.data.getSleep +import com.whitefish.ring.obtainDeviceManager import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import com.whitefish.ring.ui.home.state.components.ExerciseGoalData import com.whitefish.ring.ui.home.state.components.RecoveryScoreData +import com.whitefish.ring.utils.getTodayEndMillis +import com.whitefish.ring.utils.getTodayStartMillis +import com.whitefish.ring.utils.nowMilliseconds +import com.whitefish.ring.utils.today +import io.github.aakira.napier.Napier +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import kotlinx.datetime.TimeZone +import kotlinx.datetime.atTime +import kotlinx.datetime.toInstant data class StateUiState( val stateCards: List = emptyList(), @@ -22,10 +37,30 @@ class StateViewModel : ViewModel() { init { loadStateData() + viewModelScope.launch { + obtainDeviceManager().bleReadyStateFlow.collectLatest { + if (it){ + val heartRates = getHeartRate( + today().atTime(0, 0).toInstant(TimeZone.currentSystemDefault()).toEpochMilliseconds(), + nowMilliseconds() + ) + Napier.i { "heart rates:${heartRates}" } + _uiState.value.copy(stateCards = _uiState.value.stateCards.map { card -> + if (card.type is StateCardType.HeartRate) { + card.copy(type = StateCardType.HeartRate(heartRates.map { it.value })) + } else { + card + } + }).also { newState -> + _uiState.value = newState + } + + getSleep(getTodayStartMillis(), getTodayEndMillis()) + } + } + } } - private fun loadStateData() { - // 模拟加载状态数据,对应Android StateFragment的数据 val mockData = listOf( StateCardData( title = "心率", @@ -42,14 +77,7 @@ class StateViewModel : ViewModel() { type = StateCardType.SleepState(createSampleSleepData()) ) ) - + _uiState.value = _uiState.value.copy(stateCards = mockData) } - - fun refresh() { - _uiState.value = _uiState.value.copy(isLoading = true) - // 模拟刷新数据 - loadStateData() - _uiState.value = _uiState.value.copy(isLoading = false) - } } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/whitefish/ring/utils/Utils.kt b/shared/src/commonMain/kotlin/com/whitefish/ring/utils/Utils.kt new file mode 100644 index 0000000..979258f --- /dev/null +++ b/shared/src/commonMain/kotlin/com/whitefish/ring/utils/Utils.kt @@ -0,0 +1,26 @@ +package com.whitefish.ring.utils + +import kotlinx.datetime.Clock +import kotlinx.datetime.DateTimeUnit +import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.UtcOffset +import kotlinx.datetime.atStartOfDayIn +import kotlinx.datetime.atTime +import kotlinx.datetime.minus +import kotlinx.datetime.toInstant +import kotlinx.datetime.toLocalDateTime + + +fun nowMilliseconds(): Long = Clock.System.now().toEpochMilliseconds() + +fun today() = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date + +fun getTodayStartMillis(): Long { + return today().atTime(0,0).toInstant(UtcOffset.ZERO).toEpochMilliseconds() +} + +fun getTodayEndMillis(): Long { + return today().atTime(23, 59, 59, 999999999).toInstant(UtcOffset.ZERO).toEpochMilliseconds() +} diff --git a/shared/src/iosMain/kotlin/com/whitefish/ring/DeviceManager.kt b/shared/src/iosMain/kotlin/com/whitefish/ring/DeviceManager.kt index 9a96e0b..2536808 100644 --- a/shared/src/iosMain/kotlin/com/whitefish/ring/DeviceManager.kt +++ b/shared/src/iosMain/kotlin/com/whitefish/ring/DeviceManager.kt @@ -1,14 +1,16 @@ package com.whitefish.ring import androidx.compose.ui.util.fastFirstOrNull +import androidx.datastore.preferences.core.edit import com.whitefish.ring.bean.ui.Device +import com.whitefish.ring.data.address +import com.whitefish.ring.data.mac +import com.whitefish.ring.data.obtainDataStore import com.whitefish.ring.device.IDeviceManager import com.whitefish.ring.objc.CMD_EXECTE_ERROR_REASON import com.whitefish.ring.objc.DeviceCenter import com.whitefish.ring.objc.EXCUTED_CMD import com.whitefish.ring.objc.FUNCTION_ERROR -import com.whitefish.ring.objc.LTSRingSDK -import com.whitefish.ring.objc.OusideBleDiscovery import com.whitefish.ring.objc.SRBLeService import com.whitefish.ring.objc.SRBleDataProtocalProtocol import com.whitefish.ring.objc.SRBleScanProtocalProtocol @@ -26,12 +28,18 @@ import platform.darwin.NSObject import platform.darwin.NSUInteger @OptIn(ExperimentalForeignApi::class) -class DeviceManager: IDeviceManager() { - private val manager = DeviceCenter.instance() +class DeviceManager : IDeviceManager() { + companion object { + val INSTANCE = DeviceCenter.instance() + } + + private val sdk = INSTANCE.sdk private var iosBleList = arrayListOf() private val scope = CoroutineScope(Dispatchers.IO) - + private var isBinded = false + private var autoConnecting = false + // 将delegate对象存储为强引用的成员变量,避免被垃圾回收 private val scanDelegate = object : NSObject(), SRBleScanProtocalProtocol { override fun srBleDidConnectPeripheral(service: SRBLeService) { @@ -44,7 +52,7 @@ class DeviceManager: IDeviceManager() { override fun srBlePowerStateChange(state: CBManagerState) { Napier.i { "srBlePowerStateChange:${state}" } - if (state.toInt() == 5){ + if (state.toInt() == 5) { scope.launch { blePowerState.emit(true) } @@ -57,12 +65,22 @@ class DeviceManager: IDeviceManager() { val deviceList = perphelArray.map { val device = it as SRBLeService iosBleList.add(device) - Device(device.advDataLocalName.toString(),device.macAddress.toString()) + Device(device.advDataLocalName.toString(), device.macAddress.toString()) } _deviceList.value = deviceList + + scope.launch { + val address = mac() + if (autoConnect && !address.isNullOrEmpty() && !autoConnecting) { + autoConnecting = true + connect(address) + Napier.i { "Auto connect:${address}" } + } + } + } } - + private val dataDelegate = object : NSObject(), SRBleDataProtocalProtocol { override fun srBleDeviceDidReadyForReadAndWrite(service: SRBLeService) { Napier.i { "srBleDeviceDidReadyForReadAndWrite" } @@ -133,11 +151,35 @@ class DeviceManager: IDeviceManager() { } override fun srBleIsbinded(isBinded: Boolean) { + scope.launch { + if (isBinded && mac().isNullOrEmpty()) { + showNativeAlert( + title = "设备已绑定", + message = "当前设备已绑定,是否恢复出厂设置?", + onConfirm = { + sdk?.functionDeviceReset() + onResetDeviceWhenBind.invoke() + scope.launch { + obtainDataStore().edit { settings -> + settings[address] = "" + } + } + this@DeviceManager.isBinded = false + }, + onCancel = {} + ) + } + this@DeviceManager.isBinded = isBinded + } + + Napier.i { "srBleIsbinded:${isBinded}" } } override fun srBleOEMAuthResult(authSucceddful: Boolean) { bleReadyStateFlow.value = true + autoConnecting = false Napier.i { "srBleOEMAuthResult" } + } override fun srBleFunctionErrorCallBack( @@ -146,44 +188,49 @@ class DeviceManager: IDeviceManager() { ) { } } - + init { initializeManager() } - + private fun initializeManager() { Napier.i { "DeviceManager initializing..." } - manager.registWithisCustomBleManage(true) + INSTANCE.registWithisCustomBleManage(true) // 使用成员变量而不是匿名对象 - manager.appScanDelegate = scanDelegate - manager.appDataDelegate = dataDelegate + INSTANCE.appScanDelegate = scanDelegate + INSTANCE.appDataDelegate = dataDelegate Napier.i { "DeviceManager delegates set: scan=${scanDelegate}, data=${dataDelegate}" } } - - // 添加重新初始化方法,在需要时可以调用 - fun reinitialize() { - Napier.i { "DeviceManager reinitializing..." } - initializeManager() - } override fun startScan() { - Napier.i { "Starting scan, delegate: ${manager.appScanDelegate}" } - manager.startBleScan() + Napier.i { "Starting scan, delegate: ${INSTANCE.appScanDelegate}" } + INSTANCE.startBleScan() } override fun stopScan() { - manager.stopBleScan() + INSTANCE.stopBleScan() } override fun connect(mac: String) { iosBleList.fastFirstOrNull { it.macAddress == mac }?.let { - manager.connectDevice(it) - Napier.i { "connect device:${it}" } + INSTANCE.connectDevice(it) } } - override fun bind() { - Napier.i { "bind device:${manager.currentDevice()}" } - manager.bindCurrentDevice() + override fun bind(onBound: () -> Unit) { + if (!isBinded) { + Napier.i { "bind device:${INSTANCE.currentDevice()}" } + INSTANCE.bindCurrentDevice() + onBound.invoke() + } + } + + + override fun getCurrentMac(): String? { + return INSTANCE.currentDevice().macAddress + } + + override fun setAutoConnect(enable: Boolean) { + autoConnect = enable } } \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/com/whitefish/ring/Platform.ios.kt b/shared/src/iosMain/kotlin/com/whitefish/ring/Platform.ios.kt index 56ed02b..c22004b 100644 --- a/shared/src/iosMain/kotlin/com/whitefish/ring/Platform.ios.kt +++ b/shared/src/iosMain/kotlin/com/whitefish/ring/Platform.ios.kt @@ -6,6 +6,12 @@ import androidx.compose.ui.unit.dp import com.whitefish.ring.device.IDeviceManager import io.github.aakira.napier.DebugAntilog import io.github.aakira.napier.Napier +import platform.UIKit.UIAlertAction +import platform.UIKit.UIAlertActionStyleCancel +import platform.UIKit.UIAlertActionStyleDefault +import platform.UIKit.UIAlertController +import platform.UIKit.UIAlertControllerStyleAlert +import platform.UIKit.UIApplication import platform.UIKit.UIDevice class IOSPlatform: Platform { @@ -64,4 +70,36 @@ actual fun obtainDeviceManager(): IDeviceManager { fun initLogger(){ Napier.base(DebugAntilog()) Napier.i { "Logger init success on ios" } +} + +fun showNativeAlert( + title: String, + message: String, + onConfirm: () -> Unit, + onCancel: () -> Unit +) { + val alert = UIAlertController.alertControllerWithTitle( + title = title, + message = message, + preferredStyle = UIAlertControllerStyleAlert + ) + + // 确认按钮 + val confirmAction = UIAlertAction.actionWithTitle( + title = "确认", + style = UIAlertActionStyleDefault + ) { _ -> onConfirm() } + + // 取消按钮 + val cancelAction = UIAlertAction.actionWithTitle( + title = "取消", + style = UIAlertActionStyleCancel + ) { _ -> onCancel() } + + alert.addAction(confirmAction) + alert.addAction(cancelAction) + + // 获取当前视图控制器并展示 + val rootViewController = UIApplication.sharedApplication.keyWindow?.rootViewController + rootViewController?.presentViewController(alert, animated = true, completion = null) } \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/com/whitefish/ring/data/DataStore.ios.kt b/shared/src/iosMain/kotlin/com/whitefish/ring/data/DataStore.ios.kt new file mode 100644 index 0000000..2335117 --- /dev/null +++ b/shared/src/iosMain/kotlin/com/whitefish/ring/data/DataStore.ios.kt @@ -0,0 +1,33 @@ +package com.whitefish.ring.data + +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import co.touchlab.stately.concurrency.Synchronizable +import com.whitefish.ring.data.createDataStore +import kotlinx.atomicfu.locks.SynchronizedObject +import kotlinx.atomicfu.locks.synchronized +import kotlinx.cinterop.ExperimentalForeignApi +import org.koin.mp.Lockable +import platform.Foundation.NSDocumentDirectory +import platform.Foundation.NSFileManager +import platform.Foundation.NSURL +import platform.Foundation.NSUserDomainMask + + +private var dataStoreInstance: DataStore? = null +private val lock = SynchronizedObject() +@OptIn(ExperimentalForeignApi::class) +actual fun obtainDataStore(): DataStore = synchronized(lock) { + dataStoreInstance ?: createDataStore( + producePath = { + val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory( + directory = NSDocumentDirectory, + inDomain = NSUserDomainMask, + appropriateForURL = null, + create = false, + error = null, + ) + requireNotNull(documentDirectory).path + "/$dataStoreFileName" + } + ).also { dataStoreInstance = it } +} diff --git a/shared/src/iosMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.ios.kt b/shared/src/iosMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.ios.kt new file mode 100644 index 0000000..0b8f8fb --- /dev/null +++ b/shared/src/iosMain/kotlin/com/whitefish/ring/data/DeviceDataProvider.ios.kt @@ -0,0 +1,123 @@ +package com.whitefish.ring.data + +import com.whitefish.app.ui.chart.sleep.SleepSegment +import com.whitefish.ring.bean.ui.HeartRate +import com.whitefish.ring.bean.ui.SleepState +import com.whitefish.ring.objc.DBHeartRate +import com.whitefish.ring.objc.DBSleepData +import com.whitefish.ring.objc.StagingListObj +import com.whitefish.ring.objc.StagingSubObj +import com.whitefish.ring.utils.getCurrentTimestamp +import com.whitefish.ring.utils.timestampToDate +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.withContext +import platform.Foundation.timeIntervalSince1970 +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + +@OptIn(ExperimentalForeignApi::class) +actual suspend fun getHeartRate(start: Long, end: Long): List = + withContext(Dispatchers.IO) { + val macAddress = mac() + return@withContext suspendCoroutine { coroutine -> + macAddress?.let { + DBHeartRate.queryBy( + it, + start.timestampToDate(), + end.timestampToDate(), + false + ) { result, max, min, avg -> + val heartList = result?.map { it as DBHeartRate } + ?.map { HeartRate(it.time.getCurrentTimestamp(), it.value.intValue) } + if (heartList.isNullOrEmpty()) { + coroutine.resume(emptyList()) + } else { + coroutine.resume(heartList) + } + } + } + } + } + +@OptIn(ExperimentalForeignApi::class) +actual suspend fun getSleep( + start: Long, + end: Long +): SleepState = withContext(Dispatchers.IO) { + val macAddress = mac() + return@withContext suspendCoroutine { coroutine -> + macAddress?.let { + val segments = mutableListOf() + + DBSleepData.queryDbSleepBy( + it, start.timestampToDate().timeIntervalSince1970, + end.timestampToDate().timeIntervalSince1970 + ) { result -> + val sleepDataList = result?.map { it as DBSleepData } + var totalSeconds = 0 + + sleepDataList?.let { dataList -> + dataList.forEach { sleepData -> + if (!sleepData.isNap) { + totalSeconds += sleepData.duration.intValue + + // 处理睡眠分期数据 + sleepData.stagingData?.ousideStagingList?.let { stagingList -> + for (i in 0 until stagingList.size) { + val stagingObj = stagingList[i] as StagingSubObj + + // 计算该阶段的持续时间 + val duration = if (i == 0) { + // 第一个阶段:从开始到结束 + stagingObj.list.let { list -> + val firstTime = (list.first() as? StagingListObj)?.time?.doubleValue ?: 0.0 + val lastTime = (list.last() as? StagingListObj)?.time?.doubleValue ?: 0.0 + lastTime - firstTime + } + } else { + // 后续阶段:从前一个阶段结束到当前阶段结束 + val prevStagingObj = stagingList[i - 1] as StagingSubObj + val currentEndTime = (stagingObj.list.first() as? StagingListObj)?.time?.doubleValue ?: 0.0 + val prevEndTime = (prevStagingObj.list.last() as? StagingListObj)?.time?.doubleValue ?: 0.0 + currentEndTime - prevEndTime + } + + // 转换睡眠状态类型到用户定义的状态 + val mappedState = mapSleepStageToState(stagingObj.type.value.toInt()) + + // 只添加有效的睡眠状态(跳过 NONE 状态) + if (mappedState >= 0) { + val durationMinutes = (duration / 60.0).toFloat() + if (durationMinutes > 0) { + segments.add(SleepSegment(mappedState, durationMinutes)) + } + } + } + } + } + } + } + coroutine.resume(SleepState(totalSeconds =totalSeconds, segments = segments )) + } + } + } +} + +/** + * 将原始睡眠状态映射到用户定义的状态 + * @param originalType 原始睡眠状态类型 + * @return 映射后的状态 (0=清醒, 1=浅睡, 2=深睡, 3=REM, -1=忽略) + */ +private fun mapSleepStageToState(originalType: Int): Int { + return when (originalType) { + 0 -> -1 // NONE - 忽略 + 1 -> 0 // WAKE - 清醒 + 2, 3 -> 1 // NREM1, NREM2 - 浅睡 + 4 -> 2 // NREM3 - 深睡 + 5 -> 3 // REM - REM睡眠 + 6 -> -1 // NAP - 忽略(因为已经过滤了 isNap) + else -> -1 + } +} diff --git a/shared/src/iosMain/kotlin/com/whitefish/ring/utils/Utils.kt b/shared/src/iosMain/kotlin/com/whitefish/ring/utils/Utils.kt new file mode 100644 index 0000000..b519e77 --- /dev/null +++ b/shared/src/iosMain/kotlin/com/whitefish/ring/utils/Utils.kt @@ -0,0 +1,15 @@ +package com.whitefish.ring.utils + +import platform.Foundation.NSDate +import platform.Foundation.NSTimeInterval +import platform.Foundation.dateWithTimeIntervalSince1970 +import platform.Foundation.timeIntervalSince1970 + +fun Long.timestampToDate(): NSDate { + val timeInterval: NSTimeInterval = this / 1000.0 + return NSDate.dateWithTimeIntervalSince1970(timeInterval) +} + +fun NSDate.getCurrentTimestamp(): Long { + return (this.timeIntervalSince1970 * 1000).toLong() +} \ No newline at end of file