Merge "Offload IMMS#mImeDrawsImeNavBarRes initialization" into tm-dev
This commit is contained in:
@@ -166,6 +166,7 @@ import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
|
|||||||
import com.android.internal.notification.SystemNotificationChannels;
|
import com.android.internal.notification.SystemNotificationChannels;
|
||||||
import com.android.internal.os.SomeArgs;
|
import com.android.internal.os.SomeArgs;
|
||||||
import com.android.internal.os.TransferPipe;
|
import com.android.internal.os.TransferPipe;
|
||||||
|
import com.android.internal.util.ConcurrentUtils;
|
||||||
import com.android.internal.util.DumpUtils;
|
import com.android.internal.util.DumpUtils;
|
||||||
import com.android.internal.view.IInlineSuggestionsRequestCallback;
|
import com.android.internal.view.IInlineSuggestionsRequestCallback;
|
||||||
import com.android.internal.view.IInlineSuggestionsResponseCallback;
|
import com.android.internal.view.IInlineSuggestionsResponseCallback;
|
||||||
@@ -179,6 +180,7 @@ import com.android.server.AccessibilityManagerInternal;
|
|||||||
import com.android.server.EventLogTags;
|
import com.android.server.EventLogTags;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
import com.android.server.ServiceThread;
|
import com.android.server.ServiceThread;
|
||||||
|
import com.android.server.SystemServerInitThreadPool;
|
||||||
import com.android.server.SystemService;
|
import com.android.server.SystemService;
|
||||||
import com.android.server.inputmethod.InputMethodManagerInternal.InputMethodListListener;
|
import com.android.server.inputmethod.InputMethodManagerInternal.InputMethodListListener;
|
||||||
import com.android.server.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem;
|
import com.android.server.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem;
|
||||||
@@ -207,6 +209,7 @@ import java.util.OptionalInt;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -351,6 +354,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
|
|||||||
@GuardedBy("ImfLock.class")
|
@GuardedBy("ImfLock.class")
|
||||||
@Nullable
|
@Nullable
|
||||||
private OverlayableSystemBooleanResourceWrapper mImeDrawsImeNavBarRes;
|
private OverlayableSystemBooleanResourceWrapper mImeDrawsImeNavBarRes;
|
||||||
|
@GuardedBy("ImfLock.class")
|
||||||
|
@Nullable
|
||||||
|
Future<?> mImeDrawsImeNavBarResLazyInitFuture;
|
||||||
|
|
||||||
static class SessionState {
|
static class SessionState {
|
||||||
final ClientState client;
|
final ClientState client;
|
||||||
@@ -1742,7 +1748,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GuardedBy("ImfLock.class")
|
@GuardedBy("ImfLock.class")
|
||||||
private void recreateImeDrawsImeNavBarResIfNecessary(@UserIdInt int targetUserId) {
|
private void maybeInitImeNavbarConfigLocked(@UserIdInt int targetUserId) {
|
||||||
// Currently, com.android.internal.R.bool.config_imeDrawsImeNavBar is overlaid only for the
|
// Currently, com.android.internal.R.bool.config_imeDrawsImeNavBar is overlaid only for the
|
||||||
// profile parent user.
|
// profile parent user.
|
||||||
// TODO(b/221443458): See if we can make OverlayManager be aware of profile groups.
|
// TODO(b/221443458): See if we can make OverlayManager be aware of profile groups.
|
||||||
@@ -1786,7 +1792,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
|
|||||||
if (DEBUG) Slog.d(TAG, "Switching user stage 1/3. newUserId=" + newUserId
|
if (DEBUG) Slog.d(TAG, "Switching user stage 1/3. newUserId=" + newUserId
|
||||||
+ " currentUserId=" + mSettings.getCurrentUserId());
|
+ " currentUserId=" + mSettings.getCurrentUserId());
|
||||||
|
|
||||||
recreateImeDrawsImeNavBarResIfNecessary(newUserId);
|
maybeInitImeNavbarConfigLocked(newUserId);
|
||||||
|
|
||||||
// ContentObserver should be registered again when the user is changed
|
// ContentObserver should be registered again when the user is changed
|
||||||
mSettingsObserver.registerContentObserverLocked(newUserId);
|
mSettingsObserver.registerContentObserverLocked(newUserId);
|
||||||
@@ -1892,7 +1898,22 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
recreateImeDrawsImeNavBarResIfNecessary(currentUserId);
|
// TODO(b/32343335): The entire systemRunning() method needs to be revisited.
|
||||||
|
mImeDrawsImeNavBarResLazyInitFuture = SystemServerInitThreadPool.submit(() -> {
|
||||||
|
// Note that the synchronization block below guarantees that the task
|
||||||
|
// can never be completed before the returned Future<?> object is assigned to
|
||||||
|
// the "mImeDrawsImeNavBarResLazyInitFuture" field.
|
||||||
|
synchronized (ImfLock.class) {
|
||||||
|
mImeDrawsImeNavBarResLazyInitFuture = null;
|
||||||
|
if (currentUserId != mSettings.getCurrentUserId()) {
|
||||||
|
// This means that the current user is already switched to other user
|
||||||
|
// before the background task is executed. In this scenario the relevant
|
||||||
|
// field should already be initialized.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
maybeInitImeNavbarConfigLocked(currentUserId);
|
||||||
|
}
|
||||||
|
}, "Lazily initialize IMMS#mImeDrawsImeNavBarRes");
|
||||||
|
|
||||||
mMyPackageMonitor.register(mContext, null, UserHandle.ALL, true);
|
mMyPackageMonitor.register(mContext, null, UserHandle.ALL, true);
|
||||||
mSettingsObserver.registerContentObserverLocked(currentUserId);
|
mSettingsObserver.registerContentObserverLocked(currentUserId);
|
||||||
@@ -3028,6 +3049,11 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
|
|||||||
@GuardedBy("ImfLock.class")
|
@GuardedBy("ImfLock.class")
|
||||||
@InputMethodNavButtonFlags
|
@InputMethodNavButtonFlags
|
||||||
private int getInputMethodNavButtonFlagsLocked() {
|
private int getInputMethodNavButtonFlagsLocked() {
|
||||||
|
if (mImeDrawsImeNavBarResLazyInitFuture != null) {
|
||||||
|
// TODO(b/225366708): Avoid Future.get(), which is internally used here.
|
||||||
|
ConcurrentUtils.waitForFutureNoInterrupt(mImeDrawsImeNavBarResLazyInitFuture,
|
||||||
|
"Waiting for the lazy init of mImeDrawsImeNavBarRes");
|
||||||
|
}
|
||||||
final boolean canImeDrawsImeNavBar =
|
final boolean canImeDrawsImeNavBar =
|
||||||
mImeDrawsImeNavBarRes != null && mImeDrawsImeNavBarRes.get();
|
mImeDrawsImeNavBarRes != null && mImeDrawsImeNavBarRes.get();
|
||||||
final boolean shouldShowImeSwitcherWhenImeIsShown = shouldShowImeSwitcherLocked(
|
final boolean shouldShowImeSwitcherWhenImeIsShown = shouldShowImeSwitcherLocked(
|
||||||
|
|||||||
Reference in New Issue
Block a user