Bug 709103 - Optimize creating and saving thumbnail bitmaps r=blassey a=java-only

This commit is contained in:
Mark Finkle 2011-12-12 13:50:35 -05:00
Родитель 338b725ffd
Коммит 07b82a9779
2 изменённых файлов: 28 добавлений и 19 удалений

Просмотреть файл

@ -563,21 +563,26 @@ abstract public class GeckoApp
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
if (mOwnActivityDepth > 0) if (mOwnActivityDepth > 0)
return; // we're showing one of our own activities and likely won't get paged out return; // we're showing one of our own activities and likely won't get paged out
if (outState == null) if (outState == null)
outState = new Bundle(); outState = new Bundle();
mRememberLastScreenRunnable.run();
new SessionSnapshotRunnable(null).run();
outState.putString(SAVED_STATE_URI, mLastUri); outState.putString(SAVED_STATE_URI, mLastUri);
outState.putString(SAVED_STATE_TITLE, mLastTitle); outState.putString(SAVED_STATE_TITLE, mLastTitle);
outState.putString(SAVED_STATE_VIEWPORT, mLastViewport); outState.putString(SAVED_STATE_VIEWPORT, mLastViewport);
outState.putByteArray(SAVED_STATE_SCREEN, mLastScreen); outState.putByteArray(SAVED_STATE_SCREEN, mLastScreen);
} }
Runnable mRememberLastScreenRunnable = new Runnable() {; public class SessionSnapshotRunnable implements Runnable {
public void run() { Tab mThumbnailTab;
synchronized (this) { SessionSnapshotRunnable(Tab thumbnailTab) {
if (mUserDefinedProfile) mThumbnailTab = thumbnailTab;
return; }
public void run() {
synchronized (mSoftwareLayerClient) {
Tab tab = Tabs.getInstance().getSelectedTab(); Tab tab = Tabs.getInstance().getSelectedTab();
if (tab == null) if (tab == null)
return; return;
@ -598,6 +603,10 @@ abstract public class GeckoApp
mLastTitle = lastHistoryEntry.mTitle; mLastTitle = lastHistoryEntry.mTitle;
Bitmap bitmap = mSoftwareLayerClient.getBitmap(); Bitmap bitmap = mSoftwareLayerClient.getBitmap();
if (bitmap != null) { 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(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos); bitmap.compress(Bitmap.CompressFormat.PNG, 0, bos);
mLastScreen = bos.toByteArray(); mLastScreen = bos.toByteArray();
@ -606,7 +615,7 @@ abstract public class GeckoApp
} }
} }
} }
}; }
private void maybeCancelFaviconLoad(Tab tab) { private void maybeCancelFaviconLoad(Tab tab) {
long faviconLoadId = tab.getFaviconLoadId(); long faviconLoadId = tab.getFaviconLoadId();
@ -928,7 +937,7 @@ abstract public class GeckoApp
mMainHandler.postAtFrontOfQueue(r); mMainHandler.postAtFrontOfQueue(r);
} }
public class AboutHomeRunnable implements Runnable { public class AboutHomeRunnable implements Runnable {
boolean mShow; boolean mShow;
AboutHomeRunnable(boolean show) { AboutHomeRunnable(boolean show) {
mShow = show; mShow = show;
@ -1023,10 +1032,6 @@ abstract public class GeckoApp
} }
void handleSelectTab(int tabId) { void handleSelectTab(int tabId) {
Tab selTab = Tabs.getInstance().getSelectedTab();
if (selTab != null)
selTab.updateThumbnail(mSoftwareLayerClient.getBitmap());
final Tab tab = Tabs.getInstance().selectTab(tabId); final Tab tab = Tabs.getInstance().selectTab(tabId);
if (tab == null) if (tab == null)
return; return;
@ -1084,6 +1089,9 @@ abstract public class GeckoApp
onTabsChanged(tab); onTabsChanged(tab);
} }
}); });
Runnable r = new SessionSnapshotRunnable(tab);
GeckoAppShell.getHandler().postDelayed(r, 500);
} }
void handleShowToast(final String message, final String duration) { void handleShowToast(final String message, final String duration) {
@ -1106,18 +1114,17 @@ abstract public class GeckoApp
tab.updateTitle(title); tab.updateTitle(title);
// Make the UI changes
mMainHandler.post(new Runnable() { mMainHandler.post(new Runnable() {
public void run() { public void run() {
loadFavicon(tab); loadFavicon(tab);
if (Tabs.getInstance().isSelectedTab(tab)) { if (Tabs.getInstance().isSelectedTab(tab))
mBrowserToolbar.setTitle(tab.getDisplayTitle()); mBrowserToolbar.setTitle(tab.getDisplayTitle());
tab.updateThumbnail(mSoftwareLayerClient.getBitmap());
}
onTabsChanged(tab); onTabsChanged(tab);
} }
}); });
GeckoAppShell.getHandler().postDelayed(mRememberLastScreenRunnable, 500);
} }
void handleTitleChanged(int tabId, String title) { void handleTitleChanged(int tabId, String title) {
@ -1502,7 +1509,8 @@ abstract public class GeckoApp
{ {
Log.i(LOGTAG, "pause"); Log.i(LOGTAG, "pause");
GeckoAppShell.getHandler().post(mRememberLastScreenRunnable); Runnable r = new SessionSnapshotRunnable(null);
GeckoAppShell.getHandler().post(r);
GeckoAppShell.sendEventToGecko(new GeckoEvent(GeckoEvent.ACTIVITY_PAUSING)); GeckoAppShell.sendEventToGecko(new GeckoEvent(GeckoEvent.ACTIVITY_PAUSING));
// The user is navigating away from this activity, but nothing // The user is navigating away from this activity, but nothing

Просмотреть файл

@ -58,6 +58,7 @@ import org.mozilla.gecko.db.BrowserDB;
public class Tab { public class Tab {
public static enum AgentMode { MOBILE, DESKTOP }; public static enum AgentMode { MOBILE, DESKTOP };
private static final String LOGTAG = "GeckoTab"; private static final String LOGTAG = "GeckoTab";
private static final int kThumbnailSize = 96;
static int sMinDim = 0; static int sMinDim = 0;
private int mId; private int mId;
@ -141,7 +142,8 @@ public class Tab {
sMinDim = Math.min(metrics.widthPixels, metrics.heightPixels); sMinDim = Math.min(metrics.widthPixels, metrics.heightPixels);
} }
if (b != null) { 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); mThumbnail = new BitmapDrawable(bitmap);
saveThumbnailToDB((BitmapDrawable) mThumbnail); saveThumbnailToDB((BitmapDrawable) mThumbnail);
} else { } else {
@ -407,5 +409,4 @@ public class Tab {
public AgentMode getAgentMode() { public AgentMode getAgentMode() {
return mAgentMode; return mAgentMode;
} }
} }