From 45c5dd88462ca91cac73163c8772d7e8800db722 Mon Sep 17 00:00:00 2001 From: "Chris J. Karr" Date: Wed, 17 May 2017 21:46:07 -0500 Subject: [PATCH] Wrapping up initial Withings work. * Added System Status generator. --- ...ent_light.png => ic_pdk_ambient_light.png} | Bin ...c_app_events.png => ic_pdk_app_events.png} | Bin ..._battery.png => ic_pdk_device_battery.png} | Bin ...oft_band.png => ic_pdk_microsoft_band.png} | Bin ...phone_calls.png => ic_pdk_phone_calls.png} | Bin ...reen_state.png => ic_pdk_screen_state.png} | Bin res/drawable-hdpi/ic_pdk_system_status.png | Bin 0 -> 1501 bytes ..._messages.png => ic_pdk_text_messages.png} | Bin ..._device.png => ic_pdk_withings_device.png} | Bin ...ent_light.png => ic_pdk_ambient_light.png} | Bin ...c_app_events.png => ic_pdk_app_events.png} | Bin ..._battery.png => ic_pdk_device_battery.png} | Bin ...oft_band.png => ic_pdk_microsoft_band.png} | Bin ...phone_calls.png => ic_pdk_phone_calls.png} | Bin ...reen_state.png => ic_pdk_screen_state.png} | Bin res/drawable-mdpi/ic_pdk_system_status.png | Bin 0 -> 1294 bytes ..._messages.png => ic_pdk_text_messages.png} | Bin ..._device.png => ic_pdk_withings_device.png} | Bin ...ent_light.png => ic_pdk_ambient_light.png} | Bin ...c_app_events.png => ic_pdk_app_events.png} | Bin ..._battery.png => ic_pdk_device_battery.png} | Bin ...oft_band.png => ic_pdk_microsoft_band.png} | Bin ...phone_calls.png => ic_pdk_phone_calls.png} | Bin ...reen_state.png => ic_pdk_screen_state.png} | Bin res/drawable-xhdpi/ic_pdk_system_status.png | Bin 0 -> 1696 bytes ..._messages.png => ic_pdk_text_messages.png} | Bin ..._device.png => ic_pdk_withings_device.png} | Bin ...ent_light.png => ic_pdk_ambient_light.png} | Bin ...c_app_events.png => ic_pdk_app_events.png} | Bin ..._battery.png => ic_pdk_device_battery.png} | Bin ...oft_band.png => ic_pdk_microsoft_band.png} | Bin ...phone_calls.png => ic_pdk_phone_calls.png} | Bin ...reen_state.png => ic_pdk_screen_state.png} | Bin res/drawable-xxhdpi/ic_pdk_system_status.png | Bin 0 -> 2094 bytes ..._messages.png => ic_pdk_text_messages.png} | Bin ..._device.png => ic_pdk_withings_device.png} | Bin ...ent_light.png => ic_pdk_ambient_light.png} | Bin ...c_app_events.png => ic_pdk_app_events.png} | Bin ..._battery.png => ic_pdk_device_battery.png} | Bin ...oft_band.png => ic_pdk_microsoft_band.png} | Bin ...phone_calls.png => ic_pdk_phone_calls.png} | Bin ...reen_state.png => ic_pdk_screen_state.png} | Bin res/drawable-xxxhdpi/ic_pdk_system_status.png | Bin 0 -> 2274 bytes ..._messages.png => ic_pdk_text_messages.png} | Bin ..._device.png => ic_pdk_withings_device.png} | Bin res/layout/card_generator_app_event.xml | 2 +- res/layout/card_generator_device_battery.xml | 2 +- ...rd_generator_diagnostics_system_status.xml | 70 +++ res/layout/card_generator_microsoft_band.xml | 2 +- res/layout/card_generator_phone_calls.xml | 2 +- res/layout/card_generator_screen_state.xml | 2 +- .../card_generator_sensors_ambient_light.xml | 2 +- res/layout/card_generator_text_messages.xml | 2 +- .../card_generator_withings_body_page.xml | 174 ++++++- res/layout/card_generator_withings_device.xml | 2 +- .../card_generator_withings_intraday_page.xml | 3 +- res/values/databases.xml | 3 + res/values/generators.xml | 18 + .../generators/device/Battery.java | 16 +- .../generators/diagnostics/SystemStatus.java | 465 ++++++++++++++++++ .../generators/wearables/WithingsDevice.java | 72 ++- .../transmitters/HttpTransmitter.java | 4 +- 62 files changed, 811 insertions(+), 30 deletions(-) rename res/drawable-hdpi/{ic_ambient_light.png => ic_pdk_ambient_light.png} (100%) rename res/drawable-hdpi/{ic_app_events.png => ic_pdk_app_events.png} (100%) rename res/drawable-hdpi/{ic_device_battery.png => ic_pdk_device_battery.png} (100%) rename res/drawable-hdpi/{ic_microsoft_band.png => ic_pdk_microsoft_band.png} (100%) rename res/drawable-hdpi/{ic_phone_calls.png => ic_pdk_phone_calls.png} (100%) rename res/drawable-hdpi/{ic_screen_state.png => ic_pdk_screen_state.png} (100%) create mode 100755 res/drawable-hdpi/ic_pdk_system_status.png rename res/drawable-hdpi/{ic_text_messages.png => ic_pdk_text_messages.png} (100%) rename res/drawable-hdpi/{ic_withings_device.png => ic_pdk_withings_device.png} (100%) rename res/drawable-mdpi/{ic_ambient_light.png => ic_pdk_ambient_light.png} (100%) rename res/drawable-mdpi/{ic_app_events.png => ic_pdk_app_events.png} (100%) rename res/drawable-mdpi/{ic_device_battery.png => ic_pdk_device_battery.png} (100%) rename res/drawable-mdpi/{ic_microsoft_band.png => ic_pdk_microsoft_band.png} (100%) rename res/drawable-mdpi/{ic_phone_calls.png => ic_pdk_phone_calls.png} (100%) rename res/drawable-mdpi/{ic_screen_state.png => ic_pdk_screen_state.png} (100%) create mode 100755 res/drawable-mdpi/ic_pdk_system_status.png rename res/drawable-mdpi/{ic_text_messages.png => ic_pdk_text_messages.png} (100%) rename res/drawable-mdpi/{ic_withings_device.png => ic_pdk_withings_device.png} (100%) rename res/drawable-xhdpi/{ic_ambient_light.png => ic_pdk_ambient_light.png} (100%) rename res/drawable-xhdpi/{ic_app_events.png => ic_pdk_app_events.png} (100%) rename res/drawable-xhdpi/{ic_device_battery.png => ic_pdk_device_battery.png} (100%) rename res/drawable-xhdpi/{ic_microsoft_band.png => ic_pdk_microsoft_band.png} (100%) rename res/drawable-xhdpi/{ic_phone_calls.png => ic_pdk_phone_calls.png} (100%) rename res/drawable-xhdpi/{ic_screen_state.png => ic_pdk_screen_state.png} (100%) create mode 100755 res/drawable-xhdpi/ic_pdk_system_status.png rename res/drawable-xhdpi/{ic_text_messages.png => ic_pdk_text_messages.png} (100%) rename res/drawable-xhdpi/{ic_withings_device.png => ic_pdk_withings_device.png} (100%) rename res/drawable-xxhdpi/{ic_ambient_light.png => ic_pdk_ambient_light.png} (100%) rename res/drawable-xxhdpi/{ic_app_events.png => ic_pdk_app_events.png} (100%) rename res/drawable-xxhdpi/{ic_device_battery.png => ic_pdk_device_battery.png} (100%) rename res/drawable-xxhdpi/{ic_microsoft_band.png => ic_pdk_microsoft_band.png} (100%) rename res/drawable-xxhdpi/{ic_phone_calls.png => ic_pdk_phone_calls.png} (100%) rename res/drawable-xxhdpi/{ic_screen_state.png => ic_pdk_screen_state.png} (100%) create mode 100755 res/drawable-xxhdpi/ic_pdk_system_status.png rename res/drawable-xxhdpi/{ic_text_messages.png => ic_pdk_text_messages.png} (100%) rename res/drawable-xxhdpi/{ic_withings_device.png => ic_pdk_withings_device.png} (100%) rename res/drawable-xxxhdpi/{ic_ambient_light.png => ic_pdk_ambient_light.png} (100%) rename res/drawable-xxxhdpi/{ic_app_events.png => ic_pdk_app_events.png} (100%) rename res/drawable-xxxhdpi/{ic_device_battery.png => ic_pdk_device_battery.png} (100%) rename res/drawable-xxxhdpi/{ic_microsoft_band.png => ic_pdk_microsoft_band.png} (100%) rename res/drawable-xxxhdpi/{ic_phone_calls.png => ic_pdk_phone_calls.png} (100%) rename res/drawable-xxxhdpi/{ic_screen_state.png => ic_pdk_screen_state.png} (100%) create mode 100755 res/drawable-xxxhdpi/ic_pdk_system_status.png rename res/drawable-xxxhdpi/{ic_text_messages.png => ic_pdk_text_messages.png} (100%) rename res/drawable-xxxhdpi/{ic_withings_device.png => ic_pdk_withings_device.png} (100%) create mode 100755 res/layout/card_generator_diagnostics_system_status.xml create mode 100755 src/com/audacious_software/passive_data_kit/generators/diagnostics/SystemStatus.java diff --git a/res/drawable-hdpi/ic_ambient_light.png b/res/drawable-hdpi/ic_pdk_ambient_light.png similarity index 100% rename from res/drawable-hdpi/ic_ambient_light.png rename to res/drawable-hdpi/ic_pdk_ambient_light.png diff --git a/res/drawable-hdpi/ic_app_events.png b/res/drawable-hdpi/ic_pdk_app_events.png similarity index 100% rename from res/drawable-hdpi/ic_app_events.png rename to res/drawable-hdpi/ic_pdk_app_events.png diff --git a/res/drawable-hdpi/ic_device_battery.png b/res/drawable-hdpi/ic_pdk_device_battery.png similarity index 100% rename from res/drawable-hdpi/ic_device_battery.png rename to res/drawable-hdpi/ic_pdk_device_battery.png diff --git a/res/drawable-hdpi/ic_microsoft_band.png b/res/drawable-hdpi/ic_pdk_microsoft_band.png similarity index 100% rename from res/drawable-hdpi/ic_microsoft_band.png rename to res/drawable-hdpi/ic_pdk_microsoft_band.png diff --git a/res/drawable-hdpi/ic_phone_calls.png b/res/drawable-hdpi/ic_pdk_phone_calls.png similarity index 100% rename from res/drawable-hdpi/ic_phone_calls.png rename to res/drawable-hdpi/ic_pdk_phone_calls.png diff --git a/res/drawable-hdpi/ic_screen_state.png b/res/drawable-hdpi/ic_pdk_screen_state.png similarity index 100% rename from res/drawable-hdpi/ic_screen_state.png rename to res/drawable-hdpi/ic_pdk_screen_state.png diff --git a/res/drawable-hdpi/ic_pdk_system_status.png b/res/drawable-hdpi/ic_pdk_system_status.png new file mode 100755 index 0000000000000000000000000000000000000000..303b8b1252b34c49204b43c944fc7490dcd92784 GIT binary patch literal 1501 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFl%InM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWnQpS7v4w)UrJkXw zrG=4+j)IYap_#scrM{twu7RPIfu)s!p#l^r0c|TvNwW%aaf8|g1^l#~=$>Fbx5 zm+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH*nV6WA zUs__T1av9H3%LbwWAlok!2}F2{ffi_eM3D1ke6TzeSPsO&CP|YE-nd5MYtEM!Nnn! z1*!T$sm1xFMajU3OH&3}Rbb^@l$uzQUlfv`p92fUfQj_j!pzOU0H)U^Ke;qFHLnDwHwB^B6sKNLg2*iZ+U$~Alv$RV;#QQOs{r=6RVHq? z7~wPzsy79RVB$W~%k-Infyvv` z#WAGf)|(me8mfUZ$KP-LzVAnHo{DPy^iS${ZfvU%krNUB=u~lVx2}Jj#?#2k$BwzT z?tW{Xpl*}vy-THANcHJKrT>%uL_Yp~IdJ*r=Vv60X9d=MU1^;DY|hVfKj+=IG=6;5 z{7TKqI5 z;N_A9BApFl&1RJfueY*X_0&<~zFcyvq~V@8uVAjMl}m%GuiV`(GrJG$cN+TH{{C;j z$a?gFpJE2<57peR9cIpHtdfy#n*SUN*9lDVc;y^3J8VMYb(t=vuU60ZPCDu9l-2U} zb$4v>3bzd}1bDbh*%kZ}uLs98lvwLzi}lqv%M~2Es@jnCZbwv-VQR+on}VMU9fDKX|YBeQZq?*RAbEJCir<2TVA+cr*(aNKMttC5e_`jIa5}jx^LfVQD~2B~)vc{5^=aHc zsY>c8r@CFU#_MCMUuP%WT={;}`mTw)3%xEdMTi=u9`b4rW4+6nEpk(|>{swF^&Kfs zGquZZs%A`I>nXRo?B>tSjoUhHH#`w@EM9PbRqUT@AOF?AILlEbkicM4xteF%)#LX- O1+J&7pUXO@geCwWmol9I literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_text_messages.png b/res/drawable-hdpi/ic_pdk_text_messages.png similarity index 100% rename from res/drawable-hdpi/ic_text_messages.png rename to res/drawable-hdpi/ic_pdk_text_messages.png diff --git a/res/drawable-hdpi/ic_withings_device.png b/res/drawable-hdpi/ic_pdk_withings_device.png similarity index 100% rename from res/drawable-hdpi/ic_withings_device.png rename to res/drawable-hdpi/ic_pdk_withings_device.png diff --git a/res/drawable-mdpi/ic_ambient_light.png b/res/drawable-mdpi/ic_pdk_ambient_light.png similarity index 100% rename from res/drawable-mdpi/ic_ambient_light.png rename to res/drawable-mdpi/ic_pdk_ambient_light.png diff --git a/res/drawable-mdpi/ic_app_events.png b/res/drawable-mdpi/ic_pdk_app_events.png similarity index 100% rename from res/drawable-mdpi/ic_app_events.png rename to res/drawable-mdpi/ic_pdk_app_events.png diff --git a/res/drawable-mdpi/ic_device_battery.png b/res/drawable-mdpi/ic_pdk_device_battery.png similarity index 100% rename from res/drawable-mdpi/ic_device_battery.png rename to res/drawable-mdpi/ic_pdk_device_battery.png diff --git a/res/drawable-mdpi/ic_microsoft_band.png b/res/drawable-mdpi/ic_pdk_microsoft_band.png similarity index 100% rename from res/drawable-mdpi/ic_microsoft_band.png rename to res/drawable-mdpi/ic_pdk_microsoft_band.png diff --git a/res/drawable-mdpi/ic_phone_calls.png b/res/drawable-mdpi/ic_pdk_phone_calls.png similarity index 100% rename from res/drawable-mdpi/ic_phone_calls.png rename to res/drawable-mdpi/ic_pdk_phone_calls.png diff --git a/res/drawable-mdpi/ic_screen_state.png b/res/drawable-mdpi/ic_pdk_screen_state.png similarity index 100% rename from res/drawable-mdpi/ic_screen_state.png rename to res/drawable-mdpi/ic_pdk_screen_state.png diff --git a/res/drawable-mdpi/ic_pdk_system_status.png b/res/drawable-mdpi/ic_pdk_system_status.png new file mode 100755 index 0000000000000000000000000000000000000000..4deaf7c31edad6ee548c22d64c6d20096b99f2d6 GIT binary patch literal 1294 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m^Cs(B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk*h0bFQqR!T z(!$6@N5ROz&`jUJQs2--*TB%qz|zXVPyq^*fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAddqG<*}2 zGxI=#nqXbNzE+-j#U+V($*G<$wn{*A^fEJ3tQ;*&U7cJUEsTv#j0_E3&7E9K&D@+U zf#Gj%VdiFF0MqM|pIn-onpXnTn}X15iBm5qLF5(yZFWg5$}CGwaVyHtRRDY3DigO` z%y60q)tiFbE#^4&>H{644~kx-=!OXa(-4RWPrN`5Jo%^Q0n>aDFmZQ3{I!vRfw9KZ z#WAGfR??sU|LvJ|8HJg985OzbG|re9Cf339kw;oJV$LBu#R7(|Y8)JC~h&P_u?qr>%HLz0=K)9#wxPUI`Htc2RiG z&9sq8z`niezor1UV>2U59m7Twfoz74@mmyn7?K!QNS>H6ll9f2uMTTCkK{P$@NBK- z7TC}HDD=Vt2G=Tq5ZhhnpF3Yw>i*A|Ygw7^H&#fSzHZLHaH6d-`ND$5S*@E{q}C~H=o2%&<*H!E>&tPw z>?5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0Fmp37fa!I~PcF?(%`1WFO+n~2#HkmQAaV^MGl-2$;Bk zOnLtlm}mGrT^vIyZoQf1nJwxl()yd%aq%KG7DEf27>QmL{y7IY9Sgdcy8;ab&2PR4 zoB!YOe}i?b#lwa`fu z_km+sk`@e7B5zrJQ$iM9eXTWP`nE=!{5UIF#;;=6ZyrAV;o}zGHO$e@zos|uZOguJ z>GrYX;s@@S@LrIeoh;#8?R0K}oo>yYL%%(>*s>gVAKf9lKy%4|0S&I_6Bj3BCrDqn zQ9H|j@~xDa!gQ6lnG!ETmb9(ovRS!vwd%YLYc{!NxfyM6srcZsm;G+nw=_T1NOsfN zv6@~YIXqi7az=hXkm{^cr-(Pl8()Udfy3owRu#0vqddFhVT#f3He{^TsS7Do=E$c5$5o3P9Wp6!o)dNrM!?GV3eX{Bt zl7AnN_x-P1aPHIDH;V3?--QtvnK*(b|W<%)M@7d|cBoOs6|e3AXCzo~xLMBEQ9 zNiX!Z%VT!T`eW2nIiZz5+A1*aTicg_2PYJDr*vMxFaY z?uT!wPcNQn{-ChcYF^1NmCOWzFX}sgspK}49hW}z)8o!+|4VEhwoX@X9Y5a?%%*W) zUVZDYCBWkQmJE&e^`l0_`B0DY=8!^RAn(TkN!8}{RmdKI;Vst0Iz6~LI3~& literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_text_messages.png b/res/drawable-xhdpi/ic_pdk_text_messages.png similarity index 100% rename from res/drawable-xhdpi/ic_text_messages.png rename to res/drawable-xhdpi/ic_pdk_text_messages.png diff --git a/res/drawable-xhdpi/ic_withings_device.png b/res/drawable-xhdpi/ic_pdk_withings_device.png similarity index 100% rename from res/drawable-xhdpi/ic_withings_device.png rename to res/drawable-xhdpi/ic_pdk_withings_device.png diff --git a/res/drawable-xxhdpi/ic_ambient_light.png b/res/drawable-xxhdpi/ic_pdk_ambient_light.png similarity index 100% rename from res/drawable-xxhdpi/ic_ambient_light.png rename to res/drawable-xxhdpi/ic_pdk_ambient_light.png diff --git a/res/drawable-xxhdpi/ic_app_events.png b/res/drawable-xxhdpi/ic_pdk_app_events.png similarity index 100% rename from res/drawable-xxhdpi/ic_app_events.png rename to res/drawable-xxhdpi/ic_pdk_app_events.png diff --git a/res/drawable-xxhdpi/ic_device_battery.png b/res/drawable-xxhdpi/ic_pdk_device_battery.png similarity index 100% rename from res/drawable-xxhdpi/ic_device_battery.png rename to res/drawable-xxhdpi/ic_pdk_device_battery.png diff --git a/res/drawable-xxhdpi/ic_microsoft_band.png b/res/drawable-xxhdpi/ic_pdk_microsoft_band.png similarity index 100% rename from res/drawable-xxhdpi/ic_microsoft_band.png rename to res/drawable-xxhdpi/ic_pdk_microsoft_band.png diff --git a/res/drawable-xxhdpi/ic_phone_calls.png b/res/drawable-xxhdpi/ic_pdk_phone_calls.png similarity index 100% rename from res/drawable-xxhdpi/ic_phone_calls.png rename to res/drawable-xxhdpi/ic_pdk_phone_calls.png diff --git a/res/drawable-xxhdpi/ic_screen_state.png b/res/drawable-xxhdpi/ic_pdk_screen_state.png similarity index 100% rename from res/drawable-xxhdpi/ic_screen_state.png rename to res/drawable-xxhdpi/ic_pdk_screen_state.png diff --git a/res/drawable-xxhdpi/ic_pdk_system_status.png b/res/drawable-xxhdpi/ic_pdk_system_status.png new file mode 100755 index 0000000000000000000000000000000000000000..ce6df18f8cd4e83f0d140acbd13f78d06b552c56 GIT binary patch literal 2094 zcmaJ?dsGv57EVKWgowP~XS-uU3kc*%z@$I|Br#Be0RbrmmXJ(H#AHG;fgqF;#2x`@ z!Rl5eC}63mplv}BSuwhB06`3Fw=Livsl3)l#j1efYbRFh{;}+wGxNK@d+zt$*LTiT z2;(=~*?QTcP$;_?J|_`5`R3Qg3i&4g+P)b%JYjAsycLqd1tK+wij+XvAP}Pv<$#Hx zNK%+L2!^3h7Jl-iR5(=-#}q>fqR1RW)G1U58ifjD=~NQ=oCAY8m2BB|C*PH*k(5g z54;Y6bHnk!7nLdy0@08f1n9(&ATfou2?%8nDRjmrYH%PxB~wC3WCn>697Lut$qXi$ z0=#+fNH(=Z%1q?&-sD1V;dmJgtC%EGK|ukrfJTJWIV1{$!61>TBq}usi3rjZDq)c> zNU0&LGH^hRSS?qLiLtbsd+OdWMCwnNJXL$$>x?;0|kQr zAF5Eijn=@4;2-t=Phw3{p$a4=f*MGx79)$363nSo%xESkXWk#mGCN7@&`6}O{`fE3Kf!>1FGfupoFJ}6u|4onew%3 zp{&XG1}j;+7V4T<5>gDwyx#v>_o@rgklB1IUgYvt{-6@kyc!YrFD}yh&Jo08J& zobueUZRaue{Akm8deW)IPnJHekH3CMGoDdD&bT!5)$oYnkY=uPzPrACTv$}p4H`Gw z6ZDP)HWCaKZMn4}j^OZTf8#FWI)a0DRq0bBod<-ZSUf}FN>A__Mm(_TQT<)ULx`D* zGQ{;;ln(7>*VjLa?eDTPzT`Emf3z{*Fod4-)H4m5gLx&V9R13wiK0*AOqPf3hv(A0 z<9hr|=r)U`{I1U#328!0ul4DHGMe>4XEEzo3+X1de2$)MvZCE}r7X4M&R>Jji{Jr#VJmRq`@IQoS}XZPQB?1_5ne}}L=lk2rW zt9~wSo_UDd;`}`O)8~IOOovuJlix1$6@E7Rau=pp)}yfECggJ6?ib4N&V^vnsP*B( zAKj;hJkSnHUG}=q>AR@!N%wf)Ded%_55S8D$N?yTLPQ=^piM&7L1Lv*)P zJZSE>ow(5$_(Fx&V*4h0$)3f&qxUh`<|-)_?DcdCaD0-39SM{9&k|U!Qefq)A)~u( z&q<+X>bksmR91zP<8C>8QoksoFaDF;@JgS(QL0thobNxA5a;%ji?q)9KnbGwr(-eI z&))s8b)C;{_8y$^OyzRJU!J(R=*cTLl84*3TNb7yVjovs-4`;rWUpU-k-5DE{lers zc&^iR;{9s2ozo#Ld@k8H`n!|6jyWm5MfG?k=}ieNr;e_#YsP)+**Dt;4xeo)X)oJY z!_}q}<|k;CS$a1c!9C{uglBa*^)}{8{k9+7wBC&Qr3Rd&mJNB(?q(L)4+o$d?U_UT z^(+rPQz)VxcdNP-?Ubs&qZnBUay`xiyj7DI#@trw_Ode)qDzin4X}84n7yTSAV0o- zo0ZGMDVA{ei86?eeu|n~$lJ^20R&;etuIg(sImv6G-(IRVE%*0aN{|rqq55W1B?+r AHvj+t literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_text_messages.png b/res/drawable-xxhdpi/ic_pdk_text_messages.png similarity index 100% rename from res/drawable-xxhdpi/ic_text_messages.png rename to res/drawable-xxhdpi/ic_pdk_text_messages.png diff --git a/res/drawable-xxhdpi/ic_withings_device.png b/res/drawable-xxhdpi/ic_pdk_withings_device.png similarity index 100% rename from res/drawable-xxhdpi/ic_withings_device.png rename to res/drawable-xxhdpi/ic_pdk_withings_device.png diff --git a/res/drawable-xxxhdpi/ic_ambient_light.png b/res/drawable-xxxhdpi/ic_pdk_ambient_light.png similarity index 100% rename from res/drawable-xxxhdpi/ic_ambient_light.png rename to res/drawable-xxxhdpi/ic_pdk_ambient_light.png diff --git a/res/drawable-xxxhdpi/ic_app_events.png b/res/drawable-xxxhdpi/ic_pdk_app_events.png similarity index 100% rename from res/drawable-xxxhdpi/ic_app_events.png rename to res/drawable-xxxhdpi/ic_pdk_app_events.png diff --git a/res/drawable-xxxhdpi/ic_device_battery.png b/res/drawable-xxxhdpi/ic_pdk_device_battery.png similarity index 100% rename from res/drawable-xxxhdpi/ic_device_battery.png rename to res/drawable-xxxhdpi/ic_pdk_device_battery.png diff --git a/res/drawable-xxxhdpi/ic_microsoft_band.png b/res/drawable-xxxhdpi/ic_pdk_microsoft_band.png similarity index 100% rename from res/drawable-xxxhdpi/ic_microsoft_band.png rename to res/drawable-xxxhdpi/ic_pdk_microsoft_band.png diff --git a/res/drawable-xxxhdpi/ic_phone_calls.png b/res/drawable-xxxhdpi/ic_pdk_phone_calls.png similarity index 100% rename from res/drawable-xxxhdpi/ic_phone_calls.png rename to res/drawable-xxxhdpi/ic_pdk_phone_calls.png diff --git a/res/drawable-xxxhdpi/ic_screen_state.png b/res/drawable-xxxhdpi/ic_pdk_screen_state.png similarity index 100% rename from res/drawable-xxxhdpi/ic_screen_state.png rename to res/drawable-xxxhdpi/ic_pdk_screen_state.png diff --git a/res/drawable-xxxhdpi/ic_pdk_system_status.png b/res/drawable-xxxhdpi/ic_pdk_system_status.png new file mode 100755 index 0000000000000000000000000000000000000000..595b4592fe07b671f4f298786adf39d7c530e8aa GIT binary patch literal 2274 zcmaJ@dsGuw9-f3mAw22>!ovr{uwp2X$%97{fglM8Xfy=0phqPn6G$z00Q=}Dp#)!(EU)zx{5x2t=irMg7LkC(p$bed)gr(`Ihu@s(JE;QB0;3` z4eKu;!2n=IQ^qG?38E!D8LFa7Ef{)+N`tcjAef(_k;>8#3`|B+lxATTskv=%VGKZf-D9z5N2>;roSJ9$zyPN3?}&D zfpBkHxq>GVMt<;xpF*Hi4AbynSg+U9^=vw-O@WzQE*EC7U>3^{NBHSBs4;1VpIYZR zsUSpjGObdBDN!|OQIsa5=~xJaNBU<9D$Pe(weCZi@Pfe^QVqOZykD^s0LbEK;llWg z-bbq+ra3KgGzM%%eP~}Ej5VFBIPBsi5*#kw)f;%@M#@OlUY8McB;QN?q|Nx1S5fb^ zU`k}n{^o;G4F~6uR{0B8#bz%oq(GtKJI^a`x0r6<&eALNipTqY8O?XU(7u5E=rVe_ zoc;H+1%zA_8I>N6qKg|?V z>8(vlQfkSjy}3iaVJFSI`)L!Kx}NiGr_E@-6bcrG^x15=W%C(fPfIADyn;A^*qVyx zaZ8I21H%euM~4dAY~%e@ny+&_T{e+OZtNy(lG&QJd{!8rbKofGOOR0FX3k6m7L-kS zd(-pB_yI4f*};@v92eDnzRENw>E6nQuN~04_5)7MfbQ^$BX1|%1Tz+$ZziWcVXiQ( zU*=DE*FI*$n~&VG|K~g3+vL+#BtkQBKB==`5pC#9!~qh*=$#YkMY&@MluG01FIln2 ziL;0UR^78`wLgYGymBDqGO@<4v`KL4RQ7|Zq6p~38xF-VRKD`p3WvUFAivSvo_IGi zYc@Ic>-;)NQO)wcWmNZqAHu~)NQ{tzvoZDlk8&WV>E(_|+hz;PPoGg3hihXz<~07? z?&M6kdUt-}$wieO>2__#&SzvVa_TXxm{VlBm^XHT__F?n#5rl7VqVoTj#t8w`#F%5 ze25gKY~4C;ZgP7NbSd=wiLncVo+XKF(A!Ym6T61IZ%R&M$<#4wmtc-4)L5Ng4>Z)+ zO3uZWBuEK`&r|$bsw#k;{u_s3^QFcs zMptUqV)MPk`7B$GoOHA1Coa^g3!SigyQ--P#_A8nM26*k<3w@_OZjco!vq&E{{0%w z>gArml^VV}8)7}Q-VgSlKhnN!!}c#kjhbdhcd~Pp^FQ&Z8Dw0#u)X z{kmRHhY9OcrCIK;Hs+@FQ=X3|XVfbkM%=sgoIkQ-uNq`&pC52(wA$pWUEN_nv|#!5 zzZ5{egdGH9*2&TZZbSb#4rJbcaq=DM)mM=lI5+EcEk-x$w~QR}8c9@lU81_7_(t*g zt)?2At4GTms>?izv`w{NVpG=UQ>*tzQAS*DR+p^lpsXPbU*F!7mAmDDoZS2`ai!*Z zkD?$e93^)69CGh+;ScEA=^e9O93RDmyJW_*$5#*76g@-Slv9x*PluQ%$$#Xj3Cmu0 zb|VjR`mTd}YSMSl9-15EM&iF(hm<|8V6>gF{>eD{I&OOQy{ghskYc{bO)>>ze4m}c z(?;)XzD8Zew;dn^*T0!*E6(&`5N7wSRuG=$K0Nnwu&V#*gysfAGOo3p7U|#(TZc0ArP5wIgpid&$wKbrgfyer>g5?c6~KP_KQvqjjRz*U-6M;K?E;6T-ib z9#CBz-qH#T#|6mA-@0sW&Fzq6{q5y47ZX6u<(CBGm)DH$sV2aVY9J?>0AC=V3>G>Q a?SM7+pL^c!@ou*Kbwo!j6*h(^<^3CWg^17q literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/ic_text_messages.png b/res/drawable-xxxhdpi/ic_pdk_text_messages.png similarity index 100% rename from res/drawable-xxxhdpi/ic_text_messages.png rename to res/drawable-xxxhdpi/ic_pdk_text_messages.png diff --git a/res/drawable-xxxhdpi/ic_withings_device.png b/res/drawable-xxxhdpi/ic_pdk_withings_device.png similarity index 100% rename from res/drawable-xxxhdpi/ic_withings_device.png rename to res/drawable-xxxhdpi/ic_pdk_withings_device.png diff --git a/res/layout/card_generator_app_event.xml b/res/layout/card_generator_app_event.xml index 3d822c9..472985c 100755 --- a/res/layout/card_generator_app_event.xml +++ b/res/layout/card_generator_app_event.xml @@ -21,7 +21,7 @@ android:background="#424242" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_device_battery.xml b/res/layout/card_generator_device_battery.xml index 7239d93..ef96661 100755 --- a/res/layout/card_generator_device_battery.xml +++ b/res/layout/card_generator_device_battery.xml @@ -21,7 +21,7 @@ android:background="@color/generator_battery_header" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_diagnostics_system_status.xml b/res/layout/card_generator_diagnostics_system_status.xml new file mode 100755 index 0000000..3dc84b1 --- /dev/null +++ b/res/layout/card_generator_diagnostics_system_status.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/card_generator_microsoft_band.xml b/res/layout/card_generator_microsoft_band.xml index e360495..ef4d6b6 100755 --- a/res/layout/card_generator_microsoft_band.xml +++ b/res/layout/card_generator_microsoft_band.xml @@ -20,7 +20,7 @@ android:background="#0075DA" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_phone_calls.xml b/res/layout/card_generator_phone_calls.xml index 2a2725b..389fa6f 100755 --- a/res/layout/card_generator_phone_calls.xml +++ b/res/layout/card_generator_phone_calls.xml @@ -21,7 +21,7 @@ android:background="#FF9800" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_screen_state.xml b/res/layout/card_generator_screen_state.xml index 7af3c2d..33beadc 100755 --- a/res/layout/card_generator_screen_state.xml +++ b/res/layout/card_generator_screen_state.xml @@ -21,7 +21,7 @@ android:background="#607D8B" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_sensors_ambient_light.xml b/res/layout/card_generator_sensors_ambient_light.xml index 62dd685..0176f72 100755 --- a/res/layout/card_generator_sensors_ambient_light.xml +++ b/res/layout/card_generator_sensors_ambient_light.xml @@ -21,7 +21,7 @@ android:background="@color/generator_ambient_light_header" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_text_messages.xml b/res/layout/card_generator_text_messages.xml index 03c022d..e3e22be 100755 --- a/res/layout/card_generator_text_messages.xml +++ b/res/layout/card_generator_text_messages.xml @@ -21,7 +21,7 @@ android:background="#9C27B0" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_withings_body_page.xml b/res/layout/card_generator_withings_body_page.xml index 91befe4..2eefb66 100755 --- a/res/layout/card_generator_withings_body_page.xml +++ b/res/layout/card_generator_withings_body_page.xml @@ -1,13 +1,173 @@ - + android:layout_margin="8dp"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/card_generator_withings_device.xml b/res/layout/card_generator_withings_device.xml index 96f1fec..7f5993e 100755 --- a/res/layout/card_generator_withings_device.xml +++ b/res/layout/card_generator_withings_device.xml @@ -20,7 +20,7 @@ android:background="#009BBF" android:padding="8dp" android:baselineAligned="false"> - diff --git a/res/layout/card_generator_withings_intraday_page.xml b/res/layout/card_generator_withings_intraday_page.xml index 3b1086d..ddf6b27 100755 --- a/res/layout/card_generator_withings_intraday_page.xml +++ b/res/layout/card_generator_withings_intraday_page.xml @@ -45,8 +45,7 @@ + android:layout_marginTop="8dp"> CREATE TABLE history(_id INTEGER PRIMARY KEY AUTOINCREMENT, fetched INTEGER, transmitted INTEGER, observed INTEGER, x REAL, y REAL, z REAL, raw_timestamp BIGINT, accuracy INTEGER); + + + CREATE TABLE history(_id INTEGER PRIMARY KEY AUTOINCREMENT, fetched INTEGER, transmitted INTEGER, observed INTEGER, runtime INTEGER, storage_app INTEGER, storage_other INTEGER, storage_available INTEGER, storage_total INTEGER, storage_path TEXT); diff --git a/res/values/generators.xml b/res/values/generators.xml index 0150e72..85bd3b0 100755 --- a/res/values/generators.xml +++ b/res/values/generators.xml @@ -7,7 +7,12 @@ + com.audacious_software.passive_data_kit.generators.device.Battery + com.audacious_software.passive_data_kit.generators.sensors.Accelerometer + com.audacious_software.passive_data_kit.generators.sensors.AmbientLight + com.audacious_software.passive_data_kit.generators.device.ForegroundApplication com.audacious_software.passive_data_kit.generators.wearables.WithingsDevice + com.audacious_software.passive_data_kit.generators.diagnostics.SystemStatus @@ -142,6 +147,9 @@ Elevation %1$.2f m + - + Body Measures + Device Battery No battery levels have been reported yet. @@ -176,5 +184,15 @@ #ff4CAF50 #802196F3 #ff2196F3 + + + System Status + No status information has been collected yet. + #616161 + #2E7D32 + #FAFAFA + #757575 + Continuous Runtime: %1$s + %1$dd %2$s:%3$s:%4$s.%5$s diff --git a/src/com/audacious_software/passive_data_kit/generators/device/Battery.java b/src/com/audacious_software/passive_data_kit/generators/device/Battery.java index d652be9..48b4159 100755 --- a/src/com/audacious_software/passive_data_kit/generators/device/Battery.java +++ b/src/com/audacious_software/passive_data_kit/generators/device/Battery.java @@ -11,7 +11,6 @@ import android.os.BatteryManager; import android.os.Bundle; import android.support.v4.content.ContextCompat; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -93,6 +92,8 @@ public class Battery extends Generator { private SQLiteDatabase mDatabase = null; private long mLastTimestamp = 0; + private long mCleanupInterval = (24 * 60 * 60 * 1000); + private long mLastCleanup = 0; public static Battery getInstance(Context context) { if (Battery.sInstance == null) { @@ -220,6 +221,17 @@ public void onReceive(final Context context, Intent intent) { me.mDatabase.insert(Battery.TABLE_HISTORY, null, values); Generators.getInstance(context).notifyGeneratorUpdated(Battery.GENERATOR_IDENTIFIER, update); + + if (now - me.mLastCleanup > me.mCleanupInterval) { + me.mLastCleanup = now; + + long start = now - (24 * 60 * 60 * 1000); + + String where = Battery.HISTORY_OBSERVED + " < ?"; + String[] args = { "" + start }; + + me.mDatabase.delete(Battery.TABLE_HISTORY, where, args); + } } }; @@ -276,8 +288,6 @@ public static void bindViewHolder(DataPointViewHolder holder) { Cursor c = generator.mDatabase.query(Battery.TABLE_HISTORY, null, where, args, null, null, Battery.HISTORY_OBSERVED + " DESC"); - Log.e("PDK", "BATTERY COUNT: " + c.getCount()); - View cardContent = holder.itemView.findViewById(R.id.card_content); View cardEmpty = holder.itemView.findViewById(R.id.card_empty); TextView dateLabel = (TextView) holder.itemView.findViewById(R.id.generator_data_point_date); diff --git a/src/com/audacious_software/passive_data_kit/generators/diagnostics/SystemStatus.java b/src/com/audacious_software/passive_data_kit/generators/diagnostics/SystemStatus.java new file mode 100755 index 0000000..d1a6298 --- /dev/null +++ b/src/com/audacious_software/passive_data_kit/generators/diagnostics/SystemStatus.java @@ -0,0 +1,465 @@ +package com.audacious_software.passive_data_kit.generators.diagnostics; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.os.Build; +import android.os.Bundle; +import android.os.StatFs; +import android.support.v4.content.ContextCompat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.audacious_software.passive_data_kit.PassiveDataKit; +import com.audacious_software.passive_data_kit.activities.generators.DataPointViewHolder; +import com.audacious_software.passive_data_kit.diagnostics.DiagnosticAction; +import com.audacious_software.passive_data_kit.generators.Generator; +import com.audacious_software.passive_data_kit.generators.Generators; +import com.audacious_software.pdk.passivedatakit.R; +import com.github.mikephil.charting.charts.LineChart; +import com.github.mikephil.charting.components.AxisBase; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.formatter.IAxisValueFormatter; + +import java.io.File; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by cjkarr on 4/17/2017. + */ + +public class SystemStatus extends Generator { + private static final String GENERATOR_IDENTIFIER = "pdk-system-status"; + + private static final String ENABLED = "com.audacious_software.passive_data_kit.generators.diagnostics.SystemStatus.ENABLED"; + private static final boolean ENABLED_DEFAULT = true; + + private static final String ACTION_HEARTBEAT = "com.audacious_software.passive_data_kit.generators.diagnostics.SystemStatus.ACTION_HEARTBEAT"; + + private static final String DATABASE_PATH = "pdk-system-status.sqlite"; + private static final int DATABASE_VERSION = 1; + + public static final String TABLE_HISTORY = "history"; + + public static final String HISTORY_OBSERVED = "observed"; + public static final String HISTORY_RUNTIME = "runtime"; + public static final String HISTORY_STORAGE_USED_APP = "storage_app"; + public static final String HISTORY_STORAGE_USED_OTHER = "storage_other"; + public static final String HISTORY_STORAGE_AVAILABLE = "storage_available"; + public static final String HISTORY_STORAGE_TOTAL = "storage_total"; + public static final String HISTORY_STORAGE_PATH = "storage_path"; + private static final double GIGABYTE = (1024 * 1024 * 1024); + + private static SystemStatus sInstance = null; + + private BroadcastReceiver mReceiver = null; + + private SQLiteDatabase mDatabase = null; + + private long mLastTimestamp = 0; + private long mRefreshInterval = (5 * 60 * 1000); + + public static SystemStatus getInstance(Context context) { + if (SystemStatus.sInstance == null) { + SystemStatus.sInstance = new SystemStatus(context.getApplicationContext()); + } + + return SystemStatus.sInstance; + } + + public SystemStatus(Context context) { + super(context); + } + + public static void start(final Context context) { + SystemStatus.getInstance(context).startGenerator(); + } + + private void startGenerator() { + final SystemStatus me = this; + + final long runtimeStart = System.currentTimeMillis(); + + Generators.getInstance(this.mContext).registerCustomViewClass(SystemStatus.GENERATOR_IDENTIFIER, SystemStatus.class); + + File path = new File(PassiveDataKit.getGeneratorsStorage(this.mContext), SystemStatus.DATABASE_PATH); + + this.mDatabase = SQLiteDatabase.openOrCreateDatabase(path, null); + + int version = this.getDatabaseVersion(this.mDatabase); + + switch (version) { + case 0: + this.mDatabase.execSQL(this.mContext.getString(R.string.pdk_generator_diagnostics_system_status_create_history_table)); + } + + this.setDatabaseVersion(this.mDatabase, SystemStatus.DATABASE_VERSION); + + this.mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + File path = PassiveDataKit.getGeneratorsStorage(context); + + context = context.getApplicationContext(); + + long now = System.currentTimeMillis(); + + me.mLastTimestamp = now; + + PassiveDataKit.getInstance(context).start(); + + StatFs fsInfo = new StatFs(path.getAbsolutePath()); + + String storagePath = path.getAbsolutePath(); + + long bytesTotal = fsInfo.getTotalBytes(); + long bytesAvailable = fsInfo.getBlockSizeLong() * fsInfo.getAvailableBlocksLong(); + + long bytesAppUsed = SystemStatus.getFileSize(context.getFilesDir()); + bytesAppUsed += SystemStatus.getFileSize(context.getExternalFilesDir(null)); + bytesAppUsed += SystemStatus.getFileSize(context.getCacheDir()); + bytesAppUsed += SystemStatus.getFileSize(context.getExternalCacheDir()); + + long bytesOtherUsed = bytesTotal - bytesAvailable - bytesAppUsed; + + ContentValues values = new ContentValues(); + values.put(SystemStatus.HISTORY_OBSERVED, now); + values.put(SystemStatus.HISTORY_RUNTIME, now - runtimeStart); + values.put(SystemStatus.HISTORY_STORAGE_PATH, storagePath); + values.put(SystemStatus.HISTORY_STORAGE_TOTAL, bytesTotal); + values.put(SystemStatus.HISTORY_STORAGE_AVAILABLE, bytesAvailable); + values.put(SystemStatus.HISTORY_STORAGE_USED_APP, bytesAppUsed); + values.put(SystemStatus.HISTORY_STORAGE_USED_OTHER, bytesOtherUsed); + + Bundle update = new Bundle(); + update.putLong(SystemStatus.HISTORY_OBSERVED, now); + update.putLong(SystemStatus.HISTORY_RUNTIME, now - runtimeStart); + update.putString(SystemStatus.HISTORY_STORAGE_PATH, storagePath); + update.putLong(SystemStatus.HISTORY_STORAGE_TOTAL, bytesTotal); + update.putLong(SystemStatus.HISTORY_STORAGE_AVAILABLE, bytesAvailable); + update.putLong(SystemStatus.HISTORY_STORAGE_USED_APP, bytesAppUsed); + update.putLong(SystemStatus.HISTORY_STORAGE_USED_OTHER, bytesOtherUsed); + + me.mDatabase.insert(SystemStatus.TABLE_HISTORY, null, values); + + Generators.getInstance(context).notifyGeneratorUpdated(SystemStatus.GENERATOR_IDENTIFIER, update); + + AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + PendingIntent pi = PendingIntent.getBroadcast(context, 0, new Intent(SystemStatus.ACTION_HEARTBEAT), PendingIntent.FLAG_UPDATE_CURRENT); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarms.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, now + me.mRefreshInterval, pi); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + alarms.setExact(AlarmManager.RTC_WAKEUP, now + me.mRefreshInterval, pi); + } else { + alarms.set(AlarmManager.RTC_WAKEUP, now + me.mRefreshInterval, pi); + } + } + }; + + this.mReceiver.onReceive(this.mContext, null); + + IntentFilter filter = new IntentFilter(SystemStatus.ACTION_HEARTBEAT); + this.mContext.registerReceiver(this.mReceiver, filter); + } + + public static boolean isEnabled(Context context) { + SharedPreferences prefs = Generators.getInstance(context).getSharedPreferences(context); + + return prefs.getBoolean(SystemStatus.ENABLED, SystemStatus.ENABLED_DEFAULT); + } + + public static boolean isRunning(Context context) { + if (SystemStatus.sInstance == null) { + return false; + } + + return SystemStatus.sInstance.mReceiver != null; + } + + public static ArrayList diagnostics(Context context) { + return new ArrayList<>(); + } + + public static void bindViewHolder(DataPointViewHolder holder) { + final Context context = holder.itemView.getContext(); + + SystemStatus generator = SystemStatus.getInstance(context); + + long now = System.currentTimeMillis(); + long start = now - (24 * 60 * 60 * 1000); + + String where = SystemStatus.HISTORY_OBSERVED + " >= ?"; + String[] args = { "" + start }; + + Cursor c = generator.mDatabase.query(SystemStatus.TABLE_HISTORY, null, where, args, null, null, SystemStatus.HISTORY_OBSERVED + " DESC"); + + View cardContent = holder.itemView.findViewById(R.id.card_content); + View cardEmpty = holder.itemView.findViewById(R.id.card_empty); + TextView dateLabel = (TextView) holder.itemView.findViewById(R.id.generator_data_point_date); + + if (c.moveToNext()) { + cardContent.setVisibility(View.VISIBLE); + cardEmpty.setVisibility(View.GONE); + + long timestamp = c.getLong(c.getColumnIndex(SystemStatus.HISTORY_OBSERVED)) / 1000; + + dateLabel.setText(Generator.formatTimestamp(context, timestamp)); + + c.moveToPrevious(); + + final LineChart chart = (LineChart) holder.itemView.findViewById(R.id.system_status_chart); + chart.setViewPortOffsets(0,0,0,0); + chart.setHighlightPerDragEnabled(false); + chart.setHighlightPerTapEnabled(false); + chart.setBackgroundColor(ContextCompat.getColor(context, android.R.color.black)); + chart.setPinchZoom(false); + + final DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(context); + + final XAxis xAxis = chart.getXAxis(); + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE); + xAxis.setTextSize(10f); + xAxis.setDrawAxisLine(true); + xAxis.setDrawGridLines(true); + xAxis.setCenterAxisLabels(true); + xAxis.setDrawLabels(true); + xAxis.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + xAxis.setGranularityEnabled(true); + xAxis.setGranularity(1); + xAxis.setAxisMinimum(start); + xAxis.setAxisMaximum(now); + xAxis.setValueFormatter(new IAxisValueFormatter() { + @Override + public String getFormattedValue(float value, AxisBase axis) { + Date date = new Date((long) value); + + return timeFormat.format(date); + } + }); + + YAxis leftAxis = chart.getAxisLeft(); + leftAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART); + leftAxis.setDrawGridLines(true); + leftAxis.setDrawAxisLine(true); + leftAxis.setGranularityEnabled(true); + leftAxis.setTextColor(ContextCompat.getColor(context, android.R.color.white)); + leftAxis.setValueFormatter(new IAxisValueFormatter() { + @Override + public String getFormattedValue(float value, AxisBase axis) { + return "" + value + " GB"; + } + }); + + YAxis rightAxis = chart.getAxisRight(); + rightAxis.setEnabled(false); + + chart.getLegend().setEnabled(false); + chart.getDescription().setEnabled(false); + + int observedIndex = c.getColumnIndex(SystemStatus.HISTORY_OBSERVED); + int availableIndex = c.getColumnIndex(SystemStatus.HISTORY_STORAGE_AVAILABLE); + int appUsedIndex = c.getColumnIndex(SystemStatus.HISTORY_STORAGE_USED_APP); + int othersUsedIndex = c.getColumnIndex(SystemStatus.HISTORY_STORAGE_USED_OTHER); + + ArrayList availableValues = new ArrayList<>(); + ArrayList appValues = new ArrayList<>(); + ArrayList otherValues = new ArrayList<>(); + + long runtime = -1; + + while (c.moveToNext()) { + long when = c.getLong(observedIndex); + + double available = (double) c.getLong(availableIndex); + double app = (double) c.getLong(appUsedIndex); + double other = (double) c.getLong(othersUsedIndex); + + availableValues.add(0, new Entry(when, (float) (available / SystemStatus.GIGABYTE))); + appValues.add(0, new Entry(when, (float) (app / SystemStatus.GIGABYTE))); + otherValues.add(0, new Entry(when, (float) (other / SystemStatus.GIGABYTE))); + + if (runtime == -1) { + runtime = c.getLong(c.getColumnIndex(SystemStatus.HISTORY_RUNTIME)); + } + } + + LineData sets = new LineData(); + + LineDataSet set = new LineDataSet(availableValues, "available"); + set.setAxisDependency(YAxis.AxisDependency.LEFT); + set.setLineWidth(1.0f); + set.setDrawCircles(true); + set.setFillAlpha(192); + set.setDrawFilled(false); + set.setDrawValues(true); + set.setCircleColor(ContextCompat.getColor(context, R.color.generator_system_status_free)); + set.setCircleRadius(1.5f); + set.setCircleHoleRadius(0.0f); + set.setDrawCircleHole(false); + set.setDrawValues(false); + set.setColor(ContextCompat.getColor(context, R.color.generator_system_status_free)); + set.setMode(LineDataSet.Mode.LINEAR); + + sets.addDataSet(set); + + set = new LineDataSet(appValues, "app"); + set.setAxisDependency(YAxis.AxisDependency.LEFT); + set.setLineWidth(1.0f); + set.setDrawCircles(true); + set.setCircleColor(ContextCompat.getColor(context, R.color.generator_system_status_app)); + set.setCircleRadius(1.5f); + set.setCircleHoleRadius(0.0f); + set.setFillAlpha(192); + set.setDrawFilled(false); + set.setDrawValues(true); + set.setColor(ContextCompat.getColor(context, R.color.generator_system_status_app)); + set.setDrawCircleHole(false); + set.setDrawValues(false); + set.setMode(LineDataSet.Mode.LINEAR); + + sets.addDataSet(set); + + chart.setData(sets); + + TextView runtimeLabel = (TextView) holder.itemView.findViewById(R.id.system_status_runtime); + runtimeLabel.setText(context.getString(R.string.generator_system_status_runtime, SystemStatus.formatRuntime(context, runtime))); + } else { + cardContent.setVisibility(View.GONE); + cardEmpty.setVisibility(View.VISIBLE); + + dateLabel.setText(R.string.label_never_pdk); + } + + c.close(); + } + + private static String formatRuntime(Context context, long runtime) { + long days = runtime / (24 * 60 * 60 * 1000); + runtime -= (24 * 60 * 60 * 1000) * days; + + long hours = runtime / (60 * 60 * 1000); + runtime -= (60 * 60 * 1000) * hours; + + long minutes = runtime / (60 * 1000); + runtime -= (60 * 1000) * minutes; + + long seconds = runtime / (1000); + runtime -= (1000) * seconds; + + String hourString = "" + hours; + + if (hourString.length() == 1) { + hourString = "0" + hourString; + } + + String minuteString = "" + minutes; + + if (minuteString.length() == 1) { + minuteString = "0" + minuteString; + } + + String secondString = "" + seconds; + + if (secondString.length() == 1) { + secondString = "0" + secondString; + } + + String msString = "" + runtime; + + while (msString.length() < 3) { + msString = "0" + msString; + + } + + return context.getString(R.string.generator_system_status_runtime_formatted, days, hourString, minuteString, secondString, msString); + } + + public static long getFileSize(final File file) + { + if (file == null||!file.exists()) { + return 0; + } + + if (!file.isDirectory()) { + return file.length(); + } + + final List dirs = new LinkedList<>(); + + dirs.add(file); + + long result=0; + + while(!dirs.isEmpty()) { + final File dir = dirs.remove(0); + + if (!dir.exists()) { + continue; + } + + final File[] listFiles = dir.listFiles(); + + if (listFiles==null||listFiles.length==0) { + continue; + } + + for (final File child : listFiles) { + result += child.length(); + + if (child.isDirectory()) { + dirs.add(child); + } + } + } + + return result; + } + + public static View fetchView(ViewGroup parent) + { + return LayoutInflater.from(parent.getContext()).inflate(R.layout.card_generator_diagnostics_system_status, parent, false); + } + + @Override + public List fetchPayloads() { + return new ArrayList<>(); + } + + public static long latestPointGenerated(Context context) { + SystemStatus me = SystemStatus.getInstance(context); + + if (me.mLastTimestamp == 0) { + Cursor c = me.mDatabase.query(SystemStatus.TABLE_HISTORY, null, null, null, null, null, SystemStatus.HISTORY_OBSERVED + " DESC"); + + if (c.moveToNext()) { + me.mLastTimestamp = c.getLong(c.getColumnIndex(SystemStatus.HISTORY_OBSERVED)); + } + + c.close(); + } + + return me.mLastTimestamp; + } + + public Cursor queryHistory(String[] cols, String where, String[] args, String orderBy) { + return this.mDatabase.query(SystemStatus.TABLE_HISTORY, cols, where, args, null, null, orderBy); + } +} diff --git a/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java b/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java index 0d09ce2..7cdcff4 100755 --- a/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java +++ b/src/com/audacious_software/passive_data_kit/generators/wearables/WithingsDevice.java @@ -17,6 +17,7 @@ import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.Base64; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -1248,7 +1249,7 @@ public static void bindViewHolder(final DataPointViewHolder holder) { PagerAdapter adapter = new PagerAdapter() { @Override public int getCount() { - return 7; + return 2; } @Override @@ -1452,13 +1453,13 @@ public static long latestPointGenerated(Context context) { WithingsDevice me = WithingsDevice.getInstance(context); -// Cursor c = me.mDatabase.query(WithingsDevice.TABLE_HISTORY, null, null, null, null, null, WithingsDevice.HISTORY_OBSERVED + " DESC"); -// -// if (c.moveToNext()) { -// timestamp = c.getLong(c.getColumnIndex(WithingsDevice.HISTORY_OBSERVED)); -// } -// -// c.close(); + Cursor c = me.mDatabase.query(WithingsDevice.TABLE_ACTIVITY_MEASURE_HISTORY, null, null, null, null, null, WithingsDevice.HISTORY_OBSERVED + " DESC"); + + if (c.moveToNext()) { + timestamp = c.getLong(c.getColumnIndex(WithingsDevice.HISTORY_OBSERVED)); + } + + c.close(); return timestamp; } @@ -1653,9 +1654,64 @@ private static void populateIntradayChart(Context context, LineChart chart, Arra private static String bindBodyPage(ViewGroup container, DataPointViewHolder holder, int position) { final Context context = container.getContext(); + WithingsDevice withings = WithingsDevice.getInstance(holder.itemView.getContext()); + LinearLayout card = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.card_generator_withings_body_page, null); card.setTag("" + position); + int[] labels = { + R.id.label_body_one, + R.id.label_body_two, + R.id.label_body_three, + R.id.label_body_four, + R.id.label_body_five, + R.id.label_body_six, + R.id.label_body_seven, + R.id.label_body_eight + }; + + int[] values = { + R.id.value_body_one, + R.id.value_body_two, + R.id.value_body_three, + R.id.value_body_four, + R.id.value_body_five, + R.id.value_body_six, + R.id.value_body_seven, + R.id.value_body_eight + }; + + HashMap bodyValues = new HashMap<>(); + ArrayList keys = new ArrayList<>(); + + Cursor c = withings.mDatabase.query(WithingsDevice.TABLE_BODY_MEASURE_HISTORY, null, null, null, null, null, WithingsDevice.BODY_MEASURE_HISTORY_DATE + " DESC"); + + Log.e("PDK", "MEASURE COUNT: " + c.getCount()); + + while (c.moveToNext() && bodyValues.size() < labels.length) { + String label = c.getString(c.getColumnIndex(WithingsDevice.BODY_MEASURE_HISTORY_TYPE)); + + if (bodyValues.containsKey(label) == false) { + double value = c.getDouble(c.getColumnIndex(WithingsDevice.BODY_MEASURE_HISTORY_VALUE)); + + bodyValues.put(label, value); + + keys.add(label); + } + } + + for (int i = 0; i < keys.size() && i < labels.length; i++) { + String label = keys.get(i); + + TextView labelView = (TextView) card.findViewById(labels[i]); + labelView.setText(label.substring(0, 1).toUpperCase() + label.substring(1) + ":"); + + Double value = bodyValues.get(label); + + TextView valueView = (TextView) card.findViewById(values[i]); + valueView.setText(value.toString()); + } + container.addView(card); return "" + card.getTag(); diff --git a/src/com/audacious_software/passive_data_kit/transmitters/HttpTransmitter.java b/src/com/audacious_software/passive_data_kit/transmitters/HttpTransmitter.java index ed939ea..939f96a 100755 --- a/src/com/audacious_software/passive_data_kit/transmitters/HttpTransmitter.java +++ b/src/com/audacious_software/passive_data_kit/transmitters/HttpTransmitter.java @@ -158,8 +158,6 @@ private boolean shouldAttemptUpload(boolean force) { public void transmit(boolean force) { long now = System.currentTimeMillis(); - Log.e("PDK", "TRANSMIT: " + force); - if (force) { this.mLastAttempt = 0; } @@ -346,6 +344,8 @@ private int transmitHttpPayload(String payload) { } return HttpTransmitter.RESULT_SUCCESS; + } else { + } } catch (Exception e) { e.printStackTrace();