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)
%files -n watch-holder-devel
%{_includedir}/watch-holder/*.h
+%{_includedir}/watch-holder/*.hh
%{_libdir}/pkgconfig/watch-holder.pc
%{_libdir}/libwatch-holder.so
capi-appfw-application
aul
evas
+ screen_connector_remote_surface_evas
+ appsvc
)
AUX_SOURCE_DIRECTORY(src BUILD_SOURCE)
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})
+
+
* @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);
--- /dev/null
+/*
+ * 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__
\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
}\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
\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
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
* 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
}\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
\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
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