TizenRefApp-8907 [Gallery] Add IDisposable support to Page class 67/140067/2
authorIgor Nazarov <i.nazarov@samsung.com>
Fri, 21 Jul 2017 17:08:05 +0000 (20:08 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Mon, 24 Jul 2017 08:59:10 +0000 (11:59 +0300)
Change-Id: Icfb77b16eca8796875860e8b4e1399f39bb3c255

inc/gallery/presenters/Page.h
src/common.h
src/presenters/Instance.cpp
src/presenters/Page.cpp
src/presenters/PreviewPage.cpp
src/presenters/ThumbnailPage.cpp
src/presenters/VideoPlayerPage.cpp
ucl/inc/ucl/util/helpers.h
ucl/inc/ucl/util/memory/helpers.h

index b98569cd67919cda05ae0ae362d108f36a55b8a3..d4de6f039c72b5bb29c12a4ee24185ad25f81814 100644 (file)
@@ -25,7 +25,8 @@ namespace gallery {
 
        UCL_DECLARE_REF_ALIASES(Page);
 
-       class Page : public ucl::GuiPresenter {
+       class Page : public ucl::GuiPresenter,
+                       public ucl::IDisposable {
        public:
                using ExitRequestHandler = ucl::WeakDelegate<void(Page &page)>;
 
@@ -36,7 +37,6 @@ namespace gallery {
                bool isAtBottom() const;
 
                void exit();
-               void exitNoTransition();
 
                void popTo();
                void deleteTo();
@@ -48,6 +48,11 @@ namespace gallery {
                template <class ...ARGS>
                ucl::NaviItem insertBefore(ARGS &&...args);
 
+               // ucl::IDisposable //
+
+               virtual void dispose() override;
+               virtual bool isDisposed() const final override;
+
        protected:
                Page(ucl::IRefCountObj &rc, const ucl::NaviframeSRef &navi,
                                const ExitRequestHandler &onExitRequest);
index eff0cb08c39568e8d567de40f0c7938f223945da..659c330d9d74a7c756042ede12bb688146ac410a 100644 (file)
@@ -58,6 +58,7 @@ namespace gallery {
        namespace util {
 
                using ucl::util::makeUnique;
+               using ucl::util::dispose;
        }
 }
 
index 4c0fa5389648dce57c58fc03db3fbbfee5d701ee..392ce503bd62dbd8dea1dbb958f7340cc7996716 100644 (file)
@@ -58,9 +58,7 @@ namespace gallery {
        Instance::~Instance()
        {
                stopMediaContentScan();
-               if (const auto page = m_page.lock()) {
-                       page->exitNoTransition();
-               }
+               util::dispose(m_page);
        }
 
        Result Instance::onCreate(IInstanceContext *const context)
@@ -324,12 +322,12 @@ namespace gallery {
        {
                if (isEmpty(m_gallery->getAlbum())) {
                        if (auto page = dynamicRefCast<ThumbnailPage>(m_page).lock()) {
-                               page->exitNoTransition();
+                               util::dispose(page);
                                createNoContentPage();
                        }
                } else {
                        if (auto page = dynamicRefCast<NoContentPage>(m_page).lock()) {
-                               page->exitNoTransition();
+                               util::dispose(page);
                                createThumbnailPage();
                        }
                }
index de4b8ebf169c3455034dcd9b2ddf2533f0dc0f34..3ba8919318150c24fe241783317ee018e9b979aa 100644 (file)
@@ -104,20 +104,27 @@ namespace gallery {
                        m_navi->pop();
                        m_item = nullptr;
                } else {
-                       exitNoTransition();
+                       dispose();
                }
        }
 
-       void Page::exitNoTransition()
+       void Page::dispose()
        {
-               if (isAtTop()) {
-                       m_item.del();
-                       dispatchTopPageChanged();
-               } else if (m_item) {
-                       m_item.del();
+               if (m_item) {
+                       if (isAtTop()) {
+                               m_item.del();
+                               dispatchTopPageChanged();
+                       } else {
+                               m_item.del();
+                       }
                }
        }
 
+       bool Page::isDisposed() const
+       {
+               return m_item;
+       }
+
        void Page::popTo()
        {
                if (m_item && !isAtTop()) {
index 9071dacec4e4c55590b538401c8acf1aadfdebbe..cfb0412fbc5f112f2c670d1641b137ece177b36b 100644 (file)
@@ -224,9 +224,7 @@ namespace gallery {
                                        PreviewPage::onAlbumChanged, asWeak(*this)));
                }
                closeTempViews();
-               if (const auto page = m_page.lock()) {
-                       page->exitNoTransition();
-               }
+               util::dispose(m_page);
                if (m_imageGrid) {
                        m_imageGrid->setListener(nullptr);
                }
@@ -635,9 +633,7 @@ namespace gallery {
 
        void PreviewPage::closeTempViews()
        {
-               if (const auto alert = m_alert.lock()) {
-                       alert->dispose();
-               }
+               util::dispose(m_alert);
                if (m_more) {
                        m_more->setOpened(false);
                }
index 398d7d652f16f4ce7439572894bdaedd11077f77..abd1ce27378915e27b6224870a44db1797c79fee 100644 (file)
@@ -153,9 +153,7 @@ namespace gallery {
                if (m_more) {
                        m_more->setOpened(false);
                }
-               if (const auto page = m_page.lock()) {
-                       page->exitNoTransition();
-               }
+               util::dispose(m_page);
                if (m_imageGrid) {
                        m_imageGrid->setListener(nullptr);
                }
index 19858a0dc4e25a5ad3761e9dbf01c2d189e776e8..ebeb3f7dc44e19479c5009a7240cda2b3458707d 100644 (file)
@@ -158,9 +158,7 @@ namespace gallery {
 
        VideoPlayerPage::~VideoPlayerPage()
        {
-               if (const auto alert = m_alert.lock()) {
-                       alert->dispose();
-               }
+               util::dispose(m_alert);
 
                if (m_soundMgr) {
                        m_soundMgr->delMediaDeviceStateChangeHandler(WEAK_DELEGATE(
index 87485b0506f76f4ca7b3e6b8b1c97758802cbf25..117d3de461eabd27f94c898c50c3a412a939a56b 100644 (file)
@@ -18,6 +18,7 @@
 #define __UCL_UTIL_HELPERS_H__
 
 #include "types/baseTypes.h"
+#include "types/classTypes.h"
 
 namespace ucl {
 
@@ -108,6 +109,16 @@ namespace ucl { namespace util {
 
        template <class T>
        std::unique_ptr<T> makeUnique(T *p);
+
+       template <class T, class = typename std::enable_if<
+                       std::is_convertible<T *, IDisposable *>::value>::type>
+       inline void dispose(T *&p) noexcept
+       {
+               if (p) {
+                       p->dispose();
+                       p = nullptr;
+               }
+       }
 }}
 
 #include "helpers.hpp"
index bef907b2b9172b184a96fc875f5fa6b9cb2d9eb7..5ce25a304c9b686bb1d6af0e8699a5b2f3e204d5 100644 (file)
 
 namespace ucl {
 
+       // Misc //
+
+       namespace util {
+
+               template <class T, class = typename std::enable_if<
+                               std::is_convertible<T *, IDisposable *>::value>::type>
+               inline void dispose(SharedRef<T> &r) noexcept
+               {
+                       if (r) {
+                               r->dispose();
+                               r.reset();
+                       }
+               }
+
+               template <class T, class = typename std::enable_if<
+                               std::is_convertible<T *, IDisposable *>::value>::type>
+               inline void dispose(WeakRef<T> &r) noexcept
+               {
+                       if (const auto shared = r.lock()) {
+                               shared->dispose();
+                               r.reset();
+                       }
+               }
+       }
+
        // Generic casting functions //
 
        template <class T, class U>