diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2017-10-02 12:45:10 -0700 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2017-10-02 14:50:09 -0700 |
commit | 326403e958344751539cefec62ecbc6d28abd2ce (patch) | |
tree | f85bf31497e8addcc28542990d897cb234b5fb0d | |
parent | ec21a599f4cf68c74a2f7aad6797c0ba6d7409ad (diff) | |
download | packages_apps_Trebuchet-326403e958344751539cefec62ecbc6d28abd2ce.tar.gz packages_apps_Trebuchet-326403e958344751539cefec62ecbc6d28abd2ce.tar.bz2 packages_apps_Trebuchet-326403e958344751539cefec62ecbc6d28abd2ce.zip |
Moving some calls off the UI thread
This saves ~5ms in onNewIntent
Bug: 67305604
Change-Id: Ic97727b1c526e50bd3c8a1d8f511e1d7fd5e05e7
6 files changed, 105 insertions, 39 deletions
diff --git a/src/com/android/launcher3/ExtendedEditText.java b/src/com/android/launcher3/ExtendedEditText.java index 596aa8f7b..403c8b8ba 100644 --- a/src/com/android/launcher3/ExtendedEditText.java +++ b/src/com/android/launcher3/ExtendedEditText.java @@ -16,12 +16,16 @@ package com.android.launcher3; import android.content.Context; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.DragEvent; import android.view.KeyEvent; +import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; +import com.android.launcher3.util.UiThreadHelper; + /** * The edit text that reports back when the back key has been pressed. @@ -102,8 +106,7 @@ public class ExtendedEditText extends EditText { } public void dispatchBackKey() { - ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE)) - .hideSoftInputFromWindow(getWindowToken(), 0); + UiThreadHelper.hideKeyboardAsync(getContext(), getWindowToken()); if (mBackKeyListener != null) { mBackKeyListener.onBackKey(); } @@ -121,4 +124,17 @@ public class ExtendedEditText extends EditText { public boolean isSuggestionsEnabled() { return !mForceDisableSuggestions && super.isSuggestionsEnabled(); } + + public void reset() { + if (!TextUtils.isEmpty(getText())) { + setText(""); + } + if (isFocused()) { + View nextFocus = focusSearch(View.FOCUS_DOWN); + if (nextFocus != null) { + nextFocus.requestFocus(); + } + } + UiThreadHelper.hideKeyboardAsync(getContext(), getWindowToken()); + } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 8702660d2..3a8d260c4 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -16,6 +16,9 @@ package com.android.launcher3; +import static com.android.launcher3.util.RunnableWithId.RUNNABLE_ID_BIND_APPS; +import static com.android.launcher3.util.RunnableWithId.RUNNABLE_ID_BIND_WIDGETS; + import android.Manifest; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -53,8 +56,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Process; import android.os.StrictMode; -import android.os.SystemClock; -import android.os.Trace; import android.os.UserHandle; import android.support.annotation.Nullable; import android.text.Selection; @@ -119,7 +120,6 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; import com.android.launcher3.util.ActivityResultInfo; -import com.android.launcher3.util.RunnableWithId; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.ComponentKeyMapper; import com.android.launcher3.util.ItemInfoMatcher; @@ -127,11 +127,13 @@ import com.android.launcher3.util.MultiHashMap; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.PendingRequestArgs; +import com.android.launcher3.util.RunnableWithId; import com.android.launcher3.util.SystemUiController; import com.android.launcher3.util.TestingUtils; import com.android.launcher3.util.Themes; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.TraceHelper; +import com.android.launcher3.util.UiThreadHelper; import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.launcher3.widget.PendingAddShortcutInfo; import com.android.launcher3.widget.PendingAddWidgetInfo; @@ -140,7 +142,6 @@ import com.android.launcher3.widget.WidgetHostViewLoader; import com.android.launcher3.widget.WidgetsContainerView; import com.android.launcher3.widget.custom.CustomWidgetParser; - import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; @@ -150,9 +151,6 @@ import java.util.List; import java.util.Set; import java.util.concurrent.Executor; -import static com.android.launcher3.util.RunnableWithId.RUNNABLE_ID_BIND_APPS; -import static com.android.launcher3.util.RunnableWithId.RUNNABLE_ID_BIND_WIDGETS; - /** * Default launcher application. */ @@ -1606,9 +1604,7 @@ public class Launcher extends BaseActivity final View v = getWindow().peekDecorView(); if (v != null && v.getWindowToken() != null) { - InputMethodManager imm = (InputMethodManager) getSystemService( - INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(v.getWindowToken(), 0); + UiThreadHelper.hideKeyboardAsync(this, v.getWindowToken()); } // Reset the apps view diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java index 63aa7be3a..bf03a0ee1 100644 --- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java +++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java @@ -15,16 +15,13 @@ */ package com.android.launcher3.allapps.search; -import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.KeyEvent; -import android.view.View; import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; @@ -50,7 +47,6 @@ public class AllAppsSearchBarController protected String mQuery; protected SearchAlgorithm mSearchAlgorithm; - protected InputMethodManager mInputMethodManager; public void setVisibility(int visibility) { mInput.setVisibility(visibility); @@ -68,10 +64,6 @@ public class AllAppsSearchBarController mInput.addTextChangedListener(this); mInput.setOnEditorActionListener(this); mInput.setOnBackKeyListener(this); - - mInputMethodManager = (InputMethodManager) - mInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - mSearchAlgorithm = searchAlgorithm; } @@ -137,22 +129,9 @@ public class AllAppsSearchBarController * Resets the search bar state. */ public void reset() { - unfocusSearchField(); mCb.clearSearchResult(); - mInput.setText(""); + mInput.reset(); mQuery = null; - hideKeyboard(); - } - - protected void hideKeyboard() { - mInputMethodManager.hideSoftInputFromWindow(mInput.getWindowToken(), 0); - } - - protected void unfocusSearchField() { - View nextFocus = mInput.focusSearch(View.FOCUS_DOWN); - if (nextFocus != null) { - nextFocus.requestFocus(); - } } /** diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java index b8527148b..a7ed87fb6 100644 --- a/src/com/android/launcher3/dragndrop/DragController.java +++ b/src/com/android/launcher3/dragndrop/DragController.java @@ -27,7 +27,6 @@ import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.inputmethod.InputMethodManager; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; @@ -39,6 +38,7 @@ import com.android.launcher3.accessibility.DragViewStateAnnouncer; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.TouchController; +import com.android.launcher3.util.UiThreadHelper; import java.util.ArrayList; @@ -138,8 +138,7 @@ public class DragController implements DragDriver.EventListener, TouchController } // Hide soft keyboard, if visible - mLauncher.getSystemService(InputMethodManager.class) - .hideSoftInputFromWindow(mWindowToken, 0); + UiThreadHelper.hideKeyboardAsync(mLauncher, mWindowToken); mOptions = options; if (mOptions.systemDndStartPoint != null) { diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index 0989921b2..355c231f3 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -32,10 +32,10 @@ import android.view.View; import com.android.launcher3.BubbleTextView; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppWidgetHostView; -import com.android.launcher3.LauncherModel; import com.android.launcher3.R; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.util.UiThreadHelper; import java.nio.ByteBuffer; @@ -151,7 +151,7 @@ public class DragPreviewProvider { } mOutlineGeneratorCallback = new OutlineGeneratorCallback(preview); - new Handler(LauncherModel.getWorkerLooper()).postAtFrontOfQueue(mOutlineGeneratorCallback); + new Handler(UiThreadHelper.getBackgroundLooper()).post(mOutlineGeneratorCallback); } protected static Rect getDrawableBounds(Drawable d) { diff --git a/src/com/android/launcher3/util/UiThreadHelper.java b/src/com/android/launcher3/util/UiThreadHelper.java new file mode 100644 index 000000000..27140a113 --- /dev/null +++ b/src/com/android/launcher3/util/UiThreadHelper.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2017 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.launcher3.util; + +import android.content.Context; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.Process; +import android.view.inputmethod.InputMethodManager; + +/** + * Utility class for offloading some class from UI thread + */ +public class UiThreadHelper { + + private static HandlerThread sHandlerThread; + private static Handler sHandler; + + private static final int MSG_HIDE_KEYBOARD = 1; + + public static Looper getBackgroundLooper() { + if (sHandlerThread == null) { + sHandlerThread = + new HandlerThread("UiThreadHelper", Process.THREAD_PRIORITY_FOREGROUND); + sHandlerThread.start(); + } + return sHandlerThread.getLooper(); + } + + private static Handler getHandler(Context context) { + if (sHandler == null) { + sHandler = new Handler(getBackgroundLooper(), + new UiCallbacks(context.getApplicationContext())); + } + return sHandler; + } + + public static void hideKeyboardAsync(Context context, IBinder token) { + Message.obtain(getHandler(context), MSG_HIDE_KEYBOARD, token).sendToTarget(); + } + + private static class UiCallbacks implements Handler.Callback { + + private final InputMethodManager mIMM; + + UiCallbacks(Context context) { + mIMM = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + } + + @Override + public boolean handleMessage(Message message) { + switch (message.what) { + case MSG_HIDE_KEYBOARD: + mIMM.hideSoftInputFromWindow((IBinder) message.obj, 0); + return true; + } + return false; + } + } +} |