TizenRefApp-9559 [Gallery] Fix issue with invalid thumbnails when adding 00/154600/1 submit/tizen_4.0/20171018.092019 tizen_4.0.IoT.p2_release tizen_4.0.m2_release
authorIgor Nazarov <i.nazarov@samsung.com>
Tue, 10 Oct 2017 16:48:55 +0000 (19:48 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Tue, 10 Oct 2017 16:48:55 +0000 (19:48 +0300)
new images

Change-Id: I1d218ebac51946abc4b98d6d439dba10dac83db3

gallery/model/MediaItem.cpp
gallery/model/MediaItem.h
gallery/presenters/pages/PreviewPage.cpp
gallery/presenters/pages/ThumbnailPage.cpp
gallery/view/ImageGrid.cpp

index aec6b5d214acbf102cfdf603963591e16e483ab4..fd21ffc18adfa0fad6c86c2fa728fba11a71bbe4 100644 (file)
@@ -233,7 +233,9 @@ namespace gallery {
 
        MediaItem::~MediaItem()
        {
-               cancelThumbnailPathGet();
+               if (m_thumbCbProxy) {
+                       cancelThumbnailPathGet();
+               }
        }
 
        MediaItemSRef MediaItem::newInstance(const media_info_h media)
@@ -459,11 +461,12 @@ namespace gallery {
                }
 
                if (m_thumbCbProxy) {
-                       m_thumbCbProxy->callback = cb;
+                       m_thumbCbProxy->callbacks += cb;
                        return RES_FALSE;
                }
 
-               auto cbProxy = util::makeUnique(new ThumbCbProxy{this, cb});
+               auto cbProxy = util::makeUnique(new ThumbCbProxy{this});
+               cbProxy->callbacks += cb;
 
                {
                        MutexLock lock(getMediaMutex());
@@ -478,12 +481,21 @@ namespace gallery {
                return RES_FALSE;
        }
 
-       void MediaItem::cancelThumbnailPathGet() const
+       void MediaItem::cancelThumbnailPathGet(const ThumbnailPathGetCb &cb) const
        {
                if (!m_thumbCbProxy) {
                        return;
                }
 
+               m_thumbCbProxy->callbacks -= cb;
+
+               if (isEmpty(m_thumbCbProxy->callbacks)) {
+                       cancelThumbnailPathGet();
+               }
+       }
+
+       void MediaItem::cancelThumbnailPathGet() const
+       {
                MutexLock lock(getMediaMutex());
 
                const int ret = media_info_cancel_thumbnail(m_media);
@@ -528,10 +540,10 @@ namespace gallery {
                        item->m_media = nullptr;
                }
 
-               const auto proxy = std::move(*item->m_thumbCbProxy);
+               auto proxy = std::move(*item->m_thumbCbProxy);
 
                item->m_thumbCbProxy.reset();
 
-               proxy.callback(result, proxy.item->m_thumbPath);
+               proxy.callbacks.dispatch(result, proxy.item->m_thumbPath);
        }
 }
index 439de369ab9cdd5b4bd9922f4479db89c9f42478..0aa8a01da4975373fa1e3b73939db630fa4c829a 100644 (file)
@@ -22,6 +22,7 @@
 #include <media_content.h>
 
 #include "ucl/misc/AutoHandle.h"
+#include "ucl/misc/Event.h"
 
 #include "IJob.h"
 
@@ -81,7 +82,7 @@ namespace gallery {
                const std::string &getFilePath() const;
 
                ucl::Result getThumbnailPath(const ThumbnailPathGetCb &cb) const;
-               void cancelThumbnailPathGet() const;
+               void cancelThumbnailPathGet(const ThumbnailPathGetCb &cb) const;
 
                ucl::Result removeFile();
                ucl::Result saveToDevice();
@@ -97,13 +98,14 @@ namespace gallery {
 
        private:
                ucl::Result initThumbPath(media_info_h media) const;
+               void cancelThumbnailPathGet() const;
 
        private:
                // XXX This proxy is needed to deal with cases when
                // media_thumbnail_completed_cb can't be cancelled
                struct ThumbCbProxy final {
                        const MediaItem *item;
-                       ThumbnailPathGetCb callback;
+                       ucl::Event<ThumbnailPathGetCb> callbacks;
 
                        void completeCb(media_content_error_e error, const char *path);
                };
index f38a7c8b5ce7c8b3a95375b84c56ee9754c14fe7..19c00da3643e97b1c7d2c1ce402f4f0d00b50f4c 100644 (file)
@@ -150,7 +150,8 @@ namespace gallery {
 
                void unrealize()
                {
-                       m_media->cancelThumbnailPathGet();
+                       m_media->cancelThumbnailPathGet(
+                                       WEAK_DELEGATE(Item::onThumbnail, asWeak(*this)));
                }
 
                MediaItemSRef getMedia()
index 38845cca82d8c17c8031ca8bd597726f6e2bc61e..d8b1afb68f510f62c2da30702a1916d72055ef29 100644 (file)
@@ -107,7 +107,8 @@ namespace gallery {
 
                virtual ~RealizedItem()
                {
-                       m_parent.m_mediaItems[m_index]->cancelThumbnailPathGet();
+                       m_parent.m_mediaItems[m_index]->cancelThumbnailPathGet(
+                                       WEAK_DELEGATE(RealizedItem::onThumbnail, asWeak(this)));
                }
 
                int getIndex() const
index 9c14976f16945cec1f95f344b4428bef4e7fc11b..a456e0ad467abc22c2725380dc7b3679e79bb087 100644 (file)
@@ -334,6 +334,10 @@ namespace gallery {
                                                listener->onItemRealized(itemIndex);
                                        }
 
+                                       if (!m_wasUpdated) {
+                                               update({"", "", 0, 0, 0});
+                                       }
+
                                        makeWhite(m_btn);
                                } else {
                                        makeTransparent(m_btn);