Loading core/java/android/view/InsetsSourceConsumer.java +8 −34 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import static android.view.InsetsSourceConsumerProto.IS_REQUESTED_VISIBLE; import static android.view.InsetsSourceConsumerProto.PENDING_FRAME; import static android.view.InsetsSourceConsumerProto.PENDING_VISIBLE_FRAME; import static android.view.InsetsSourceConsumerProto.SOURCE_CONTROL; import static android.view.InsetsSourceControl.INVALID_HINTS; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.getDefaultVisibility; import static android.view.InsetsState.toPublicType; Loading @@ -34,7 +33,6 @@ import static com.android.internal.annotations.VisibleForTesting.Visibility.PACK import android.annotation.IntDef; import android.annotation.Nullable; import android.graphics.Insets; import android.graphics.Rect; import android.util.ArraySet; import android.util.Log; Loading Loading @@ -93,13 +91,6 @@ public class InsetsSourceConsumer { private Rect mPendingFrame; private Rect mPendingVisibleFrame; /** * Indicates if we have the pending animation. When we have the control, we need to play the * animation if the requested visibility is different from the current state. But if we haven't * had a leash yet, we will set this flag, and play the animation once we get the leash. */ private boolean mIsAnimationPending; /** * @param type The {@link InternalInsetsType} of the consumed insets. * @param state The current {@link InsetsState} of the consumed insets. Loading Loading @@ -138,7 +129,6 @@ public class InsetsSourceConsumer { } return false; } SurfaceControl oldLeash = mSourceControl != null ? mSourceControl.getLeash() : null; final InsetsSourceControl lastControl = mSourceControl; mSourceControl = control; Loading @@ -163,27 +153,21 @@ public class InsetsSourceConsumer { // For updateCompatSysUiVisibility applyLocalVisibilityOverride(); } else { // We are gaining control, and need to run an animation since previous state // didn't match final boolean requestedVisible = isRequestedVisibleAwaitingControl(); final boolean fakeControl = INVALID_HINTS.equals(control.getInsetsHint()); final boolean needsAnimation = requestedVisible != mState.getSource(mType).isVisible() && !fakeControl; if (control.getLeash() != null && (needsAnimation || mIsAnimationPending)) { if (DEBUG) Log.d(TAG, String.format("Gaining control in %s, requestedVisible: %b", final SurfaceControl oldLeash = lastControl != null ? lastControl.getLeash() : null; final SurfaceControl newLeash = control.getLeash(); if (newLeash != null && (oldLeash == null || !newLeash.isSameSurface(oldLeash)) && requestedVisible != control.isInitiallyVisible()) { // We are gaining leash, and need to run an animation since previous state // didn't match. if (DEBUG) Log.d(TAG, String.format("Gaining leash in %s, requestedVisible: %b", mController.getHost().getRootViewTitle(), requestedVisible)); if (requestedVisible) { showTypes[0] |= toPublicType(getType()); } else { hideTypes[0] |= toPublicType(getType()); } mIsAnimationPending = false; } else { if (needsAnimation) { // We need animation but we haven't had a leash yet. Set this flag that when we // get the leash we can play the deferred animation. mIsAnimationPending = true; } // We are gaining control, but don't need to run an animation. // However make sure that the leash visibility is still up to date. if (applyLocalVisibilityOverride()) { Loading @@ -195,7 +179,7 @@ public class InsetsSourceConsumer { applyRequestedVisibilityToControl(); // Remove the surface that owned by last control when it lost. if (!requestedVisible && !mIsAnimationPending && lastControl == null) { if (!requestedVisible && lastControl == null) { removeSurface(); } } Loading Loading @@ -406,16 +390,6 @@ public class InsetsSourceConsumer { protected void setRequestedVisible(boolean requestedVisible) { if (mRequestedVisible != requestedVisible) { mRequestedVisible = requestedVisible; // We need an animation later if the leash of a real control (which has an insets hint) // is not ready. The !mIsAnimationPending check is in case that the requested visibility // is changed twice before playing the animation -- we don't need an animation in this // case. mIsAnimationPending = !mIsAnimationPending && mSourceControl != null && mSourceControl.getLeash() == null && !Insets.NONE.equals(mSourceControl.getInsetsHint()); mController.onRequestedVisibilityChanged(this); if (DEBUG) Log.d(TAG, "setRequestedVisible: " + requestedVisible); } Loading core/java/android/view/InsetsSourceControl.java +15 −9 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.util.proto.ProtoOutputStream; import android.view.InsetsState.InternalInsetsType; import java.io.PrintWriter; import java.util.Objects; import java.util.function.Consumer; /** Loading @@ -39,10 +40,9 @@ import java.util.function.Consumer; */ public class InsetsSourceControl implements Parcelable { public static final Insets INVALID_HINTS = Insets.of(-1, -1, -1, -1); private final @InternalInsetsType int mType; private final @Nullable SurfaceControl mLeash; private final boolean mInitiallyVisible; private final Point mSurfacePosition; // This is used while playing an insets animation regardless of the relative frame. This would Loading @@ -53,9 +53,10 @@ public class InsetsSourceControl implements Parcelable { private int mParcelableFlags; public InsetsSourceControl(@InternalInsetsType int type, @Nullable SurfaceControl leash, Point surfacePosition, Insets insetsHint) { boolean initiallyVisible, Point surfacePosition, Insets insetsHint) { mType = type; mLeash = leash; mInitiallyVisible = initiallyVisible; mSurfacePosition = surfacePosition; mInsetsHint = insetsHint; } Loading @@ -67,6 +68,7 @@ public class InsetsSourceControl implements Parcelable { } else { mLeash = null; } mInitiallyVisible = other.mInitiallyVisible; mSurfacePosition = new Point(other.mSurfacePosition); mInsetsHint = other.mInsetsHint; mSkipAnimationOnce = other.getAndClearSkipAnimationOnce(); Loading @@ -75,6 +77,7 @@ public class InsetsSourceControl implements Parcelable { public InsetsSourceControl(Parcel in) { mType = in.readInt(); mLeash = in.readTypedObject(SurfaceControl.CREATOR); mInitiallyVisible = in.readBoolean(); mSurfacePosition = in.readTypedObject(Point.CREATOR); mInsetsHint = in.readTypedObject(Insets.CREATOR); mSkipAnimationOnce = in.readBoolean(); Loading @@ -94,6 +97,10 @@ public class InsetsSourceControl implements Parcelable { return mLeash; } public boolean isInitiallyVisible() { return mInitiallyVisible; } public boolean setSurfacePosition(int left, int top) { if (mSurfacePosition.equals(left, top)) { return false; Loading Loading @@ -148,6 +155,7 @@ public class InsetsSourceControl implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mType); dest.writeTypedObject(mLeash, mParcelableFlags); dest.writeBoolean(mInitiallyVisible); dest.writeTypedObject(mSurfacePosition, mParcelableFlags); dest.writeTypedObject(mInsetsHint, mParcelableFlags); dest.writeBoolean(mSkipAnimationOnce); Loading @@ -172,6 +180,7 @@ public class InsetsSourceControl implements Parcelable { return mType == that.mType && ((mLeash == thatLeash) || (mLeash != null && thatLeash != null && mLeash.isSameSurface(thatLeash))) && mInitiallyVisible == that.mInitiallyVisible && mSurfacePosition.equals(that.mSurfacePosition) && mInsetsHint.equals(that.mInsetsHint) && mSkipAnimationOnce == that.mSkipAnimationOnce; Loading @@ -179,12 +188,8 @@ public class InsetsSourceControl implements Parcelable { @Override public int hashCode() { int result = mType; result = 31 * result + (mLeash != null ? mLeash.hashCode() : 0); result = 31 * result + mSurfacePosition.hashCode(); result = 31 * result + mInsetsHint.hashCode(); result = 31 * result + (mSkipAnimationOnce ? 1 : 0); return result; return Objects.hash(mType, mLeash, mInitiallyVisible, mSurfacePosition, mInsetsHint, mSkipAnimationOnce); } @Override Loading @@ -200,6 +205,7 @@ public class InsetsSourceControl implements Parcelable { pw.print(prefix); pw.print("InsetsSourceControl type="); pw.print(InsetsState.typeToString(mType)); pw.print(" mLeash="); pw.print(mLeash); pw.print(" mInitiallyVisible="); pw.print(mInitiallyVisible); pw.print(" mSurfacePosition="); pw.print(mSurfacePosition); pw.print(" mInsetsHint="); pw.print(mInsetsHint); pw.print(" mSkipAnimationOnce="); pw.print(mSkipAnimationOnce); Loading core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ public class ImeInsetsSourceConsumerTest { @Test public void testImeVisibility() { final InsetsSourceControl ime = new InsetsSourceControl(ITYPE_IME, mLeash, new Point(), Insets.NONE); new InsetsSourceControl(ITYPE_IME, mLeash, false, new Point(), Insets.NONE); mController.onControlsChanged(new InsetsSourceControl[] { ime }); InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { Loading Loading @@ -121,7 +121,7 @@ public class ImeInsetsSourceConsumerTest { // set control and verify visibility is applied. InsetsSourceControl control = new InsetsSourceControl(ITYPE_IME, mLeash, new Point(), Insets.NONE); new InsetsSourceControl(ITYPE_IME, mLeash, false, new Point(), Insets.NONE); mController.onControlsChanged(new InsetsSourceControl[] { control }); // IME show animation should be triggered when control becomes available. verify(mController).applyAnimation( Loading Loading @@ -158,7 +158,7 @@ public class ImeInsetsSourceConsumerTest { // set control and verify visibility is applied. InsetsSourceControl control = Mockito.spy( new InsetsSourceControl(ITYPE_IME, mLeash, new Point(), Insets.NONE)); new InsetsSourceControl(ITYPE_IME, mLeash, false, new Point(), Insets.NONE)); // Simulate IME source control set this flag when the target has starting window. control.setSkipAnimationOnce(true); Loading core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -95,12 +95,13 @@ public class InsetsAnimationControlImplTest { () -> mMockTransaction, mMockController); topConsumer.setControl( new InsetsSourceControl( ITYPE_STATUS_BAR, mTopLeash, new Point(0, 0), Insets.of(0, 100, 0, 0)), ITYPE_STATUS_BAR, mTopLeash, true, new Point(0, 0), Insets.of(0, 100, 0, 0)), new int[1], new int[1]); InsetsSourceConsumer navConsumer = new InsetsSourceConsumer(ITYPE_NAVIGATION_BAR, mInsetsState, () -> mMockTransaction, mMockController); navConsumer.setControl(new InsetsSourceControl(ITYPE_NAVIGATION_BAR, mNavLeash, navConsumer.setControl(new InsetsSourceControl(ITYPE_NAVIGATION_BAR, mNavLeash, true, new Point(400, 0), Insets.of(0, 0, 100, 0)), new int[1], new int[1]); navConsumer.hide(); Loading core/tests/coretests/src/android/view/InsetsControllerTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -223,7 +223,7 @@ public class InsetsControllerTest { InsetsSourceControl control = new InsetsSourceControl( ITYPE_STATUS_BAR, mLeash, new Point(), Insets.of(0, 10, 0, 0)); ITYPE_STATUS_BAR, mLeash, true, new Point(), Insets.of(0, 10, 0, 0)); mController.onControlsChanged(new InsetsSourceControl[]{control}); mController.controlWindowInsetsAnimation(0, 0 /* durationMs */, new LinearInterpolator(), Loading Loading @@ -926,7 +926,8 @@ public class InsetsControllerTest { // Simulate binder behavior by copying SurfaceControl. Otherwise, InsetsController will // attempt to release mLeash directly. SurfaceControl copy = new SurfaceControl(mLeash, "InsetsControllerTest.createControl"); return new InsetsSourceControl(type, copy, new Point(), Insets.NONE); return new InsetsSourceControl(type, copy, InsetsState.getDefaultVisibility(type), new Point(), Insets.NONE); } private InsetsSourceControl[] createSingletonControl(@InternalInsetsType int type) { Loading Loading
core/java/android/view/InsetsSourceConsumer.java +8 −34 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import static android.view.InsetsSourceConsumerProto.IS_REQUESTED_VISIBLE; import static android.view.InsetsSourceConsumerProto.PENDING_FRAME; import static android.view.InsetsSourceConsumerProto.PENDING_VISIBLE_FRAME; import static android.view.InsetsSourceConsumerProto.SOURCE_CONTROL; import static android.view.InsetsSourceControl.INVALID_HINTS; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.getDefaultVisibility; import static android.view.InsetsState.toPublicType; Loading @@ -34,7 +33,6 @@ import static com.android.internal.annotations.VisibleForTesting.Visibility.PACK import android.annotation.IntDef; import android.annotation.Nullable; import android.graphics.Insets; import android.graphics.Rect; import android.util.ArraySet; import android.util.Log; Loading Loading @@ -93,13 +91,6 @@ public class InsetsSourceConsumer { private Rect mPendingFrame; private Rect mPendingVisibleFrame; /** * Indicates if we have the pending animation. When we have the control, we need to play the * animation if the requested visibility is different from the current state. But if we haven't * had a leash yet, we will set this flag, and play the animation once we get the leash. */ private boolean mIsAnimationPending; /** * @param type The {@link InternalInsetsType} of the consumed insets. * @param state The current {@link InsetsState} of the consumed insets. Loading Loading @@ -138,7 +129,6 @@ public class InsetsSourceConsumer { } return false; } SurfaceControl oldLeash = mSourceControl != null ? mSourceControl.getLeash() : null; final InsetsSourceControl lastControl = mSourceControl; mSourceControl = control; Loading @@ -163,27 +153,21 @@ public class InsetsSourceConsumer { // For updateCompatSysUiVisibility applyLocalVisibilityOverride(); } else { // We are gaining control, and need to run an animation since previous state // didn't match final boolean requestedVisible = isRequestedVisibleAwaitingControl(); final boolean fakeControl = INVALID_HINTS.equals(control.getInsetsHint()); final boolean needsAnimation = requestedVisible != mState.getSource(mType).isVisible() && !fakeControl; if (control.getLeash() != null && (needsAnimation || mIsAnimationPending)) { if (DEBUG) Log.d(TAG, String.format("Gaining control in %s, requestedVisible: %b", final SurfaceControl oldLeash = lastControl != null ? lastControl.getLeash() : null; final SurfaceControl newLeash = control.getLeash(); if (newLeash != null && (oldLeash == null || !newLeash.isSameSurface(oldLeash)) && requestedVisible != control.isInitiallyVisible()) { // We are gaining leash, and need to run an animation since previous state // didn't match. if (DEBUG) Log.d(TAG, String.format("Gaining leash in %s, requestedVisible: %b", mController.getHost().getRootViewTitle(), requestedVisible)); if (requestedVisible) { showTypes[0] |= toPublicType(getType()); } else { hideTypes[0] |= toPublicType(getType()); } mIsAnimationPending = false; } else { if (needsAnimation) { // We need animation but we haven't had a leash yet. Set this flag that when we // get the leash we can play the deferred animation. mIsAnimationPending = true; } // We are gaining control, but don't need to run an animation. // However make sure that the leash visibility is still up to date. if (applyLocalVisibilityOverride()) { Loading @@ -195,7 +179,7 @@ public class InsetsSourceConsumer { applyRequestedVisibilityToControl(); // Remove the surface that owned by last control when it lost. if (!requestedVisible && !mIsAnimationPending && lastControl == null) { if (!requestedVisible && lastControl == null) { removeSurface(); } } Loading Loading @@ -406,16 +390,6 @@ public class InsetsSourceConsumer { protected void setRequestedVisible(boolean requestedVisible) { if (mRequestedVisible != requestedVisible) { mRequestedVisible = requestedVisible; // We need an animation later if the leash of a real control (which has an insets hint) // is not ready. The !mIsAnimationPending check is in case that the requested visibility // is changed twice before playing the animation -- we don't need an animation in this // case. mIsAnimationPending = !mIsAnimationPending && mSourceControl != null && mSourceControl.getLeash() == null && !Insets.NONE.equals(mSourceControl.getInsetsHint()); mController.onRequestedVisibilityChanged(this); if (DEBUG) Log.d(TAG, "setRequestedVisible: " + requestedVisible); } Loading
core/java/android/view/InsetsSourceControl.java +15 −9 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import android.util.proto.ProtoOutputStream; import android.view.InsetsState.InternalInsetsType; import java.io.PrintWriter; import java.util.Objects; import java.util.function.Consumer; /** Loading @@ -39,10 +40,9 @@ import java.util.function.Consumer; */ public class InsetsSourceControl implements Parcelable { public static final Insets INVALID_HINTS = Insets.of(-1, -1, -1, -1); private final @InternalInsetsType int mType; private final @Nullable SurfaceControl mLeash; private final boolean mInitiallyVisible; private final Point mSurfacePosition; // This is used while playing an insets animation regardless of the relative frame. This would Loading @@ -53,9 +53,10 @@ public class InsetsSourceControl implements Parcelable { private int mParcelableFlags; public InsetsSourceControl(@InternalInsetsType int type, @Nullable SurfaceControl leash, Point surfacePosition, Insets insetsHint) { boolean initiallyVisible, Point surfacePosition, Insets insetsHint) { mType = type; mLeash = leash; mInitiallyVisible = initiallyVisible; mSurfacePosition = surfacePosition; mInsetsHint = insetsHint; } Loading @@ -67,6 +68,7 @@ public class InsetsSourceControl implements Parcelable { } else { mLeash = null; } mInitiallyVisible = other.mInitiallyVisible; mSurfacePosition = new Point(other.mSurfacePosition); mInsetsHint = other.mInsetsHint; mSkipAnimationOnce = other.getAndClearSkipAnimationOnce(); Loading @@ -75,6 +77,7 @@ public class InsetsSourceControl implements Parcelable { public InsetsSourceControl(Parcel in) { mType = in.readInt(); mLeash = in.readTypedObject(SurfaceControl.CREATOR); mInitiallyVisible = in.readBoolean(); mSurfacePosition = in.readTypedObject(Point.CREATOR); mInsetsHint = in.readTypedObject(Insets.CREATOR); mSkipAnimationOnce = in.readBoolean(); Loading @@ -94,6 +97,10 @@ public class InsetsSourceControl implements Parcelable { return mLeash; } public boolean isInitiallyVisible() { return mInitiallyVisible; } public boolean setSurfacePosition(int left, int top) { if (mSurfacePosition.equals(left, top)) { return false; Loading Loading @@ -148,6 +155,7 @@ public class InsetsSourceControl implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mType); dest.writeTypedObject(mLeash, mParcelableFlags); dest.writeBoolean(mInitiallyVisible); dest.writeTypedObject(mSurfacePosition, mParcelableFlags); dest.writeTypedObject(mInsetsHint, mParcelableFlags); dest.writeBoolean(mSkipAnimationOnce); Loading @@ -172,6 +180,7 @@ public class InsetsSourceControl implements Parcelable { return mType == that.mType && ((mLeash == thatLeash) || (mLeash != null && thatLeash != null && mLeash.isSameSurface(thatLeash))) && mInitiallyVisible == that.mInitiallyVisible && mSurfacePosition.equals(that.mSurfacePosition) && mInsetsHint.equals(that.mInsetsHint) && mSkipAnimationOnce == that.mSkipAnimationOnce; Loading @@ -179,12 +188,8 @@ public class InsetsSourceControl implements Parcelable { @Override public int hashCode() { int result = mType; result = 31 * result + (mLeash != null ? mLeash.hashCode() : 0); result = 31 * result + mSurfacePosition.hashCode(); result = 31 * result + mInsetsHint.hashCode(); result = 31 * result + (mSkipAnimationOnce ? 1 : 0); return result; return Objects.hash(mType, mLeash, mInitiallyVisible, mSurfacePosition, mInsetsHint, mSkipAnimationOnce); } @Override Loading @@ -200,6 +205,7 @@ public class InsetsSourceControl implements Parcelable { pw.print(prefix); pw.print("InsetsSourceControl type="); pw.print(InsetsState.typeToString(mType)); pw.print(" mLeash="); pw.print(mLeash); pw.print(" mInitiallyVisible="); pw.print(mInitiallyVisible); pw.print(" mSurfacePosition="); pw.print(mSurfacePosition); pw.print(" mInsetsHint="); pw.print(mInsetsHint); pw.print(" mSkipAnimationOnce="); pw.print(mSkipAnimationOnce); Loading
core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ public class ImeInsetsSourceConsumerTest { @Test public void testImeVisibility() { final InsetsSourceControl ime = new InsetsSourceControl(ITYPE_IME, mLeash, new Point(), Insets.NONE); new InsetsSourceControl(ITYPE_IME, mLeash, false, new Point(), Insets.NONE); mController.onControlsChanged(new InsetsSourceControl[] { ime }); InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { Loading Loading @@ -121,7 +121,7 @@ public class ImeInsetsSourceConsumerTest { // set control and verify visibility is applied. InsetsSourceControl control = new InsetsSourceControl(ITYPE_IME, mLeash, new Point(), Insets.NONE); new InsetsSourceControl(ITYPE_IME, mLeash, false, new Point(), Insets.NONE); mController.onControlsChanged(new InsetsSourceControl[] { control }); // IME show animation should be triggered when control becomes available. verify(mController).applyAnimation( Loading Loading @@ -158,7 +158,7 @@ public class ImeInsetsSourceConsumerTest { // set control and verify visibility is applied. InsetsSourceControl control = Mockito.spy( new InsetsSourceControl(ITYPE_IME, mLeash, new Point(), Insets.NONE)); new InsetsSourceControl(ITYPE_IME, mLeash, false, new Point(), Insets.NONE)); // Simulate IME source control set this flag when the target has starting window. control.setSkipAnimationOnce(true); Loading
core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -95,12 +95,13 @@ public class InsetsAnimationControlImplTest { () -> mMockTransaction, mMockController); topConsumer.setControl( new InsetsSourceControl( ITYPE_STATUS_BAR, mTopLeash, new Point(0, 0), Insets.of(0, 100, 0, 0)), ITYPE_STATUS_BAR, mTopLeash, true, new Point(0, 0), Insets.of(0, 100, 0, 0)), new int[1], new int[1]); InsetsSourceConsumer navConsumer = new InsetsSourceConsumer(ITYPE_NAVIGATION_BAR, mInsetsState, () -> mMockTransaction, mMockController); navConsumer.setControl(new InsetsSourceControl(ITYPE_NAVIGATION_BAR, mNavLeash, navConsumer.setControl(new InsetsSourceControl(ITYPE_NAVIGATION_BAR, mNavLeash, true, new Point(400, 0), Insets.of(0, 0, 100, 0)), new int[1], new int[1]); navConsumer.hide(); Loading
core/tests/coretests/src/android/view/InsetsControllerTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -223,7 +223,7 @@ public class InsetsControllerTest { InsetsSourceControl control = new InsetsSourceControl( ITYPE_STATUS_BAR, mLeash, new Point(), Insets.of(0, 10, 0, 0)); ITYPE_STATUS_BAR, mLeash, true, new Point(), Insets.of(0, 10, 0, 0)); mController.onControlsChanged(new InsetsSourceControl[]{control}); mController.controlWindowInsetsAnimation(0, 0 /* durationMs */, new LinearInterpolator(), Loading Loading @@ -926,7 +926,8 @@ public class InsetsControllerTest { // Simulate binder behavior by copying SurfaceControl. Otherwise, InsetsController will // attempt to release mLeash directly. SurfaceControl copy = new SurfaceControl(mLeash, "InsetsControllerTest.createControl"); return new InsetsSourceControl(type, copy, new Point(), Insets.NONE); return new InsetsSourceControl(type, copy, InsetsState.getDefaultVisibility(type), new Point(), Insets.NONE); } private InsetsSourceControl[] createSingletonControl(@InternalInsetsType int type) { Loading