Using Transaction directly instead of building surface params am: fd2c9eb04e
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/19933596 Change-Id: I5441961aaae960333dbddd6585568412a88f52a1 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -119,6 +119,8 @@ import com.android.quickstep.util.MultiValueUpdateListener;
|
|||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
import com.android.quickstep.util.RemoteAnimationProvider;
|
import com.android.quickstep.util.RemoteAnimationProvider;
|
||||||
import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
import com.android.quickstep.util.StaggeredWorkspaceAnim;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.quickstep.util.SurfaceTransactionApplier;
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.quickstep.util.WorkspaceRevealAnim;
|
import com.android.quickstep.util.WorkspaceRevealAnim;
|
||||||
import com.android.quickstep.views.FloatingWidgetView;
|
import com.android.quickstep.views.FloatingWidgetView;
|
||||||
@@ -133,7 +135,6 @@ import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat;
|
|||||||
import com.android.systemui.shared.system.RemoteAnimationRunnerCompat;
|
import com.android.systemui.shared.system.RemoteAnimationRunnerCompat;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.RemoteTransitionCompat;
|
import com.android.systemui.shared.system.RemoteTransitionCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
import com.android.systemui.shared.system.WindowManagerWrapper;
|
import com.android.systemui.shared.system.WindowManagerWrapper;
|
||||||
import com.android.wm.shell.startingsurface.IStartingWindowListener;
|
import com.android.wm.shell.startingsurface.IStartingWindowListener;
|
||||||
|
|
||||||
@@ -811,10 +812,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<SurfaceParams> params = new ArrayList<>();
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
|
|
||||||
for (int i = appTargets.length - 1; i >= 0; i--) {
|
for (int i = appTargets.length - 1; i >= 0; i--) {
|
||||||
RemoteAnimationTargetCompat target = appTargets[i];
|
RemoteAnimationTargetCompat target = appTargets[i];
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash);
|
SurfaceProperties builder = transaction.forSurface(target.leash);
|
||||||
|
|
||||||
if (target.mode == MODE_OPENING) {
|
if (target.mode == MODE_OPENING) {
|
||||||
matrix.setScale(scale, scale);
|
matrix.setScale(scale, scale);
|
||||||
@@ -835,11 +837,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
|
|
||||||
floatingView.update(mIconAlpha.value, 255, floatingIconBounds, percent, 0f,
|
floatingView.update(mIconAlpha.value, 255, floatingIconBounds, percent, 0f,
|
||||||
mWindowRadius.value * scale, true /* isOpening */);
|
mWindowRadius.value * scale, true /* isOpening */);
|
||||||
builder.withMatrix(matrix)
|
builder.setMatrix(matrix)
|
||||||
.withWindowCrop(crop)
|
.setWindowCrop(crop)
|
||||||
.withAlpha(1f - mIconAlpha.value)
|
.setAlpha(1f - mIconAlpha.value)
|
||||||
.withCornerRadius(mWindowRadius.value)
|
.setCornerRadius(mWindowRadius.value)
|
||||||
.withShadowRadius(mShadowRadius.value);
|
.setShadowRadius(mShadowRadius.value);
|
||||||
} else if (target.mode == MODE_CLOSING) {
|
} else if (target.mode == MODE_CLOSING) {
|
||||||
if (target.localBounds != null) {
|
if (target.localBounds != null) {
|
||||||
final Rect localBounds = target.localBounds;
|
final Rect localBounds = target.localBounds;
|
||||||
@@ -859,29 +861,26 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
tmpPos.y = tmp;
|
tmpPos.y = tmp;
|
||||||
}
|
}
|
||||||
matrix.setTranslate(tmpPos.x, tmpPos.y);
|
matrix.setTranslate(tmpPos.x, tmpPos.y);
|
||||||
builder.withMatrix(matrix)
|
builder.setMatrix(matrix)
|
||||||
.withWindowCrop(crop)
|
.setWindowCrop(crop)
|
||||||
.withAlpha(1f);
|
.setAlpha(1f);
|
||||||
}
|
}
|
||||||
params.add(builder.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (navBarTarget != null) {
|
if (navBarTarget != null) {
|
||||||
final SurfaceParams.Builder navBuilder =
|
SurfaceProperties navBuilder =
|
||||||
new SurfaceParams.Builder(navBarTarget.leash);
|
transaction.forSurface(navBarTarget.leash);
|
||||||
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
|
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
|
||||||
matrix.setScale(scale, scale);
|
matrix.setScale(scale, scale);
|
||||||
matrix.postTranslate(windowTransX0, windowTransY0);
|
matrix.postTranslate(windowTransX0, windowTransY0);
|
||||||
navBuilder.withMatrix(matrix)
|
navBuilder.setMatrix(matrix)
|
||||||
.withWindowCrop(crop)
|
.setWindowCrop(crop)
|
||||||
.withAlpha(mNavFadeIn.value);
|
.setAlpha(mNavFadeIn.value);
|
||||||
} else {
|
} else {
|
||||||
navBuilder.withAlpha(mNavFadeOut.value);
|
navBuilder.setAlpha(mNavFadeOut.value);
|
||||||
}
|
}
|
||||||
params.add(navBuilder.build());
|
|
||||||
}
|
}
|
||||||
|
surfaceApplier.scheduleApply(transaction);
|
||||||
surfaceApplier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
appAnimator.addUpdateListener(listener);
|
appAnimator.addUpdateListener(listener);
|
||||||
@@ -997,37 +996,33 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
matrix.postScale(mAppWindowScale, mAppWindowScale, widgetBackgroundBounds.left,
|
matrix.postScale(mAppWindowScale, mAppWindowScale, widgetBackgroundBounds.left,
|
||||||
widgetBackgroundBounds.top);
|
widgetBackgroundBounds.top);
|
||||||
|
|
||||||
ArrayList<SurfaceParams> params = new ArrayList<>();
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
float floatingViewAlpha = appTargetsAreTranslucent ? 1 - mPreviewAlpha.value : 1;
|
float floatingViewAlpha = appTargetsAreTranslucent ? 1 - mPreviewAlpha.value : 1;
|
||||||
for (int i = appTargets.length - 1; i >= 0; i--) {
|
for (int i = appTargets.length - 1; i >= 0; i--) {
|
||||||
RemoteAnimationTargetCompat target = appTargets[i];
|
RemoteAnimationTargetCompat target = appTargets[i];
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash);
|
SurfaceProperties builder = transaction.forSurface(target.leash);
|
||||||
if (target.mode == MODE_OPENING) {
|
if (target.mode == MODE_OPENING) {
|
||||||
floatingView.update(widgetBackgroundBounds, floatingViewAlpha,
|
floatingView.update(widgetBackgroundBounds, floatingViewAlpha,
|
||||||
mWidgetForegroundAlpha.value, mWidgetFallbackBackgroundAlpha.value,
|
mWidgetForegroundAlpha.value, mWidgetFallbackBackgroundAlpha.value,
|
||||||
mCornerRadiusProgress.value);
|
mCornerRadiusProgress.value);
|
||||||
builder.withMatrix(matrix)
|
builder.setMatrix(matrix)
|
||||||
.withWindowCrop(appWindowCrop)
|
.setWindowCrop(appWindowCrop)
|
||||||
.withAlpha(mPreviewAlpha.value)
|
.setAlpha(mPreviewAlpha.value)
|
||||||
.withCornerRadius(mWindowRadius.value / mAppWindowScale);
|
.setCornerRadius(mWindowRadius.value / mAppWindowScale);
|
||||||
}
|
}
|
||||||
params.add(builder.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (navBarTarget != null) {
|
if (navBarTarget != null) {
|
||||||
final SurfaceParams.Builder navBuilder =
|
SurfaceProperties navBuilder = transaction.forSurface(navBarTarget.leash);
|
||||||
new SurfaceParams.Builder(navBarTarget.leash);
|
|
||||||
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
|
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
|
||||||
navBuilder.withMatrix(matrix)
|
navBuilder.setMatrix(matrix)
|
||||||
.withWindowCrop(appWindowCrop)
|
.setWindowCrop(appWindowCrop)
|
||||||
.withAlpha(mNavFadeIn.value);
|
.setAlpha(mNavFadeIn.value);
|
||||||
} else {
|
} else {
|
||||||
navBuilder.withAlpha(mNavFadeOut.value);
|
navBuilder.setAlpha(mNavFadeOut.value);
|
||||||
}
|
}
|
||||||
params.add(navBuilder.build());
|
|
||||||
}
|
}
|
||||||
|
surfaceApplier.scheduleApply(transaction);
|
||||||
surfaceApplier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1222,16 +1217,15 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
unlockAnimator.addListener(new AnimatorListenerAdapter() {
|
unlockAnimator.addListener(new AnimatorListenerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationStart(Animator animation) {
|
public void onAnimationStart(Animator animation) {
|
||||||
SurfaceParams[] params = new SurfaceParams[appTargets.length];
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
for (int i = appTargets.length - 1; i >= 0; i--) {
|
for (int i = appTargets.length - 1; i >= 0; i--) {
|
||||||
RemoteAnimationTargetCompat target = appTargets[i];
|
RemoteAnimationTargetCompat target = appTargets[i];
|
||||||
params[i] = new SurfaceParams.Builder(target.leash)
|
transaction.forSurface(target.leash)
|
||||||
.withAlpha(1f)
|
.setAlpha(1f)
|
||||||
.withWindowCrop(target.screenSpaceBounds)
|
.setWindowCrop(target.screenSpaceBounds)
|
||||||
.withCornerRadius(cornerRadius)
|
.setCornerRadius(cornerRadius);
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
surfaceApplier.scheduleApply(params);
|
surfaceApplier.scheduleApply(transaction);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return unlockAnimator;
|
return unlockAnimator;
|
||||||
@@ -1449,10 +1443,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(float percent, boolean initOnly) {
|
public void onUpdate(float percent, boolean initOnly) {
|
||||||
SurfaceParams[] params = new SurfaceParams[appTargets.length];
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
for (int i = appTargets.length - 1; i >= 0; i--) {
|
for (int i = appTargets.length - 1; i >= 0; i--) {
|
||||||
RemoteAnimationTargetCompat target = appTargets[i];
|
RemoteAnimationTargetCompat target = appTargets[i];
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash);
|
SurfaceProperties builder = transaction.forSurface(target.leash);
|
||||||
|
|
||||||
if (target.localBounds != null) {
|
if (target.localBounds != null) {
|
||||||
tmpPos.set(target.localBounds.left, target.localBounds.top);
|
tmpPos.set(target.localBounds.left, target.localBounds.top);
|
||||||
@@ -1474,20 +1468,19 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
tmpRect.centerY());
|
tmpRect.centerY());
|
||||||
matrix.postTranslate(0, mDy.value);
|
matrix.postTranslate(0, mDy.value);
|
||||||
matrix.postTranslate(tmpPos.x, tmpPos.y);
|
matrix.postTranslate(tmpPos.x, tmpPos.y);
|
||||||
builder.withMatrix(matrix)
|
builder.setMatrix(matrix)
|
||||||
.withWindowCrop(crop)
|
.setWindowCrop(crop)
|
||||||
.withAlpha(mAlpha.value)
|
.setAlpha(mAlpha.value)
|
||||||
.withCornerRadius(windowCornerRadius)
|
.setCornerRadius(windowCornerRadius)
|
||||||
.withShadowRadius(mShadowRadius.value);
|
.setShadowRadius(mShadowRadius.value);
|
||||||
} else if (target.mode == MODE_OPENING) {
|
} else if (target.mode == MODE_OPENING) {
|
||||||
matrix.setTranslate(tmpPos.x, tmpPos.y);
|
matrix.setTranslate(tmpPos.x, tmpPos.y);
|
||||||
builder.withMatrix(matrix)
|
builder.setMatrix(matrix)
|
||||||
.withWindowCrop(crop)
|
.setWindowCrop(crop)
|
||||||
.withAlpha(1f);
|
.setAlpha(1f);
|
||||||
}
|
}
|
||||||
params[i] = builder.build();
|
|
||||||
}
|
}
|
||||||
surfaceApplier.scheduleApply(params);
|
surfaceApplier.scheduleApply(transaction);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1857,10 +1850,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(RectF currentRectF, float progress) {
|
public void onUpdate(RectF currentRectF, float progress) {
|
||||||
SurfaceParams[] params = new SurfaceParams[mAppTargets.length];
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
for (int i = mAppTargets.length - 1; i >= 0; i--) {
|
for (int i = mAppTargets.length - 1; i >= 0; i--) {
|
||||||
RemoteAnimationTargetCompat target = mAppTargets[i];
|
RemoteAnimationTargetCompat target = mAppTargets[i];
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash);
|
SurfaceProperties builder = transaction.forSurface(target.leash);
|
||||||
|
|
||||||
if (target.localBounds != null) {
|
if (target.localBounds != null) {
|
||||||
mTmpPos.set(target.localBounds.left, target.localBounds.top);
|
mTmpPos.set(target.localBounds.left, target.localBounds.top);
|
||||||
@@ -1895,18 +1888,17 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
|
|||||||
mMatrix.setScale(scale, scale);
|
mMatrix.setScale(scale, scale);
|
||||||
mMatrix.postTranslate(mCurrentRect.left, mCurrentRect.top);
|
mMatrix.postTranslate(mCurrentRect.left, mCurrentRect.top);
|
||||||
|
|
||||||
builder.withMatrix(mMatrix)
|
builder.setMatrix(mMatrix)
|
||||||
.withWindowCrop(mTmpRect)
|
.setWindowCrop(mTmpRect)
|
||||||
.withAlpha(getWindowAlpha(progress))
|
.setAlpha(getWindowAlpha(progress))
|
||||||
.withCornerRadius(getCornerRadius(progress) / scale);
|
.setCornerRadius(getCornerRadius(progress) / scale);
|
||||||
} else if (target.mode == MODE_OPENING) {
|
} else if (target.mode == MODE_OPENING) {
|
||||||
mMatrix.setTranslate(mTmpPos.x, mTmpPos.y);
|
mMatrix.setTranslate(mTmpPos.x, mTmpPos.y);
|
||||||
builder.withMatrix(mMatrix)
|
builder.setMatrix(mMatrix)
|
||||||
.withAlpha(1f);
|
.setAlpha(1f);
|
||||||
}
|
}
|
||||||
params[i] = builder.build();
|
|
||||||
}
|
}
|
||||||
mSurfaceApplier.scheduleApply(params);
|
mSurfaceApplier.scheduleApply(transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected float getWindowAlpha(float progress) {
|
protected float getWindowAlpha(float progress) {
|
||||||
|
|||||||
@@ -65,12 +65,12 @@ import com.android.launcher3.util.DisplayController;
|
|||||||
import com.android.quickstep.fallback.FallbackRecentsView;
|
import com.android.quickstep.fallback.FallbackRecentsView;
|
||||||
import com.android.quickstep.fallback.RecentsState;
|
import com.android.quickstep.fallback.RecentsState;
|
||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.quickstep.util.TransformParams.BuilderProxy;
|
import com.android.quickstep.util.TransformParams.BuilderProxy;
|
||||||
import com.android.systemui.shared.recents.model.Task.TaskKey;
|
import com.android.systemui.shared.recents.model.Task.TaskKey;
|
||||||
import com.android.systemui.shared.system.InputConsumerController;
|
import com.android.systemui.shared.system.InputConsumerController;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -125,18 +125,18 @@ public class FallbackSwipeHandler extends
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateHomeActivityTransformDuringSwipeUp(SurfaceParams.Builder builder,
|
private void updateHomeActivityTransformDuringSwipeUp(SurfaceProperties builder,
|
||||||
RemoteAnimationTargetCompat app, TransformParams params) {
|
RemoteAnimationTargetCompat app, TransformParams params) {
|
||||||
setHomeScaleAndAlpha(builder, app, mCurrentShift.value,
|
setHomeScaleAndAlpha(builder, app, mCurrentShift.value,
|
||||||
Utilities.boundToRange(1 - mCurrentShift.value, 0, 1));
|
Utilities.boundToRange(1 - mCurrentShift.value, 0, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setHomeScaleAndAlpha(SurfaceParams.Builder builder,
|
private void setHomeScaleAndAlpha(SurfaceProperties builder,
|
||||||
RemoteAnimationTargetCompat app, float verticalShift, float alpha) {
|
RemoteAnimationTargetCompat app, float verticalShift, float alpha) {
|
||||||
float scale = Utilities.mapRange(verticalShift, 1, mMaxLauncherScale);
|
float scale = Utilities.mapRange(verticalShift, 1, mMaxLauncherScale);
|
||||||
mTmpMatrix.setScale(scale, scale,
|
mTmpMatrix.setScale(scale, scale,
|
||||||
app.localBounds.exactCenterX(), app.localBounds.exactCenterY());
|
app.localBounds.exactCenterX(), app.localBounds.exactCenterY());
|
||||||
builder.withMatrix(mTmpMatrix).withAlpha(alpha);
|
builder.setMatrix(mTmpMatrix).setAlpha(alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -279,12 +279,12 @@ public class FallbackSwipeHandler extends
|
|||||||
return mTargetRect;
|
return mTargetRect;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRecentsActivityTransformDuringHomeAnim(SurfaceParams.Builder builder,
|
private void updateRecentsActivityTransformDuringHomeAnim(SurfaceProperties builder,
|
||||||
RemoteAnimationTargetCompat app, TransformParams params) {
|
RemoteAnimationTargetCompat app, TransformParams params) {
|
||||||
builder.withAlpha(mRecentsAlpha.value);
|
builder.setAlpha(mRecentsAlpha.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateHomeActivityTransformDuringHomeAnim(SurfaceParams.Builder builder,
|
private void updateHomeActivityTransformDuringHomeAnim(SurfaceProperties builder,
|
||||||
RemoteAnimationTargetCompat app, TransformParams params) {
|
RemoteAnimationTargetCompat app, TransformParams params) {
|
||||||
setHomeScaleAndAlpha(builder, app, mVerticalShiftForScale.value, mHomeAlpha.value);
|
setHomeScaleAndAlpha(builder, app, mVerticalShiftForScale.value, mHomeAlpha.value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ import com.android.launcher3.uioverrides.QuickstepLauncher;
|
|||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
import com.android.systemui.shared.system.QuickStepContract;
|
import com.android.systemui.shared.system.QuickStepContract;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controls the animation of swiping back and returning to launcher.
|
* Controls the animation of swiping back and returning to launcher.
|
||||||
@@ -242,20 +241,17 @@ public class LauncherBackAnimationController {
|
|||||||
|
|
||||||
/** Transform the target window to match the target rect. */
|
/** Transform the target window to match the target rect. */
|
||||||
private void applyTransform(RectF targetRect, float cornerRadius) {
|
private void applyTransform(RectF targetRect, float cornerRadius) {
|
||||||
SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder builder =
|
|
||||||
new SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder(mBackTarget.leash);
|
|
||||||
final float scale = targetRect.width() / mStartRect.width();
|
final float scale = targetRect.width() / mStartRect.width();
|
||||||
mTransformMatrix.reset();
|
mTransformMatrix.reset();
|
||||||
mTransformMatrix.setScale(scale, scale);
|
mTransformMatrix.setScale(scale, scale);
|
||||||
mTransformMatrix.postTranslate(targetRect.left, targetRect.top);
|
mTransformMatrix.postTranslate(targetRect.left, targetRect.top);
|
||||||
builder.withMatrix(mTransformMatrix)
|
|
||||||
.withWindowCrop(mStartRect)
|
|
||||||
.withCornerRadius(cornerRadius);
|
|
||||||
SyncRtSurfaceTransactionApplierCompat.SurfaceParams surfaceParams = builder.build();
|
|
||||||
|
|
||||||
if (surfaceParams.surface.isValid()) {
|
if (mBackTarget.leash.isValid()) {
|
||||||
surfaceParams.applyTo(mTransaction);
|
mTransaction.setMatrix(mBackTarget.leash, mTransformMatrix, new float[9]);
|
||||||
|
mTransaction.setWindowCrop(mBackTarget.leash, mStartRect);
|
||||||
|
mTransaction.setCornerRadius(mBackTarget.leash, cornerRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
mTransaction.apply();
|
mTransaction.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,11 +37,11 @@ import com.android.launcher3.touch.PagedOrientationHandler;
|
|||||||
import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle;
|
import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle;
|
||||||
import com.android.quickstep.util.AnimatorControllerWithResistance;
|
import com.android.quickstep.util.AnimatorControllerWithResistance;
|
||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.quickstep.util.TaskViewSimulator;
|
import com.android.quickstep.util.TaskViewSimulator;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.quickstep.util.TransformParams.BuilderProxy;
|
import com.android.quickstep.util.TransformParams.BuilderProxy;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -335,11 +335,11 @@ public abstract class SwipeUpAnimationLogic implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBuildTargetParams(
|
public void onBuildTargetParams(SurfaceProperties builder, RemoteAnimationTargetCompat app,
|
||||||
Builder builder, RemoteAnimationTargetCompat app, TransformParams params) {
|
TransformParams params) {
|
||||||
builder.withMatrix(mMatrix)
|
builder.setMatrix(mMatrix)
|
||||||
.withWindowCrop(mCropRect)
|
.setWindowCrop(mCropRect)
|
||||||
.withCornerRadius(params.getCornerRadius());
|
.setCornerRadius(params.getCornerRadius());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ import com.android.launcher3.statemanager.StateManager;
|
|||||||
import com.android.launcher3.util.DisplayController;
|
import com.android.launcher3.util.DisplayController;
|
||||||
import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle;
|
import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle;
|
||||||
import com.android.quickstep.util.MultiValueUpdateListener;
|
import com.android.quickstep.util.MultiValueUpdateListener;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.quickstep.util.SurfaceTransactionApplier;
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.quickstep.util.TaskViewSimulator;
|
import com.android.quickstep.util.TaskViewSimulator;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
@@ -82,7 +84,6 @@ import com.android.quickstep.views.TaskView;
|
|||||||
import com.android.systemui.shared.recents.model.Task;
|
import com.android.systemui.shared.recents.model.Task;
|
||||||
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
|
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -252,21 +253,24 @@ public final class TaskViewUtils {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(float percent, boolean initOnly) {
|
public void onUpdate(float percent, boolean initOnly) {
|
||||||
final SurfaceParams.Builder navBuilder =
|
|
||||||
new SurfaceParams.Builder(navBarTarget.leash);
|
|
||||||
|
|
||||||
// TODO Do we need to operate over multiple TVSs for the navbar leash?
|
// TODO Do we need to operate over multiple TVSs for the navbar leash?
|
||||||
for (RemoteTargetHandle handle : remoteTargetHandles) {
|
for (RemoteTargetHandle handle : remoteTargetHandles) {
|
||||||
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
|
SurfaceProperties navBuilder =
|
||||||
|
transaction.forSurface(navBarTarget.leash);
|
||||||
|
|
||||||
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
|
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
|
||||||
TaskViewSimulator taskViewSimulator = handle.getTaskViewSimulator();
|
TaskViewSimulator taskViewSimulator = handle.getTaskViewSimulator();
|
||||||
taskViewSimulator.getCurrentCropRect().round(cropRect);
|
taskViewSimulator.getCurrentCropRect().round(cropRect);
|
||||||
navBuilder.withMatrix(taskViewSimulator.getCurrentMatrix())
|
navBuilder.setMatrix(taskViewSimulator.getCurrentMatrix())
|
||||||
.withWindowCrop(cropRect)
|
.setWindowCrop(cropRect)
|
||||||
.withAlpha(mNavFadeIn.value);
|
.setAlpha(mNavFadeIn.value);
|
||||||
} else {
|
} else {
|
||||||
navBuilder.withAlpha(mNavFadeOut.value);
|
navBuilder.setAlpha(mNavFadeOut.value);
|
||||||
}
|
}
|
||||||
handle.getTransformParams().applySurfaceParams(navBuilder.build());
|
handle.getTransformParams().applySurfaceParams(transaction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -474,7 +478,7 @@ public final class TaskViewUtils {
|
|||||||
* If {@param launchingTaskView} is not null, then this will play the tasks launch animation
|
* If {@param launchingTaskView} is not null, then this will play the tasks launch animation
|
||||||
* from the position of the GroupedTaskView (when user taps on the TaskView to start it).
|
* from the position of the GroupedTaskView (when user taps on the TaskView to start it).
|
||||||
* Technically this case should be taken care of by
|
* Technically this case should be taken care of by
|
||||||
* {@link #composeRecentsSplitLaunchAnimatorLegacy()} below, but the way we launch tasks whether
|
* {@link #composeRecentsSplitLaunchAnimatorLegacy} below, but the way we launch tasks whether
|
||||||
* it's a single task or multiple tasks results in different entry-points.
|
* it's a single task or multiple tasks results in different entry-points.
|
||||||
*
|
*
|
||||||
* If it is null, then it will simply fade in the starting apps and fade out launcher (for the
|
* If it is null, then it will simply fade in the starting apps and fade out launcher (for the
|
||||||
|
|||||||
@@ -53,13 +53,13 @@ import com.android.quickstep.RecentsAnimationController;
|
|||||||
import com.android.quickstep.RecentsAnimationDeviceState;
|
import com.android.quickstep.RecentsAnimationDeviceState;
|
||||||
import com.android.quickstep.RecentsAnimationTargets;
|
import com.android.quickstep.RecentsAnimationTargets;
|
||||||
import com.android.quickstep.TaskAnimationManager;
|
import com.android.quickstep.TaskAnimationManager;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.quickstep.util.TransformParams.BuilderProxy;
|
import com.android.quickstep.util.TransformParams.BuilderProxy;
|
||||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||||
import com.android.systemui.shared.system.InputMonitorCompat;
|
import com.android.systemui.shared.system.InputMonitorCompat;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
@@ -290,9 +290,9 @@ public class DeviceLockedInputConsumer implements InputConsumer,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBuildTargetParams(
|
public void onBuildTargetParams(
|
||||||
Builder builder, RemoteAnimationTargetCompat app, TransformParams params) {
|
SurfaceProperties builder, RemoteAnimationTargetCompat app, TransformParams params) {
|
||||||
mMatrix.setTranslate(0, mProgress.value * mMaxTranslationY);
|
mMatrix.setTranslate(0, mProgress.value * mMaxTranslationY);
|
||||||
builder.withMatrix(mMatrix);
|
builder.setMatrix(mMatrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+17
-14
@@ -33,7 +33,6 @@ import android.graphics.PointF;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.view.SurfaceControl;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewOutlineProvider;
|
import android.view.ViewOutlineProvider;
|
||||||
|
|
||||||
@@ -53,9 +52,11 @@ import com.android.quickstep.RecentsAnimationDeviceState;
|
|||||||
import com.android.quickstep.RemoteTargetGluer;
|
import com.android.quickstep.RemoteTargetGluer;
|
||||||
import com.android.quickstep.SwipeUpAnimationLogic;
|
import com.android.quickstep.SwipeUpAnimationLogic;
|
||||||
import com.android.quickstep.SwipeUpAnimationLogic.RunningWindowAnim;
|
import com.android.quickstep.SwipeUpAnimationLogic.RunningWindowAnim;
|
||||||
|
import com.android.quickstep.util.RecordingSurfaceTransaction;
|
||||||
|
import com.android.quickstep.util.RecordingSurfaceTransaction.MockProperties;
|
||||||
import com.android.quickstep.util.RectFSpringAnim;
|
import com.android.quickstep.util.RectFSpringAnim;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction;
|
||||||
import com.android.quickstep.util.TransformParams;
|
import com.android.quickstep.util.TransformParams;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.R)
|
@TargetApi(Build.VERSION_CODES.R)
|
||||||
abstract class SwipeUpGestureTutorialController extends TutorialController {
|
abstract class SwipeUpGestureTutorialController extends TutorialController {
|
||||||
@@ -415,21 +416,23 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
|
|||||||
private class FakeTransformParams extends TransformParams {
|
private class FakeTransformParams extends TransformParams {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SurfaceParams[] createSurfaceParams(BuilderProxy proxy) {
|
public SurfaceTransaction createSurfaceParams(BuilderProxy proxy) {
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder((SurfaceControl) null);
|
RecordingSurfaceTransaction transaction = new RecordingSurfaceTransaction();
|
||||||
proxy.onBuildTargetParams(builder, null, this);
|
proxy.onBuildTargetParams(transaction.mockProperties, null, this);
|
||||||
return new SurfaceParams[] {builder.build()};
|
return transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applySurfaceParams(SurfaceParams[] params) {
|
public void applySurfaceParams(SurfaceTransaction params) {
|
||||||
SurfaceParams p = params[0];
|
if (params instanceof RecordingSurfaceTransaction) {
|
||||||
mFakeTaskView.setAnimationMatrix(p.matrix);
|
MockProperties p = ((RecordingSurfaceTransaction) params).mockProperties;
|
||||||
mFakePreviousTaskView.setAnimationMatrix(p.matrix);
|
mFakeTaskView.setAnimationMatrix(p.matrix);
|
||||||
mFakeTaskViewRect.set(p.windowCrop);
|
mFakePreviousTaskView.setAnimationMatrix(p.matrix);
|
||||||
mFakeTaskViewRadius = p.cornerRadius;
|
mFakeTaskViewRect.set(p.windowCrop);
|
||||||
mFakeTaskView.invalidateOutline();
|
mFakeTaskViewRadius = p.cornerRadius;
|
||||||
mFakePreviousTaskView.invalidateOutline();
|
mFakeTaskView.invalidateOutline();
|
||||||
|
mFakePreviousTaskView.invalidateOutline();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.quickstep.util;
|
||||||
|
|
||||||
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension for {@link SurfaceTransaction} which records the commands for mocking
|
||||||
|
*/
|
||||||
|
public class RecordingSurfaceTransaction extends SurfaceTransaction {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A mock builder which can be used for recording values
|
||||||
|
*/
|
||||||
|
public final MockProperties mockProperties = new MockProperties();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension of {@link SurfaceProperties} which just stores all the values locally
|
||||||
|
*/
|
||||||
|
public class MockProperties extends SurfaceProperties {
|
||||||
|
|
||||||
|
public float alpha = -1;
|
||||||
|
public Matrix matrix = null;
|
||||||
|
public Rect windowCrop = null;
|
||||||
|
public float cornerRadius = 0;
|
||||||
|
public float shadowRadius = 0;
|
||||||
|
|
||||||
|
MockProperties() {
|
||||||
|
super(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceProperties setAlpha(float alpha) {
|
||||||
|
this.alpha = alpha;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceProperties setMatrix(Matrix matrix) {
|
||||||
|
this.matrix = matrix;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceProperties setWindowCrop(Rect windowCrop) {
|
||||||
|
this.windowCrop = windowCrop;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceProperties setLayer(int relativeLayer) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceProperties setCornerRadius(float radius) {
|
||||||
|
this.cornerRadius = radius;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceProperties setShadowRadius(float radius) {
|
||||||
|
this.shadowRadius = radius;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,10 +19,10 @@ import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MOD
|
|||||||
|
|
||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
import android.animation.ValueAnimator.AnimatorUpdateListener;
|
import android.animation.ValueAnimator.AnimatorUpdateListener;
|
||||||
|
import android.view.SurfaceControl.Transaction;
|
||||||
|
|
||||||
import com.android.quickstep.RemoteAnimationTargets;
|
import com.android.quickstep.RemoteAnimationTargets;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.TransactionCompat;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Animation listener which fades out the closing targets
|
* Animation listener which fades out the closing targets
|
||||||
@@ -40,7 +40,7 @@ public class RemoteFadeOutAnimationListener implements AnimatorUpdateListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationUpdate(ValueAnimator valueAnimator) {
|
public void onAnimationUpdate(ValueAnimator valueAnimator) {
|
||||||
TransactionCompat t = new TransactionCompat();
|
Transaction t = new Transaction();
|
||||||
if (mFirstFrame) {
|
if (mFirstFrame) {
|
||||||
for (RemoteAnimationTargetCompat target : mTarget.unfilteredApps) {
|
for (RemoteAnimationTargetCompat target : mTarget.unfilteredApps) {
|
||||||
t.show(target.leash);
|
t.show(target.leash);
|
||||||
|
|||||||
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.quickstep.util;
|
||||||
|
|
||||||
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.view.SurfaceControl;
|
||||||
|
import android.view.SurfaceControl.Transaction;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class for building a {@link Transaction}.
|
||||||
|
*/
|
||||||
|
public class SurfaceTransaction {
|
||||||
|
|
||||||
|
private final Transaction mTransaction = new Transaction();
|
||||||
|
private final float[] mTmpValues = new float[9];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new builder for the provided surface
|
||||||
|
*/
|
||||||
|
public SurfaceProperties forSurface(SurfaceControl surface) {
|
||||||
|
return new SurfaceProperties(surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the final transaction
|
||||||
|
*/
|
||||||
|
public Transaction getTransaction() {
|
||||||
|
return mTransaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class to update surface params in a transaction
|
||||||
|
*/
|
||||||
|
public class SurfaceProperties {
|
||||||
|
|
||||||
|
private final SurfaceControl mSurface;
|
||||||
|
|
||||||
|
SurfaceProperties(SurfaceControl surface) {
|
||||||
|
mSurface = surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param alpha The alpha value to apply to the surface.
|
||||||
|
* @return this Builder
|
||||||
|
*/
|
||||||
|
public SurfaceProperties setAlpha(float alpha) {
|
||||||
|
mTransaction.setAlpha(mSurface, alpha);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param matrix The matrix to apply to the surface.
|
||||||
|
* @return this Builder
|
||||||
|
*/
|
||||||
|
public SurfaceProperties setMatrix(Matrix matrix) {
|
||||||
|
mTransaction.setMatrix(mSurface, matrix, mTmpValues);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param windowCrop The window crop to apply to the surface.
|
||||||
|
* @return this Builder
|
||||||
|
*/
|
||||||
|
public SurfaceProperties setWindowCrop(Rect windowCrop) {
|
||||||
|
mTransaction.setWindowCrop(mSurface, windowCrop);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param relativeLayer The relative layer.
|
||||||
|
* @return this Builder
|
||||||
|
*/
|
||||||
|
public SurfaceProperties setLayer(int relativeLayer) {
|
||||||
|
mTransaction.setLayer(mSurface, relativeLayer);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param radius the Radius for rounded corners to apply to the surface.
|
||||||
|
* @return this Builder
|
||||||
|
*/
|
||||||
|
public SurfaceProperties setCornerRadius(float radius) {
|
||||||
|
mTransaction.setCornerRadius(mSurface, radius);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param radius the Radius for the shadows to apply to the surface.
|
||||||
|
* @return this Builder
|
||||||
|
*/
|
||||||
|
public SurfaceProperties setShadowRadius(float radius) {
|
||||||
|
mTransaction.setShadowRadius(mSurface, radius);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,7 +25,6 @@ import android.view.View;
|
|||||||
import android.view.ViewRootImpl;
|
import android.view.ViewRootImpl;
|
||||||
|
|
||||||
import com.android.quickstep.RemoteAnimationTargets.ReleaseCheck;
|
import com.android.quickstep.RemoteAnimationTargets.ReleaseCheck;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -70,18 +69,12 @@ public class SurfaceTransactionApplier extends ReleaseCheck {
|
|||||||
* @param params The surface parameters to apply. DO NOT MODIFY the list after passing into
|
* @param params The surface parameters to apply. DO NOT MODIFY the list after passing into
|
||||||
* this method to avoid synchronization issues.
|
* this method to avoid synchronization issues.
|
||||||
*/
|
*/
|
||||||
public void scheduleApply(final SurfaceParams... params) {
|
public void scheduleApply(SurfaceTransaction params) {
|
||||||
View view = mTargetViewRootImpl.getView();
|
View view = mTargetViewRootImpl.getView();
|
||||||
if (view == null) {
|
if (view == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Transaction t = new Transaction();
|
Transaction t = params.getTransaction();
|
||||||
for (int i = params.length - 1; i >= 0; i--) {
|
|
||||||
SurfaceParams surfaceParams = params[i];
|
|
||||||
if (surfaceParams.surface.isValid()) {
|
|
||||||
surfaceParams.applyTo(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mLastSequenceNumber++;
|
mLastSequenceNumber++;
|
||||||
final int toApplySeqNo = mLastSequenceNumber;
|
final int toApplySeqNo = mLastSequenceNumber;
|
||||||
@@ -102,7 +95,7 @@ public class SurfaceTransactionApplier extends ReleaseCheck {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance of SyncRtSurfaceTransactionApplier, deferring until the target view is
|
* Creates an instance of SurfaceTransactionApplier, deferring until the target view is
|
||||||
* attached if necessary.
|
* attached if necessary.
|
||||||
*/
|
*/
|
||||||
public static void create(
|
public static void create(
|
||||||
|
|||||||
@@ -46,11 +46,11 @@ import com.android.launcher3.util.TraceHelper;
|
|||||||
import com.android.quickstep.AnimatedFloat;
|
import com.android.quickstep.AnimatedFloat;
|
||||||
import com.android.quickstep.BaseActivityInterface;
|
import com.android.quickstep.BaseActivityInterface;
|
||||||
import com.android.quickstep.TaskAnimationManager;
|
import com.android.quickstep.TaskAnimationManager;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
|
import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
|
||||||
import com.android.quickstep.views.TaskView.FullscreenDrawParams;
|
import com.android.quickstep.views.TaskView.FullscreenDrawParams;
|
||||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A utility class which emulates the layout behavior of TaskView and RecentsView
|
* A utility class which emulates the layout behavior of TaskView and RecentsView
|
||||||
@@ -386,10 +386,10 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBuildTargetParams(
|
public void onBuildTargetParams(
|
||||||
Builder builder, RemoteAnimationTargetCompat app, TransformParams params) {
|
SurfaceProperties builder, RemoteAnimationTargetCompat app, TransformParams params) {
|
||||||
builder.withMatrix(mMatrix)
|
builder.setMatrix(mMatrix)
|
||||||
.withWindowCrop(mTmpCropRect)
|
.setWindowCrop(mTmpCropRect)
|
||||||
.withCornerRadius(getCurrentCornerRadius());
|
.setCornerRadius(getCurrentCornerRadius());
|
||||||
|
|
||||||
// If mDrawsBelowRecents is unset, no reordering will be enforced.
|
// If mDrawsBelowRecents is unset, no reordering will be enforced.
|
||||||
if (ENABLE_QUICKSTEP_LIVE_TILE.get() && mDrawsBelowRecents != null) {
|
if (ENABLE_QUICKSTEP_LIVE_TILE.get() && mDrawsBelowRecents != null) {
|
||||||
@@ -398,7 +398,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
|||||||
// conflict with layers that WM core positions (ie. the input consumers). For shell
|
// conflict with layers that WM core positions (ie. the input consumers). For shell
|
||||||
// transitions, the animation leashes are reparented to an animation container so we
|
// transitions, the animation leashes are reparented to an animation container so we
|
||||||
// can bump layers as needed.
|
// can bump layers as needed.
|
||||||
builder.withLayer(mDrawsBelowRecents
|
builder.setLayer(mDrawsBelowRecents
|
||||||
? Integer.MIN_VALUE + 1
|
? Integer.MIN_VALUE + 1
|
||||||
: ENABLE_SHELL_TRANSITIONS ? Integer.MAX_VALUE : 0);
|
: ENABLE_SHELL_TRANSITIONS ? Integer.MAX_VALUE : 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,10 +21,8 @@ import android.view.SurfaceControl;
|
|||||||
import com.android.launcher3.Utilities;
|
import com.android.launcher3.Utilities;
|
||||||
import com.android.launcher3.anim.Interpolators;
|
import com.android.launcher3.anim.Interpolators;
|
||||||
import com.android.quickstep.RemoteAnimationTargets;
|
import com.android.quickstep.RemoteAnimationTargets;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
|
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
import com.android.systemui.shared.system.TransactionCompat;
|
|
||||||
|
|
||||||
public class TransformParams {
|
public class TransformParams {
|
||||||
|
|
||||||
@@ -113,8 +111,7 @@ public class TransformParams {
|
|||||||
* Sets the SyncRtSurfaceTransactionApplierCompat that will apply the SurfaceParams that
|
* Sets the SyncRtSurfaceTransactionApplierCompat that will apply the SurfaceParams that
|
||||||
* are computed based on these TransformParams.
|
* are computed based on these TransformParams.
|
||||||
*/
|
*/
|
||||||
public TransformParams setSyncTransactionApplier(
|
public TransformParams setSyncTransactionApplier(SurfaceTransactionApplier applier) {
|
||||||
SurfaceTransactionApplier applier) {
|
|
||||||
mSyncTransactionApplier = applier;
|
mSyncTransactionApplier = applier;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -137,16 +134,14 @@ public class TransformParams {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SurfaceParams[] createSurfaceParams(BuilderProxy proxy) {
|
public SurfaceTransaction createSurfaceParams(BuilderProxy proxy) {
|
||||||
RemoteAnimationTargets targets = mTargetSet;
|
RemoteAnimationTargets targets = mTargetSet;
|
||||||
final int appLength = targets.unfilteredApps.length;
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
final int wallpaperLength = targets.wallpapers != null ? targets.wallpapers.length : 0;
|
|
||||||
SurfaceParams[] surfaceParams = new SurfaceParams[appLength + wallpaperLength];
|
|
||||||
mRecentsSurface = getRecentsSurface(targets);
|
mRecentsSurface = getRecentsSurface(targets);
|
||||||
|
|
||||||
for (int i = 0; i < appLength; i++) {
|
for (int i = 0; i < targets.unfilteredApps.length; i++) {
|
||||||
RemoteAnimationTargetCompat app = targets.unfilteredApps[i];
|
RemoteAnimationTargetCompat app = targets.unfilteredApps[i];
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder(app.leash);
|
SurfaceProperties builder = transaction.forSurface(app.leash);
|
||||||
|
|
||||||
if (app.mode == targets.targetMode) {
|
if (app.mode == targets.targetMode) {
|
||||||
if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
|
if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
|
||||||
@@ -156,9 +151,9 @@ public class TransformParams {
|
|||||||
if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_ASSISTANT
|
if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_ASSISTANT
|
||||||
&& app.isNotInRecents) {
|
&& app.isNotInRecents) {
|
||||||
float progress = Utilities.boundToRange(getProgress(), 0, 1);
|
float progress = Utilities.boundToRange(getProgress(), 0, 1);
|
||||||
builder.withAlpha(1 - Interpolators.DEACCEL_2_5.getInterpolation(progress));
|
builder.setAlpha(1 - Interpolators.DEACCEL_2_5.getInterpolation(progress));
|
||||||
} else {
|
} else {
|
||||||
builder.withAlpha(getTargetAlpha());
|
builder.setAlpha(getTargetAlpha());
|
||||||
}
|
}
|
||||||
|
|
||||||
proxy.onBuildTargetParams(builder, app, this);
|
proxy.onBuildTargetParams(builder, app, this);
|
||||||
@@ -166,15 +161,15 @@ public class TransformParams {
|
|||||||
} else {
|
} else {
|
||||||
mBaseBuilderProxy.onBuildTargetParams(builder, app, this);
|
mBaseBuilderProxy.onBuildTargetParams(builder, app, this);
|
||||||
}
|
}
|
||||||
surfaceParams[i] = builder.build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// always put wallpaper layer to bottom.
|
// always put wallpaper layer to bottom.
|
||||||
|
final int wallpaperLength = targets.wallpapers != null ? targets.wallpapers.length : 0;
|
||||||
for (int i = 0; i < wallpaperLength; i++) {
|
for (int i = 0; i < wallpaperLength; i++) {
|
||||||
RemoteAnimationTargetCompat wallpaper = targets.wallpapers[i];
|
RemoteAnimationTargetCompat wallpaper = targets.wallpapers[i];
|
||||||
surfaceParams[appLength + i] = new SurfaceParams.Builder(wallpaper.leash)
|
transaction.forSurface(wallpaper.leash).setLayer(Integer.MIN_VALUE);
|
||||||
.withLayer(Integer.MIN_VALUE).build();
|
|
||||||
}
|
}
|
||||||
return surfaceParams;
|
return transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SurfaceControl getRecentsSurface(RemoteAnimationTargets targets) {
|
private static SurfaceControl getRecentsSurface(RemoteAnimationTargets targets) {
|
||||||
@@ -213,15 +208,11 @@ public class TransformParams {
|
|||||||
return mTargetSet;
|
return mTargetSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applySurfaceParams(SurfaceParams... params) {
|
public void applySurfaceParams(SurfaceTransaction builder) {
|
||||||
if (mSyncTransactionApplier != null) {
|
if (mSyncTransactionApplier != null) {
|
||||||
mSyncTransactionApplier.scheduleApply(params);
|
mSyncTransactionApplier.scheduleApply(builder);
|
||||||
} else {
|
} else {
|
||||||
TransactionCompat t = new TransactionCompat();
|
builder.getTransaction().apply();
|
||||||
for (SurfaceParams param : params) {
|
|
||||||
SyncRtSurfaceTransactionApplierCompat.applyParams(t, param);
|
|
||||||
}
|
|
||||||
t.apply();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,9 +220,9 @@ public class TransformParams {
|
|||||||
public interface BuilderProxy {
|
public interface BuilderProxy {
|
||||||
|
|
||||||
BuilderProxy NO_OP = (builder, app, params) -> { };
|
BuilderProxy NO_OP = (builder, app, params) -> { };
|
||||||
BuilderProxy ALWAYS_VISIBLE = (builder, app, params) ->builder.withAlpha(1);
|
BuilderProxy ALWAYS_VISIBLE = (builder, app, params) -> builder.setAlpha(1);
|
||||||
|
|
||||||
void onBuildTargetParams(SurfaceParams.Builder builder,
|
void onBuildTargetParams(SurfaceProperties builder,
|
||||||
RemoteAnimationTargetCompat app, TransformParams params);
|
RemoteAnimationTargetCompat app, TransformParams params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ import com.android.quickstep.util.LayoutUtils;
|
|||||||
import com.android.quickstep.util.RecentsOrientedState;
|
import com.android.quickstep.util.RecentsOrientedState;
|
||||||
import com.android.quickstep.util.SplitScreenBounds;
|
import com.android.quickstep.util.SplitScreenBounds;
|
||||||
import com.android.quickstep.util.SplitSelectStateController;
|
import com.android.quickstep.util.SplitSelectStateController;
|
||||||
|
import com.android.quickstep.util.SurfaceTransaction;
|
||||||
import com.android.quickstep.util.SurfaceTransactionApplier;
|
import com.android.quickstep.util.SurfaceTransactionApplier;
|
||||||
import com.android.quickstep.util.TaskViewSimulator;
|
import com.android.quickstep.util.TaskViewSimulator;
|
||||||
import com.android.quickstep.util.TaskVisualsChangeListener;
|
import com.android.quickstep.util.TaskVisualsChangeListener;
|
||||||
@@ -184,7 +185,6 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
|
|||||||
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
|
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
|
||||||
import com.android.systemui.shared.system.PackageManagerWrapper;
|
import com.android.systemui.shared.system.PackageManagerWrapper;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
import com.android.systemui.shared.system.TaskStackChangeListener;
|
import com.android.systemui.shared.system.TaskStackChangeListener;
|
||||||
import com.android.systemui.shared.system.TaskStackChangeListeners;
|
import com.android.systemui.shared.system.TaskStackChangeListeners;
|
||||||
import com.android.wm.shell.pip.IPipAnimationListener;
|
import com.android.wm.shell.pip.IPipAnimationListener;
|
||||||
@@ -1064,14 +1064,15 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
|||||||
appAnimator.setInterpolator(ACCEL_DEACCEL);
|
appAnimator.setInterpolator(ACCEL_DEACCEL);
|
||||||
appAnimator.addUpdateListener(valueAnimator -> {
|
appAnimator.addUpdateListener(valueAnimator -> {
|
||||||
float percent = valueAnimator.getAnimatedFraction();
|
float percent = valueAnimator.getAnimatedFraction();
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder(
|
SurfaceTransaction transaction = new SurfaceTransaction();
|
||||||
apps[apps.length - 1].leash);
|
|
||||||
Matrix matrix = new Matrix();
|
Matrix matrix = new Matrix();
|
||||||
matrix.postScale(percent, percent);
|
matrix.postScale(percent, percent);
|
||||||
matrix.postTranslate(mActivity.getDeviceProfile().widthPx * (1 - percent) / 2,
|
matrix.postTranslate(mActivity.getDeviceProfile().widthPx * (1 - percent) / 2,
|
||||||
mActivity.getDeviceProfile().heightPx * (1 - percent) / 2);
|
mActivity.getDeviceProfile().heightPx * (1 - percent) / 2);
|
||||||
builder.withAlpha(percent).withMatrix(matrix);
|
transaction.forSurface(apps[apps.length - 1].leash)
|
||||||
surfaceApplier.scheduleApply(builder.build());
|
.setAlpha(percent)
|
||||||
|
.setMatrix(matrix);
|
||||||
|
surfaceApplier.scheduleApply(transaction);
|
||||||
});
|
});
|
||||||
anim.play(appAnimator);
|
anim.play(appAnimator);
|
||||||
anim.addListener(new AnimatorListenerAdapter() {
|
anim.addListener(new AnimatorListenerAdapter() {
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import android.appwidget.AppWidgetProviderInfo;
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
@@ -111,7 +110,6 @@ public final class WidgetsPredicationUpdateTaskTest {
|
|||||||
doReturn(allWidgets).when(manager).getInstalledProvidersForProfile(eq(myUserHandle()));
|
doReturn(allWidgets).when(manager).getInstalledProvidersForProfile(eq(myUserHandle()));
|
||||||
doAnswer(i -> {
|
doAnswer(i -> {
|
||||||
String pkg = i.getArgument(0);
|
String pkg = i.getArgument(0);
|
||||||
Log.e("Hello", "Getting v " + pkg);
|
|
||||||
return TextUtils.isEmpty(pkg) ? allWidgets : allWidgets.stream()
|
return TextUtils.isEmpty(pkg) ? allWidgets : allWidgets.stream()
|
||||||
.filter(a -> pkg.equals(a.provider.getPackageName()))
|
.filter(a -> pkg.equals(a.provider.getPackageName()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import android.graphics.Rect;
|
|||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
import android.view.SurfaceControl;
|
|
||||||
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
@@ -42,8 +41,8 @@ import com.android.launcher3.util.window.CachedDisplayInfo;
|
|||||||
import com.android.launcher3.util.window.WindowManagerProxy;
|
import com.android.launcher3.util.window.WindowManagerProxy;
|
||||||
import com.android.quickstep.FallbackActivityInterface;
|
import com.android.quickstep.FallbackActivityInterface;
|
||||||
import com.android.quickstep.SystemUiProxy;
|
import com.android.quickstep.SystemUiProxy;
|
||||||
|
import com.android.quickstep.util.RecordingSurfaceTransaction.MockProperties;
|
||||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
|
||||||
|
|
||||||
import org.hamcrest.Description;
|
import org.hamcrest.Description;
|
||||||
import org.hamcrest.TypeSafeMatcher;
|
import org.hamcrest.TypeSafeMatcher;
|
||||||
@@ -207,17 +206,21 @@ public class TaskViewSimulatorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SurfaceParams[] createSurfaceParams(BuilderProxy proxy) {
|
public SurfaceTransaction createSurfaceParams(BuilderProxy proxy) {
|
||||||
SurfaceParams.Builder builder = new SurfaceParams.Builder((SurfaceControl) null);
|
RecordingSurfaceTransaction transaction = new RecordingSurfaceTransaction();
|
||||||
proxy.onBuildTargetParams(builder, mock(RemoteAnimationTargetCompat.class), this);
|
proxy.onBuildTargetParams(
|
||||||
return new SurfaceParams[] {builder.build()};
|
transaction.mockProperties, mock(RemoteAnimationTargetCompat.class), this);
|
||||||
|
return transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applySurfaceParams(SurfaceParams[] params) {
|
public void applySurfaceParams(SurfaceTransaction params) {
|
||||||
|
Assert.assertTrue(params instanceof RecordingSurfaceTransaction);
|
||||||
|
MockProperties p = ((RecordingSurfaceTransaction) params).mockProperties;
|
||||||
|
|
||||||
// Verify that the task position remains the same
|
// Verify that the task position remains the same
|
||||||
RectF newAppBounds = new RectF(mAppBounds);
|
RectF newAppBounds = new RectF(mAppBounds);
|
||||||
params[0].matrix.mapRect(newAppBounds);
|
p.matrix.mapRect(newAppBounds);
|
||||||
Assert.assertThat(newAppBounds, new AlmostSame(mAppBounds));
|
Assert.assertThat(newAppBounds, new AlmostSame(mAppBounds));
|
||||||
|
|
||||||
System.err.println("Bounds mapped: " + mAppBounds + " => " + newAppBounds);
|
System.err.println("Bounds mapped: " + mAppBounds + " => " + newAppBounds);
|
||||||
|
|||||||
Reference in New Issue
Block a user