Implement a Launch function
authorhyunho <hhstark.kang@samsung.com>
Mon, 20 Jan 2020 01:08:56 +0000 (10:08 +0900)
committerhyunho <hhstark.kang@samsung.com>
Mon, 20 Jan 2020 01:08:56 +0000 (10:08 +0900)
Signed-off-by: hyunho <hhstark.kang@samsung.com>
CMakeLists.txt
packaging/libwidget_viewer.spec
watch-holder/CMakeLists.txt
watch-holder/api/watch_holder.h
watch-holder/src/common.hh [new file with mode: 0644]
watch-holder/src/watch.cc
watch-holder/src/watch.hh
watch-holder/src/watch_holder.cc
watch-holder/src/watch_holder.hh

index 5de1b9370f619fdd413a3fc91b3de74d6116364f..86bbc61ee7d1cfd1e00a717d7c5b2bbe489c29da 100644 (file)
@@ -12,6 +12,7 @@ ADD_SUBDIRECTORY(unittest)
 
 ADD_DEPENDENCIES(widget-viewer_unittests widget_viewer_evas)
 ADD_DEPENDENCIES(widget_viewer_sdk widget_viewer_evas)
+ADD_DEPENDENCIES(widget_viewer_sdk watch-holder)
 
 ENABLE_TESTING()
 SET(WIDGET_VIEWER_UNIT_TESTS widget-viewer_unittests)
index 545bad3730c49e8cfe43f03ef0da38a954254885..c95b49ace850fc6f102eff8f4764dd667ab450f5 100644 (file)
@@ -324,6 +324,7 @@ Header & package configuration of ambient-viewer
 
 %files -n watch-holder-devel
 %{_includedir}/watch-holder/*.h
+%{_includedir}/watch-holder/*.hh
 %{_libdir}/pkgconfig/watch-holder.pc
 %{_libdir}/libwatch-holder.so
 
index e90d04eb1788771566160125259b1286d4ad9a25..f6d7566df1f6c3c81874dafbdda43491bb6c9941 100644 (file)
@@ -18,6 +18,8 @@ pkg_check_modules(watch-holder REQUIRED
        capi-appfw-application
        aul
        evas
+       screen_connector_remote_surface_evas
+       appsvc
 )
 
 AUX_SOURCE_DIRECTORY(src BUILD_SOURCE)
@@ -45,3 +47,7 @@ INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIB_INSTALL_DIR})
 INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/api/watch.h DESTINATION include/${PROJECT_NAME})
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/api/watch_holder.h DESTINATION include/${PROJECT_NAME})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/watch_holder.hh DESTINATION include/${PROJECT_NAME})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/watch.hh DESTINATION include/${PROJECT_NAME})
+
+
index 30cd8bb81ea6694daacb865569d33447f3b479e6..cc3b2ea3be99c101ffa0488bebd89b87dc739654 100644 (file)
@@ -41,7 +41,7 @@ typedef struct {
  * @since_tizen 5.5
  * @return @c 0 on success, otherwise a negative error value
  */
-int watch_holder_create(watch_holder_h *handle);
+int watch_holder_create(Evas_Object *viewer_win, watch_holder_h *handle);
 
 int watch_holder_destroy(watch_holder_h handle);
 
diff --git a/watch-holder/src/common.hh b/watch-holder/src/common.hh
new file mode 100644 (file)
index 0000000..3955fc2
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * 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.
+ */
+
+#ifndef __WATCH_HOLDER_COMMON_HH__
+#define __WATCH_HOLDER_COMMON_HH__
+
+#ifdef EXPORT_API
+#undef EXPORT_API
+#endif
+#define EXPORT_API __attribute__((visibility("default")))
+
+#endif  // __WATCH_HOLDER_COMMON_HH__
index 4a5bcc1f49676834fee795807448b950e93b8ff0..e4de0a2ba65230eff3a8d934f203ced4fd835704 100644 (file)
 \r
 #include "watch.hh"\r
 \r
