VisD update for the PipAppIconOverlay 2/N

We try to use the same icon size as in Launcher for the app icon overlay
if possible and cap it to 72dp.

Video: http://recall/-/aaaaaabFQoRHlzixHdtY/ha3ebrRk0hAEyU8GSWBrYE
Bug: Bug: 271912318
Test: manual with 4x4 and 5x5 grid, see the video
Change-Id: Ida1ed19157ed613c29318e51d41483177783eb25
This commit is contained in:
Hongwei Wang
2023-03-15 14:32:14 -07:00
parent b9b825843a
commit 99f800b1ca
7 changed files with 61 additions and 28 deletions

View File

@@ -75,4 +75,9 @@ interface IPip {
* Sets the height and visibility of the Launcher keep clear area.
*/
oneway void setLauncherKeepClearAreaHeight(boolean visible, int height) = 6;
/**
* Sets the app icon size in pixel used by Launcher
*/
oneway void setLauncherAppIconSize(int iconSizePx) = 7;
}

View File

@@ -371,10 +371,11 @@ public class PipAnimationController {
new PipContentOverlay.PipSnapshotOverlay(snapshot, sourceRectHint));
}
void setAppIconContentOverlay(Context context, Rect bounds, ActivityInfo activityInfo) {
void setAppIconContentOverlay(Context context, Rect bounds, ActivityInfo activityInfo,
int appIconSizePx) {
reattachContentOverlay(
new PipContentOverlay.PipAppIconOverlay(context, bounds,
() -> new IconProvider(context).getIcon(activityInfo)));
new IconProvider(context).getIcon(activityInfo), appIconSizePx));
}
private void reattachContentOverlay(PipContentOverlay overlay) {

View File

@@ -86,6 +86,7 @@ public class PipBoundsState {
private int mStashedState = STASH_TYPE_NONE;
private int mStashOffset;
private @Nullable PipReentryState mPipReentryState;
private final LauncherState mLauncherState = new LauncherState();
private final @Nullable PipSizeSpecHandler mPipSizeSpecHandler;
private @Nullable ComponentName mLastPipComponentName;
private int mDisplayId = Display.DEFAULT_DISPLAY;
@@ -497,6 +498,10 @@ public class PipBoundsState {
mOnPipExclusionBoundsChangeCallbacks.remove(onPipExclusionBoundsChangeCallback);
}
public LauncherState getLauncherState() {
return mLauncherState;
}
/** Source of truth for the current bounds of PIP that may be in motion. */
public static class MotionBoundsState {
/** The bounds used when PIP is in motion (e.g. during a drag or animation) */
@@ -549,6 +554,25 @@ public class PipBoundsState {
}
}
/** Data class for Launcher state. */
public static final class LauncherState {
private int mAppIconSizePx;
public void setAppIconSizePx(int appIconSizePx) {
mAppIconSizePx = appIconSizePx;
}
public int getAppIconSizePx() {
return mAppIconSizePx;
}
void dump(PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " ";
pw.println(prefix + LauncherState.class.getSimpleName());
pw.println(innerPrefix + "getAppIconSizePx=" + getAppIconSizePx());
}
}
static final class PipReentryState {
private static final String TAG = PipReentryState.class.getSimpleName();
@@ -603,6 +627,7 @@ public class PipBoundsState {
} else {
mPipReentryState.dump(pw, innerPrefix);
}
mLauncherState.dump(pw, innerPrefix);
mMotionBoundsState.dump(pw, innerPrefix);
}
}

View File

@@ -32,8 +32,6 @@ import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.window.TaskSnapshot;
import java.util.function.Supplier;
/**
* Represents the content overlay used during the entering PiP animation.
*/
@@ -176,9 +174,8 @@ public abstract class PipContentOverlay {
/** A {@link PipContentOverlay} shows app icon on solid color background. */
public static final class PipAppIconOverlay extends PipContentOverlay {
private static final String TAG = PipAppIconOverlay.class.getSimpleName();
// Align with the practical / reasonable launcher:iconImageSize as in
// vendor/unbundled_google/packages/NexusLauncher/res/xml/device_profiles.xml
private static final int APP_ICON_SIZE_DP = 66;
// The maximum size for app icon in pixel.
private static final int MAX_APP_ICON_SIZE_DP = 72;
private final Context mContext;
private final int mAppIconSizePx;
@@ -188,14 +185,16 @@ public abstract class PipContentOverlay {
private Bitmap mBitmap;
public PipAppIconOverlay(Context context, Rect appBounds, Supplier<Drawable> iconSupplier) {
public PipAppIconOverlay(Context context, Rect appBounds,
Drawable appIcon, int appIconSizePx) {
mContext = context;
mAppIconSizePx = (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, APP_ICON_SIZE_DP,
context.getResources().getDisplayMetrics());
final int maxAppIconSizePx = (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP,
MAX_APP_ICON_SIZE_DP, context.getResources().getDisplayMetrics());
mAppIconSizePx = Math.min(maxAppIconSizePx, appIconSizePx);
mAppBounds = new Rect(appBounds);
mBitmap = Bitmap.createBitmap(appBounds.width(), appBounds.height(),
Bitmap.Config.ARGB_8888);
prepareAppIconOverlay(iconSupplier);
prepareAppIconOverlay(appIcon);
mLeash = new SurfaceControl.Builder(new SurfaceSession())
.setCallsite(TAG)
.setName(LAYER_NAME)
@@ -238,7 +237,7 @@ public abstract class PipContentOverlay {
}
}
private void prepareAppIconOverlay(Supplier<Drawable> iconSupplier) {
private void prepareAppIconOverlay(Drawable appIcon) {
final Canvas canvas = new Canvas();
canvas.setBitmap(mBitmap);
final TypedArray ta = mContext.obtainStyledAttributes(new int[] {
@@ -252,7 +251,6 @@ public abstract class PipContentOverlay {
} finally {
ta.recycle();
}
final Drawable appIcon = iconSupplier.get();
final Rect appIconBounds = new Rect(
mAppBounds.centerX() - mAppIconSizePx / 2,
mAppBounds.centerY() - mAppIconSizePx / 2,

View File

@@ -1610,7 +1610,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
if (SystemProperties.getBoolean(
"persist.wm.debug.enable_pip_app_icon_overlay", true)) {
animator.setAppIconContentOverlay(
mContext, currentBounds, mTaskInfo.topActivityInfo);
mContext, currentBounds, mTaskInfo.topActivityInfo,
mPipBoundsState.getLauncherState().getAppIconSizePx());
} else {
animator.setColorContentOverlay(mContext);
}

View File

@@ -813,7 +813,8 @@ public class PipTransition extends PipTransitionController {
"persist.wm.debug.enable_pip_app_icon_overlay", true)
&& hasTopActivityInfo) {
animator.setAppIconContentOverlay(
mContext, currentBounds, taskInfo.topActivityInfo);
mContext, currentBounds, taskInfo.topActivityInfo,
mPipBoundsState.getLauncherState().getAppIconSizePx());
} else {
animator.setColorContentOverlay(mContext);
}

View File

@@ -938,6 +938,10 @@ public class PipController implements PipTransitionController.PipTransitionCallb
}
}
private void setLauncherAppIconSize(int iconSizePx) {
mPipBoundsState.getLauncherState().setAppIconSizePx(iconSizePx);
}
private void setOnIsInPipStateChangedListener(Consumer<Boolean> callback) {
mOnIsInPipStateChangedListener = callback;
if (mOnIsInPipStateChangedListener != null) {
@@ -1286,26 +1290,26 @@ public class PipController implements PipTransitionController.PipTransitionCallb
public void stopSwipePipToHome(int taskId, ComponentName componentName,
Rect destinationBounds, SurfaceControl overlay) {
executeRemoteCallWithTaskPermission(mController, "stopSwipePipToHome",
(controller) -> {
controller.stopSwipePipToHome(taskId, componentName, destinationBounds,
overlay);
});
(controller) -> controller.stopSwipePipToHome(
taskId, componentName, destinationBounds, overlay));
}
@Override
public void setShelfHeight(boolean visible, int height) {
executeRemoteCallWithTaskPermission(mController, "setShelfHeight",
(controller) -> {
controller.setShelfHeight(visible, height);
});
(controller) -> controller.setShelfHeight(visible, height));
}
@Override
public void setLauncherKeepClearAreaHeight(boolean visible, int height) {
executeRemoteCallWithTaskPermission(mController, "setLauncherKeepClearAreaHeight",
(controller) -> {
controller.setLauncherKeepClearAreaHeight(visible, height);
});
(controller) -> controller.setLauncherKeepClearAreaHeight(visible, height));
}
@Override
public void setLauncherAppIconSize(int iconSizePx) {
executeRemoteCallWithTaskPermission(mController, "setLauncherAppIconSize",
(controller) -> controller.setLauncherAppIconSize(iconSizePx));
}
@Override
@@ -1323,9 +1327,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
@Override
public void setPipAnimationTypeToAlpha() {
executeRemoteCallWithTaskPermission(mController, "setPipAnimationTypeToAlpha",
(controller) -> {
controller.setPinnedStackAnimationType(ANIM_TYPE_ALPHA);
});
(controller) -> controller.setPinnedStackAnimationType(ANIM_TYPE_ALPHA));
}
}
}