Loading config/hiddenapi-light-greylist.txt +17 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,7 @@ Landroid/app/ActivityThread;->mNumVisibleActivities:I Landroid/app/ActivityThread;->mPackages:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mPendingConfiguration:Landroid/content/res/Configuration; Landroid/app/ActivityThread;->mProviderMap:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mProviderRefCountMap:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mResourcePackages:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mResourcesManager:Landroid/app/ResourcesManager; Landroid/app/ActivityThread;->mServices:Landroid/util/ArrayMap; Loading Loading @@ -910,9 +911,14 @@ Landroid/app/SearchManager;->isVisible()Z Landroid/app/SearchManager;->launchAssist(Landroid/os/Bundle;)V Landroid/app/SearchManager;->mSearchDialog:Landroid/app/SearchDialog; Landroid/app/SearchManager;->startSearch(Ljava/lang/String;ZLandroid/content/ComponentName;Landroid/os/Bundle;ZLandroid/graphics/Rect;)V Landroid/app/servertransaction/ActivityResultItem;->mResultInfoList:Ljava/util/List; Landroid/app/servertransaction/ClientTransaction;->getActivityToken()Landroid/os/IBinder; Landroid/app/servertransaction/ClientTransaction;->getCallbacks()Ljava/util/List; Landroid/app/servertransaction/ClientTransaction;->getLifecycleStateRequest()Landroid/app/servertransaction/ActivityLifecycleItem; Landroid/app/servertransaction/ClientTransaction;->mActivityCallbacks:Ljava/util/List; Landroid/app/servertransaction/LaunchActivityItem;->mInfo:Landroid/content/pm/ActivityInfo; Landroid/app/servertransaction/LaunchActivityItem;->mIntent:Landroid/content/Intent; Landroid/app/servertransaction/NewIntentItem;->mIntents:Ljava/util/List; Landroid/app/Service;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Ljava/lang/String;Landroid/os/IBinder;Landroid/app/Application;Ljava/lang/Object;)V Landroid/app/Service;->mActivityManager:Landroid/app/IActivityManager; Landroid/app/Service;->mApplication:Landroid/app/Application; Loading Loading @@ -1705,6 +1711,12 @@ Landroid/content/pm/PackageParser$Provider;->syncable:Z Landroid/content/pm/PackageParser$ProviderIntentInfo;->provider:Landroid/content/pm/PackageParser$Provider; Landroid/content/pm/PackageParser$Service;->info:Landroid/content/pm/ServiceInfo; Landroid/content/pm/PackageParser$ServiceIntentInfo;->service:Landroid/content/pm/PackageParser$Service; Landroid/content/pm/PackageParser$SigningDetails$Builder;-><init>()V Landroid/content/pm/PackageParser$SigningDetails$Builder;->build()Landroid/content/pm/PackageParser$SigningDetails; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setPastSigningCertificates([Landroid/content/pm/Signature;)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setPastSigningCertificatesFlags([I)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setSignatures([Landroid/content/pm/Signature;)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setSignatureSchemeVersion(I)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails;->signatures:[Landroid/content/pm/Signature; Landroid/content/pm/PackageParser;-><init>()V Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Ljava/io/File;Z)V Loading Loading @@ -5865,6 +5877,7 @@ Landroid/view/animation/TranslateAnimation;->mToXValue:F Landroid/view/animation/TranslateAnimation;->mToYValue:F Landroid/view/animation/TranslateYAnimation;-><init>(IFIF)V Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/view/autofill/IAutoFillManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/autofill/IAutoFillManager; Landroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V Landroid/view/Choreographer$CallbackRecord;->run(J)V Landroid/view/Choreographer;->doFrame(JI)V Loading Loading @@ -9076,6 +9089,10 @@ Lorg/w3c/dom/ls/LSSerializerFilter;->getWhatToShow()I Lorg/w3c/dom/traversal/NodeFilter;->acceptNode(Lorg/w3c/dom/Node;)S Lorg/w3c/dom/traversal/NodeIterator;->detach()V Lorg/w3c/dom/traversal/NodeIterator;->nextNode()Lorg/w3c/dom/Node; Lorg/xml/sax/ext/Attributes2Impl;->declared:[Z Lorg/xml/sax/ext/Attributes2Impl;->specified:[Z Lorg/xml/sax/ext/Locator2Impl;->encoding:Ljava/lang/String; Lorg/xml/sax/ext/Locator2Impl;->version:Ljava/lang/String; Lorg/xml/sax/helpers/AttributesImpl;->badIndex(I)V Lorg/xml/sax/helpers/AttributesImpl;->data:[Ljava/lang/String; Lorg/xml/sax/helpers/AttributesImpl;->ensureCapacity(I)V core/java/android/os/Vibrator.java +21 −2 Original line number Diff line number Diff line Loading @@ -72,12 +72,23 @@ public abstract class Vibrator { public @interface VibrationIntensity{} private final String mPackageName; // The default vibration intensity level for haptic feedback. @VibrationIntensity private final int mDefaultHapticFeedbackIntensity; // The default vibration intensity level for notifications. @VibrationIntensity private final int mDefaultNotificationVibrationIntensity; /** * @hide to prevent subclassing from outside of the framework */ public Vibrator() { mPackageName = ActivityThread.currentPackageName(); final Context ctx = ActivityThread.currentActivityThread().getSystemContext(); mDefaultHapticFeedbackIntensity = loadDefaultIntensity(ctx, com.android.internal.R.integer.config_defaultHapticFeedbackIntensity); mDefaultNotificationVibrationIntensity = loadDefaultIntensity(ctx, com.android.internal.R.integer.config_defaultNotificationVibrationIntensity); } /** Loading @@ -85,6 +96,14 @@ public abstract class Vibrator { */ protected Vibrator(Context context) { mPackageName = context.getOpPackageName(); mDefaultHapticFeedbackIntensity = loadDefaultIntensity(context, com.android.internal.R.integer.config_defaultHapticFeedbackIntensity); mDefaultNotificationVibrationIntensity = loadDefaultIntensity(context, com.android.internal.R.integer.config_defaultNotificationVibrationIntensity); } private int loadDefaultIntensity(Context ctx, int resId) { return ctx != null ? ctx.getResources().getInteger(resId) : VIBRATION_INTENSITY_MEDIUM; } /** Loading @@ -92,7 +111,7 @@ public abstract class Vibrator { * @hide */ public int getDefaultHapticFeedbackIntensity() { return VIBRATION_INTENSITY_MEDIUM; return mDefaultHapticFeedbackIntensity; } /** Loading @@ -100,7 +119,7 @@ public abstract class Vibrator { * @hide */ public int getDefaultNotificationVibrationIntensity() { return VIBRATION_INTENSITY_HIGH; return mDefaultNotificationVibrationIntensity; } /** Loading core/java/android/view/ViewGroup.java +3 −3 Original line number Diff line number Diff line Loading @@ -5060,10 +5060,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager child.assignParent(this); } else { child.mParent = this; } if (child.hasUnhandledKeyListener()) { incrementChildUnhandledKeyListeners(); } } final boolean childHasFocus = child.hasFocus(); if (childHasFocus) { Loading core/java/android/view/ViewRootImpl.java +66 −41 Original line number Diff line number Diff line Loading @@ -76,7 +76,6 @@ import android.util.LongArray; import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.util.TypedValue; import android.view.Surface.OutOfResourcesException; Loading Loading @@ -5008,10 +5007,7 @@ public final class ViewRootImpl implements ViewParent, private int processKeyEvent(QueuedInputEvent q) { final KeyEvent event = (KeyEvent)q.mEvent; mUnhandledKeyManager.mDispatched = false; if (mUnhandledKeyManager.hasFocus() && mUnhandledKeyManager.dispatchUnique(mView, event)) { if (mUnhandledKeyManager.preViewDispatch(event)) { return FINISH_HANDLED; } Loading @@ -5024,7 +5020,10 @@ public final class ViewRootImpl implements ViewParent, return FINISH_NOT_HANDLED; } if (mUnhandledKeyManager.dispatchUnique(mView, event)) { // This dispatch is for windows that don't have a Window.Callback. Otherwise, // the Window.Callback usually will have already called this (see // DecorView.superDispatchKeyEvent) leaving this call a no-op. if (mUnhandledKeyManager.dispatch(mView, event)) { return FINISH_HANDLED; } Loading Loading @@ -7062,6 +7061,10 @@ public final class ViewRootImpl implements ViewParent, stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage; } if (q.mEvent instanceof KeyEvent) { mUnhandledKeyManager.preDispatch((KeyEvent) q.mEvent); } if (stage != null) { handleWindowFocusChanged(); stage.deliver(q); Loading Loading @@ -7830,7 +7833,7 @@ public final class ViewRootImpl implements ViewParent, * @param event * @return {@code true} if the event was handled, {@code false} otherwise. */ public boolean dispatchKeyFallbackEvent(KeyEvent event) { public boolean dispatchUnhandledKeyEvent(KeyEvent event) { return mUnhandledKeyManager.dispatch(mView, event); } Loading Loading @@ -8422,35 +8425,74 @@ public final class ViewRootImpl implements ViewParent, } private static class UnhandledKeyManager { // This is used to ensure that unhandled events are only dispatched once. We attempt // to dispatch more than once in order to achieve a certain order. Specifically, if we // are in an Activity or Dialog (and have a Window.Callback), the unhandled events should // be dispatched after the view hierarchy, but before the Activity. However, if we aren't // be dispatched after the view hierarchy, but before the Callback. However, if we aren't // in an activity, we still want unhandled keys to be dispatched. boolean mDispatched = false; private boolean mDispatched = true; // Keeps track of which Views have unhandled key focus for which keys. This doesn't // include modifiers. private final SparseArray<WeakReference<View>> mCapturedKeys = new SparseArray<>(); // The current receiver. This value is transient and used between the pre-dispatch and // pre-view phase to ensure that other input-stages don't interfere with tracking. private WeakReference<View> mCurrentReceiver = null; boolean dispatch(View root, KeyEvent event) { if (mDispatched) { return false; } View consumer; try { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "UnhandledKeyEvent dispatch"); mDispatched = true; SparseBooleanArray mCapturedKeys = new SparseBooleanArray(); WeakReference<View> mCurrentReceiver = null; consumer = root.dispatchUnhandledKeyEvent(event); private void updateCaptureState(KeyEvent event) { // If an unhandled listener handles one, then keep track of it so that the // consuming view is first to receive its repeats and release as well. if (event.getAction() == KeyEvent.ACTION_DOWN) { mCapturedKeys.append(event.getKeyCode(), true); int keycode = event.getKeyCode(); if (consumer != null && !KeyEvent.isModifierKey(keycode)) { mCapturedKeys.put(keycode, new WeakReference<>(consumer)); } if (event.getAction() == KeyEvent.ACTION_UP) { mCapturedKeys.delete(event.getKeyCode()); } } finally { Trace.traceEnd(Trace.TRACE_TAG_VIEW); } return consumer != null; } boolean dispatch(View root, KeyEvent event) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "KeyFallback dispatch"); mDispatched = true; updateCaptureState(event); /** * Called before the event gets dispatched to anything */ void preDispatch(KeyEvent event) { // Always clean-up 'up' events since it's possible for earlier dispatch stages to // consume them without consuming the corresponding 'down' event. mCurrentReceiver = null; if (event.getAction() == KeyEvent.ACTION_UP) { int idx = mCapturedKeys.indexOfKey(event.getKeyCode()); if (idx >= 0) { mCurrentReceiver = mCapturedKeys.valueAt(idx); mCapturedKeys.removeAt(idx); } } } /** * Called before the event gets dispatched to the view hierarchy * @return {@code true} if an unhandled handler has focus and consumed the event */ boolean preViewDispatch(KeyEvent event) { mDispatched = false; if (mCurrentReceiver == null) { mCurrentReceiver = mCapturedKeys.get(event.getKeyCode()); } if (mCurrentReceiver != null) { View target = mCurrentReceiver.get(); if (mCapturedKeys.size() == 0) { if (event.getAction() == KeyEvent.ACTION_UP) { mCurrentReceiver = null; } if (target != null && target.isAttachedToWindow()) { Loading @@ -8459,24 +8501,7 @@ public final class ViewRootImpl implements ViewParent, // consume anyways so that we don't feed uncaptured key events to other views return true; } View consumer = root.dispatchUnhandledKeyEvent(event); if (consumer != null) { mCurrentReceiver = new WeakReference<>(consumer); } Trace.traceEnd(Trace.TRACE_TAG_VIEW); return consumer != null; } boolean hasFocus() { return mCurrentReceiver != null; } boolean dispatchUnique(View root, KeyEvent event) { if (mDispatched) { return false; } return dispatch(root, event); } } } core/java/com/android/internal/policy/DecorView.java +1 −1 Original line number Diff line number Diff line Loading @@ -429,7 +429,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return true; } return (getViewRootImpl() != null) && getViewRootImpl().dispatchKeyFallbackEvent(event); return (getViewRootImpl() != null) && getViewRootImpl().dispatchUnhandledKeyEvent(event); } public boolean superDispatchKeyShortcutEvent(KeyEvent event) { Loading Loading
config/hiddenapi-light-greylist.txt +17 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,7 @@ Landroid/app/ActivityThread;->mNumVisibleActivities:I Landroid/app/ActivityThread;->mPackages:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mPendingConfiguration:Landroid/content/res/Configuration; Landroid/app/ActivityThread;->mProviderMap:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mProviderRefCountMap:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mResourcePackages:Landroid/util/ArrayMap; Landroid/app/ActivityThread;->mResourcesManager:Landroid/app/ResourcesManager; Landroid/app/ActivityThread;->mServices:Landroid/util/ArrayMap; Loading Loading @@ -910,9 +911,14 @@ Landroid/app/SearchManager;->isVisible()Z Landroid/app/SearchManager;->launchAssist(Landroid/os/Bundle;)V Landroid/app/SearchManager;->mSearchDialog:Landroid/app/SearchDialog; Landroid/app/SearchManager;->startSearch(Ljava/lang/String;ZLandroid/content/ComponentName;Landroid/os/Bundle;ZLandroid/graphics/Rect;)V Landroid/app/servertransaction/ActivityResultItem;->mResultInfoList:Ljava/util/List; Landroid/app/servertransaction/ClientTransaction;->getActivityToken()Landroid/os/IBinder; Landroid/app/servertransaction/ClientTransaction;->getCallbacks()Ljava/util/List; Landroid/app/servertransaction/ClientTransaction;->getLifecycleStateRequest()Landroid/app/servertransaction/ActivityLifecycleItem; Landroid/app/servertransaction/ClientTransaction;->mActivityCallbacks:Ljava/util/List; Landroid/app/servertransaction/LaunchActivityItem;->mInfo:Landroid/content/pm/ActivityInfo; Landroid/app/servertransaction/LaunchActivityItem;->mIntent:Landroid/content/Intent; Landroid/app/servertransaction/NewIntentItem;->mIntents:Ljava/util/List; Landroid/app/Service;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Ljava/lang/String;Landroid/os/IBinder;Landroid/app/Application;Ljava/lang/Object;)V Landroid/app/Service;->mActivityManager:Landroid/app/IActivityManager; Landroid/app/Service;->mApplication:Landroid/app/Application; Loading Loading @@ -1705,6 +1711,12 @@ Landroid/content/pm/PackageParser$Provider;->syncable:Z Landroid/content/pm/PackageParser$ProviderIntentInfo;->provider:Landroid/content/pm/PackageParser$Provider; Landroid/content/pm/PackageParser$Service;->info:Landroid/content/pm/ServiceInfo; Landroid/content/pm/PackageParser$ServiceIntentInfo;->service:Landroid/content/pm/PackageParser$Service; Landroid/content/pm/PackageParser$SigningDetails$Builder;-><init>()V Landroid/content/pm/PackageParser$SigningDetails$Builder;->build()Landroid/content/pm/PackageParser$SigningDetails; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setPastSigningCertificates([Landroid/content/pm/Signature;)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setPastSigningCertificatesFlags([I)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setSignatures([Landroid/content/pm/Signature;)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails$Builder;->setSignatureSchemeVersion(I)Landroid/content/pm/PackageParser$SigningDetails$Builder; Landroid/content/pm/PackageParser$SigningDetails;->signatures:[Landroid/content/pm/Signature; Landroid/content/pm/PackageParser;-><init>()V Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Ljava/io/File;Z)V Loading Loading @@ -5865,6 +5877,7 @@ Landroid/view/animation/TranslateAnimation;->mToXValue:F Landroid/view/animation/TranslateAnimation;->mToYValue:F Landroid/view/animation/TranslateYAnimation;-><init>(IFIF)V Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/view/autofill/IAutoFillManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/autofill/IAutoFillManager; Landroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V Landroid/view/Choreographer$CallbackRecord;->run(J)V Landroid/view/Choreographer;->doFrame(JI)V Loading Loading @@ -9076,6 +9089,10 @@ Lorg/w3c/dom/ls/LSSerializerFilter;->getWhatToShow()I Lorg/w3c/dom/traversal/NodeFilter;->acceptNode(Lorg/w3c/dom/Node;)S Lorg/w3c/dom/traversal/NodeIterator;->detach()V Lorg/w3c/dom/traversal/NodeIterator;->nextNode()Lorg/w3c/dom/Node; Lorg/xml/sax/ext/Attributes2Impl;->declared:[Z Lorg/xml/sax/ext/Attributes2Impl;->specified:[Z Lorg/xml/sax/ext/Locator2Impl;->encoding:Ljava/lang/String; Lorg/xml/sax/ext/Locator2Impl;->version:Ljava/lang/String; Lorg/xml/sax/helpers/AttributesImpl;->badIndex(I)V Lorg/xml/sax/helpers/AttributesImpl;->data:[Ljava/lang/String; Lorg/xml/sax/helpers/AttributesImpl;->ensureCapacity(I)V
core/java/android/os/Vibrator.java +21 −2 Original line number Diff line number Diff line Loading @@ -72,12 +72,23 @@ public abstract class Vibrator { public @interface VibrationIntensity{} private final String mPackageName; // The default vibration intensity level for haptic feedback. @VibrationIntensity private final int mDefaultHapticFeedbackIntensity; // The default vibration intensity level for notifications. @VibrationIntensity private final int mDefaultNotificationVibrationIntensity; /** * @hide to prevent subclassing from outside of the framework */ public Vibrator() { mPackageName = ActivityThread.currentPackageName(); final Context ctx = ActivityThread.currentActivityThread().getSystemContext(); mDefaultHapticFeedbackIntensity = loadDefaultIntensity(ctx, com.android.internal.R.integer.config_defaultHapticFeedbackIntensity); mDefaultNotificationVibrationIntensity = loadDefaultIntensity(ctx, com.android.internal.R.integer.config_defaultNotificationVibrationIntensity); } /** Loading @@ -85,6 +96,14 @@ public abstract class Vibrator { */ protected Vibrator(Context context) { mPackageName = context.getOpPackageName(); mDefaultHapticFeedbackIntensity = loadDefaultIntensity(context, com.android.internal.R.integer.config_defaultHapticFeedbackIntensity); mDefaultNotificationVibrationIntensity = loadDefaultIntensity(context, com.android.internal.R.integer.config_defaultNotificationVibrationIntensity); } private int loadDefaultIntensity(Context ctx, int resId) { return ctx != null ? ctx.getResources().getInteger(resId) : VIBRATION_INTENSITY_MEDIUM; } /** Loading @@ -92,7 +111,7 @@ public abstract class Vibrator { * @hide */ public int getDefaultHapticFeedbackIntensity() { return VIBRATION_INTENSITY_MEDIUM; return mDefaultHapticFeedbackIntensity; } /** Loading @@ -100,7 +119,7 @@ public abstract class Vibrator { * @hide */ public int getDefaultNotificationVibrationIntensity() { return VIBRATION_INTENSITY_HIGH; return mDefaultNotificationVibrationIntensity; } /** Loading
core/java/android/view/ViewGroup.java +3 −3 Original line number Diff line number Diff line Loading @@ -5060,10 +5060,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager child.assignParent(this); } else { child.mParent = this; } if (child.hasUnhandledKeyListener()) { incrementChildUnhandledKeyListeners(); } } final boolean childHasFocus = child.hasFocus(); if (childHasFocus) { Loading
core/java/android/view/ViewRootImpl.java +66 −41 Original line number Diff line number Diff line Loading @@ -76,7 +76,6 @@ import android.util.LongArray; import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.util.TypedValue; import android.view.Surface.OutOfResourcesException; Loading Loading @@ -5008,10 +5007,7 @@ public final class ViewRootImpl implements ViewParent, private int processKeyEvent(QueuedInputEvent q) { final KeyEvent event = (KeyEvent)q.mEvent; mUnhandledKeyManager.mDispatched = false; if (mUnhandledKeyManager.hasFocus() && mUnhandledKeyManager.dispatchUnique(mView, event)) { if (mUnhandledKeyManager.preViewDispatch(event)) { return FINISH_HANDLED; } Loading @@ -5024,7 +5020,10 @@ public final class ViewRootImpl implements ViewParent, return FINISH_NOT_HANDLED; } if (mUnhandledKeyManager.dispatchUnique(mView, event)) { // This dispatch is for windows that don't have a Window.Callback. Otherwise, // the Window.Callback usually will have already called this (see // DecorView.superDispatchKeyEvent) leaving this call a no-op. if (mUnhandledKeyManager.dispatch(mView, event)) { return FINISH_HANDLED; } Loading Loading @@ -7062,6 +7061,10 @@ public final class ViewRootImpl implements ViewParent, stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage; } if (q.mEvent instanceof KeyEvent) { mUnhandledKeyManager.preDispatch((KeyEvent) q.mEvent); } if (stage != null) { handleWindowFocusChanged(); stage.deliver(q); Loading Loading @@ -7830,7 +7833,7 @@ public final class ViewRootImpl implements ViewParent, * @param event * @return {@code true} if the event was handled, {@code false} otherwise. */ public boolean dispatchKeyFallbackEvent(KeyEvent event) { public boolean dispatchUnhandledKeyEvent(KeyEvent event) { return mUnhandledKeyManager.dispatch(mView, event); } Loading Loading @@ -8422,35 +8425,74 @@ public final class ViewRootImpl implements ViewParent, } private static class UnhandledKeyManager { // This is used to ensure that unhandled events are only dispatched once. We attempt // to dispatch more than once in order to achieve a certain order. Specifically, if we // are in an Activity or Dialog (and have a Window.Callback), the unhandled events should // be dispatched after the view hierarchy, but before the Activity. However, if we aren't // be dispatched after the view hierarchy, but before the Callback. However, if we aren't // in an activity, we still want unhandled keys to be dispatched. boolean mDispatched = false; private boolean mDispatched = true; // Keeps track of which Views have unhandled key focus for which keys. This doesn't // include modifiers. private final SparseArray<WeakReference<View>> mCapturedKeys = new SparseArray<>(); // The current receiver. This value is transient and used between the pre-dispatch and // pre-view phase to ensure that other input-stages don't interfere with tracking. private WeakReference<View> mCurrentReceiver = null; boolean dispatch(View root, KeyEvent event) { if (mDispatched) { return false; } View consumer; try { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "UnhandledKeyEvent dispatch"); mDispatched = true; SparseBooleanArray mCapturedKeys = new SparseBooleanArray(); WeakReference<View> mCurrentReceiver = null; consumer = root.dispatchUnhandledKeyEvent(event); private void updateCaptureState(KeyEvent event) { // If an unhandled listener handles one, then keep track of it so that the // consuming view is first to receive its repeats and release as well. if (event.getAction() == KeyEvent.ACTION_DOWN) { mCapturedKeys.append(event.getKeyCode(), true); int keycode = event.getKeyCode(); if (consumer != null && !KeyEvent.isModifierKey(keycode)) { mCapturedKeys.put(keycode, new WeakReference<>(consumer)); } if (event.getAction() == KeyEvent.ACTION_UP) { mCapturedKeys.delete(event.getKeyCode()); } } finally { Trace.traceEnd(Trace.TRACE_TAG_VIEW); } return consumer != null; } boolean dispatch(View root, KeyEvent event) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, "KeyFallback dispatch"); mDispatched = true; updateCaptureState(event); /** * Called before the event gets dispatched to anything */ void preDispatch(KeyEvent event) { // Always clean-up 'up' events since it's possible for earlier dispatch stages to // consume them without consuming the corresponding 'down' event. mCurrentReceiver = null; if (event.getAction() == KeyEvent.ACTION_UP) { int idx = mCapturedKeys.indexOfKey(event.getKeyCode()); if (idx >= 0) { mCurrentReceiver = mCapturedKeys.valueAt(idx); mCapturedKeys.removeAt(idx); } } } /** * Called before the event gets dispatched to the view hierarchy * @return {@code true} if an unhandled handler has focus and consumed the event */ boolean preViewDispatch(KeyEvent event) { mDispatched = false; if (mCurrentReceiver == null) { mCurrentReceiver = mCapturedKeys.get(event.getKeyCode()); } if (mCurrentReceiver != null) { View target = mCurrentReceiver.get(); if (mCapturedKeys.size() == 0) { if (event.getAction() == KeyEvent.ACTION_UP) { mCurrentReceiver = null; } if (target != null && target.isAttachedToWindow()) { Loading @@ -8459,24 +8501,7 @@ public final class ViewRootImpl implements ViewParent, // consume anyways so that we don't feed uncaptured key events to other views return true; } View consumer = root.dispatchUnhandledKeyEvent(event); if (consumer != null) { mCurrentReceiver = new WeakReference<>(consumer); } Trace.traceEnd(Trace.TRACE_TAG_VIEW); return consumer != null; } boolean hasFocus() { return mCurrentReceiver != null; } boolean dispatchUnique(View root, KeyEvent event) { if (mDispatched) { return false; } return dispatch(root, event); } } }
core/java/com/android/internal/policy/DecorView.java +1 −1 Original line number Diff line number Diff line Loading @@ -429,7 +429,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return true; } return (getViewRootImpl() != null) && getViewRootImpl().dispatchKeyFallbackEvent(event); return (getViewRootImpl() != null) && getViewRootImpl().dispatchUnhandledKeyEvent(event); } public boolean superDispatchKeyShortcutEvent(KeyEvent event) { Loading