Only create InsetsSourceConsumer for InsetsSourceControl
Previously, the insets source consumer is only created if the insets
source exists. However, if a control target is not below an insets
source, the target won't receive the source, and the consumer won't be
created, and the insets cannot be controlled.
Also, InsetsSourceConsumer only works when the control exists. So we
don't have to create redundant consumers for types not controllable.
This CL only creates the insets source consumer for the control, not for
the source. This fixes the z-order problem.
Fix: 290884763
Bug: 234093736
Test: atest InsetsControllerTest InsetsSourceConsumerTest
ImeInsetsSourceConsumerTest
Test: Watch a video in Google TV. Long press an icon on taskbar before
taskbar fades out. See if taskbar is visible.
Change-Id: I16a854d52f46d36899c826426afc5ebbcf47b586
This commit is contained in:
@@ -69,6 +69,7 @@ import com.android.internal.annotations.VisibleForTesting;
|
|||||||
import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
|
import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
|
||||||
import com.android.internal.inputmethod.ImeTracing;
|
import com.android.internal.inputmethod.ImeTracing;
|
||||||
import com.android.internal.inputmethod.SoftInputShowHideReason;
|
import com.android.internal.inputmethod.SoftInputShowHideReason;
|
||||||
|
import com.android.internal.util.function.TriFunction;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
@@ -77,7 +78,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.BiFunction;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements {@link WindowInsetsController} on the client.
|
* Implements {@link WindowInsetsController} on the client.
|
||||||
@@ -627,7 +627,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
private final InsetsState mLastDispatchedState = new InsetsState();
|
private final InsetsState mLastDispatchedState = new InsetsState();
|
||||||
|
|
||||||
private final Rect mFrame = new Rect();
|
private final Rect mFrame = new Rect();
|
||||||
private final BiFunction<InsetsController, InsetsSource, InsetsSourceConsumer> mConsumerCreator;
|
private final TriFunction<InsetsController, Integer, Integer, InsetsSourceConsumer>
|
||||||
|
mConsumerCreator;
|
||||||
private final SparseArray<InsetsSourceConsumer> mSourceConsumers = new SparseArray<>();
|
private final SparseArray<InsetsSourceConsumer> mSourceConsumers = new SparseArray<>();
|
||||||
private final InsetsSourceConsumer mImeSourceConsumer;
|
private final InsetsSourceConsumer mImeSourceConsumer;
|
||||||
private final Host mHost;
|
private final Host mHost;
|
||||||
@@ -695,13 +696,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
|
|
||||||
// Don't change the indexes of the sources while traversing. Remove it later.
|
// Don't change the indexes of the sources while traversing. Remove it later.
|
||||||
mPendingRemoveIndexes.add(index1);
|
mPendingRemoveIndexes.add(index1);
|
||||||
|
|
||||||
// Remove the consumer as well except the IME one. IME consumer should always
|
|
||||||
// be there since we need to communicate with InputMethodManager no matter we
|
|
||||||
// have the source or not.
|
|
||||||
if (source1.getType() != ime()) {
|
|
||||||
mSourceConsumers.remove(source1.getId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -756,12 +750,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
};
|
};
|
||||||
|
|
||||||
public InsetsController(Host host) {
|
public InsetsController(Host host) {
|
||||||
this(host, (controller, source) -> {
|
this(host, (controller, id, type) -> {
|
||||||
if (source.getType() == ime()) {
|
if (type == ime()) {
|
||||||
return new ImeInsetsSourceConsumer(source.getId(), controller.mState,
|
return new ImeInsetsSourceConsumer(id, controller.mState,
|
||||||
Transaction::new, controller);
|
Transaction::new, controller);
|
||||||
} else {
|
} else {
|
||||||
return new InsetsSourceConsumer(source.getId(), source.getType(), controller.mState,
|
return new InsetsSourceConsumer(id, type, controller.mState,
|
||||||
Transaction::new, controller);
|
Transaction::new, controller);
|
||||||
}
|
}
|
||||||
}, host.getHandler());
|
}, host.getHandler());
|
||||||
@@ -769,7 +763,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public InsetsController(Host host,
|
public InsetsController(Host host,
|
||||||
BiFunction<InsetsController, InsetsSource, InsetsSourceConsumer> consumerCreator,
|
TriFunction<InsetsController, Integer, Integer, InsetsSourceConsumer> consumerCreator,
|
||||||
Handler handler) {
|
Handler handler) {
|
||||||
mHost = host;
|
mHost = host;
|
||||||
mConsumerCreator = consumerCreator;
|
mConsumerCreator = consumerCreator;
|
||||||
@@ -821,7 +815,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Make mImeSourceConsumer always non-null.
|
// Make mImeSourceConsumer always non-null.
|
||||||
mImeSourceConsumer = getSourceConsumer(new InsetsSource(ID_IME, ime()));
|
mImeSourceConsumer = getSourceConsumer(ID_IME, ime());
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -898,7 +892,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
cancelledUserAnimationTypes[0] |= type;
|
cancelledUserAnimationTypes[0] |= type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getSourceConsumer(source).updateSource(source, animationType);
|
final InsetsSourceConsumer consumer = mSourceConsumers.get(source.getId());
|
||||||
|
if (consumer != null) {
|
||||||
|
consumer.updateSource(source, animationType);
|
||||||
|
} else {
|
||||||
|
mState.addSource(source);
|
||||||
|
}
|
||||||
existingTypes |= type;
|
existingTypes |= type;
|
||||||
if (source.isVisible()) {
|
if (source.isVisible()) {
|
||||||
visibleTypes |= type;
|
visibleTypes |= type;
|
||||||
@@ -1002,8 +1001,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
|
|
||||||
@InsetsType int controllableTypes = 0;
|
@InsetsType int controllableTypes = 0;
|
||||||
int consumedControlCount = 0;
|
int consumedControlCount = 0;
|
||||||
final int[] showTypes = new int[1];
|
final @InsetsType int[] showTypes = new int[1];
|
||||||
final int[] hideTypes = new int[1];
|
final @InsetsType int[] hideTypes = new int[1];
|
||||||
|
|
||||||
// Ensure to update all existing source consumers
|
// Ensure to update all existing source consumers
|
||||||
for (int i = mSourceConsumers.size() - 1; i >= 0; i--) {
|
for (int i = mSourceConsumers.size() - 1; i >= 0; i--) {
|
||||||
@@ -1019,15 +1018,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
consumer.setControl(control, showTypes, hideTypes);
|
consumer.setControl(control, showTypes, hideTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure to create source consumers if not available yet.
|
||||||
if (consumedControlCount != mTmpControlArray.size()) {
|
if (consumedControlCount != mTmpControlArray.size()) {
|
||||||
// Whoops! The server sent us some controls without sending corresponding sources.
|
|
||||||
for (int i = mTmpControlArray.size() - 1; i >= 0; i--) {
|
for (int i = mTmpControlArray.size() - 1; i >= 0; i--) {
|
||||||
final InsetsSourceControl control = mTmpControlArray.valueAt(i);
|
final InsetsSourceControl control = mTmpControlArray.valueAt(i);
|
||||||
final InsetsSourceConsumer consumer = mSourceConsumers.get(control.getId());
|
getSourceConsumer(control.getId(), control.getType())
|
||||||
if (consumer == null) {
|
.setControl(control, showTypes, hideTypes);
|
||||||
control.release(SurfaceControl::release);
|
|
||||||
Log.e(TAG, control + " has no consumer.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1592,6 +1588,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
if (type == ime()) {
|
if (type == ime()) {
|
||||||
abortPendingImeControlRequest();
|
abortPendingImeControlRequest();
|
||||||
}
|
}
|
||||||
|
if (consumer.getType() != ime()) {
|
||||||
|
// IME consumer should always be there since we need to communicate with
|
||||||
|
// InputMethodManager no matter we have the control or not.
|
||||||
|
mSourceConsumers.remove(consumer.getId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cancelAnimation(InsetsAnimationControlRunner control, boolean invokeCallback) {
|
private void cancelAnimation(InsetsAnimationControlRunner control, boolean invokeCallback) {
|
||||||
@@ -1645,21 +1646,20 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public @NonNull InsetsSourceConsumer getSourceConsumer(InsetsSource source) {
|
public @NonNull InsetsSourceConsumer getSourceConsumer(int id, int type) {
|
||||||
final int sourceId = source.getId();
|
InsetsSourceConsumer consumer = mSourceConsumers.get(id);
|
||||||
InsetsSourceConsumer consumer = mSourceConsumers.get(sourceId);
|
|
||||||
if (consumer != null) {
|
if (consumer != null) {
|
||||||
return consumer;
|
return consumer;
|
||||||
}
|
}
|
||||||
if (source.getType() == ime() && mImeSourceConsumer != null) {
|
if (type == ime() && mImeSourceConsumer != null) {
|
||||||
// WindowInsets.Type.ime() should be only provided by one source.
|
// WindowInsets.Type.ime() should be only provided by one source.
|
||||||
mSourceConsumers.remove(mImeSourceConsumer.getId());
|
mSourceConsumers.remove(mImeSourceConsumer.getId());
|
||||||
consumer = mImeSourceConsumer;
|
consumer = mImeSourceConsumer;
|
||||||
consumer.setId(sourceId);
|
consumer.setId(id);
|
||||||
} else {
|
} else {
|
||||||
consumer = mConsumerCreator.apply(this, source);
|
consumer = mConsumerCreator.apply(this, id, type);
|
||||||
}
|
}
|
||||||
mSourceConsumers.put(sourceId, consumer);
|
mSourceConsumers.put(id, consumer);
|
||||||
return consumer;
|
return consumer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1668,8 +1668,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
|
|||||||
return mImeSourceConsumer;
|
return mImeSourceConsumer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
void notifyVisibilityChanged() {
|
||||||
public void notifyVisibilityChanged() {
|
|
||||||
mHost.notifyInsetsChanged();
|
mHost.notifyInsetsChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -149,9 +149,12 @@ public class InsetsSourceConsumer {
|
|||||||
// Check if we need to restore server visibility.
|
// Check if we need to restore server visibility.
|
||||||
final InsetsSource localSource = mState.peekSource(mId);
|
final InsetsSource localSource = mState.peekSource(mId);
|
||||||
final InsetsSource serverSource = mController.getLastDispatchedState().peekSource(mId);
|
final InsetsSource serverSource = mController.getLastDispatchedState().peekSource(mId);
|
||||||
if (localSource != null && serverSource != null
|
final boolean localVisible = localSource != null && localSource.isVisible();
|
||||||
&& localSource.isVisible() != serverSource.isVisible()) {
|
final boolean serverVisible = serverSource != null && serverSource.isVisible();
|
||||||
localSource.setVisible(serverSource.isVisible());
|
if (localSource != null) {
|
||||||
|
localSource.setVisible(serverVisible);
|
||||||
|
}
|
||||||
|
if (localVisible != serverVisible) {
|
||||||
mController.notifyVisibilityChanged();
|
mController.notifyVisibilityChanged();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -131,10 +131,10 @@ public class InsetsControllerTest {
|
|||||||
mTestClock = new OffsettableClock();
|
mTestClock = new OffsettableClock();
|
||||||
mTestHandler = new TestHandler(null, mTestClock);
|
mTestHandler = new TestHandler(null, mTestClock);
|
||||||
mTestHost = spy(new TestHost(mViewRoot));
|
mTestHost = spy(new TestHost(mViewRoot));
|
||||||
mController = new InsetsController(mTestHost, (controller, source) -> {
|
mController = new InsetsController(mTestHost, (controller, id, type) -> {
|
||||||
if (source.getType() == ime()) {
|
if (type == ime()) {
|
||||||
return new InsetsSourceConsumer(source.getId(), source.getType(),
|
return new InsetsSourceConsumer(id, type, controller.getState(),
|
||||||
controller.getState(), Transaction::new, controller) {
|
Transaction::new, controller) {
|
||||||
|
|
||||||
private boolean mImeRequestedShow;
|
private boolean mImeRequestedShow;
|
||||||
|
|
||||||
@@ -150,8 +150,8 @@ public class InsetsControllerTest {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return new InsetsSourceConsumer(source.getId(), source.getType(),
|
return new InsetsSourceConsumer(id, type, controller.getState(),
|
||||||
controller.getState(), Transaction::new, controller);
|
Transaction::new, controller);
|
||||||
}
|
}
|
||||||
}, mTestHandler);
|
}, mTestHandler);
|
||||||
final Rect rect = new Rect(5, 5, 5, 5);
|
final Rect rect = new Rect(5, 5, 5, 5);
|
||||||
@@ -182,7 +182,8 @@ public class InsetsControllerTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testControlsChanged() {
|
public void testControlsChanged() {
|
||||||
mController.onControlsChanged(createSingletonControl(ID_STATUS_BAR, statusBars()));
|
mController.onControlsChanged(createSingletonControl(ID_STATUS_BAR, statusBars()));
|
||||||
assertNotNull(mController.getSourceConsumer(mStatusSource).getControl().getLeash());
|
assertNotNull(
|
||||||
|
mController.getSourceConsumer(ID_STATUS_BAR, statusBars()).getControl().getLeash());
|
||||||
mController.addOnControllableInsetsChangedListener(
|
mController.addOnControllableInsetsChangedListener(
|
||||||
((controller, typeMask) -> assertEquals(statusBars(), typeMask)));
|
((controller, typeMask) -> assertEquals(statusBars(), typeMask)));
|
||||||
}
|
}
|
||||||
@@ -194,7 +195,7 @@ public class InsetsControllerTest {
|
|||||||
mController.addOnControllableInsetsChangedListener(listener);
|
mController.addOnControllableInsetsChangedListener(listener);
|
||||||
mController.onControlsChanged(createSingletonControl(ID_STATUS_BAR, statusBars()));
|
mController.onControlsChanged(createSingletonControl(ID_STATUS_BAR, statusBars()));
|
||||||
mController.onControlsChanged(new InsetsSourceControl[0]);
|
mController.onControlsChanged(new InsetsSourceControl[0]);
|
||||||
assertNull(mController.getSourceConsumer(mStatusSource).getControl());
|
assertNull(mController.getSourceConsumer(ID_STATUS_BAR, statusBars()).getControl());
|
||||||
InOrder inOrder = Mockito.inOrder(listener);
|
InOrder inOrder = Mockito.inOrder(listener);
|
||||||
inOrder.verify(listener).onControllableInsetsChanged(eq(mController), eq(0));
|
inOrder.verify(listener).onControllableInsetsChanged(eq(mController), eq(0));
|
||||||
inOrder.verify(listener).onControllableInsetsChanged(eq(mController), eq(statusBars()));
|
inOrder.verify(listener).onControllableInsetsChanged(eq(mController), eq(statusBars()));
|
||||||
@@ -254,7 +255,7 @@ public class InsetsControllerTest {
|
|||||||
// only the original thread that created view hierarchy can touch its views
|
// only the original thread that created view hierarchy can touch its views
|
||||||
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
||||||
mController.setSystemDrivenInsetsAnimationLoggingListener(loggingListener);
|
mController.setSystemDrivenInsetsAnimationLoggingListener(loggingListener);
|
||||||
mController.getSourceConsumer(mImeSource).onWindowFocusGained(true);
|
mController.getSourceConsumer(ID_IME, ime()).onWindowFocusGained(true);
|
||||||
// since there is no focused view, forcefully make IME visible.
|
// since there is no focused view, forcefully make IME visible.
|
||||||
mController.show(WindowInsets.Type.ime(), true /* fromIme */, null /* statsToken */);
|
mController.show(WindowInsets.Type.ime(), true /* fromIme */, null /* statsToken */);
|
||||||
// When using the animation thread, this must not invoke onReady()
|
// When using the animation thread, this must not invoke onReady()
|
||||||
@@ -271,7 +272,7 @@ public class InsetsControllerTest {
|
|||||||
prepareControls();
|
prepareControls();
|
||||||
|
|
||||||
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
||||||
mController.getSourceConsumer(mImeSource).onWindowFocusGained(true);
|
mController.getSourceConsumer(ID_IME, ime()).onWindowFocusGained(true);
|
||||||
// since there is no focused view, forcefully make IME visible.
|
// since there is no focused view, forcefully make IME visible.
|
||||||
mController.show(WindowInsets.Type.ime(), true /* fromIme */, null /* statsToken */);
|
mController.show(WindowInsets.Type.ime(), true /* fromIme */, null /* statsToken */);
|
||||||
mController.show(all());
|
mController.show(all());
|
||||||
@@ -284,7 +285,7 @@ public class InsetsControllerTest {
|
|||||||
mController.hide(all());
|
mController.hide(all());
|
||||||
mController.cancelExistingAnimations();
|
mController.cancelExistingAnimations();
|
||||||
assertEquals(0, mController.getRequestedVisibleTypes() & types);
|
assertEquals(0, mController.getRequestedVisibleTypes() & types);
|
||||||
mController.getSourceConsumer(mImeSource).onWindowFocusLost();
|
mController.getSourceConsumer(ID_IME, ime()).onWindowFocusLost();
|
||||||
});
|
});
|
||||||
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
|
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
|
||||||
}
|
}
|
||||||
@@ -294,14 +295,14 @@ public class InsetsControllerTest {
|
|||||||
InsetsSourceControl ime = createControl(ID_IME, ime());
|
InsetsSourceControl ime = createControl(ID_IME, ime());
|
||||||
mController.onControlsChanged(new InsetsSourceControl[] { ime });
|
mController.onControlsChanged(new InsetsSourceControl[] { ime });
|
||||||
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
||||||
mController.getSourceConsumer(mImeSource).onWindowFocusGained(true);
|
mController.getSourceConsumer(ID_IME, ime()).onWindowFocusGained(true);
|
||||||
mController.show(WindowInsets.Type.ime(), true /* fromIme */, null /* statsToken */);
|
mController.show(WindowInsets.Type.ime(), true /* fromIme */, null /* statsToken */);
|
||||||
mController.cancelExistingAnimations();
|
mController.cancelExistingAnimations();
|
||||||
assertTrue(isRequestedVisible(mController, ime()));
|
assertTrue(isRequestedVisible(mController, ime()));
|
||||||
mController.hide(ime(), true /* fromIme */, null /* statsToken */);
|
mController.hide(ime(), true /* fromIme */, null /* statsToken */);
|
||||||
mController.cancelExistingAnimations();
|
mController.cancelExistingAnimations();
|
||||||
assertFalse(isRequestedVisible(mController, ime()));
|
assertFalse(isRequestedVisible(mController, ime()));
|
||||||
mController.getSourceConsumer(mImeSource).onWindowFocusLost();
|
mController.getSourceConsumer(ID_IME, ime()).onWindowFocusLost();
|
||||||
});
|
});
|
||||||
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
|
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
|
||||||
}
|
}
|
||||||
@@ -914,7 +915,7 @@ public class InsetsControllerTest {
|
|||||||
// Simulate IME insets is not controllable
|
// Simulate IME insets is not controllable
|
||||||
mController.onControlsChanged(new InsetsSourceControl[0]);
|
mController.onControlsChanged(new InsetsSourceControl[0]);
|
||||||
final InsetsSourceConsumer imeInsetsConsumer =
|
final InsetsSourceConsumer imeInsetsConsumer =
|
||||||
mController.getSourceConsumer(mImeSource);
|
mController.getSourceConsumer(ID_IME, ime());
|
||||||
assertNull(imeInsetsConsumer.getControl());
|
assertNull(imeInsetsConsumer.getControl());
|
||||||
|
|
||||||
// Verify IME requested visibility should be updated to IME consumer from controller.
|
// Verify IME requested visibility should be updated to IME consumer from controller.
|
||||||
|
|||||||
@@ -219,10 +219,10 @@ public class InsetsSourceConsumerTest {
|
|||||||
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
|
||||||
InsetsState state = new InsetsState();
|
InsetsState state = new InsetsState();
|
||||||
ViewRootInsetsControllerHost host = new ViewRootInsetsControllerHost(mViewRoot);
|
ViewRootInsetsControllerHost host = new ViewRootInsetsControllerHost(mViewRoot);
|
||||||
InsetsController insetsController = new InsetsController(host, (controller, source) -> {
|
InsetsController insetsController = new InsetsController(host, (ic, id, type) -> {
|
||||||
if (source.getType() == ime()) {
|
if (type == ime()) {
|
||||||
return new InsetsSourceConsumer(ID_IME, ime(), state,
|
return new InsetsSourceConsumer(ID_IME, ime(), state,
|
||||||
() -> mMockTransaction, controller) {
|
() -> mMockTransaction, ic) {
|
||||||
@Override
|
@Override
|
||||||
public int requestShow(boolean fromController,
|
public int requestShow(boolean fromController,
|
||||||
ImeTracker.Token statsToken) {
|
ImeTracker.Token statsToken) {
|
||||||
@@ -230,11 +230,9 @@ public class InsetsSourceConsumerTest {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return new InsetsSourceConsumer(source.getId(), source.getType(),
|
return new InsetsSourceConsumer(id, type, ic.getState(), Transaction::new, ic);
|
||||||
controller.getState(), Transaction::new, controller);
|
|
||||||
}, host.getHandler());
|
}, host.getHandler());
|
||||||
InsetsSource imeSource = new InsetsSource(ID_IME, ime());
|
InsetsSourceConsumer imeConsumer = insetsController.getSourceConsumer(ID_IME, ime());
|
||||||
InsetsSourceConsumer imeConsumer = insetsController.getSourceConsumer(imeSource);
|
|
||||||
|
|
||||||
// Initial IME insets source control with its leash.
|
// Initial IME insets source control with its leash.
|
||||||
imeConsumer.setControl(new InsetsSourceControl(ID_IME, ime(), mLeash,
|
imeConsumer.setControl(new InsetsSourceControl(ID_IME, ime(), mLeash,
|
||||||
|
|||||||
Reference in New Issue
Block a user