summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/service/wallpaper/WallpaperService.java134
1 files changed, 15 insertions, 119 deletions
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 7b8410bba6ec..b68717a9b457 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -196,7 +196,7 @@ public abstract class WallpaperService extends Service {
EngineWindowPage[] mWindowPages = new EngineWindowPage[1];
Bitmap mLastScreenshot;
int mLastWindowPage = -1;
- float mLastPageOffset = 0;
+ private boolean mResetWindowPages;
// Copies from mIWallpaperEngine.
HandlerCaller mCaller;
@@ -787,7 +787,7 @@ public abstract class WallpaperService extends Service {
Log.w(TAG, "Can't notify system because wallpaper connection "
+ "was not established.");
}
- resetWindowPages();
+ mResetWindowPages = true;
processLocalColors(mPendingXOffset, mPendingXOffsetStep);
} catch (RemoteException e) {
Log.w(TAG, "Can't notify system because wallpaper connection was lost.", e);
@@ -1515,6 +1515,7 @@ public abstract class WallpaperService extends Service {
float finalXOffsetStep = xOffsetStep;
float finalXOffset = xOffset;
mHandler.post(() -> {
+ resetWindowPages();
int xPage = xCurrentPage;
EngineWindowPage current;
if (mWindowPages.length == 0 || (mWindowPages.length != xPages)) {
@@ -1699,15 +1700,15 @@ public abstract class WallpaperService extends Service {
private void resetWindowPages() {
if (supportsLocalColorExtraction()) return;
+ if (!mResetWindowPages) return;
+ mResetWindowPages = false;
mLastWindowPage = -1;
- mHandler.post(() -> {
- for (int i = 0; i < mWindowPages.length; i++) {
- EngineWindowPage page = mWindowPages[i];
- if (page != null) {
- page.setLastUpdateTime(0L);
- }
+ for (int i = 0; i < mWindowPages.length; i++) {
+ EngineWindowPage page = mWindowPages[i];
+ if (page != null) {
+ page.setLastUpdateTime(0L);
}
- });
+ }
}
private int getRectFPage(RectF area, float step) {
@@ -1730,40 +1731,8 @@ public abstract class WallpaperService extends Service {
if (DEBUG) {
Log.d(TAG, "addLocalColorsAreas adding local color areas " + regions);
}
-
- List<WallpaperColors> colors = getLocalWallpaperColors(regions);
mHandler.post(() -> {
- float step = mPendingXOffsetStep;
- if (!validStep(step)) {
- step = 0;
- }
- for (int i = 0; i < regions.size(); i++) {
- RectF area = regions.get(i);
- if (!isValid(area)) continue;
- int pageInx = getRectFPage(area, step);
- // no page should be null
- EngineWindowPage page = mWindowPages[pageInx];
-
- if (page != null) {
- mLocalColorAreas.add(area);
- page.addArea(area);
- WallpaperColors color = colors.get(i);
- if (color != null && !color.equals(page.getColors(area))) {
- page.addWallpaperColors(area, color);
- }
- } else {
- mLocalColorsToAdd.add(area);
- }
- }
- for (int i = 0; i < colors.size() && colors.get(i) != null; i++) {
- try {
- mConnection.onLocalWallpaperColorsChanged(regions.get(i), colors.get(i),
- mDisplayContext.getDisplayId());
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling Connection.onLocalWallpaperColorsChanged", e);
- return;
- }
- }
+ mLocalColorsToAdd.addAll(regions);
processLocalColors(mPendingXOffset, mPendingYOffset);
});
@@ -1784,88 +1753,15 @@ public abstract class WallpaperService extends Service {
if (!validStep(step)) {
return;
}
- for (int i = 0; i < regions.size(); i++) {
- RectF area = regions.get(i);
- if (!isValid(area)) continue;
- int pageInx = getRectFPage(area, step);
- // no page should be null
- EngineWindowPage page = mWindowPages[pageInx];
- if (page != null) {
- page.removeArea(area);
+ for (int i = 0; i < mWindowPages.length; i++) {
+ for (int j = 0; j < regions.size(); j++) {
+ EngineWindowPage page = mWindowPages[i];
+ if (page != null) page.removeArea(regions.get(j));
}
}
});
}
- private @NonNull List<WallpaperColors> getLocalWallpaperColors(@NonNull List<RectF> areas) {
- ArrayList<WallpaperColors> colors = new ArrayList<>(areas.size());
- float step = mPendingXOffsetStep;
- if (!validStep(step)) {
- if (DEBUG) Log.d(TAG, "invalid step size " + step);
- step = 1.0f;
- }
- for (int i = 0; i < areas.size(); i++) {
- RectF currentArea = areas.get(i);
- if (currentArea == null || !isValid(currentArea)) {
- Log.wtf(TAG, "invalid local area " + currentArea);
- continue;
- }
- EngineWindowPage page;
- RectF area;
- int pageIndx;
- synchronized (mLock) {
- pageIndx = getRectFPage(currentArea, step);
- if (mWindowPages.length == 0 || pageIndx < 0
- || pageIndx > mWindowPages.length || !isValid(currentArea)) {
- colors.add(null);
- continue;
- }
- area = generateSubRect(currentArea, pageIndx, mWindowPages.length);
- page = mWindowPages[pageIndx];
- }
- if (page == null) {
- colors.add(null);
- continue;
- }
- float finalStep = step;
- int finalPageIndx = pageIndx;
- Bitmap screenShot = page.getBitmap();
- if (screenShot == null) screenShot = mLastScreenshot;
- if (screenShot == null || screenShot.isRecycled()) {
- if (DEBUG) {
- Log.d(TAG, "invalid bitmap " + screenShot
- + " for page " + finalPageIndx);
- }
- page.setLastUpdateTime(0);
- colors.add(null);
- continue;
- }
- Bitmap b = screenShot;
- Rect subImage = new Rect(
- Math.round(area.left * b.getWidth() / finalStep),
- Math.round(area.top * b.getHeight()),
- Math.round(area.right * b.getWidth() / finalStep),
- Math.round(area.bottom * b.getHeight())
- );
- subImage = fixRect(b, subImage);
- if (DEBUG) {
- Log.d(TAG, "getting subbitmap of " + subImage.toString()
- + " for RectF " + area.toString()
- + " screenshot width " + screenShot.getWidth() + " height "
- + screenShot.getHeight());
- }
- Bitmap colorImg = Bitmap.createBitmap(screenShot,
- subImage.left, subImage.top, subImage.width(), subImage.height());
- if (DEBUG) {
- Log.d(TAG, "created bitmap " + colorImg.getWidth() + ", "
- + colorImg.getHeight());
- }
- WallpaperColors color = WallpaperColors.fromBitmap(colorImg);
- colors.add(color);
- }
- return colors;
- }
-
// fix the rect to be included within the bounds of the bitmap
private Rect fixRect(Bitmap b, Rect r) {
r.left = r.left >= r.right || r.left >= b.getWidth() || r.left > 0