From 4afc6992781d68cd130bb881f092cd458bbb935d Mon Sep 17 00:00:00 2001 From: lasantha Date: Tue, 20 Jun 2017 16:27:58 +0530 Subject: [PATCH] removed android active time chart gadget --- .../Android_Active_Time_Chart/conf.json | 18 -- .../gadget-controller.jag | 42 ---- .../Android_Active_Time_Chart/gadget.json | 9 - .../Android_Active_Time_Chart/gadget.xml | 56 ------ .../js/core/batch-provider-api.js | 190 ------------------ .../js/core/gadget-core.js | 88 -------- .../js/core/gadget-util.js | 35 ---- .../js/core/line-chart-api.js | 132 ------------ .../Android_Active_Time_Chart/thumbnail.png | Bin 17872 -> 0 bytes .../artifact.xml | 23 --- 10 files changed, 593 deletions(-) delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/conf.json delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget-controller.jag delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.json delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.xml delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/batch-provider-api.js delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-core.js delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-util.js delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/line-chart-api.js delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/thumbnail.png delete mode 100644 components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/artifact.xml diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/conf.json b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/conf.json deleted file mode 100644 index ffdd90533a..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/conf.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "chart-conf": { - "chart-name": "line-chart", - "color": "None", - "gadget-name": "Android Active Time Chart", - "maxLength": "15", - "x": "timestamp", - "xType": "time", - "y": "duration", - "yType": "default" - }, - "provider-conf": { - "limit": "15", - "provider-name": "batch", - "query": "", - "tableName": "ANDROID_ACTIVE_STAT_PER_DAY" - } -} \ No newline at end of file diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget-controller.jag b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget-controller.jag deleted file mode 100644 index f84538a40a..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget-controller.jag +++ /dev/null @@ -1,42 +0,0 @@ -<% -/** - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you 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 () { - - response.contentType = 'application/json'; - var PROVIDER_CONF = 'provider-conf'; - var PROVIDER_NAME = 'provider-name'; - - var action = request.getParameter("action"); - var data = request.getContent(); - var providerConf = data[PROVIDER_CONF]; - var providerAPI = require('js/core/' + providerConf[PROVIDER_NAME] + '-provider-api.js'); - - if (action === 'getSchema') { - print(providerAPI.getSchema(providerConf)); - return; - } else if(action === 'getData'){ - print(providerAPI.getData(providerConf)); - return; - } - -}()); - - -%> diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.json b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.json deleted file mode 100644 index fc2bcee303..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "Android_Active_Time_Chart", - "title": "Android Active Time Chart", - "type": "gadget", - "thumbnail": "gadget/Android_Active_Time_Chart/thumbnail.png", - "data": { - "url": "gadget/Android_Active_Time_Chart/gadget.xml" - } -} diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.xml b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.xml deleted file mode 100644 index 1d78e66b92..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/gadget.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - ]]> -
-
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/batch-provider-api.js b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/batch-provider-api.js deleted file mode 100644 index d6d5102560..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/batch-provider-api.js +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) 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. - */ -var getConfig, validate, getMode, getSchema, getData, registerCallBackforPush; - -(function() { - - var PROVIDERS_LOCATION = '/extensions/providers/'; - - var PROVIDER_NAME = 'batch'; - var TYPE = "type"; - var TABLE_NAME = "tableName"; - var HTTPS_TRANSPORT = "https"; - var CONTENT_TYPE_JSON = "application/json"; - var AUTHORIZATION_HEADER = "Authorization"; - var USER_TOKEN = "user"; - var TENANT_DOMAIN = "domain"; - var CONST_AT = "@"; - var USERNAME = "username"; - var HTTP_USER_NOT_AUTHENTICATED = 403; - var JS_MAX_VALUE = "9007199254740992"; - var JS_MIN_VALUE = "-9007199254740992"; - - var typeMap = { - "bool" : "string", - "boolean" : "string", - "string" : "string", - "int" : "number", - "integer" : "number", - "long" : "number", - "double" : "number", - "float" : "number", - "time": "time" - }; - - var log = new Log(); - var carbon = require('carbon'); - var configs = require('/configs/designer.json'); - var utils = require('/modules/utils.js'); - var JSUtils = Packages.org.wso2.carbon.analytics.jsservice.Utils; - var AnalyticsCachedJSServiceConnector = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector; - var AnalyticsCache = Packages.org.wso2.carbon.analytics.jsservice.AnalyticsCachedJSServiceConnector.AnalyticsCache; - var cacheTimeoutSeconds = 5; - var loggedInUser = null; - - if (configs.cacheTimeoutSeconds) { - cacheTimeoutSeconds = parseInt(configs.cacheTimeoutSeconds); - } - var cacheSizeBytes = 1024 * 1024 * 1024; // 1GB - if (configs.cacheSizeBytes) { - cacheSizeBytes = parseInt(configs.cacheSizeBytes); - } - response.contentType = CONTENT_TYPE_JSON; - - var authParam = request.getHeader(AUTHORIZATION_HEADER); - if (authParam != null) { - credentials = JSUtils.authenticate(authParam); - loggedInUser = credentials[0]; - } else { - var token = session.get(USER_TOKEN); - if (token != null) { - loggedInUser = token[USERNAME] + CONST_AT + token[TENANT_DOMAIN]; - } else { - log.error("user is not authenticated!"); - response.status = HTTP_USER_NOT_AUTHENTICATED; - print('{ "status": "Failed", "message": "User is not authenticated." }'); - return; - } - } - - var cache = application.get("AnalyticsWebServiceCache"); - if (cache == null) { - cache = new AnalyticsCache(cacheTimeoutSeconds, cacheSizeBytes); - application.put("AnalyticsWebServiceCache", cache); - } - var connector = new AnalyticsCachedJSServiceConnector(cache); - - /** - * require the existing config.json and push any dynamic fields that needs to be populated in the UI - */ - getConfig = function() { - var formConfig = require(PROVIDERS_LOCATION + '/' + PROVIDER_NAME + '/config.json'); - var tables; - try { - tables = JSON.parse(connector.getTableList(loggedInUser).getMessage()); - } catch (e) { - log.error(e); - } - var configs = formConfig.config; - configs.forEach(function(config) { - if (config.fieldName === TABLE_NAME) { - config.valueSet = tables; - } - }); - return formConfig; - } - - /** - * validate the user input of provider configuration - * @param providerConfig - */ - validate = function(providerConfig) { - /* - validate the form and return - - */ - return true; - } - - /** - * returns the data mode either push or pull - */ - getMode = function() { - return "PULL"; - } - - /** - * returns an array of column names & types - * @param providerConfig - */ - getSchema = function(providerConfig) { - var schema = []; - var tableName = providerConfig["tableName"]; - var result = connector.getTableSchema(loggedInUser, tableName).getMessage(); - result = JSON.parse(result); - - var columns = result.columns; - Object.getOwnPropertyNames(columns).forEach(function(name, idx, array) { - var type = "ordinal"; - if(columns[name]['type']) { - type = columns[name]['type']; - } - schema.push({ - fieldName: name, - fieldType: typeMap[type.toLowerCase()] - }); - }); - // log.info(schema); - return schema; - }; - - /** - * returns the actual data - * @param providerConfig - * @param limit - */ - getData = function(providerConfig, limit) { - var tableName = providerConfig.tableName; - var query = providerConfig.query; - var limit = 100; - if (providerConfig.limit) { - limit = providerConfig.limit; - } - var result; - //if there's a filter present, we should perform a Lucene search instead of reading the table - if (query) { - var filter = { - "query": query, - "start": 0, - "count": limit - }; - result = connector.search(loggedInUser, tableName, stringify(filter)).getMessage(); - } else { - var from = JS_MIN_VALUE; - var to = JS_MAX_VALUE; - result = connector.getRecordsByRange(loggedInUser, tableName, from, to, 0, limit, null).getMessage(); - - } - result = JSON.parse(result); - var data = []; - for (var i = 0; i < result.length; i++) { - var values = result[i].values; - data.push(values); - } - console.log(data); - return data; - }; -}()); diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-core.js b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-core.js deleted file mode 100644 index 282e7e2285..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-core.js +++ /dev/null @@ -1,88 +0,0 @@ -/* -* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) 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 gadgetLocation; - var conf; - var schema; - var pref = new gadgets.Prefs(); - - var refreshInterval; - var providerData; - - var CHART_CONF = 'chart-conf'; - var PROVIDER_CONF = 'provider-conf'; - - var REFRESH_INTERVAL = 'refreshInterval'; - -var init = function () { - $.ajax({ - url: gadgetLocation + '/conf.json', - method: "GET", - contentType: "application/json", - async: false, - success: function (data) { - conf = JSON.parse(data); - $.ajax({ - url: gadgetLocation + '/gadget-controller.jag?action=getSchema', - method: "POST", - data: JSON.stringify(conf), - contentType: "application/json", - async: false, - success: function (data) { - schema = data; - } - }); - - getProviderData(); - - } - }); -}; - -var getProviderData = function (){ - $.ajax({ - url: gadgetLocation + '/gadget-controller.jag?action=getData', - method: "POST", - data: JSON.stringify(conf), - contentType: "application/json", - async: false, - success: function (data) { - data.forEach(function(entry) { - entry.duration = entry.duration / 3600000; // Convert to hours - }); - providerData = data; - } - }); - return providerData; -}; - - -var drawGadget = function (){ - - draw('#canvas', conf[CHART_CONF], schema, providerData); - setInterval(function() { - draw('#canvas', conf[CHART_CONF], schema, getProviderData()); - },pref.getInt(REFRESH_INTERVAL)); - -}; - -getGadgetLocation(function (gadget_Location) { - gadgetLocation = gadget_Location; - init(); - drawGadget(); - -}); -}); diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-util.js b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-util.js deleted file mode 100644 index 09654fc253..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/gadget-util.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) 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. - */ -var getGadgetLocation = function (callback) { - var gadgetLocation = "/portal/store/carbon.super/fs/gadget/Android_Active_Time_Chart"; - var PATH_SEPERATOR = "/"; - if (gadgetLocation.search("store") != -1) { - wso2.gadgets.identity.getTenantDomain(function (tenantDomain) { - var gadgetPath = gadgetLocation.split(PATH_SEPERATOR); - var modifiedPath = ''; - for (var i = 1; i < gadgetPath.length; i++) { - if (i === 3) { - modifiedPath = modifiedPath.concat(PATH_SEPERATOR, tenantDomain); - } else { - modifiedPath = modifiedPath.concat(PATH_SEPERATOR, gadgetPath[i]) - } - } - callback(modifiedPath); - }); - } else { - callback(gadgetLocation); - } -} \ No newline at end of file diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/line-chart-api.js b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/line-chart-api.js deleted file mode 100644 index 7a42bbbf97..0000000000 --- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/js/core/line-chart-api.js +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) 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. - */ -var getConfig, validate, isProviderRequired, draw, update; - -(function() { - - var CHART_LOCATION = '/extensions/chart-templates/'; - - /** - * return the config to be populated in the chart configuration UI - * @param schema - */ - getConfig = function(schema) { - var chartConf = require(CHART_LOCATION + '/line-chart/config.json').config; - /* - dynamic logic goes here - */ - - var columns = []; - - columns.push("None"); - for(var i=0; i < schema.length; i++) { - columns.push(schema[i]["fieldName"]); - } - - for(var i=0; i < chartConf.length; i++) { - if (chartConf[i]["fieldName"] == "color") { - chartConf[i]["valueSet"] = columns; - break; - } - } - - return chartConf; - }; - - /** - * validate the user inout for the chart configuration - * @param chartConfig - */ - validate = function(chartConfig) { - return true; - }; - - /** - * TO be used when provider configuration steps need to be skipped - */ - isProviderRequired = function() { - - } - - - /** - * return the gadget content - * @param chartConfig - * @param schema - * @param data - */ - draw = function(placeholder, chartConfig, _schema, data) { - _schema = updateUserPrefXYTypes(_schema, chartConfig); - var schema = toVizGrammarSchema(_schema); - - var view = { - id: "chart-0", - schema: schema, - chartConfig: buildChartConfig(chartConfig), - data: function() { - if(data) { - var result = []; - data.forEach(function(item) { - var row = []; - schema[0].metadata.names.forEach(function(name) { - row.push(item[name]); - }); - result.push(row); - }); - wso2gadgets.onDataReady(result); - } - } - - }; - - try { - wso2gadgets.init(placeholder, view); - var view = wso2gadgets.load("chart-0"); - } catch (e) { - console.error(e); - } - - }; - - /** - * - * @param data - */ - update = function(data) { - wso2gadgets.onDataReady(data,"append"); - }; - - buildChartConfig = function (_chartConfig) { - var conf = {}; - conf.x = _chartConfig.x; - conf.xType = _chartConfig.xType; - conf.yType = _chartConfig.yType; - conf.maxLength = _chartConfig.maxLength; - conf.charts = []; - conf.charts[0] = { - type : "line", - y: _chartConfig.y - }; - - if (_chartConfig.color != "None") { - conf.charts[0].color = _chartConfig.color; - } - - return conf; - }; - - -}()); \ No newline at end of file diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/thumbnail.png b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.analytics/src/main/resources/carbonapps/androidsense/android_active_time_chart_gadget/Android_Active_Time_Chart/thumbnail.png deleted file mode 100644 index 16ac3e8bdeafa6c3e568bb3791a5aef4c84d793a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17872 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 k+`0~ - - - - Android_Active_Time_Chart - -