Add sanitization 03/204803/1 accepted/tizen/unified/20190503.075059 submit/tizen/20190430.023700 submit/tizen/20190430.065044 submit/tizen/20190502.073346
authorLukasz Wlazly <l.wlazly@partner.samsung.com>
Fri, 26 Apr 2019 09:35:11 +0000 (11:35 +0200)
committerLukasz Wlazly <l.wlazly@partner.samsung.com>
Fri, 26 Apr 2019 09:35:11 +0000 (11:35 +0200)
1. Check if AppContext stack is empty before calling presenter's
callback
2. Unregister from smart callbacks in Widget destructor

Change-Id: I716c0dde5d43f3b7bc3527c2dd591dbe41e5ab5b

src/main.cpp
src/presenter/AppContext.cpp
src/presenter/AppContext.hpp
src/ui/Widget.cpp
src/ui/Widget.hpp

index 212259b..8ce74f1 100644 (file)
@@ -29,11 +29,13 @@ static bool on_app_create(void *priv)
 }
 
 static void on_app_terminate(void *priv)
-{
-}
+{}
 
 static void on_app_pause(void *priv)
 {
+       if (Singleton<AppContext>::instance().empty())
+               return;
+
        auto p = Singleton<AppContext>::instance().back();
        if (p)
                p->onAppPause();
@@ -41,6 +43,9 @@ static void on_app_pause(void *priv)
 
 static void on_app_resume(void *priv)
 {
+       if (Singleton<AppContext>::instance().empty())
+               return;
+
        auto p = Singleton<AppContext>::instance().back();
        if (p)
                p->onAppResume();
index d0c7395..e75205f 100644 (file)
@@ -24,9 +24,17 @@ void AppContext::pop()
 {
        navContext_.popView();
        presentersStack_.pop_back();
+
+       if (presentersStack_.empty())
+               ui_app_exit();
 }
 
 Presenter *AppContext::back()
 {
        return presentersStack_.back().get();
 }
+
+bool AppContext::empty()
+{
+       return presentersStack_.empty();
+}
index d3ef7f2..6633439 100644 (file)
@@ -18,6 +18,7 @@ class AppContext
        void push(std::unique_ptr<Presenter> presenter);
        void pop();
        Presenter *back();
+       bool empty();
 
        // TODO: should be private
        UniversalSwitchDbusConfig config;
index d3c922c..b806122 100644 (file)
@@ -6,6 +6,13 @@ Widget::Widget(Widget *parent)
        : parent_(parent)
 {}
 
+Widget::~Widget()
+{
+       for (auto &it : smartCallbacks_) {
+               evas_object_smart_callback_del(getObject(), it.first.c_str(), smartCallbackMethod);
+       }
+}
+
 void Widget::setText(const TranslatedString &text)
 {
        elm_object_text_set(uniqueObj_.get(), text.c_str());
@@ -57,8 +64,7 @@ void Widget::setEvasSmartCallback(const std::string &eventName, std::function<vo
 {
        auto cbData = std::make_unique<WidgetCallback::Data<Widget, std::string>>(this, eventName);
        auto dataPtr = cbData.get();
-       smartCallbacks_.insert_or_assign(
-               eventName, WidgetCallback::Value<Widget, std::string>{std::move(callback), std::move(cbData)});
+       smartCallbacks_.insert_or_assign(eventName, WidgetCallback::Value<Widget, std::string>{std::move(callback), std::move(cbData)});
        evas_object_smart_callback_add(getObject(), eventName.c_str(), smartCallbackMethod, dataPtr);
 }
 
index 73acccc..53b0bf6 100644 (file)
@@ -19,7 +19,7 @@ class Widget
        public:
        Widget(const Widget &) = delete;
        Widget(Widget &&) = delete;
-       virtual ~Widget() = default;
+       virtual ~Widget();
 
        template <typename T, typename... Args>
        static T *make(Widget *parent, Args &&... args)