From 8a1d8c688268b802bd5ad18a64b883016b132076 Mon Sep 17 00:00:00 2001 From: Raphael Maenle <17550607+g-spacewhale@users.noreply.github.com> Date: Mon, 24 Feb 2020 23:06:22 +0100 Subject: [PATCH] added example structure for json download and calendar visualization functions --- CalendarWatch.wgt | Bin 0 -> 33176 bytes LICENSE.APLv2 | 202 +++++++++++++++++++++++++++ NOTICE | 3 + README.md | 0 config.xml | 14 ++ css/style.css | 27 ++++ icon.png | Bin 0 -> 18122 bytes index.html | 20 +++ js/app.js | 344 ++++++++++++++++++++++++++++++++++++++++++++++ version.txt | 1 + 10 files changed, 611 insertions(+) create mode 100644 CalendarWatch.wgt create mode 100644 LICENSE.APLv2 create mode 100644 NOTICE create mode 100644 README.md create mode 100644 config.xml create mode 100644 css/style.css create mode 100644 icon.png create mode 100644 index.html create mode 100644 js/app.js create mode 100644 version.txt diff --git a/CalendarWatch.wgt b/CalendarWatch.wgt new file mode 100644 index 0000000000000000000000000000000000000000..13fb568ca97112e3039b47ab7b9f36de9834ee89 GIT binary patch literal 33176 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%0A4vIo#FnpwI*H>Bqv}x9@`E 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 literal 0 HcmV?d00001 diff --git a/LICENSE.APLv2 b/LICENSE.APLv2 new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE.APLv2 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..1c1a4d0 --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Apache License, Version 2. +Please, see the LICENSE.APLv2 file for Apache License, Version 2 terms and conditions. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..9996115 --- /dev/null +++ b/config.xml @@ -0,0 +1,14 @@ + + + + + + + + CalendarWatch + + + + + + diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..d47f9cd --- /dev/null +++ b/css/style.css @@ -0,0 +1,27 @@ +html, body { + width: 100%; + height: 100%; + margin: 0; + overflow-y: hidden; +} + +#container { + display: -webkit-flex; + -webkit-align-items: center; + width: 100%; + height: 100% +} + +#canvas-layout { + position: absolute; + width: 100%; + height: 100%; + z-index: 1; +} + +#canvas-content { + position: absolute; + width: 100%; + height: 100%; + z-index: 2; +} \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0fc0dd5e890f0a3929c22ac364c71e6623f4e8e GIT binary patch literal 18122 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..66de0dc --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + Canvas Watch + + + + +

