From 87c6119c089ff17bbe8bc18d7485297e966ffb69 Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Tue, 2 Apr 2013 10:54:48 -0700 Subject: [PATCH] Bug 826639 - Force pending about:home updates to happen onDraw. r=lucasr --- .../android/base/widget/AboutHomeContent.java | 37 ++++++++++++++++--- mobile/android/base/widget/TopSitesView.java | 2 + 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/mobile/android/base/widget/AboutHomeContent.java b/mobile/android/base/widget/AboutHomeContent.java index 1bb2047ca73a..d10a827e95cc 100644 --- a/mobile/android/base/widget/AboutHomeContent.java +++ b/mobile/android/base/widget/AboutHomeContent.java @@ -14,6 +14,7 @@ import org.mozilla.gecko.util.ThreadUtils; import android.content.Context; import android.database.ContentObserver; +import android.graphics.Canvas; import android.util.AttributeSet; import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextMenu.ContextMenuInfo; @@ -45,6 +46,7 @@ public class AboutHomeContent extends ScrollView private Context mContext; private BrowserApp mActivity; private UriLoadCallback mUriLoadCallback = null; + private EnumSet mPendingUpdates = EnumSet.noneOf(UpdateFlags.class); private ContentObserver mTabsContentObserver = null; @@ -155,19 +157,44 @@ public class AboutHomeContent extends ScrollView } public void update(final EnumSet flags) { - ThreadUtils.postToBackgroundThread(new Runnable() { + synchronized (mPendingUpdates) { + for (UpdateFlags flag : flags) { + if (!mPendingUpdates.contains(flag)) + mPendingUpdates.add(flag); + } + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + // if any updates are pending, process them on a background thread + processPendingUpdates(); + } + + void processPendingUpdates() { + // during startup, this may be called before init() + final EnumSet copiedUpdates; + synchronized (mPendingUpdates) { + if (mPendingUpdates.isEmpty()) + return; + copiedUpdates = mPendingUpdates.clone(); + mPendingUpdates = EnumSet.noneOf(UpdateFlags.class); + } + + ThreadUtils.getBackgroundHandler().post(new Runnable() { @Override public void run() { - if (flags.contains(UpdateFlags.TOP_SITES)) + if (copiedUpdates.contains(UpdateFlags.TOP_SITES)) loadTopSites(); - if (flags.contains(UpdateFlags.PREVIOUS_TABS)) + if (copiedUpdates.contains(UpdateFlags.PREVIOUS_TABS)) readLastTabs(); - if (flags.contains(UpdateFlags.RECOMMENDED_ADDONS)) + if (copiedUpdates.contains(UpdateFlags.RECOMMENDED_ADDONS)) readRecommendedAddons(); - if (flags.contains(UpdateFlags.REMOTE_TABS)) + if (copiedUpdates.contains(UpdateFlags.REMOTE_TABS)) loadRemoteTabs(); } }); diff --git a/mobile/android/base/widget/TopSitesView.java b/mobile/android/base/widget/TopSitesView.java index 2dda137378ca..835b878fdaea 100644 --- a/mobile/android/base/widget/TopSitesView.java +++ b/mobile/android/base/widget/TopSitesView.java @@ -255,6 +255,7 @@ public class TopSitesView extends GridView { } catch (OutOfMemoryError oom) { Log.e(LOGTAG, "Unable to load thumbnail bitmap", oom); thumbnailView.setImageResource(R.drawable.abouthome_thumbnail_bg); + thumbnailView.setBackgroundColor(mThumbnailBackground); thumbnailView.setScaleType(ImageView.ScaleType.FIT_CENTER); } } @@ -274,6 +275,7 @@ public class TopSitesView extends GridView { if (TextUtils.isEmpty(url)) { holder.thumbnailView.setImageResource(R.drawable.abouthome_thumbnail_add); holder.thumbnailView.setScaleType(ImageView.ScaleType.FIT_CENTER); + holder.thumbnailView.setBackgroundColor(mThumbnailBackground); } else { displayThumbnail(view, thumbnails.get(url)); }