From 07b82a9779269c74886513e8e2dd823cf6f8f997 Mon Sep 17 00:00:00 2001 From: Mark Finkle Date: Mon, 12 Dec 2011 13:50:35 -0500 Subject: [PATCH] Bug 709103 - Optimize creating and saving thumbnail bitmaps r=blassey a=java-only --- mobile/android/base/GeckoApp.java | 42 ++++++++++++++++++------------- mobile/android/base/Tab.java | 5 ++-- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index bb5fbd14d0c7..0937fa7f3dff 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -563,21 +563,26 @@ abstract public class GeckoApp super.onSaveInstanceState(outState); if (mOwnActivityDepth > 0) return; // we're showing one of our own activities and likely won't get paged out + if (outState == null) outState = new Bundle(); - mRememberLastScreenRunnable.run(); + + new SessionSnapshotRunnable(null).run(); + outState.putString(SAVED_STATE_URI, mLastUri); outState.putString(SAVED_STATE_TITLE, mLastTitle); outState.putString(SAVED_STATE_VIEWPORT, mLastViewport); outState.putByteArray(SAVED_STATE_SCREEN, mLastScreen); } - Runnable mRememberLastScreenRunnable = new Runnable() {; - public void run() { - synchronized (this) { - if (mUserDefinedProfile) - return; + public class SessionSnapshotRunnable implements Runnable { + Tab mThumbnailTab; + SessionSnapshotRunnable(Tab thumbnailTab) { + mThumbnailTab = thumbnailTab; + } + public void run() { + synchronized (mSoftwareLayerClient) { Tab tab = Tabs.getInstance().getSelectedTab(); if (tab == null) return; @@ -598,6 +603,10 @@ abstract public class GeckoApp mLastTitle = lastHistoryEntry.mTitle; Bitmap bitmap = mSoftwareLayerClient.getBitmap(); if (bitmap != null) { + // Make a thumbnail for the given tab, if it's still selected + if (tab == mThumbnailTab) + mThumbnailTab.updateThumbnail(bitmap); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos); mLastScreen = bos.toByteArray(); @@ -606,7 +615,7 @@ abstract public class GeckoApp } } } - }; + } private void maybeCancelFaviconLoad(Tab tab) { long faviconLoadId = tab.getFaviconLoadId(); @@ -928,7 +937,7 @@ abstract public class GeckoApp mMainHandler.postAtFrontOfQueue(r); } - public class AboutHomeRunnable implements Runnable { + public class AboutHomeRunnable implements Runnable { boolean mShow; AboutHomeRunnable(boolean show) { mShow = show; @@ -1023,10 +1032,6 @@ abstract public class GeckoApp } void handleSelectTab(int tabId) { - Tab selTab = Tabs.getInstance().getSelectedTab(); - if (selTab != null) - selTab.updateThumbnail(mSoftwareLayerClient.getBitmap()); - final Tab tab = Tabs.getInstance().selectTab(tabId); if (tab == null) return; @@ -1084,6 +1089,9 @@ abstract public class GeckoApp onTabsChanged(tab); } }); + + Runnable r = new SessionSnapshotRunnable(tab); + GeckoAppShell.getHandler().postDelayed(r, 500); } void handleShowToast(final String message, final String duration) { @@ -1106,18 +1114,17 @@ abstract public class GeckoApp tab.updateTitle(title); + // Make the UI changes mMainHandler.post(new Runnable() { public void run() { loadFavicon(tab); - if (Tabs.getInstance().isSelectedTab(tab)) { + if (Tabs.getInstance().isSelectedTab(tab)) mBrowserToolbar.setTitle(tab.getDisplayTitle()); - tab.updateThumbnail(mSoftwareLayerClient.getBitmap()); - } + onTabsChanged(tab); } }); - GeckoAppShell.getHandler().postDelayed(mRememberLastScreenRunnable, 500); } void handleTitleChanged(int tabId, String title) { @@ -1502,7 +1509,8 @@ abstract public class GeckoApp { Log.i(LOGTAG, "pause"); - GeckoAppShell.getHandler().post(mRememberLastScreenRunnable); + Runnable r = new SessionSnapshotRunnable(null); + GeckoAppShell.getHandler().post(r); GeckoAppShell.sendEventToGecko(new GeckoEvent(GeckoEvent.ACTIVITY_PAUSING)); // The user is navigating away from this activity, but nothing diff --git a/mobile/android/base/Tab.java b/mobile/android/base/Tab.java index 55d7b17306bf..9f81791b23a0 100644 --- a/mobile/android/base/Tab.java +++ b/mobile/android/base/Tab.java @@ -58,6 +58,7 @@ import org.mozilla.gecko.db.BrowserDB; public class Tab { public static enum AgentMode { MOBILE, DESKTOP }; private static final String LOGTAG = "GeckoTab"; + private static final int kThumbnailSize = 96; static int sMinDim = 0; private int mId; @@ -141,7 +142,8 @@ public class Tab { sMinDim = Math.min(metrics.widthPixels, metrics.heightPixels); } if (b != null) { - Bitmap bitmap = Bitmap.createBitmap(b, 0, 0, sMinDim, sMinDim); + Bitmap cropped = Bitmap.createBitmap(b, 0, 0, sMinDim, sMinDim); + Bitmap bitmap = Bitmap.createScaledBitmap(cropped, kThumbnailSize, kThumbnailSize, false); mThumbnail = new BitmapDrawable(bitmap); saveThumbnailToDB((BitmapDrawable) mThumbnail); } else { @@ -407,5 +409,4 @@ public class Tab { public AgentMode getAgentMode() { return mAgentMode; } - }