+ + +
+ + + + diff --git a/js/app.js b/js/app.js new file mode 100644 index 0000000..9f8c12f --- /dev/null +++ b/js/app.js @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function() { + var canvasLayout, + canvasContent, + ctxLayout, + ctxContent, + center, + watchRadius; + + function readJSON(path) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', path, true); + xhr.responseType = 'blob'; + xhr.onload = function(e) { + console.log("status " + this.status); + if (this.status == 0) { + var file = new File([this.response], 'temp'); + var fileReader = new FileReader(); + fileReader.addEventListener('load', function(){ + console.log(fileReader.result); + }); + fileReader.readAsText(file); + } + } + xhr.send(); + } + + function getJSON() { + var downloadRequest = new tizen.DownloadRequest('http://download.tizen.org/tools/README.txt', 'downloads'); + tizen.systeminfo.getPropertyValue('NETWORK', function(networkInfo) { + if (networkInfo.networkType === 'NONE') { + console.log('Network connection is not available.Download is not possible.'); + downloadRequest = null; + } + }); + + var listener = { + /* When the download progresses (interval is platform-dependent) */ + onprogress: function(id, receivedSize, totalSize) { + console.log('Received with id: ' + id + ', ' + receivedSize + '/' + totalSize); + }, + + /* When the user pauses the download */ + onpaused: function(id) { + console.log('Paused with id: ' + id); + }, + + /* When the user cancels the download */ + oncanceled: function(id) { + console.log('Canceled with id: ' + id); + }, + + /* When the download is completed */ + oncompleted: function(id, fullPath) { + console.log('Completed with id: ' + id + ', full path: ' + fullPath); + + readJSON(fullPath); + }, + + /* When the download fails */ + onfailed: function(id, error) { + console.log('Failed with id: ' + id + ', error name: ' + error.name); + } + }; + console.log("starting download"); + downloadId = tizen.download.start(downloadRequest, listener); + console.log(tizen.download.getState(downloadId)); + console.log("done"); + } + + /** + * Renders a circle with specific center, radius, and color + * @private + * @param {object} context - the context for the circle to be placed in + * @param {number} radius - the radius of the circle + * @param {string} color - the color of the circle + */ + function renderCircle(context, center, radius, color) { + context.save(); + context.beginPath(); + context.fillStyle = color; + context.arc(center.x, center.y, radius, 0, 2 * Math.PI); + context.fill(); + context.closePath(); + context.restore(); + } + + + /** + * Renders a partial with specific center, radius, and color + * @private + * @param {object} context - the context for the circle to be placed in + * @param {number} radius - the radius of the circle + * @param {string} color - the color of the circle + */ + function renderArc(context, center, radius, color, startAngle, endAngle) { + context.save(); + context.beginPath(); + + seperation = 5; + + startAngle += seperation; + if(startAngle >= 360) + startAngle -= 360; + + endAngle -= seperation; + if(endAngle<0) + endAngle += 360; + context.arc(center.x, center.y, radius, startAngle * Math.PI / 180., endAngle * Math.PI / 180.); + context.fillStyle = color; + context.strokeStyle = color; + context.lineWidth = 18; + context.stroke(); + context.restore(); + + renderCircle(context, polToCart(radius, startAngle), 9, color); + renderCircle(context, polToCart(radius, endAngle), 9, color); + } + + function polToCart(radius, angle) { + pos = { + x: center.x + radius * Math.cos(angle * Math.PI / 180), + y: center.y + radius * Math.sin(angle * Math.PI / 180) + }; + return pos; + } + + function hourToAngle(hour) { + + } + + /** + * Renders a needle with specific center, angle, start point, end point, width and color + * @private + * @param {object} context - the context for the needle to be placed in + * @param {number} angle - the angle of the needle (0 ~ 360) + * @param {number} startPoint - the start point of the needle (-1.0 ~ 1.0) + * @param {number} startPoint - the end point of the needle (-1.0 ~ 1.0) + * @param {number} width - the width of the needle + * @param {string} color - the color of the needle + */ + function renderNeedle(context, angle, startPoint, endPoint, width, color) { + var radius = context.canvas.width / 2, + centerX = context.canvas.width / 2, + centerY = context.canvas.height / 2, + dxi = radius * Math.cos(angle) * startPoint, + dyi = radius * Math.sin(angle) * startPoint, + dxf = radius * Math.cos(angle) * endPoint, + dyf = radius * Math.sin(angle) * endPoint; + + context.save(); + context.beginPath(); + context.lineWidth = width; + context.strokeStyle = color; + context.moveTo(centerX + dxi, centerY + dyi); + context.lineTo(centerX + dxf, centerY + dyf); + context.stroke(); + context.closePath(); + context.restore(); + } + + /** + * Renders text at a specific center, radius, and color + * @private + * @param {object} context - the context for the text to be placed in + * @param {string} text - the text to be placed + * @param {number} x - the x-coordinate of the text + * @param {number} y - the y-coordinate of the text + * @param {number} textSize - the size of the text in pixel + * @param {string} color - the color of the text + */ + function renderText(context, text, x, y, textSize, color) { + context.save(); + context.beginPath(); + context.font = textSize + "px Courier"; + context.textAlign = "center"; + context.textBaseline = "middle"; + context.fillStyle = color; + context.fillText(text, x, y); + context.closePath(); + context.restore(); + } + + /** + * Draws the basic layout of the watch + * @private + */ + function drawWatchLayout() { + var grd, + angle, + i, + j; + + // Clear canvas + ctxLayout.clearRect(0, 0, ctxLayout.canvas.width, ctxLayout.canvas.height); + + // Draw the background circle + /* + renderCircle(ctxLayout, center, watchRadius, "#000000"); + grd = ctxLayout.createLinearGradient(0, 0, watchRadius * 2, 0); + grd.addColorStop(0, "#000000"); + grd.addColorStop(0.5, "#454545"); + grd.addColorStop(1, "#000000"); + ctxLayout.fillStyle = grd; + renderCircle(ctxLayout, center, watchRadius * 0.945, grd); + renderCircle(ctxLayout, center, watchRadius * 0.7, "#000000"); + */ + // Draw the dividers + // 60 unit divider + /* + for (i = 1; i <= 60; i++) { + angle = (i - 15) * (Math.PI * 2) / 60; + renderNeedle(ctxLayout, angle, 0.95, 1.0, 1, "#c4c4c4"); + } + + // 12 unit divider + for (j = 1; j <= 12; j++) { + angle = (j - 3) * (Math.PI * 2) / 12; + renderNeedle(ctxLayout, angle, 0.7, 0.945, 10, "#c4c4c4"); + } + */ + renderText(ctxLayout, "TIZEN WATCH", center.x, center.y - (watchRadius * 0.4), 25, "#999999"); + } + + /** + * Draws the content of the watch + * @private + */ + function drawWatchContent() { + var datetime = tizen.time.getCurrentDateTime(), + hour = datetime.getHours(), + minute = datetime.getMinutes(), + second = datetime.getSeconds(), + date = datetime.getDate(); + + // Clear canvas + ctxContent.clearRect(0, 0, ctxContent.canvas.width, ctxContent.canvas.height); + + // Draw the hour needle + renderNeedle(ctxContent, Math.PI * (((hour + minute / 60) / 6) - 0.5), 0, 0.50, 3, "#454545"); + + // Draw the minute needle + renderNeedle(ctxContent, Math.PI * (((minute + second / 60) / 30) - 0.5), 0, 0.70, 3, "#454545"); + + // Draw the minute/hour circle + // renderCircle(ctxContent, center, 8, "#454545"); + + thickness = 18; + edge = document.body.clientWidth / 2 - thickness / 2 - 2; + renderArc(ctxContent, center, edge, "#808080", 75, 195); // sleep + renderArc(ctxContent, center, edge, "#FF0000", 210, 277.5); // work + renderArc(ctxContent, center, edge, "#FFFF00", 277.5, 292.5); // lunch + renderArc(ctxContent, center, edge, "#FF0000", 292.5, 352.5); // work + + // Draw the second needle + ctxContent.shadowOffsetX = 4; + ctxContent.shadowOffsetY = 4; + renderNeedle(ctxContent, Math.PI * ((second / 30) - 0.5), -0.10, 0.85, 1, "#c4c4c4"); + + // Draw the second circle + ctxContent.shadowOffsetX = 0; + ctxContent.shadowOffsetY = 0; + renderCircle(ctxContent, center, 5, "#c4c4c4"); + + // Draw the center circle + renderCircle(ctxContent, center, 2, "#454545"); + + // Draw the text for date + renderText(ctxContent, date, center.x, center.y + (watchRadius * 0.5), 25, "#999999"); + } + + /** + * Set default variables + * @private + */ + function setDefaultVariables() { + canvasLayout = document.querySelector("#canvas-layout"); + ctxLayout = canvasLayout.getContext("2d"); + canvasContent = document.querySelector("#canvas-content"); + ctxContent = canvasContent.getContext("2d"); + + // Set the canvases square + canvasLayout.width = document.body.clientWidth; + canvasLayout.height = canvasLayout.width; + canvasContent.width = document.body.clientWidth; + canvasContent.height = canvasContent.width; + + center = { + x: document.body.clientWidth / 2, + y: document.body.clientHeight / 2 + }; + + watchRadius = canvasLayout.width / 2; + } + + /** + * Set default event listeners + * @private + */ + function setDefaultEvents() { + // add eventListener to update the screen immediately when the device wakes up + document.addEventListener("visibilitychange", function() { + if (!document.hidden) { + // Draw the content of the watch + drawWatchContent(); + } + }); + } + + /** + * Initiates the application + * @private + */ + function init() { + setDefaultVariables(); + setDefaultEvents(); + + // Draw the basic layout and the content of the watch at the beginning + drawWatchLayout(); + drawWatchContent(); + + // Update the content of the watch every second + setInterval(function() { + drawWatchContent(); + }, 1000); + } + + window.onload = init; +}()); \ No newline at end of file diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..90a27f9 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +1.0.5