Loading quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java +6 −5 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.provider.RestoreDbTask; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.uioverrides.DejankBinderTracker; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.SysUINavigationMode.Mode; import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener; import com.android.quickstep.inputconsumers.AccessibilityInputConsumer; Loading Loading @@ -401,7 +401,6 @@ public class TouchInteractionService extends Service implements } private void onInputEvent(InputEvent ev) { DejankBinderTracker.allowBinderTrackingInTests(); if (TestProtocol.sDebugTracing) { Log.d(TestProtocol.NO_BACKGROUND_TO_OVERVIEW_TAG, "onInputEvent " + ev); } Loading @@ -410,6 +409,7 @@ public class TouchInteractionService extends Service implements return; } TraceHelper.INSTANCE.beginFlagsOverride(TraceHelper.FLAG_ALLOW_BINDER_TRACKING); MotionEvent event = (MotionEvent) ev; if (event.getAction() == ACTION_DOWN) { GestureState newGestureState = new GestureState( Loading Loading @@ -438,7 +438,7 @@ public class TouchInteractionService extends Service implements ActiveGestureLog.INSTANCE.addLog("onMotionEvent", event.getActionMasked()); mUncheckedConsumer.onMotionEvent(event); DejankBinderTracker.disallowBinderTrackingInTests(); TraceHelper.INSTANCE.endFlagsOverride(); } private InputConsumer newConsumer(GestureState gestureState, boolean useSharedState, Loading Loading @@ -490,7 +490,7 @@ public class TouchInteractionService extends Service implements private InputConsumer newBaseConsumer(GestureState gestureState, boolean useSharedState, MotionEvent event) { RunningTaskInfo runningTaskInfo = DejankBinderTracker.whitelistIpcs( RunningTaskInfo runningTaskInfo = TraceHelper.whitelistIpcs("getRunningTask.0", () -> mAM.getRunningTask(0)); if (!useSharedState) { sSwipeSharedState.clearAllState(false /* finishAnimation */); Loading @@ -504,7 +504,8 @@ public class TouchInteractionService extends Service implements if (isExcludedAssistant(runningTaskInfo)) { // In the case where we are in the excluded assistant state, ignore it and treat the // running activity as the task behind the assistant runningTaskInfo = DejankBinderTracker.whitelistIpcs( runningTaskInfo = TraceHelper.whitelistIpcs("getRunningTask.assistant", () -> mAM.getRunningTask(ACTIVITY_TYPE_ASSISTANT)); if (!ActivityManagerWrapper.isHomeTask(runningTaskInfo)) { final ComponentName homeComponent = Loading quickstep/recents_ui_overrides/src/com/android/quickstep/WindowTransformSwipeHandler.java +12 −15 Original line number Diff line number Diff line Loading @@ -23,8 +23,6 @@ import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2; import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE; import static com.android.launcher3.config.FeatureFlags.QUICKSTEP_SPRINGS; import static com.android.launcher3.util.DefaultDisplay.getSingleFrameMs; import static com.android.launcher3.util.RaceConditionTracker.ENTER; import static com.android.launcher3.util.RaceConditionTracker.EXIT; import static com.android.launcher3.util.SystemUiController.UI_STATE_OVERVIEW; import static com.android.quickstep.BaseActivityInterface.AnimationFactory.ShelfAnimState.HIDE; import static com.android.quickstep.BaseActivityInterface.AnimationFactory.ShelfAnimState.PEEK; Loading Loading @@ -65,11 +63,9 @@ import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.uioverrides.DejankBinderTracker; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.RaceConditionTracker; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.BaseActivityInterface.AnimationFactory; import com.android.quickstep.BaseActivityInterface.AnimationFactory.ShelfAnimState; Loading Loading @@ -371,13 +367,13 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> if (mWasLauncherAlreadyVisible) { mStateCallback.setState(STATE_LAUNCHER_DRAWN); } else { TraceHelper.beginSection("WTS-init"); TraceHelper.INSTANCE.beginSection("WTS-init"); View dragLayer = activity.getDragLayer(); dragLayer.getViewTreeObserver().addOnDrawListener(new OnDrawListener() { @Override public void onDraw() { TraceHelper.endSection("WTS-init", "Launcher frame is drawn"); TraceHelper.INSTANCE.endSection(); dragLayer.post(() -> dragLayer.getViewTreeObserver().removeOnDrawListener(this)); if (activity != mActivity) { Loading Loading @@ -420,13 +416,13 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> private void initializeLauncherAnimationController() { buildAnimationController(); DejankBinderTracker.whitelistIpcs(() -> { TraceHelper.INSTANCE.beginSection("logToggleRecents", TraceHelper.FLAG_IGNORE_BINDERS); // Only used in debug builds if (LatencyTrackerCompat.isEnabled(mContext)) { LatencyTrackerCompat.logToggleRecents( (int) (mLauncherFrameDrawnTime - mTouchTimeMs)); } }); TraceHelper.INSTANCE.endSection(); // This method is only called when STATE_GESTURE_STARTED is set, so we can enable the // high-res thumbnail loader here once we are sure that we will end up in an overview state Loading Loading @@ -1148,9 +1144,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> } if (!finishTransitionPosted) { // If we haven't posted a draw callback, set the state immediately. RaceConditionTracker.onEvent(SCREENSHOT_CAPTURED_EVT, ENTER); TraceHelper.INSTANCE.beginSection(SCREENSHOT_CAPTURED_EVT, TraceHelper.FLAG_CHECK_FOR_RACE_CONDITIONS); setStateOnUiThread(STATE_SCREENSHOT_CAPTURED); RaceConditionTracker.onEvent(SCREENSHOT_CAPTURED_EVT, EXIT); TraceHelper.INSTANCE.endSection(); } } } Loading quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java +6 −10 Original line number Diff line number Diff line Loading @@ -25,8 +25,7 @@ import static android.view.MotionEvent.INVALID_POINTER_ID; import static com.android.launcher3.Utilities.EDGE_NAV_BAR; import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.util.RaceConditionTracker.ENTER; import static com.android.launcher3.util.RaceConditionTracker.EXIT; import static com.android.launcher3.util.TraceHelper.FLAG_CHECK_FOR_RACE_CONDITIONS; import static com.android.quickstep.TouchInteractionService.startRecentsActivityAsync; import static com.android.quickstep.util.ActiveGestureLog.INTENT_EXTRA_LOG_TRACE_ID; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; Loading @@ -48,13 +47,13 @@ import androidx.annotation.UiThread; import com.android.launcher3.R; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RaceConditionTracker; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.BaseActivityInterface; import com.android.quickstep.BaseSwipeUpHandler; import com.android.quickstep.BaseSwipeUpHandler.Factory; import com.android.quickstep.GestureState; import com.android.quickstep.InputConsumer; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationDeviceState; import com.android.quickstep.SwipeSharedState; import com.android.quickstep.SysUINavigationMode; Loading @@ -63,7 +62,6 @@ import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.CachedEventDispatcher; import com.android.quickstep.util.MotionPauseDetector; import com.android.quickstep.util.NavBarPosition; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.InputMonitorCompat; Loading Loading @@ -200,8 +198,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC switch (ev.getActionMasked()) { case ACTION_DOWN: { RaceConditionTracker.onEvent(DOWN_EVT, ENTER); TraceHelper.beginSection("TouchInt"); TraceHelper.INSTANCE.beginSection(DOWN_EVT, FLAG_CHECK_FOR_RACE_CONDITIONS); mActivePointerId = ev.getPointerId(0); mDownPos.set(ev.getX(), ev.getY()); mLastPos.set(mDownPos); Loading @@ -212,7 +209,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC startTouchTrackingForWindowAnimation(ev.getEventTime(), false); } RaceConditionTracker.onEvent(DOWN_EVT, EXIT); TraceHelper.INSTANCE.endSection(); break; } case ACTION_POINTER_DOWN: { Loading Loading @@ -358,8 +355,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC * the animation can still be running. */ private void finishTouchTracking(MotionEvent ev) { RaceConditionTracker.onEvent(UP_EVT, ENTER); TraceHelper.endSection("TouchInt"); TraceHelper.INSTANCE.beginSection(UP_EVT, FLAG_CHECK_FOR_RACE_CONDITIONS); if (mPassedWindowMoveSlop && mInteractionHandler != null) { if (ev.getActionMasked() == ACTION_CANCEL) { Loading Loading @@ -393,7 +389,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC mVelocityTracker.recycle(); mVelocityTracker = null; mMotionPauseDetector.clear(); RaceConditionTracker.onEvent(UP_EVT, EXIT); TraceHelper.INSTANCE.endSection(); } @Override Loading quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java +2 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,8 @@ import com.android.launcher3.R; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.appprediction.PredictionUiStateManager; import com.android.launcher3.appprediction.PredictionUiStateManager.Client; import com.android.launcher3.uioverrides.DejankBinderTracker; import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.views.ScrimView; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.util.AppWindowAnimationHelper; Loading Loading @@ -221,7 +221,7 @@ public class LauncherRecentsView extends RecentsView<Launcher> implements StateL @Override public boolean shouldUseMultiWindowTaskSizeStrategy() { return DejankBinderTracker.whitelistIpcs(() -> mActivity.isInMultiWindowMode()); return TraceHelper.whitelistIpcs("isInMultiWindowMode", mActivity::isInMultiWindowMode); } @Override Loading quickstep/src/com/android/launcher3/uioverrides/DejankBinderTracker.javadeleted 100644 → 0 +0 −159 Original line number Diff line number Diff line /** * Copyright (C) 2019 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.uioverrides; import static android.os.IBinder.FLAG_ONEWAY; import android.os.Binder; import android.os.Build; import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.util.Log; import androidx.annotation.MainThread; import java.util.HashSet; import java.util.Locale; import java.util.function.BiConsumer; import java.util.function.Supplier; /** * A binder proxy transaction listener for tracking non-whitelisted binder calls. */ public class DejankBinderTracker implements Binder.ProxyTransactListener { private static final String TAG = "DejankBinderTracker"; private static final Object sLock = new Object(); private static final HashSet<String> sWhitelistedFrameworkClasses = new HashSet<>(); static { // Common IPCs that are ok to block the main thread. sWhitelistedFrameworkClasses.add("android.view.IWindowSession"); sWhitelistedFrameworkClasses.add("android.os.IPowerManager"); } private static boolean sTemporarilyIgnoreTracking = false; // Used by the client to limit binder tracking to specific regions private static boolean sTrackingAllowed = false; private BiConsumer<String, Integer> mUnexpectedTransactionCallback; private boolean mIsTracking = false; /** * Temporarily ignore blocking binder calls for the duration of this {@link Runnable}. */ @MainThread public static void whitelistIpcs(Runnable runnable) { sTemporarilyIgnoreTracking = true; runnable.run(); sTemporarilyIgnoreTracking = false; } /** * Temporarily ignore blocking binder calls for the duration of this {@link Supplier}. */ @MainThread public static <T> T whitelistIpcs(Supplier<T> supplier) { sTemporarilyIgnoreTracking = true; T value = supplier.get(); sTemporarilyIgnoreTracking = false; return value; } /** * Enables binder tracking during a test. */ @MainThread public static void allowBinderTrackingInTests() { sTrackingAllowed = true; } /** * Disables binder tracking during a test. */ @MainThread public static void disallowBinderTrackingInTests() { sTrackingAllowed = false; } public DejankBinderTracker(BiConsumer<String, Integer> unexpectedTransactionCallback) { mUnexpectedTransactionCallback = unexpectedTransactionCallback; } @MainThread public void startTracking() { if (!Build.TYPE.toLowerCase(Locale.ROOT).contains("debug") && !Build.TYPE.toLowerCase(Locale.ROOT).equals("eng")) { Log.wtf(TAG, "Unexpected use of binder tracker in non-debug build", new Exception()); return; } if (mIsTracking) { return; } mIsTracking = true; Binder.setProxyTransactListener(this); } @MainThread public void stopTracking() { if (!mIsTracking) { return; } mIsTracking = false; Binder.setProxyTransactListener(null); } // Override the hidden Binder#onTransactStarted method public synchronized Object onTransactStarted(IBinder binder, int transactionCode, int flags) { if (!mIsTracking || !sTrackingAllowed || sTemporarilyIgnoreTracking || (flags & FLAG_ONEWAY) == FLAG_ONEWAY || !isMainThread()) { return null; } String descriptor; try { descriptor = binder.getInterfaceDescriptor(); if (sWhitelistedFrameworkClasses.contains(descriptor)) { return null; } } catch (RemoteException e) { e.printStackTrace(); descriptor = binder.getClass().getSimpleName(); } mUnexpectedTransactionCallback.accept(descriptor, transactionCode); return null; } @Override public Object onTransactStarted(IBinder binder, int transactionCode) { // Do nothing return null; } @Override public void onTransactEnded(Object session) { // Do nothing } public static boolean isMainThread() { return Thread.currentThread() == Looper.getMainLooper().getThread(); } } Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java +6 −5 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.provider.RestoreDbTask; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.uioverrides.DejankBinderTracker; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.SysUINavigationMode.Mode; import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener; import com.android.quickstep.inputconsumers.AccessibilityInputConsumer; Loading Loading @@ -401,7 +401,6 @@ public class TouchInteractionService extends Service implements } private void onInputEvent(InputEvent ev) { DejankBinderTracker.allowBinderTrackingInTests(); if (TestProtocol.sDebugTracing) { Log.d(TestProtocol.NO_BACKGROUND_TO_OVERVIEW_TAG, "onInputEvent " + ev); } Loading @@ -410,6 +409,7 @@ public class TouchInteractionService extends Service implements return; } TraceHelper.INSTANCE.beginFlagsOverride(TraceHelper.FLAG_ALLOW_BINDER_TRACKING); MotionEvent event = (MotionEvent) ev; if (event.getAction() == ACTION_DOWN) { GestureState newGestureState = new GestureState( Loading Loading @@ -438,7 +438,7 @@ public class TouchInteractionService extends Service implements ActiveGestureLog.INSTANCE.addLog("onMotionEvent", event.getActionMasked()); mUncheckedConsumer.onMotionEvent(event); DejankBinderTracker.disallowBinderTrackingInTests(); TraceHelper.INSTANCE.endFlagsOverride(); } private InputConsumer newConsumer(GestureState gestureState, boolean useSharedState, Loading Loading @@ -490,7 +490,7 @@ public class TouchInteractionService extends Service implements private InputConsumer newBaseConsumer(GestureState gestureState, boolean useSharedState, MotionEvent event) { RunningTaskInfo runningTaskInfo = DejankBinderTracker.whitelistIpcs( RunningTaskInfo runningTaskInfo = TraceHelper.whitelistIpcs("getRunningTask.0", () -> mAM.getRunningTask(0)); if (!useSharedState) { sSwipeSharedState.clearAllState(false /* finishAnimation */); Loading @@ -504,7 +504,8 @@ public class TouchInteractionService extends Service implements if (isExcludedAssistant(runningTaskInfo)) { // In the case where we are in the excluded assistant state, ignore it and treat the // running activity as the task behind the assistant runningTaskInfo = DejankBinderTracker.whitelistIpcs( runningTaskInfo = TraceHelper.whitelistIpcs("getRunningTask.assistant", () -> mAM.getRunningTask(ACTIVITY_TYPE_ASSISTANT)); if (!ActivityManagerWrapper.isHomeTask(runningTaskInfo)) { final ComponentName homeComponent = Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/WindowTransformSwipeHandler.java +12 −15 Original line number Diff line number Diff line Loading @@ -23,8 +23,6 @@ import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2; import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE; import static com.android.launcher3.config.FeatureFlags.QUICKSTEP_SPRINGS; import static com.android.launcher3.util.DefaultDisplay.getSingleFrameMs; import static com.android.launcher3.util.RaceConditionTracker.ENTER; import static com.android.launcher3.util.RaceConditionTracker.EXIT; import static com.android.launcher3.util.SystemUiController.UI_STATE_OVERVIEW; import static com.android.quickstep.BaseActivityInterface.AnimationFactory.ShelfAnimState.HIDE; import static com.android.quickstep.BaseActivityInterface.AnimationFactory.ShelfAnimState.PEEK; Loading Loading @@ -65,11 +63,9 @@ import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.uioverrides.DejankBinderTracker; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.RaceConditionTracker; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.BaseActivityInterface.AnimationFactory; import com.android.quickstep.BaseActivityInterface.AnimationFactory.ShelfAnimState; Loading Loading @@ -371,13 +367,13 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> if (mWasLauncherAlreadyVisible) { mStateCallback.setState(STATE_LAUNCHER_DRAWN); } else { TraceHelper.beginSection("WTS-init"); TraceHelper.INSTANCE.beginSection("WTS-init"); View dragLayer = activity.getDragLayer(); dragLayer.getViewTreeObserver().addOnDrawListener(new OnDrawListener() { @Override public void onDraw() { TraceHelper.endSection("WTS-init", "Launcher frame is drawn"); TraceHelper.INSTANCE.endSection(); dragLayer.post(() -> dragLayer.getViewTreeObserver().removeOnDrawListener(this)); if (activity != mActivity) { Loading Loading @@ -420,13 +416,13 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> private void initializeLauncherAnimationController() { buildAnimationController(); DejankBinderTracker.whitelistIpcs(() -> { TraceHelper.INSTANCE.beginSection("logToggleRecents", TraceHelper.FLAG_IGNORE_BINDERS); // Only used in debug builds if (LatencyTrackerCompat.isEnabled(mContext)) { LatencyTrackerCompat.logToggleRecents( (int) (mLauncherFrameDrawnTime - mTouchTimeMs)); } }); TraceHelper.INSTANCE.endSection(); // This method is only called when STATE_GESTURE_STARTED is set, so we can enable the // high-res thumbnail loader here once we are sure that we will end up in an overview state Loading Loading @@ -1148,9 +1144,10 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity> } if (!finishTransitionPosted) { // If we haven't posted a draw callback, set the state immediately. RaceConditionTracker.onEvent(SCREENSHOT_CAPTURED_EVT, ENTER); TraceHelper.INSTANCE.beginSection(SCREENSHOT_CAPTURED_EVT, TraceHelper.FLAG_CHECK_FOR_RACE_CONDITIONS); setStateOnUiThread(STATE_SCREENSHOT_CAPTURED); RaceConditionTracker.onEvent(SCREENSHOT_CAPTURED_EVT, EXIT); TraceHelper.INSTANCE.endSection(); } } } Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java +6 −10 Original line number Diff line number Diff line Loading @@ -25,8 +25,7 @@ import static android.view.MotionEvent.INVALID_POINTER_ID; import static com.android.launcher3.Utilities.EDGE_NAV_BAR; import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.util.RaceConditionTracker.ENTER; import static com.android.launcher3.util.RaceConditionTracker.EXIT; import static com.android.launcher3.util.TraceHelper.FLAG_CHECK_FOR_RACE_CONDITIONS; import static com.android.quickstep.TouchInteractionService.startRecentsActivityAsync; import static com.android.quickstep.util.ActiveGestureLog.INTENT_EXTRA_LOG_TRACE_ID; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; Loading @@ -48,13 +47,13 @@ import androidx.annotation.UiThread; import com.android.launcher3.R; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RaceConditionTracker; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.BaseActivityInterface; import com.android.quickstep.BaseSwipeUpHandler; import com.android.quickstep.BaseSwipeUpHandler.Factory; import com.android.quickstep.GestureState; import com.android.quickstep.InputConsumer; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationDeviceState; import com.android.quickstep.SwipeSharedState; import com.android.quickstep.SysUINavigationMode; Loading @@ -63,7 +62,6 @@ import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.CachedEventDispatcher; import com.android.quickstep.util.MotionPauseDetector; import com.android.quickstep.util.NavBarPosition; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.InputMonitorCompat; Loading Loading @@ -200,8 +198,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC switch (ev.getActionMasked()) { case ACTION_DOWN: { RaceConditionTracker.onEvent(DOWN_EVT, ENTER); TraceHelper.beginSection("TouchInt"); TraceHelper.INSTANCE.beginSection(DOWN_EVT, FLAG_CHECK_FOR_RACE_CONDITIONS); mActivePointerId = ev.getPointerId(0); mDownPos.set(ev.getX(), ev.getY()); mLastPos.set(mDownPos); Loading @@ -212,7 +209,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC startTouchTrackingForWindowAnimation(ev.getEventTime(), false); } RaceConditionTracker.onEvent(DOWN_EVT, EXIT); TraceHelper.INSTANCE.endSection(); break; } case ACTION_POINTER_DOWN: { Loading Loading @@ -358,8 +355,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC * the animation can still be running. */ private void finishTouchTracking(MotionEvent ev) { RaceConditionTracker.onEvent(UP_EVT, ENTER); TraceHelper.endSection("TouchInt"); TraceHelper.INSTANCE.beginSection(UP_EVT, FLAG_CHECK_FOR_RACE_CONDITIONS); if (mPassedWindowMoveSlop && mInteractionHandler != null) { if (ev.getActionMasked() == ACTION_CANCEL) { Loading Loading @@ -393,7 +389,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC mVelocityTracker.recycle(); mVelocityTracker = null; mMotionPauseDetector.clear(); RaceConditionTracker.onEvent(UP_EVT, EXIT); TraceHelper.INSTANCE.endSection(); } @Override Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java +2 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,8 @@ import com.android.launcher3.R; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.appprediction.PredictionUiStateManager; import com.android.launcher3.appprediction.PredictionUiStateManager.Client; import com.android.launcher3.uioverrides.DejankBinderTracker; import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.views.ScrimView; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.util.AppWindowAnimationHelper; Loading Loading @@ -221,7 +221,7 @@ public class LauncherRecentsView extends RecentsView<Launcher> implements StateL @Override public boolean shouldUseMultiWindowTaskSizeStrategy() { return DejankBinderTracker.whitelistIpcs(() -> mActivity.isInMultiWindowMode()); return TraceHelper.whitelistIpcs("isInMultiWindowMode", mActivity::isInMultiWindowMode); } @Override Loading
quickstep/src/com/android/launcher3/uioverrides/DejankBinderTracker.javadeleted 100644 → 0 +0 −159 Original line number Diff line number Diff line /** * Copyright (C) 2019 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.uioverrides; import static android.os.IBinder.FLAG_ONEWAY; import android.os.Binder; import android.os.Build; import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.util.Log; import androidx.annotation.MainThread; import java.util.HashSet; import java.util.Locale; import java.util.function.BiConsumer; import java.util.function.Supplier; /** * A binder proxy transaction listener for tracking non-whitelisted binder calls. */ public class DejankBinderTracker implements Binder.ProxyTransactListener { private static final String TAG = "DejankBinderTracker"; private static final Object sLock = new Object(); private static final HashSet<String> sWhitelistedFrameworkClasses = new HashSet<>(); static { // Common IPCs that are ok to block the main thread. sWhitelistedFrameworkClasses.add("android.view.IWindowSession"); sWhitelistedFrameworkClasses.add("android.os.IPowerManager"); } private static boolean sTemporarilyIgnoreTracking = false; // Used by the client to limit binder tracking to specific regions private static boolean sTrackingAllowed = false; private BiConsumer<String, Integer> mUnexpectedTransactionCallback; private boolean mIsTracking = false; /** * Temporarily ignore blocking binder calls for the duration of this {@link Runnable}. */ @MainThread public static void whitelistIpcs(Runnable runnable) { sTemporarilyIgnoreTracking = true; runnable.run(); sTemporarilyIgnoreTracking = false; } /** * Temporarily ignore blocking binder calls for the duration of this {@link Supplier}. */ @MainThread public static <T> T whitelistIpcs(Supplier<T> supplier) { sTemporarilyIgnoreTracking = true; T value = supplier.get(); sTemporarilyIgnoreTracking = false; return value; } /** * Enables binder tracking during a test. */ @MainThread public static void allowBinderTrackingInTests() { sTrackingAllowed = true; } /** * Disables binder tracking during a test. */ @MainThread public static void disallowBinderTrackingInTests() { sTrackingAllowed = false; } public DejankBinderTracker(BiConsumer<String, Integer> unexpectedTransactionCallback) { mUnexpectedTransactionCallback = unexpectedTransactionCallback; } @MainThread public void startTracking() { if (!Build.TYPE.toLowerCase(Locale.ROOT).contains("debug") && !Build.TYPE.toLowerCase(Locale.ROOT).equals("eng")) { Log.wtf(TAG, "Unexpected use of binder tracker in non-debug build", new Exception()); return; } if (mIsTracking) { return; } mIsTracking = true; Binder.setProxyTransactListener(this); } @MainThread public void stopTracking() { if (!mIsTracking) { return; } mIsTracking = false; Binder.setProxyTransactListener(null); } // Override the hidden Binder#onTransactStarted method public synchronized Object onTransactStarted(IBinder binder, int transactionCode, int flags) { if (!mIsTracking || !sTrackingAllowed || sTemporarilyIgnoreTracking || (flags & FLAG_ONEWAY) == FLAG_ONEWAY || !isMainThread()) { return null; } String descriptor; try { descriptor = binder.getInterfaceDescriptor(); if (sWhitelistedFrameworkClasses.contains(descriptor)) { return null; } } catch (RemoteException e) { e.printStackTrace(); descriptor = binder.getClass().getSimpleName(); } mUnexpectedTransactionCallback.accept(descriptor, transactionCode); return null; } @Override public Object onTransactStarted(IBinder binder, int transactionCode) { // Do nothing return null; } @Override public void onTransactEnded(Object session) { // Do nothing } public static boolean isMainThread() { return Thread.currentThread() == Looper.getMainLooper().getThread(); } }