From d851073ba1a906a62c573a650f4fddea42a6ee14 Mon Sep 17 00:00:00 2001 From: Darren Croton Date: Tue, 18 Apr 2017 11:02:39 +1000 Subject: [PATCH] Code cleaning, presentation and internal structure update --- bin/SnapshotWatch-settings.json | 2 +- bin/SnapshotWatch.prg | Bin 56363 -> 57136 bytes bin/SnapshotWatch.prg.debug.xml | 707 ++++++++++++++++---------------- resources/resources.xml | 14 +- source/SnapshotWatchView.mc | 371 ++++++++--------- 5 files changed, 534 insertions(+), 560 deletions(-) diff --git a/bin/SnapshotWatch-settings.json b/bin/SnapshotWatch-settings.json index 54e0047..a4964b6 100644 --- a/bin/SnapshotWatch-settings.json +++ b/bin/SnapshotWatch-settings.json @@ -1 +1 @@ -{"settings":[{"key":"showHeartRate","valueType":"boolean","defaultValue":true,"configTitle":"ShowHeartRateLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"showDigitalTime","valueType":"boolean","defaultValue":false,"configTitle":"ShowDigitalTimeLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"digitalTimeOffset","valueType":"number","defaultValue":0,"configTitle":"DigitalTimeOffsetLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"numeric","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null}],"languages":{"valyrian":{"ShowDigitalTimeLabel":"Show digital time","DigitalTimeOffsetLabel":"Digital time offset (integer, +-24)","ShowHeartRateLabel":"Show heart rate graph and cur/min/max values","AppName":"SnapshotWatch"}}} \ No newline at end of file +{"settings":[{"key":"showHeartRate","valueType":"boolean","defaultValue":true,"configTitle":"ShowHeartRateLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"showSecondTime","valueType":"boolean","defaultValue":false,"configTitle":"ShowSecondTimeLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"boolean","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null},{"key":"secondTimeOffset","valueType":"number","defaultValue":0,"configTitle":"SecondTimeOffsetLabel","configPrompt":null,"configHelpUrl":null,"configError":null,"configType":"numeric","configReadonly":false,"configRequired":false,"configOptions":null,"configMin":null,"configMax":null,"configMaxLength":null}],"languages":{"valyrian":{"ShowHeartRateLabel":"Show heart rate graph and min/max values","ShowSecondTimeLabel":"Show second (digital) time","SecondTimeOffsetLabel":"Second (digital) time hour offset (integer, +-24)","AppName":"SnapshotWatch"}}} \ No newline at end of file diff --git a/bin/SnapshotWatch.prg b/bin/SnapshotWatch.prg index c78088749f0e7150f7fc9cd771b1955ce35d1887..6a8d2906c9b2befe0e9eed3dd3daf94a507ca9fc 100644 GIT binary patch delta 21732 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 DJ!J82 delta 20904 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 diff --git a/bin/SnapshotWatch.prg.debug.xml b/bin/SnapshotWatch.prg.debug.xml index af3b26e..450f7ce 100644 --- a/bin/SnapshotWatch.prg.debug.xml +++ b/bin/SnapshotWatch.prg.debug.xml @@ -35,348 +35,352 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - + - + - + - + - + - - + + - + - + + - + + - - - + + + + - + - + - - + + - - - - - + + + + - - + + + + - - - + + + + + - - + + - - - + + + @@ -385,77 +389,68 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -494,6 +489,10 @@ Terminate any active timers and prepare for slow updates.
]]>
+ + + + diff --git a/resources/resources.xml b/resources/resources.xml index 3aff0ff..56910b9 100644 --- a/resources/resources.xml +++ b/resources/resources.xml @@ -2,24 +2,24 @@ true - false - 0 + false + 0 - Show heart rate graph and cur/min/max values - Show digital time - Digital time offset (integer, +-24) + Show heart rate graph and min/max values + Show second (digital) time + Second (digital) time hour offset (integer, +-24) - + - + diff --git a/source/SnapshotWatchView.mc b/source/SnapshotWatchView.mc index a0993c9..0cc45df 100644 --- a/source/SnapshotWatchView.mc +++ b/source/SnapshotWatchView.mc @@ -21,14 +21,20 @@ class SnapshotWatchView extends Ui.WatchFace { var usePreferences = true; var showHeartRate = true; - var showDigitalTime = false; - var digitalTimeOffset = 0; + var showSecondTime = false; + var secondTimeOffset = 0; - var showSeconds = true; var background_color = Gfx.COLOR_BLACK; +// var background_color = Gfx.COLOR_DK_GRAY; + + var showSeconds = true; var width_screen, height_screen; var hashMarksArray = new [60]; + var heartNow; + var heartMin; + var heartMax; + //! Load your resources here function onLayout(dc) { @@ -44,13 +50,9 @@ class SnapshotWatchView extends Ui.WatchFace { hashMarksArray[i][0] = (i / 60.0) * Math.PI * 2; if(i != 0 && i != 15 && i != 30 && i != 45) - { - hashMarksArray[i][1] = -85; - } + { hashMarksArray[i][1] = -85; } else - { - hashMarksArray[i][1] = -67; - } + { hashMarksArray[i][1] = -67; } } setLayout(Rez.Layouts.WatchFace(dc)); @@ -64,54 +66,141 @@ class SnapshotWatchView extends Ui.WatchFace { //! Update the view function onUpdate(dc) { - if (usePreferences) { + if (usePreferences) + { showHeartRate = Application.getApp().getProperty("showHeartRate"); - showDigitalTime = Application.getApp().getProperty("showDigitalTime"); - digitalTimeOffset = Application.getApp().getProperty("digitalTimeOffset"); + showSecondTime = Application.getApp().getProperty("showSecondTime"); + secondTimeOffset = Application.getApp().getProperty("secondTimeOffset"); } - if (showDigitalTime) + if (showSecondTime) { - if (digitalTimeOffset != null && digitalTimeOffset <= 24 && digitalTimeOffset >= -24) { - digitalTimeOffset = digitalTimeOffset.toNumber(); + if (secondTimeOffset != null && secondTimeOffset <= 24 && secondTimeOffset >= -24) + { + secondTimeOffset = secondTimeOffset.toNumber(); } else { - showDigitalTime = false; - digitalTimeOffset = 0; + showSecondTime = false; + secondTimeOffset = 0; } } - - var clockTime = Sys.getClockTime(); // Clear screen dc.setColor(background_color, Gfx.COLOR_WHITE); -// dc.setColor(Gfx.COLOR_DK_GRAY, Gfx.COLOR_DK_GRAY); - dc.fillRectangle(0,0, width_screen, height_screen); + dc.fillRectangle(0,0, width_screen, height_screen); + + heartNow = 0; + heartMin = 0; + heartMax = 0; - var heartNow = 0; - var heartMin = 0; - var heartMax = 0; + // Plot heart rate graph + plotHRgraph(dc); + + // Draw hash marks + drawHashMarks(dc); + + // Draw analogue clock hands + drawHands(dc, Sys.getClockTime().hour, Sys.getClockTime().min, Sys.getClockTime().sec); + + // Set text colour for the remaining information + dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_TRANSPARENT); + + // Show cur/min/max HR values (recorded when plotting graph, above) + if (heartNow == 0) + { dc.drawText(width_screen/2, height_screen/2 + 20, Gfx.FONT_SMALL, "-- bpm", Graphics.TEXT_JUSTIFY_CENTER|Graphics.TEXT_JUSTIFY_VCENTER); } + else + { dc.drawText(width_screen/2, height_screen/2 + 20, Gfx.FONT_SMALL, Lang.format("$1$ bpm", [heartNow]), Graphics.TEXT_JUSTIFY_CENTER|Graphics.TEXT_JUSTIFY_VCENTER); } if (showHeartRate) { - // Plot heart rate graph - var sample = Sensor.getHeartRateHistory( {:order=>Sensor.ORDER_NEWEST_FIRST} ); - if (sample != null) - { + var heartMinMaxString; + if (heartMin == 0 || heartMax == 0) + { heartMinMaxString = "-- / -- bpm"; } + else + { heartMinMaxString = Lang.format("$1$ / $2$ bpm", [heartMin, heartMax]); } + + dc.drawText(width_screen/2, height_screen - 19, Gfx.FONT_SMALL, heartMinMaxString, Graphics.TEXT_JUSTIFY_CENTER); + } + + // Show date + drawDate(dc); + + // Show second (digital) time + drawDigitalTime(dc, Sys.getClockTime()); + + // Show bluetooth icon + if (Sys.getDeviceSettings().phoneConnected) + { dc.drawBitmap(39, 6, Ui.loadResource(Rez.Drawables.BluetoothIcon)); } + + // Show alarm icon + if (Sys.getDeviceSettings().alarmCount > 0) + { dc.drawBitmap(25, 23, Ui.loadResource(Rez.Drawables.AlarmIcon)); } + + // Show do not disturb icon + if (Sys.getDeviceSettings().doNotDisturb) + { dc.drawBitmap(10, 49, Ui.loadResource(Rez.Drawables.MuteIcon)); } + + // Show notification count icon + if (Sys.getDeviceSettings().notificationCount > 0) + { + var offset = 0; + if (Sys.getDeviceSettings().notificationCount >= 10) { offset = 6; } + + dc.drawText(width_screen/2+16+offset, 7, Gfx.FONT_SMALL, Sys.getDeviceSettings().notificationCount, Graphics.TEXT_JUSTIFY_RIGHT|Graphics.TEXT_JUSTIFY_VCENTER); + dc.drawBitmap(width_screen/2+18+offset, 2, Ui.loadResource(Rez.Drawables.NotificationIcon)); + } + + // Show battery percent + var battery = Sys.getSystemStats().battery; + var offset = 0; + if (battery == 100) + { offset = 6; } + dc.drawText(width_screen/2-33-offset, 7, Gfx.FONT_SMALL, Lang.format("$1$%", [battery.format("%2d")]), Graphics.TEXT_JUSTIFY_LEFT|Graphics.TEXT_JUSTIFY_VCENTER); + + // Show steps + dc.drawText(width_screen-4, height_screen/2 - 14, Gfx.FONT_SMALL, ActMon.getInfo().steps, Graphics.TEXT_JUSTIFY_RIGHT|Graphics.TEXT_JUSTIFY_VCENTER); + dc.drawText(width_screen-4, height_screen/2 + 11, Gfx.FONT_SMALL, ActMon.getInfo().stepGoal, Graphics.TEXT_JUSTIFY_RIGHT|Graphics.TEXT_JUSTIFY_VCENTER); + + // Show sunrise and sunset + drawSunriseSunset(dc); + + } + + + //! The user has just looked at their watch. Timers and animations may be started here. + function onExitSleep() { + showSeconds = true; + } + + + //! Terminate any active timers and prepare for slow updates. + function onEnterSleep() { + showSeconds = false; + requestUpdate(); + } + + + function plotHRgraph(dc) { + + var sample = Sensor.getHeartRateHistory( {:order=>Sensor.ORDER_NEWEST_FIRST} ); + if (sample != null) + { + var heart = sample.next(); + if (heart.data != null) + { heartNow = heart.data; } + + if (showHeartRate) + { if (sample.getMin() != null) - { heartMin = sample.getMin(); } + { heartMin = sample.getMin(); } if (sample.getMax() != null) - { heartMax = sample.getMax(); } - - var heart = sample.next(); - if (heart.data != null) - { heartNow = heart.data; } + { heartMax = sample.getMax(); } dc.setColor(Gfx.COLOR_DK_GREEN, Gfx.COLOR_TRANSPARENT); - var maxSecs = 14355;//14400; //4 hours + var maxSecs = 14355; //14400 = 4 hours var totHeight = 44; var totWidth = 165; var binPixels = 1; @@ -159,10 +248,10 @@ class SnapshotWatchView extends Ui.WatchFace { else { if (heartValue > heartBinMax) - { heartBinMax = heartValue; } + { heartBinMax = heartValue; } if (heartValue < heartBinMin) - { heartBinMin = heartValue; } + { heartBinMin = heartValue; } } } @@ -181,7 +270,7 @@ class SnapshotWatchView extends Ui.WatchFace { } // while secsBin < binWidthSecs if (secsBin >= binWidthSecs) - { secsBin -= binWidthSecs; } + { secsBin -= binWidthSecs; } // only plot bar if we have valid values if (heartBinMax > 0 && heartBinMax >= heartBinMin) @@ -202,105 +291,8 @@ class SnapshotWatchView extends Ui.WatchFace { } // if sample != null } - - // First draw hash marks the analogue time hands - drawHashMarks(dc); - drawHands(dc, clockTime.hour, clockTime.min, clockTime.sec); - - if (showHeartRate) - { - // Now show HR information (calculated above) - dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_TRANSPARENT); - - if (heartNow == 0) - { dc.drawText(width_screen/2, height_screen/2 + 20, Gfx.FONT_SMALL, "-- bpm", Graphics.TEXT_JUSTIFY_CENTER|Graphics.TEXT_JUSTIFY_VCENTER); } - else - { dc.drawText(width_screen/2, height_screen/2 + 20, Gfx.FONT_SMALL, Lang.format("$1$ bpm", [heartNow]), Graphics.TEXT_JUSTIFY_CENTER|Graphics.TEXT_JUSTIFY_VCENTER); } - - var heartMinMaxString; - if (heartMin == 0 || heartMax == 0) - { heartMinMaxString = "-- / -- bpm"; } - else - { heartMinMaxString = Lang.format("$1$ / $2$ bpm", [heartMin, heartMax]); } - dc.drawText(width_screen/2, height_screen - 19, Gfx.FONT_SMALL, heartMinMaxString, Graphics.TEXT_JUSTIFY_CENTER); - - } - - // Date - dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_TRANSPARENT); - drawDate(dc); - - // Digital time - if (showDigitalTime) - { - dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_TRANSPARENT); - drawDigitalTime(dc, clockTime); - } - - // BT, alarm, notification, and do not disturb icons - if (Sys.getDeviceSettings().phoneConnected) - { - dc.drawBitmap(39, 6, Ui.loadResource(Rez.Drawables.BluetoothIcon)); - } - - if (Sys.getDeviceSettings().alarmCount > 0) - { - dc.drawBitmap(25, 23, Ui.loadResource(Rez.Drawables.AlarmIcon)); - } - - if (Sys.getDeviceSettings().doNotDisturb) - { - dc.drawBitmap(10, 49, Ui.loadResource(Rez.Drawables.MuteIcon)); - } - - if (Sys.getDeviceSettings().notificationCount > 0) - { - var offset = 0; - if (Sys.getDeviceSettings().notificationCount >= 10) - { - offset = 6; - } - - dc.drawText(width_screen/2+16+offset, 7, Gfx.FONT_SMALL, Sys.getDeviceSettings().notificationCount, Graphics.TEXT_JUSTIFY_RIGHT|Graphics.TEXT_JUSTIFY_VCENTER); - dc.drawBitmap(width_screen/2+18+offset, 2, Ui.loadResource(Rez.Drawables.NotificationIcon)); - } - - // Battery - var systemStats = Sys.getSystemStats(); - var battery = systemStats.battery; - - var offset = 0; - if (battery == 100) - { offset = 6; } - - dc.drawText(width_screen/2-33-offset, 7, Gfx.FONT_SMALL, Lang.format("$1$%", [battery.format("%2d")]), Graphics.TEXT_JUSTIFY_LEFT|Graphics.TEXT_JUSTIFY_VCENTER); - - // Steps - var stepsInfo = ActMon.getInfo(); - var steps = stepsInfo.steps; - var goal = stepsInfo.stepGoal; - dc.drawText(width_screen-4, height_screen/2 - 14, Gfx.FONT_SMALL, steps, Graphics.TEXT_JUSTIFY_RIGHT|Graphics.TEXT_JUSTIFY_VCENTER); - dc.drawText(width_screen-4, height_screen/2 + 11, Gfx.FONT_SMALL, goal, Graphics.TEXT_JUSTIFY_RIGHT|Graphics.TEXT_JUSTIFY_VCENTER); - - // Sunrise & sunset - dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_TRANSPARENT); - drawSunriseSunset(dc); - - } - - - //! The user has just looked at their watch. Timers and animations may be started here. - function onExitSleep() { - showSeconds = true; - } - - - //! Terminate any active timers and prepare for slow updates. - function onEnterSleep() { - showSeconds = false; - requestUpdate(); - } - + } + //! Draw the watch hand function drawHand(dc, angle, whichHand, width, handColour) @@ -322,7 +314,7 @@ class SnapshotWatchView extends Ui.WatchFace { deflect1 = 0.10*width; deflect2 = 0.08*width; } - else //minute hand + else //minute hand { length = 1.0*centerX; r1 = 0.0*length; @@ -352,20 +344,21 @@ class SnapshotWatchView extends Ui.WatchFace { { var hour, min, sec; - // Draw the hour. Convert it to minutes and compute the angle. + // Draw the hour hand - convert to minutes then compute angle hour = ( ( ( clock_hour % 12 ) * 60 ) + clock_min ); // hour = 2*60.0; hour = hour / (12 * 60.0) * Math.PI * 2; drawHand(dc, hour, 0, 2.0, Gfx.COLOR_DK_BLUE); drawHand(dc, hour, 0, 1.6, Gfx.COLOR_LT_GRAY); - // Draw the minute + // Draw the minute hand min = ( clock_min / 60.0); // min = 40/60.0; min = min * Math.PI * 2; drawHand(dc, min, 1, 1.2, Gfx.COLOR_DK_BLUE); drawHand(dc, min, 1, 1.0, Gfx.COLOR_LT_GRAY); - // Draw the seconds (use hash graphic here) - if(showSeconds){ + // Draw the seconds hand (use hash graphic here) + if(showSeconds) + { sec = ( clock_sec / 60.0) * Math.PI * 2; drawHash(dc, sec, width_screen/2, 4, 25, Gfx.COLOR_DK_BLUE); drawHash(dc, sec, width_screen/2, 2, 25, Gfx.COLOR_LT_GRAY); @@ -413,24 +406,21 @@ class SnapshotWatchView extends Ui.WatchFace { //! Draw the hash mark symbols function drawHashMarks(dc) { - - for(var i = 0; i < 60; i += 5) - { - if(i != 30) - { - if(i != 0 && i != 15 && i != 45) - { - drawHash(dc, hashMarksArray[i][0], 110, 3, hashMarksArray[i][1], Gfx.COLOR_WHITE); - } else { - drawHash(dc, hashMarksArray[i][0], 110, 5, hashMarksArray[i][1], Gfx.COLOR_WHITE); - } - } - - if(!showHeartRate && i == 30) - { - drawHash(dc, hashMarksArray[i][0], 110, 5, hashMarksArray[i][1], Gfx.COLOR_WHITE); - } - } + drawHash(dc, hashMarksArray[5][0], 110, 3, hashMarksArray[5][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[10][0], 110, 3, hashMarksArray[10][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[20][0], 110, 3, hashMarksArray[20][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[25][0], 110, 3, hashMarksArray[25][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[35][0], 110, 3, hashMarksArray[35][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[40][0], 110, 3, hashMarksArray[40][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[50][0], 110, 3, hashMarksArray[50][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[55][0], 110, 3, hashMarksArray[55][1], Gfx.COLOR_WHITE); + + drawHash(dc, hashMarksArray[0][0], 110, 5, hashMarksArray[0][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[15][0], 110, 5, hashMarksArray[15][1], Gfx.COLOR_WHITE); + drawHash(dc, hashMarksArray[45][0], 110, 5, hashMarksArray[45][1], Gfx.COLOR_WHITE); + + if(!showHeartRate) + { drawHash(dc, hashMarksArray[30][0], 110, 5, hashMarksArray[30][1], Gfx.COLOR_WHITE); } } @@ -439,40 +429,31 @@ class SnapshotWatchView extends Ui.WatchFace { var info = Calendar.info(Time.now(), Time.FORMAT_LONG); var dateStr = Lang.format("$1$ $2$ $3$", [info.day_of_week, info.month, info.day]); - if (showDigitalTime) - { - dc.drawText(width_screen/2, height_screen/2 - 60, Gfx.FONT_MEDIUM, dateStr, Gfx.TEXT_JUSTIFY_CENTER); - } + if (showSecondTime) + { dc.drawText(width_screen/2, height_screen/2 - 60, Gfx.FONT_MEDIUM, dateStr, Gfx.TEXT_JUSTIFY_CENTER); } else - { - dc.drawText(width_screen/2, height_screen/2 - 55, Gfx.FONT_MEDIUM, dateStr, Gfx.TEXT_JUSTIFY_CENTER); - } + { dc.drawText(width_screen/2, height_screen/2 - 55, Gfx.FONT_MEDIUM, dateStr, Gfx.TEXT_JUSTIFY_CENTER); } } function drawDigitalTime(dc, clockTime) { - - var offsetHour = clockTime.hour + digitalTimeOffset; - - if (offsetHour > 23) - { - offsetHour -= 24; - } - else if (offsetHour < 0) - { - offsetHour += 24; - } - - var ampm = "am"; - if (offsetHour >= 12) - { - ampm = "pm"; - } - - var timeString = Lang.format("$1$:$2$$3$", [to12hourFormat(offsetHour), clockTime.min.format("%02d"), ampm]); - dc.drawText(width_screen/2, height_screen/2 - 30, Gfx.FONT_SMALL, timeString, Gfx.TEXT_JUSTIFY_CENTER|Graphics.TEXT_JUSTIFY_VCENTER); - + if (showSecondTime) + { + var offsetHour = clockTime.hour + secondTimeOffset; + + if (offsetHour > 23) + { offsetHour -= 24; } + else if (offsetHour < 0) + { offsetHour += 24; } + + var ampm = "am"; + if (offsetHour >= 12) + { ampm = "pm"; } + + var timeString = Lang.format("$1$:$2$$3$", [to12hourFormat(offsetHour), clockTime.min.format("%02d"), ampm]); + dc.drawText(width_screen/2, height_screen/2 - 30, Gfx.FONT_SMALL, timeString, Gfx.TEXT_JUSTIFY_CENTER|Graphics.TEXT_JUSTIFY_VCENTER); + } } @@ -513,18 +494,14 @@ class SnapshotWatchView extends Ui.WatchFace { ampm = "a"; if (timeInfoSunrise.hour >= 12) - { - ampm = "p"; - } + { ampm = "p"; } timeString = Lang.format("$1$:$2$$3$", [to12hourFormat(timeInfoSunrise.hour), timeInfoSunrise.min.format("%02d"), ampm]); dc.drawText(3, height_screen/2 - 14, Gfx.FONT_SMALL, timeString, Gfx.TEXT_JUSTIFY_LEFT|Graphics.TEXT_JUSTIFY_VCENTER); ampm = "a"; if (timeInfoSunset.hour >= 12) - { - ampm = "p"; - } + { ampm = "p"; } timeString = Lang.format("$1$:$2$$3$", [to12hourFormat(timeInfoSunset.hour), timeInfoSunset.min.format("%02d"), ampm]); dc.drawText(3, height_screen/2 + 11, Gfx.FONT_SMALL, timeString, Gfx.TEXT_JUSTIFY_LEFT|Graphics.TEXT_JUSTIFY_VCENTER); @@ -537,12 +514,10 @@ class SnapshotWatchView extends Ui.WatchFace { function to12hourFormat(hour) { var hour12 = hour % 12; - if (hour12 == 0) { - hour12 = 12; - } + if (hour12 == 0) + { hour12 = 12; } return hour12; } } -