Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e1f651a authored by Bernardo Rufino's avatar Bernardo Rufino
Browse files

Notify policy of untrusted touch for toast

Notify policy when an untrusted touch happens with the obscuring package
so we can show a toast in topic CL.

Test: Enable feature, draw overlay, verify toast appears
Test: atest WindowUntrustedTouchTest WindowInputTests inputflinger_tests
      inputflinger_benchmarks libinput_tests libgui_test
Bug: 158002302
Change-Id: Ief4a048128efc52b505a1a8c60aa2240a196f254
parent fae795de
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -57,6 +57,8 @@ private:

    void notifyFocusChanged(const sp<IBinder>&, const sp<IBinder>&) override {}

    void notifyUntrustedTouch(const std::string& obscuringPackage) override {}

    void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) override {
        *outConfig = mConfig;
    }
+1 −0
Original line number Diff line number Diff line
@@ -263,6 +263,7 @@ struct CommandEntry {
    std::shared_ptr<InputChannel> inputChannel;
    sp<IBinder> oldToken;
    sp<IBinder> newToken;
    std::string obscuringPackage;
};

} // namespace android::inputdispatcher
+22 −8
Original line number Diff line number Diff line
@@ -1743,16 +1743,15 @@ int32_t InputDispatcher::findTouchedWindowTargetsLocked(nsecs_t currentTime,
            mBlockUntrustedTouchesMode != BlockUntrustedTouchesMode::DISABLED) {
            TouchOcclusionInfo occlusionInfo =
                    computeTouchOcclusionInfoLocked(newTouchedWindowHandle, x, y);
            // The order of the operands in the 'if' below is important because even if the feature
            // is not BLOCK we want isTouchTrustedLocked() to execute in order to log details to
            // logcat.
            if (!isTouchTrustedLocked(occlusionInfo) &&
                mBlockUntrustedTouchesMode == BlockUntrustedTouchesMode::BLOCK) {
            if (!isTouchTrustedLocked(occlusionInfo)) {
                onUntrustedTouchLocked(occlusionInfo.obscuringPackage);
                if (mBlockUntrustedTouchesMode == BlockUntrustedTouchesMode::BLOCK) {
                    ALOGW("Dropping untrusted touch event due to %s/%d",
                          occlusionInfo.obscuringPackage.c_str(), occlusionInfo.obscuringUid);
                    newTouchedWindowHandle = nullptr;
                }
            }
        }

        // Also don't send the new touch event to unresponsive gesture monitors
        newGestureMonitors = selectResponsiveMonitorsLocked(newGestureMonitors);
@@ -4858,6 +4857,13 @@ void InputDispatcher::onAnrLocked(const std::shared_ptr<InputApplicationHandle>&
    postCommandLocked(std::move(commandEntry));
}

void InputDispatcher::onUntrustedTouchLocked(const std::string& obscuringPackage) {
    std::unique_ptr<CommandEntry> commandEntry = std::make_unique<CommandEntry>(
            &InputDispatcher::doNotifyUntrustedTouchLockedInterruptible);
    commandEntry->obscuringPackage = obscuringPackage;
    postCommandLocked(std::move(commandEntry));
}

void InputDispatcher::updateLastAnrStateLocked(const sp<InputWindowHandle>& window,
                                               const std::string& reason) {
    const std::string windowLabel = getApplicationWindowLabel(nullptr, window);
@@ -4936,6 +4942,14 @@ void InputDispatcher::doNotifyAnrLockedInterruptible(CommandEntry* commandEntry)
    }
}

void InputDispatcher::doNotifyUntrustedTouchLockedInterruptible(CommandEntry* commandEntry) {
    mLock.unlock();

    mPolicy->notifyUntrustedTouch(commandEntry->obscuringPackage);

    mLock.lock();
}

void InputDispatcher::extendAnrTimeoutsLocked(
        const std::shared_ptr<InputApplicationHandle>& application,
        const sp<IBinder>& connectionToken, std::chrono::nanoseconds timeoutExtension) {
+2 −0
Original line number Diff line number Diff line
@@ -547,6 +547,7 @@ private:
            REQUIRES(mLock);
    void onAnrLocked(const Connection& connection) REQUIRES(mLock);
    void onAnrLocked(const std::shared_ptr<InputApplicationHandle>& application) REQUIRES(mLock);
    void onUntrustedTouchLocked(const std::string& obscuringPackage) REQUIRES(mLock);
    void updateLastAnrStateLocked(const sp<InputWindowHandle>& window, const std::string& reason)
            REQUIRES(mLock);
    void updateLastAnrStateLocked(const std::shared_ptr<InputApplicationHandle>& application,
@@ -560,6 +561,7 @@ private:
    void doNotifyInputChannelBrokenLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyFocusChangedLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyAnrLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyUntrustedTouchLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doInterceptKeyBeforeDispatchingLockedInterruptible(CommandEntry* commandEntry)
            REQUIRES(mLock);
    void doDispatchCycleFinishedLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
+3 −0
Original line number Diff line number Diff line
@@ -55,6 +55,9 @@ public:
    virtual void notifyInputChannelBroken(const sp<IBinder>& token) = 0;
    virtual void notifyFocusChanged(const sp<IBinder>& oldToken, const sp<IBinder>& newToken) = 0;

    /* Notifies the system that an untrusted touch occurred. */
    virtual void notifyUntrustedTouch(const std::string& obscuringPackage) = 0;

    /* Gets the input dispatcher configuration. */
    virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) = 0;

Loading