From b19428c677df66aac273fd7a175d723b96936a8c Mon Sep 17 00:00:00 2001 From: Szymon Jastrzebski Date: Thu, 27 Apr 2017 15:53:18 +0200 Subject: [PATCH] [Application] Implementation for method getBatteryUsageInfo [Verification] Code compiles Change-Id: Iee809b801803868405c1f83986fa6de7f3ea22ed Signed-off-by: Szymon Jastrzebski --- packaging/webapi-plugins.spec | 5 + src/application/application.gyp | 7 ++ src/application/application_api.js | 54 +++++++++++ src/application/application_instance.cc | 15 +++ src/application/application_instance.h | 1 + src/application/application_manager.cc | 121 ++++++++++++++++++++++++ src/application/application_manager.h | 1 + 7 files changed, 204 insertions(+) diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index b475a5b24..e17172d9 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -494,6 +494,11 @@ BuildRequires: pkgconfig(alarm-service) %if "%{?tizen_feature_application_support}" == "1" || "%{?unified_build}" == "1" BuildRequires: pkgconfig(capi-appfw-app-control) BuildRequires: pkgconfig(capi-appfw-event) + +%if "%{?unified_build}" == "1" || "%{?profile}" == "mobile" +BuildRequires: pkgconfig(capi-context) +%endif + %endif %if "%{?tizen_feature_bluetooth_support}" == "1" || "%{?unified_build}" == "1" diff --git a/src/application/application.gyp b/src/application/application.gyp index 7a222ba3..38d04d04 100644 --- a/src/application/application.gyp +++ b/src/application/application.gyp @@ -43,6 +43,13 @@ ] }, }], + ['extension_host_os == "mobile"', { + 'variables': { + 'packages': [ + 'capi-context', + ] + } + }], ], }, ], diff --git a/src/application/application_api.js b/src/application/application_api.js index b0d5774d..39313a30 100755 --- a/src/application/application_api.js +++ b/src/application/application_api.js @@ -496,6 +496,44 @@ ApplicationManager.prototype.getAppMetaData = function() { } }; +ApplicationManager.prototype.getBatteryUsageInfo = function() { + var args = AV.validateMethod(arguments, [ + { + name: 'days', + type: AV.Types.LONG, + optional: true, + nullable: true + }, + { + name: 'limit', + type: AV.Types.LONG, + optional: true, + nullable: true + }]); + + var callArgs = {}; + + if (!T.isNullOrUndefined(args.days)) { + callArgs.days = args.days; + } + + if (!T.isNullOrUndefined(args.limit)) { + callArgs.limit = args.limit; + } + + var result = native.callSync('ApplicationManager_getBatteryUsageInfo', callArgs); + if (native.isFailure(result)) { + throw native.getErrorObject(result); + } else { + var metaData = native.getResultObject(result); + var data = []; + metaData.forEach(function(i) { + data.push(new ApplicationBatteryUsage(i)); + }); + return data; + } +}; + function ListenerManager(native, listenerName) { this.listeners = {}; this.nextId = 1; @@ -1123,5 +1161,21 @@ function ApplicationMetaData(data) { }); } +//class ApplicationBatteryUsage //////////////////////////////////////////////////// +function ApplicationBatteryUsage(data) { + Object.defineProperties(this, { + appId : { + value : data.appId, + writable : false, + enumerable : true + }, + batteryUsage : { + value : data.batteryUsage, + writable : false, + enumerable : true + } + }); +} + // exports //////////////////////////////////////////////////// exports = new ApplicationManager(); diff --git a/src/application/application_instance.cc b/src/application/application_instance.cc index cb8d850a..f6a12828 100755 --- a/src/application/application_instance.cc +++ b/src/application/application_instance.cc @@ -32,6 +32,7 @@ const std::string kPrivilegeAppManagerCertificate = "http://tizen.org/privilege/ const std::string kPrivilegeAppManagerKill = "http://tizen.org/privilege/appmanager.kill"; const std::string kPrivilegeApplicationInfo = "http://tizen.org/privilege/application.info"; const std::string kPrivilegeApplicationLaunch = "http://tizen.org/privilege/application.launch"; +const std::string kPrivilegeAppHistoryRead = "http://tizen.org/privilege/apphistory.read"; } // namespace using namespace common; @@ -59,6 +60,7 @@ ApplicationInstance::ApplicationInstance() : REGISTER_SYNC("ApplicationManager_getAppCerts", GetAppCerts); REGISTER_SYNC("ApplicationManager_getAppSharedURI", GetAppSharedURI); REGISTER_SYNC("ApplicationManager_getAppMetaData", GetAppMetaData); + REGISTER_SYNC("ApplicationManager_getBatteryUsageInfo", GetBatteryUsageInfo); REGISTER_SYNC("ApplicationManager_addAppInfoEventListener", AddAppInfoEventListener); REGISTER_SYNC("ApplicationManager_removeAppInfoEventListener", RemoveAppInfoEventListener); @@ -157,6 +159,19 @@ void ApplicationInstance::GetAppMetaData(const picojson::value& args, picojson:: manager_.GetAppMetaData(app_id, &out); } +void ApplicationInstance::GetBatteryUsageInfo(const picojson::value& args, picojson::object& out) { + LoggerD("Entered"); +#ifdef TIZEN_MOBILE + CHECK_PRIVILEGE_ACCESS(kPrivilegeAppHistoryRead, &out); + + manager_.GetBatteryUsageInfo(args, &out); +#else + LogAndReportError(PlatformResult(ErrorCode::NOT_SUPPORTED_ERR, "This feature is not supported on this profile."), &out, + ("NOT_SUPPORTED_ERR: This feature is not supported on this profile")); + return; +#endif +} + void ApplicationInstance::AddAppInfoEventListener(const picojson::value& args, picojson::object& out) { LoggerD("Entered"); LoggerW("DEPRECATION WARNING: addAppInfoEventListener() is deprecated and will be removed from next release. " diff --git a/src/application/application_instance.h b/src/application/application_instance.h index cb99cbb4..bdf86dc2 100755 --- a/src/application/application_instance.h +++ b/src/application/application_instance.h @@ -38,6 +38,7 @@ class ApplicationInstance: public common::ParsedInstance { void GetAppCerts(const picojson::value& args, picojson::object& out); void GetAppSharedURI(const picojson::value& args, picojson::object& out); void GetAppMetaData(const picojson::value& args, picojson::object& out); + void GetBatteryUsageInfo(const picojson::value& args, picojson::object& out); void AddAppInfoEventListener(const picojson::value& args, picojson::object& out); void RemoveAppInfoEventListener(const picojson::value& args, picojson::object& out); void GetRequestedAppControl(const picojson::value& args, picojson::object& out); diff --git a/src/application/application_manager.cc b/src/application/application_manager.cc index 328d6ffd..e514eee3 100755 --- a/src/application/application_manager.cc +++ b/src/application/application_manager.cc @@ -30,6 +30,7 @@ #include #include #include +#include #include "common/current_application.h" #include "common/logger.h" @@ -1143,6 +1144,126 @@ void ApplicationManager::GetAppSharedUri(const std::string& app_id, picojson::ob ReportSuccess(result, *out); } +void ApplicationManager::GetBatteryUsageInfo(const picojson::value& args, picojson::object* out) { + LoggerD("Entered"); + + context_history_list_h list = nullptr; + context_history_h handle = nullptr; + context_history_filter_h filter = nullptr; + + SCOPE_EXIT { + context_history_list_destroy(list); + context_history_destroy(handle); + context_history_filter_destroy(filter); + }; + + int ret = context_history_create(&handle); + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to create context handle."), out, + ("Failed to create context handle: %d (%s)", ret, get_error_message(ret))); + return; + } + + ret = context_history_filter_create(&filter); + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to create filter handle."), out, + ("Failed to create filter handle: %d (%s)", ret, get_error_message(ret))); + return; + } + + if (args.contains("limit")) { + const int limit = static_cast(args.get("limit").get()); + ret = context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_RESULT_SIZE, limit); + + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError( + PlatformResult(ErrorCode::INVALID_VALUES_ERR, "limit given with invalid value."), out, + ("limit given with invalid value: %d (%s)", ret, get_error_message(ret))); + return; + } + } + + context_history_data_e date_type = CONTEXT_HISTORY_RECENT_BATTERY_USAGE; + if (args.contains("days")) { + const int days = static_cast(args.get("days").get()); + date_type = CONTEXT_HISTORY_BATTERY_USAGE; + ret = context_history_filter_set_int(filter, CONTEXT_HISTORY_FILTER_TIME_SPAN, days); + + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError( + PlatformResult(ErrorCode::INVALID_VALUES_ERR, "days given with invalid value."), out, + ("days given with invalid value: %d (%s)", ret, get_error_message(ret))); + return; + } + } + + ret = context_history_get_list(handle, date_type, filter, &list); + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to get list."), out, + ("Failed to get list: %d (%s)", ret, get_error_message(ret))); + return; + } + + int size = 0; + ret = context_history_list_get_count(list, &size); + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to get list size."), out, + ("Failed to get list size: %d (%s)", ret, get_error_message(ret))); + return; + } + + double amount; + char* app_id; + + context_history_record_h record; + picojson::value result_array = picojson::value( + picojson::array(size, picojson::value(picojson::object()))); + picojson::array& array_obj = result_array.get(); + + for (int i = 0; i < size; ++i) { + SCOPE_EXIT { + free(app_id); + context_history_record_destroy(record); + }; + + app_id = nullptr; + record = nullptr; + + picojson::object& object = array_obj[i].get(); + + ret = context_history_list_get_current(list, &record); + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to current record."), out, + ("Failed to get current record: %d (%s)", ret, get_error_message(ret))); + return; + } + + ret = context_history_record_get_string(record, CONTEXT_HISTORY_APP_ID, &app_id); + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to get string."), out, + ("Failed to get string: %d (%s)", ret, get_error_message(ret))); + return; + } + object.insert(std::make_pair("appId", picojson::value(app_id))); + + ret = context_history_record_get_double(record, CONTEXT_HISTORY_TOTAL_AMOUNT, &amount); + if (CONTEXT_HISTORY_ERROR_NONE != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to get amount."), out, + ("Failed to get amount: %d (%s)", ret, get_error_message(ret))); + return; + } + object.insert(std::make_pair("batteryUsage", picojson::value(amount))); + + ret = context_history_list_move_next(list); + if (CONTEXT_HISTORY_ERROR_NONE != ret && CONTEXT_HISTORY_ERROR_NO_DATA != ret) { + LogAndReportError(PlatformResult(ErrorCode::ABORT_ERR, "Failed to move iterator."), out, + ("Failed to move iterator: %d (%s)", ret, get_error_message(ret))); + return; + } + } + ReportSuccess(result_array, *out); +} + void ApplicationManager::GetAppMetaData(const std::string& app_id, picojson::object* out) { LoggerD("Entered"); diff --git a/src/application/application_manager.h b/src/application/application_manager.h index f5585b3c..ea8a92c1 100755 --- a/src/application/application_manager.h +++ b/src/application/application_manager.h @@ -52,6 +52,7 @@ class ApplicationManager { void GetAppCerts(const std::string& app_id, picojson::object* out); void GetAppSharedUri(const std::string& app_id, picojson::object* out); void GetAppMetaData(const std::string& app_id, picojson::object* out); + void GetBatteryUsageInfo(const picojson::value& args, picojson::object* out); void StartAppInfoEventListener(picojson::object* out); void StopAppInfoEventListener(); void GetApplicationInformationSize(const picojson::value& args, picojson::object* out); -- 2.34.1