Update wallpaper window pages only at processing

Fixes: 207597806
Test: manually create pages
Change-Id: I8138d42d6a2066531ec332e3a510edbd95151699
This commit is contained in:
Jay Aliomer
2021-11-30 14:01:02 -05:00
parent 8528d07450
commit 815497e1ab

View File

@@ -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