Merge "Fix ImageTileSet support for multiple drawables" into sc-dev

This commit is contained in:
Mark Renouf
2021-03-08 19:35:27 +00:00
committed by Android (Google) Code Review
2 changed files with 54 additions and 24 deletions

View File

@@ -15,6 +15,7 @@
*/
package com.android.systemui.screenshot;
import android.annotation.AnyThread;
import android.graphics.Bitmap;
import android.graphics.HardwareRenderer;
import android.graphics.RecordingCanvas;
@@ -26,6 +27,9 @@ import android.util.Log;
import androidx.annotation.UiThread;
import com.android.internal.util.CallbackRegistry;
import com.android.internal.util.CallbackRegistry.NotifierCallback;
import java.util.ArrayList;
import java.util.List;
@@ -34,10 +38,14 @@ import java.util.List;
* <p>
* To display on-screen, use {@link #getDrawable()}.
*/
@UiThread
class ImageTileSet {
private static final String TAG = "ImageTileSet";
private CallbackRegistry<OnBoundsChangedListener, ImageTileSet, Rect> mOnBoundsListeners;
private CallbackRegistry<OnContentChangedListener, ImageTileSet, Rect> mContentListeners;
ImageTileSet(@UiThread Handler handler) {
mHandler = handler;
}
@@ -64,15 +72,43 @@ class ImageTileSet {
private OnContentChangedListener mOnContentChangedListener;
private OnBoundsChangedListener mOnBoundsChangedListener;
void setOnBoundsChangedListener(OnBoundsChangedListener listener) {
mOnBoundsChangedListener = listener;
void addOnBoundsChangedListener(OnBoundsChangedListener listener) {
if (mOnBoundsListeners == null) {
mOnBoundsListeners = new CallbackRegistry<>(
new NotifierCallback<OnBoundsChangedListener, ImageTileSet, Rect>() {
@Override
public void onNotifyCallback(OnBoundsChangedListener callback,
ImageTileSet sender,
int arg, Rect newBounds) {
callback.onBoundsChanged(newBounds.left, newBounds.top, newBounds.right,
newBounds.bottom);
}
});
}
mOnBoundsListeners.add(listener);
}
void setOnContentChangedListener(OnContentChangedListener listener) {
mOnContentChangedListener = listener;
void addOnContentChangedListener(OnContentChangedListener listener) {
if (mContentListeners == null) {
mContentListeners = new CallbackRegistry<>(
new NotifierCallback<OnContentChangedListener, ImageTileSet, Rect>() {
@Override
public void onNotifyCallback(OnContentChangedListener callback,
ImageTileSet sender,
int arg, Rect newBounds) {
callback.onContentChanged();
}
});
}
mContentListeners.add(listener);
}
@AnyThread
void addTile(ImageTile tile) {
if (!mHandler.getLooper().isCurrentThread()) {
mHandler.post(() -> addTile(tile));
return;
}
final Rect newBounds = new Rect(mBounds);
final Rect newRect = tile.getLocation();
mTiles.add(tile);
@@ -84,27 +120,15 @@ class ImageTileSet {
notifyContentChanged();
}
void notifyContentChanged() {
if (mOnContentChangedListener == null) {
return;
}
if (mHandler.getLooper().isCurrentThread()) {
mOnContentChangedListener.onContentChanged();
} else {
mHandler.post(() -> mOnContentChangedListener.onContentChanged());
private void notifyContentChanged() {
if (mContentListeners != null) {
mContentListeners.notifyCallbacks(this, 0, null);
}
}
void notifyBoundsChanged(Rect bounds) {
if (mOnBoundsChangedListener == null) {
return;
}
if (mHandler.getLooper().isCurrentThread()) {
mOnBoundsChangedListener.onBoundsChanged(
bounds.left, bounds.top, bounds.right, bounds.bottom);
} else {
mHandler.post(() -> mOnBoundsChangedListener.onBoundsChanged(
bounds.left, bounds.top, bounds.right, bounds.bottom));
private void notifyBoundsChanged(Rect bounds) {
if (mOnBoundsListeners != null) {
mOnBoundsListeners.notifyCallbacks(this, 0, bounds);
}
}
@@ -180,8 +204,13 @@ class ImageTileSet {
return mBounds.height();
}
@AnyThread
void clear() {
if (mBounds.isEmpty()) {
if (!mHandler.getLooper().isCurrentThread()) {
mHandler.post(this::clear);
return;
}
if (mTiles.isEmpty()) {
return;
}
mBounds.setEmpty();

View File

@@ -38,9 +38,10 @@ public class TiledImageDrawable extends Drawable {
public TiledImageDrawable(ImageTileSet tiles) {
mTiles = tiles;
mTiles.setOnContentChangedListener(this::onContentChanged);
mTiles.addOnContentChangedListener(this::onContentChanged);
}
private void onContentChanged() {
if (mNode != null && mNode.hasDisplayList()) {
mNode.discardDisplayList();