diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 653645794f956..3f4ddea22a249 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -2089,6 +2089,16 @@ public class InputManagerService extends IInputManager.Stub } } + // Native callback + private void notifyUntrustedTouch(String packageName) { + // TODO(b/169067926): Remove toast after gathering feedback on dogfood. + DisplayThread.getHandler().post(() -> + Toast.makeText(mContext, + "Touch obscured by " + packageName + + " will be blocked. Check go/s-untrusted-touches", + Toast.LENGTH_SHORT).show()); + } + // Native callback. private long notifyANR(InputApplicationHandle inputApplicationHandle, IBinder token, String reason) { diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 4413dc3df6bbd..c1d5f19fd2569 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -99,6 +99,7 @@ static struct { jmethodID notifyInputChannelBroken; jmethodID notifyANR; jmethodID notifyFocusChanged; + jmethodID notifyUntrustedTouch; jmethodID filterInputEvent; jmethodID interceptKeyBeforeQueueing; jmethodID interceptMotionBeforeQueueingNonInteractive; @@ -256,6 +257,7 @@ public: const sp& token, const std::string& reason) override; void notifyInputChannelBroken(const sp& token) override; void notifyFocusChanged(const sp& oldToken, const sp& newToken) override; + void notifyUntrustedTouch(const std::string& obscuringPackage) override; bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) override; void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) override; void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) override; @@ -755,6 +757,17 @@ void NativeInputManager::notifyInputChannelBroken(const sp& token) { } } +void NativeInputManager::notifyUntrustedTouch(const std::string& obscuringPackage) { +#if DEBUG_INPUT_DISPATCHER_POLICY + ALOGD("notifyUntrustedTouch - obscuringPackage=%s", obscuringPackage.c_str()); +#endif + ATRACE_CALL(); + JNIEnv* env = jniEnv(); + jstring jPackage = env->NewStringUTF(obscuringPackage.c_str()); + env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyUntrustedTouch, jPackage); + checkAndClearExceptionFromCallback(env, "notifyUntrustedTouch"); +} + void NativeInputManager::notifyFocusChanged(const sp& oldToken, const sp& newToken) { #if DEBUG_INPUT_DISPATCHER_POLICY @@ -1893,6 +1906,9 @@ int register_android_server_InputManager(JNIEnv* env) { GET_METHOD_ID(gServiceClassInfo.notifyFocusChanged, clazz, "notifyFocusChanged", "(Landroid/os/IBinder;Landroid/os/IBinder;)V"); + GET_METHOD_ID(gServiceClassInfo.notifyUntrustedTouch, clazz, "notifyUntrustedTouch", + "(Ljava/lang/String;)V"); + GET_METHOD_ID(gServiceClassInfo.notifyANR, clazz, "notifyANR", "(Landroid/view/InputApplicationHandle;Landroid/os/IBinder;Ljava/lang/String;)J");