From bc2e6f70cc3c6b3b308dc3df3fb7f4d13fa8ab06 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 9 Feb 2026 21:10:20 +1100 Subject: [PATCH] HydroFlux 0.0.6 --- .../src/main/assets/js/modules/dashboard.js | 76 ++++++++++++++---- .../assets/js/modules/views/FitnessView.js | 5 +- .../main/assets/js/modules/views/SleepView.js | 8 +- Hydroflux/releases/HydroFlux_v2.apk | Bin 31536505 -> 31537275 bytes 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/Hydroflux/app/src/main/assets/js/modules/dashboard.js b/Hydroflux/app/src/main/assets/js/modules/dashboard.js index 60c8467..c188467 100644 --- a/Hydroflux/app/src/main/assets/js/modules/dashboard.js +++ b/Hydroflux/app/src/main/assets/js/modules/dashboard.js @@ -10,13 +10,17 @@ export class Dashboard { render() { if (!this.container) return; - // Data Retrieval (Keeping persistence) // Data Retrieval (Keeping persistence) const waterData = JSON.parse(localStorage.getItem('hydroflux_data') || '{"current":0,"goal":3.0}'); - const stepsData = 8432; + + // Real Health Data (Default to 0 until synced) + const healthData = JSON.parse(localStorage.getItem('hydroflux_health_data') || '{"steps": 0, "sleep": 0}'); + const stepsData = healthData.steps; + const sleepHoursTotal = healthData.sleep; + const sleepHours = Math.floor(sleepHoursTotal); + const sleepMins = Math.round((sleepHoursTotal - sleepHours) * 60); + const goalData = 10000; - const sleepHours = 7; - const sleepMins = 20; const goalsData = JSON.parse(localStorage.getItem('hydroflux_goals') || JSON.stringify([ { id: '1', text: 'Drink 3L of water', completed: true }, @@ -56,13 +60,15 @@ export class Dashboard {
- - - - - - - 14 Days + +
+ + + + 14 Days +
@@ -102,7 +108,7 @@ export class Dashboard {
- ${stepsData.toLocaleString()} + ${stepsData.toLocaleString()} steps
@@ -131,7 +137,7 @@ export class Dashboard {
- ${sleepHours}h ${sleepMins}m + ${sleepHours}h ${sleepMins}m Light Sleep
@@ -157,6 +163,34 @@ export class Dashboard { this.updateDynamicElements(stepsData, goalData); this.renderGoals(goalsData); + + // Expose Native Callback + window.updateHealthData = (steps, sleepHoursTotal) => { + console.log("Received Health Data:", steps, sleepHoursTotal); + + // Save to Storage + localStorage.setItem('hydroflux_health_data', JSON.stringify({ steps: steps, sleep: sleepHoursTotal })); + + // Update UI directly + const stepsCount = this.container.querySelector('#stepsCount'); + if (stepsCount) stepsCount.textContent = steps.toLocaleString(); + + const sh = Math.floor(sleepHoursTotal); + const sm = Math.round((sleepHoursTotal - sh) * 60); + const sleepTime = this.container.querySelector('#sleepTime'); + if (sleepTime) sleepTime.textContent = `${sh}h ${sm}m`; + + this.updateDynamicElements(steps, 10000); + }; + + // Trigger initial sync if native interface exists + if (window.HydroFluxNative) { + try { + window.HydroFluxNative.requestHealthPermissions(); + } catch (e) { + console.error("Native sync error", e); + } + } } updateDynamicElements(steps, goal) { @@ -170,7 +204,7 @@ export class Dashboard { circle.style.strokeDashoffset = strokeDashoffset; } - // Sleep Chart Logic + // Sleep Chart Logic (Static for now, but could be dynamic) const sleepData = [30, 35, 25, 40, 55, 45, 60, 75, 70, 80, 65, 55, 50, 45, 40]; const chartWidth = 300; const chartHeight = 100; @@ -308,6 +342,20 @@ export class Dashboard { }); } + // Sync Health Listener + const syncBtn = this.container.querySelector('#syncHealthBtn'); + if (syncBtn) { + syncBtn.addEventListener('click', () => { + if (window.HydroFluxNative) { + window.HydroFluxNative.requestHealthPermissions(); + } else { + alert("Health Sync only available on Android App"); + // Mock data for browser testing + window.updateHealthData(12500, 7.8); + } + }); + } + // Notes Save const noteArea = this.container.querySelector('#notesInput'); if (noteArea) { diff --git a/Hydroflux/app/src/main/assets/js/modules/views/FitnessView.js b/Hydroflux/app/src/main/assets/js/modules/views/FitnessView.js index d8987d3..3c224e4 100644 --- a/Hydroflux/app/src/main/assets/js/modules/views/FitnessView.js +++ b/Hydroflux/app/src/main/assets/js/modules/views/FitnessView.js @@ -7,8 +7,9 @@ export class FitnessView { } render() { - // Mock Data - const steps = 8432; + // Real Data + const healthData = JSON.parse(localStorage.getItem('hydroflux_health_data') || '{"steps": 0, "sleep": 0}'); + const steps = healthData.steps; const goal = 10000; const pct = Math.min((steps / goal) * 100, 100); const radius = 80; diff --git a/Hydroflux/app/src/main/assets/js/modules/views/SleepView.js b/Hydroflux/app/src/main/assets/js/modules/views/SleepView.js index e286e26..4ed729d 100644 --- a/Hydroflux/app/src/main/assets/js/modules/views/SleepView.js +++ b/Hydroflux/app/src/main/assets/js/modules/views/SleepView.js @@ -7,9 +7,11 @@ export class SleepView { } render() { - // Mock Sleep Data - const sleepHours = 7; - const sleepMins = 20; + // Real Sleep Data + const healthData = JSON.parse(localStorage.getItem('hydroflux_health_data') || '{"steps": 0, "sleep": 0}'); + const sleepHoursTotal = healthData.sleep; + const sleepHours = Math.floor(sleepHoursTotal); + const sleepMins = Math.round((sleepHoursTotal - sleepHours) * 60); this.container.innerHTML = `
diff --git a/Hydroflux/releases/HydroFlux_v2.apk b/Hydroflux/releases/HydroFlux_v2.apk index 8a073388a7f3f7b22dcdcbee7abdc2cc0a814698..ba2cc044c8084640b9e401bc8e59dc706b3a90e9 100644 GIT binary patch delta 12195 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�J`q!c{a4`{-W4lR3G@Dk-heV=x*S|)(6nlQ}) zjaKZ9Dt>h|EXi;GF}s-nUfptKoib(+({S@xEimINTF$N78cpiAG|DZd?AxWg0jfL= zkqQrPbaO3~xJbEZyrIjfw_7)fB8{QE{!v1{#Q(vt-)!I?mBf@z+lJmR*>j1ez{;M4 zD$Samm;_QneG9uvCG>-yM>u1~AZg=$^_rBUoIRBvgITyS|63<;o|&?6iPaF8Q^R*I zBrve2nb*7SQp)(FSp5ULVM!EROml4iiOinINA~d=`sja;By%gM^(s57`napS?VU%x z*rQ27;%}I)IXOh6FuV;%&4L+x)aha2u^pS^Q9SPy^BCrOpWcC zU$)4O=;=^gw5ykHhKSXWjOC@r15v7L%wBQ7)Rnmuce|4xSL?r^(>y5}KSF2do*w4l= zl`G?{N$mRrgqVC+bvorP4kATg(*Y{Ae~}!YsfpW)QpQk}ldOp0V-U_*+n)^!?Q<0P z@Y$@eBpwgHftyRo;v2wH+F<6&`-;f*FluZ8>+@?esXuZPwf^gCSbFa4EVJ*y9GRi2mI*Wn))yf<{X=nBN8Z}nJH&J#P%g8v z{`rMcxnGZs`rDVwQ6XI+OzSVRb}r9lnT|$YntSv7m?F1Ckh`w->K6{4V17Zr_#v@6 zzK_LV!a1f4jxgelkHWqXgODn_xkLBH(c+P9-h8ZYYa`Z6Dy1x&_ON`hf980{ndzduWU+($Bt~kVi ztAUUgoVTRm=IU0`ZCQ>T6@>O@qsk2?Gq1q8Y_GA}W2?3*wm~3Y6N{SW8n?f>%NXJi z%$fE2Gp}2UAnJi}uVmqEhS&4aeNlOY`_pw8({B;#U%Pv z{e3HkE&P3z5AMlC$B-~`qjZ1|(WQQ|#}fM2G>xHSawuzP-FGNIGf?roIfd3=Gy}#P z`z7{op;1EGd8*@1j8(vc55u5qF|5+UrAyvAJD#`SbWk4XBb*r=^yzWXf%c*jdahCtzmJW+jixj zG_&+~@_w9XFNBG*lIaU{XL3uPIet_6He*GevvKK+gX>y|Ij-F4KVQhu*Y}&vkufDw z^>;qP0qGsv^{Sdc!@JY=ugsHC-t`Knwx$Zl#f?XWk|@PyDfI`Lr!(!5v8K9I*@D*G zY=3u|&O+U5_+bCp#wPX~g$TjU8hP@KKleQQN6UQWSFAx&lpEGc6dC$+*>8hYPLW9Y zZ~twFWWBn8iHdH`&S47a^S#)#KK9!(F?;1RRU5d1!CfuGbPlH&ir*|^*E;r8`V*R_ zrb1!8KS>>in%_2r&TE+J;7d4{BF`*It=0x>ilvnI4%PlO^OSYZRAIP;{Ta;tjM8kU zAnZ}4S;?tUXwIqsB{zeOH|lEwOU}@UwGO3`-n)(97#cDEcL}on5l2X!c_x?N%@xg= z*uv=wF*>7KgJddh&_74Q5TAKZn$9uIA{Z;r_7dzfD1S$8gS&Jqsggd3z;xV{LlS;K z3^2niNe>`Uxw4J=wslXmV~&bs;Sz%iU+>wFzwXgIu5C3qkI&Q~uvcvvOYXW;o*{IF zI#ka5fd;4P>aZvMgJyippah~8TIQzQiH3JY1Mwu+=tDZPoJ>?rFea<$=tv8mkB6&K z$)S04D*N-`>C21FTu1vY_?Oh;L0uveR#$Y@Z>^1vVS1^(wIfsVg=i-kX-}RPDAc4|E=V zqb|%3&QvQnAFS+k&$`$CJRk+U;jCbG^F-EG`->`O@CSW?zSU6$?N>j+to6&1;U=>C z9yrFIY)L|So|FlZL->=Xu>p*0hHnBfk%fAeVpw4t5vvw*HvQ8Uep8#@Y;{*uM}k{3 zn||7#Vr00Qhuf7Lf2LgJYIE$hpD}sT56POTFiJI delta 11206 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