-namespace watch {\r
+using namespace std;\r
+using namespace screen_connector;\r
+namespace watch_holder {\r
+\r
+Watch::Watch(string appid, Evas_Object* viewer_win, IWatchEventListener* holder)\r
+    : RemoteSurfaceEvas(appid, RemoteSurface::WATCH,\r
+        make_shared<screen_connector::EvasObject>(viewer_win, false)),\r
+        appid_(appid), holder_(holder) {\r
+}\r
 \r
 void Watch::Resume() {\r
 \r
@@ -43,19 +51,31 @@ Evas_Object* Watch::GetCurrentImage() {
 }\r
 \r
 void Watch::OnAdded(Evas_Object* image) {\r
-\r
 }\r
 \r
 void Watch::OnUpdated(Evas_Object* image) {\r
-\r
 }\r
 \r
 void Watch::OnRemoved(Evas_Object* image) {\r
+}\r
+\r
+void Watch::OnEvasAdded(const std::string& appId, const std::string& instId,\r
+    int pid, const screen_connector::EvasObject& image) {\r
+  holder_->OnWatchAdded(*this, image.GetRaw());\r
+}\r
+\r
+void Watch::OnEvasRemoved(const std::string& appId, const std::string& instId,\r
+    int pid, const screen_connector::EvasObject& image) {\r
+  holder_->OnWatchRemoved(*this, image.GetRaw());\r
+}\r
 \r
+void Watch::OnEvasChanged(const std::string& appId, const std::string& instId,\r
+    int pid, const screen_connector::EvasObject& image) {\r
+  holder_->OnWatchUpdated(*this, image.GetRaw());\r
 }\r
 \r
 float Watch::GetOpr() {\r
   return 0.0f;\r
 }\r
 \r
-}   // namspace watch\r
+}   // namspace watch_holder\r
index d5b0d0ab2ff3fbe95f023e7f59f7eb9865f5b99d..4d05771283a4ac913de39564a462744f91e2b033 100644 (file)
 \r
 #include <Evas.h>\r
 \r
-namespace watch {\r
+#include <string>\r
+#include <screen_connector_remote_surface_evas/remote_surface_evas.h>\r
 \r
-class Watch {\r
+#include "common.hh"\r
+\r
+namespace watch_holder {\r
+\r
+class EXPORT_API Watch : private screen_connector::RemoteSurfaceEvas {\r
  public:\r
+  class IWatchEventListener {\r
+   public:\r
+    virtual void OnWatchAdded(Watch& watch, Evas_Object* image) = 0;\r
+    virtual void OnWatchUpdated(Watch& watch, Evas_Object* image) = 0;\r
+    virtual void OnWatchRemoved(Watch& watch, Evas_Object* image) = 0;\r
+  };\r
+  Watch(std::string appid, Evas_Object* viewer_win, IWatchEventListener* listener);\r
   void Resume();\r
   void Pause();\r
   void Terminate();\r
@@ -33,9 +45,20 @@ class Watch {
   void OnUpdated(Evas_Object* image);\r
   void OnRemoved(Evas_Object* image);\r
   float GetOpr();\r
+ private:\r
+  void OnEvasAdded(const std::string& appId, const std::string& instId,\r
+    int pid, const screen_connector::EvasObject& image) override;\r
+  void OnEvasRemoved(const std::string& appId, const std::string& instId,\r
+    int pid, const screen_connector::EvasObject& image) override;\r
+  void OnEvasChanged(const std::string& appId, const std::string& instId,\r
+    int pid, const screen_connector::EvasObject& image) override;\r
+\r
+ private:\r
+  std::string appid_;\r
+  IWatchEventListener* holder_;\r
 };\r
 \r
-}  // namespace watch\r
+}  // namespace watch_holder\r
 \r
 #endif  // __WATCH_HOLDER_WATCH_HH__\r
 \r
index ee17a07eaa32e62ff20162a90da0e76a8310394f..62797852bd6395cb0e1ad3d660861a3cb709de28 100644 (file)
  * See the License for the specific language governing permissions and\r
  * limitations under the License.\r
  */\r
+#include <aul.h>\r
+#include <dlog.h>\r
+#include <app_control_internal.h>\r
+#include <appsvc.h>\r
 \r
 #include "watch_holder.hh"\r
+#include "bundle_cpp.h"\r
+\r
+#ifdef LOG_TAG\r
+#undef LOG_TAG\r
+#endif\r
+\r
+#define LOG_TAG "WATCH_HOLDER"\r
+\r
+using namespace tizen_base;\r
+using namespace std;\r
+namespace watch_holder {\r
+\r
+WatchHolder::WatchHolder(Evas_Object* win) : win_(win) {\r
+  if (aul_app_com_create("watch.dead", nullptr,\r
+                       OnDeadSignal, this, &dead_signal_conn_) != AUL_R_OK) {\r
+               LOGE("failed to create status");\r
+       }\r
+\r
+       if (aul_app_com_create("watch.launch", nullptr, OnLaunchSignal,\r
+                       this, &launch_signal_conn_) != AUL_R_OK) {\r
+               LOGE("Failed to listen watch.launch signal");\r
+       }\r
+\r
+  char appid_buf[512] = {0, };\r
+  if (aul_app_get_appid_bypid(\r
+      getpid(), appid_buf, sizeof(appid_buf)) != AUL_R_OK) {\r
+    LOGE("Failed to get appid (%d)", getpid());\r
+  }\r
+  appid_ = appid_buf;\r
+}\r
 \r
-namespace watch {\r
-\r
-void WatchHolder::Launch(std::string& appid, bool background, bundle* extra) {\r
-\r
+int WatchHolder::Launch(\r
+    app_control_h control, bool background, bundle* extra) {\r
+  Evas_Coord x, y, w, h;\r
+  evas_object_geometry_get(win_, &x, &y, &w, &h);\r
+       app_control_add_extra_data(control, "WATCH_WIDTH", std::to_string(w).c_str());\r
+  app_control_add_extra_data(control, "WATCH_HEIGHT", std::to_string(h).c_str());\r
+\r
+  bundle* data;\r
+  app_control_to_bundle(control, &data);\r
+  bundle_add_str(data, AUL_K_WIDGET_VIEWER, appid_.c_str());\r
+  int pid = appsvc_run_service(data, 0, nullptr, nullptr);\r
+  if (pid < 0) {\r
+    LOGE("Fail to run watch (%d)", pid);\r
+    return -1;\r
+  }\r
+  return 0;\r
 }\r
 \r
 void WatchHolder::EnableRendering() {\r
@@ -47,7 +93,37 @@ void WatchHolder::OnWatchLaunched(Watch& watch) {
 }\r
 \r
 void WatchHolder::OnWatchBound(Watch& watch) {\r
+}\r
+\r
+void WatchHolder::OnWatchAdded(Watch& watch, Evas_Object* image) {\r
+}\r
+\r
+void WatchHolder::OnWatchUpdated(Watch& watch, Evas_Object* image) {\r
+}\r
+\r
+void WatchHolder::OnWatchRemoved(Watch& watch, Evas_Object* image) {\r
+}\r
+\r
+int WatchHolder::OnDeadSignal(const char *endpoint, aul_app_com_result_e e,\r
+               bundle *envelope, void *user_data) {\r
+  return 0;\r
+}\r
 \r
+int WatchHolder::OnLaunchSignal(const char *endpoint,\r
+               aul_app_com_result_e res, bundle *envelope, void *user_data) {\r
+  Bundle launch_data(envelope, false, false);\r
+  WatchHolder* holder = (WatchHolder*)user_data;\r
+\r
+  string viewer_appid = launch_data.GetString(AUL_K_WIDGET_VIEWER);\r
+  if (viewer_appid != holder->appid_) {\r
+    LOGE("It's not mine (%s)", viewer_appid.c_str());\r
+    return 0;\r
+  }\r
+\r
+  string watch_appid = launch_data.GetString(AUL_K_APPID);\r
+  holder->stack_.push_back(make_shared<Watch>(watch_appid, holder->win_, holder));\r
+  holder->OnWatchLaunched(*holder->stack_.back());\r
+  return 0;\r
 }\r
 \r
 }\r
index eae510c2676809463eb65d908f5f03fa2f558d6b..92c096328b971a9af6be29cbd41fa9af63561816 100644 (file)
 \r
 #include <Evas.h>\r
 #include <bundle.h>\r
+#include <app_control.h>\r
+#include <aul_app_com.h>\r
 \r
 #include "watch.hh"\r
+#include "common.hh"\r
 \r
-namespace watch {\r
+namespace watch_holder {\r
 \r
-class WatchHolder {\r
+class EXPORT_API WatchHolder : public Watch::IWatchEventListener {\r
  public:\r
-  WatchHolder(Evas_Object* win) : win_(win) {}\r
-  void Launch(std::string& appid, bool background, bundle* extra);\r
+  WatchHolder(Evas_Object* win);\r
+  int Launch(app_control_h control, bool background, bundle* extra);\r
   void EnableRendering();\r
   void DisableRendering(int timeout);\r
   const std::list<std::shared_ptr<Watch>>& GetStack();\r
@@ -39,13 +42,25 @@ class WatchHolder {
   void OnWatchDead(Watch& watch);\r
   void OnWatchLaunched(Watch& watch);\r
   void OnWatchBound(Watch& watch);\r
+  void OnWatchAdded(Watch& watch, Evas_Object* image) override;\r
+  void OnWatchUpdated(Watch& watch, Evas_Object* image) override;\r
+  void OnWatchRemoved(Watch& watch, Evas_Object* image) override;\r
 \r
  private:\r
+  static int OnDeadSignal(const char *endpoint, aul_app_com_result_e e,\r
+               bundle *envelope, void *user_data);\r
+  static int OnLaunchSignal(const char *endpoint,\r
+               aul_app_com_result_e res, bundle *envelope, void *user_data);\r
+\r
+ private:\r
+  std::string appid_;\r
   Evas_Object* win_;\r
   std::list<std::shared_ptr<Watch>> stack_;\r
+  aul_app_com_connection_h launch_signal_conn_;\r
+  aul_app_com_connection_h dead_signal_conn_;\r
 };\r
 \r
-}  // namespace watch\r
+}  // namespace watch_holder\r
 \r
 #endif  // __WATCH_HOLDER_WATCH_HOLDER_HH__\r
 \r