зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1238656 - Part 2: introduce FLAG_BYPASS_CACHE_WHEN_DOWNLOADING_ICONS to avoid icon downscaling r=mcomella
MozReview-Commit-ID: BXLqJ9wjzf7 --HG-- extra : rebase_source : af06ecf65b5577ae7c6415f56aaaf1aa1e44d251
This commit is contained in:
Родитель
0cc2273ad4
Коммит
f897ab1357
|
@ -25,12 +25,14 @@ import org.mozilla.gecko.util.IOUtils;
|
||||||
import org.mozilla.gecko.util.ThreadUtils;
|
import org.mozilla.gecko.util.ThreadUtils;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
import java.util.concurrent.RejectedExecutionException;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
@ -50,6 +52,14 @@ public class LoadFaviconTask {
|
||||||
private static final HashMap<String, LoadFaviconTask> loadsInFlight = new HashMap<>();
|
private static final HashMap<String, LoadFaviconTask> loadsInFlight = new HashMap<>();
|
||||||
|
|
||||||
public static final int FLAG_PERSIST = 1;
|
public static final int FLAG_PERSIST = 1;
|
||||||
|
/**
|
||||||
|
* Bypass all caches - this is used to directly retrieve the requested icon. Without this flag,
|
||||||
|
* favicons will first be pushed into the memory cache (and possibly permanent cache if using FLAG_PERSIST),
|
||||||
|
* where they will be downscaled to the maximum cache size, before being retrieved from the cache (resulting
|
||||||
|
* in a possibly smaller icon size).
|
||||||
|
*/
|
||||||
|
public static final int FLAG_BYPASS_CACHE_WHEN_DOWNLOADING_ICONS = 2;
|
||||||
|
|
||||||
private static final int MAX_REDIRECTS_TO_FOLLOW = 5;
|
private static final int MAX_REDIRECTS_TO_FOLLOW = 5;
|
||||||
// The default size of the buffer to use for downloading Favicons in the event no size is given
|
// The default size of the buffer to use for downloading Favicons in the event no size is given
|
||||||
// by the server.
|
// by the server.
|
||||||
|
@ -417,11 +427,14 @@ public class LoadFaviconTask {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LoadFaviconResult loadedBitmaps = null;
|
||||||
// If there are no valid bitmaps decoded, the returned LoadFaviconResult is null.
|
// If there are no valid bitmaps decoded, the returned LoadFaviconResult is null.
|
||||||
LoadFaviconResult loadedBitmaps = loadFaviconFromDb(db);
|
if ((flags & FLAG_BYPASS_CACHE_WHEN_DOWNLOADING_ICONS) == 0) {
|
||||||
|
loadedBitmaps = loadFaviconFromDb(db);
|
||||||
if (loadedBitmaps != null) {
|
if (loadedBitmaps != null) {
|
||||||
return pushToCacheAndGetResult(loadedBitmaps);
|
return pushToCacheAndGetResult(loadedBitmaps);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (onlyFromLocal || isCancelled()) {
|
if (onlyFromLocal || isCancelled()) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -445,11 +458,25 @@ public class LoadFaviconTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loadedBitmaps != null) {
|
if (loadedBitmaps != null) {
|
||||||
|
if ((flags & FLAG_BYPASS_CACHE_WHEN_DOWNLOADING_ICONS) == 0) {
|
||||||
// Fetching bytes to store can fail. saveFaviconToDb will
|
// Fetching bytes to store can fail. saveFaviconToDb will
|
||||||
// do the right thing, but we still choose to cache the
|
// do the right thing, but we still choose to cache the
|
||||||
// downloaded icon in memory.
|
// downloaded icon in memory.
|
||||||
saveFaviconToDb(db, loadedBitmaps.getBytesForDatabaseStorage());
|
saveFaviconToDb(db, loadedBitmaps.getBytesForDatabaseStorage());
|
||||||
return pushToCacheAndGetResult(loadedBitmaps);
|
return pushToCacheAndGetResult(loadedBitmaps);
|
||||||
|
} else {
|
||||||
|
final Map<Integer, Bitmap> iconMap = new HashMap<>();
|
||||||
|
final List<Integer> sizes = new ArrayList<>();
|
||||||
|
|
||||||
|
while (loadedBitmaps.getBitmaps().hasNext()) {
|
||||||
|
final Bitmap b = loadedBitmaps.getBitmaps().next();
|
||||||
|
iconMap.put(b.getWidth(), b);
|
||||||
|
sizes.add(b.getWidth());
|
||||||
|
}
|
||||||
|
|
||||||
|
int bestSize = Favicons.selectBestSizeFromList(sizes, targetWidth);
|
||||||
|
return iconMap.get(bestSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isUsingDefaultURL) {
|
if (isUsingDefaultURL) {
|
||||||
|
@ -545,11 +572,15 @@ public class LoadFaviconTask {
|
||||||
|
|
||||||
private void processResult(Bitmap image) {
|
private void processResult(Bitmap image) {
|
||||||
Favicons.removeLoadTask(id);
|
Favicons.removeLoadTask(id);
|
||||||
Bitmap scaled = image;
|
final Bitmap scaled;
|
||||||
|
|
||||||
// Notify listeners, scaling if required.
|
// Notify listeners, scaling if required.
|
||||||
if (targetWidth != -1 && image != null && image.getWidth() != targetWidth) {
|
if ((flags & FLAG_BYPASS_CACHE_WHEN_DOWNLOADING_ICONS) != 0) {
|
||||||
|
scaled = Bitmap.createScaledBitmap(image, targetWidth, targetWidth, true);
|
||||||
|
} else if (targetWidth != -1 && image != null && image.getWidth() != targetWidth) {
|
||||||
scaled = Favicons.getSizedFaviconFromCache(faviconURL, targetWidth);
|
scaled = Favicons.getSizedFaviconFromCache(faviconURL, targetWidth);
|
||||||
|
} else {
|
||||||
|
scaled = image;
|
||||||
}
|
}
|
||||||
|
|
||||||
Favicons.dispatchResult(pageUrl, faviconURL, scaled, listener);
|
Favicons.dispatchResult(pageUrl, faviconURL, scaled, listener);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче