[Application] Implementation for method getBatteryUsageInfo 69/123869/5
authorSzymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
Thu, 27 Apr 2017 13:53:18 +0000 (15:53 +0200)
committerSzymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
Thu, 27 Apr 2017 13:53:18 +0000 (15:53 +0200)
[Verification] Code compiles

Change-Id: Iee809b801803868405c1f83986fa6de7f3ea22ed
Signed-off-by: Szymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
packaging/webapi-plugins.spec
src/application/application.gyp
src/application/application_api.js
src/application/application_instance.cc
src/application/application_instance.h
src/application/application_manager.cc
src/application/application_manager.h

index b475a5b24213e0353597212370bdf92f8b28e345..e17172d9727100832ce80d8bf44adb19ad405b30 100644 (file)
@@ -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"
index 7a222ba3fb8850271a9edd0408bd0c0a38ae0965..38d04d045fcc5df0f909ed8fba12bd019b903c50 100644 (file)
             ]
           },
         }],
+        ['extension_host_os == "mobile"', {
+          'variables': {
+            'packages': [
+              'capi-context',
+            ]
+          }
+        }],
       ],
     },
   ],
index b0d5774dc71375e73e7e26dc75ddf4c28e7c09ca..39313a30785c7d5e9d0aebb34b3b5c8171a1255e 100755 (executable)
@@ -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();
index cb8d850ae56785343748ccdf27fcfddaddca77db..f6a12828993e23c1c7b86be11c6e6e876d42f2e3 100755 (executable)
@@ -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. "
index cb99cbb4e99b65abddfc3517b52c0ac973df9af9..bdf86dc2ae5172c3bcdd66db30f345695e5e90b4 100755 (executable)
@@ -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);
index 328d6ffd729cb211e04403cd7f32d7b6b2c886a3..e514eee3550d33b02244d026b21e7082474e5477 100755 (executable)
@@ -30,6 +30,7 @@
 #include <bundle_internal.h>
 #include <appsvc.h>
 #include <app_control_internal.h>
+#include <context-service/context_history.h>
 
 #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<int>(args.get("limit").get<double>());
+    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<int>(args.get("days").get<double>());
+    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<picojson::array>();
+
+  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<picojson::object>();
+
+    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");
 
index f5585b3c13fe2fbcf1e6fe8239993c9cf84bd34f..ea8a92c1065005b78eb47a435cd4b3e8435f5a0c 100755 (executable)
@@ -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);