Moving some calls off the UI thread
This saves ~5ms in onNewIntent Bug: 67305604 Change-Id: Ic97727b1c526e50bd3c8a1d8f511e1d7fd5e05e7
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user