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

Commit 87c464e4 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 8857231 from e23a168d to tm-qpr1-release

Change-Id: I3c1251d93fa2a17267b79715c7ccc076d0f66f76
parents 4040fd4b e23a168d
Loading
Loading
Loading
Loading
+41 −38
Original line number Diff line number Diff line
@@ -29,6 +29,14 @@

using android::base::StringPrintf;

/**
 * This type is declared here to ensure consistency between the instantiated type (used in the
 * constructor via std::make_unique) and the cast-to type (used in PalmRejector::dump() with
 * static_cast). Due to the lack of rtti support, dynamic_cast is not available, so this can't be
 * checked at runtime to avoid undefined behaviour.
 */
using PalmFilterImplementation = ::ui::NeuralStylusPalmDetectionFilter;

namespace android {

// Category (=namespace) name for the input settings that are applied at boot time
@@ -81,21 +89,6 @@ static int getLinuxToolType(int32_t toolType) {
    return MT_TOOL_FINGER;
}

static std::string dumpDeviceInfo(const AndroidPalmFilterDeviceInfo& info) {
    std::string out;
    out += StringPrintf("max_x = %.2f\n", info.max_x);
    out += StringPrintf("max_y = %.2f\n", info.max_y);
    out += StringPrintf("x_res = %.2f\n", info.x_res);
    out += StringPrintf("y_res = %.2f\n", info.y_res);
    out += StringPrintf("major_radius_res = %.2f\n", info.major_radius_res);
    out += StringPrintf("minor_radius_res = %.2f\n", info.minor_radius_res);
    out += StringPrintf("minor_radius_supported = %s\n",
                        info.minor_radius_supported ? "true" : "false");
    out += StringPrintf("touch_major_res = %" PRId32 "\n", info.touch_major_res);
    out += StringPrintf("touch_minor_res = %" PRId32 "\n", info.touch_minor_res);
    return out;
}

static int32_t getActionUpForPointerId(const NotifyMotionArgs& args, int32_t pointerId) {
    for (size_t i = 0; i < args.pointerCount; i++) {
        if (pointerId == args.pointerProperties[i].id) {
@@ -128,15 +121,6 @@ static int32_t resolveActionForPointer(uint8_t pointerIndex, int32_t action) {
    return AMOTION_EVENT_ACTION_MOVE;
}

std::string toString(const ::ui::InProgressTouchEvdev& touch) {
    return StringPrintf("x=%.1f, y=%.1f, tracking_id=%i, slot=%zu,"
                        " pressure=%.1f, major=%i, minor=%i, "
                        "tool_type=%i, altered=%s, was_touching=%s, touching=%s",
                        touch.x, touch.y, touch.tracking_id, touch.slot, touch.pressure,
                        touch.major, touch.minor, touch.tool_type, toString(touch.altered),
                        toString(touch.was_touching), toString(touch.touching));
}

/**
 * Remove the data for the provided pointers from the args. The pointers are identified by their
 * pointerId, not by the index inside the array.
@@ -428,9 +412,10 @@ void UnwantedInteractionBlocker::dump(std::string& dump) {
    dump += "UnwantedInteractionBlocker:\n";
    dump += "  mPreferStylusOverTouchBlocker:\n";
    dump += addLinePrefix(mPreferStylusOverTouchBlocker.dump(), "    ");
    dump += StringPrintf("  mEnablePalmRejection: %s\n", toString(mEnablePalmRejection));
    dump += StringPrintf("  mEnablePalmRejection: %s\n",
                         std::to_string(mEnablePalmRejection).c_str());
    dump += StringPrintf("  isPalmRejectionEnabled (flag value): %s\n",
                         toString(isPalmRejectionEnabled()));
                         std::to_string(isPalmRejectionEnabled()).c_str());
    dump += mPalmRejectors.empty() ? "  mPalmRejectors: None\n" : "  mPalmRejectors:\n";
    for (const auto& [deviceId, palmRejector] : mPalmRejectors) {
        dump += StringPrintf("    deviceId = %" PRId32 ":\n", deviceId);
@@ -512,6 +497,15 @@ std::string SlotState::dump() const {
    return out;
}

class AndroidPalmRejectionModel : public ::ui::OneDeviceTrainNeuralStylusPalmDetectionFilterModel {
public:
    AndroidPalmRejectionModel()
          : ::ui::OneDeviceTrainNeuralStylusPalmDetectionFilterModel(/*default version*/ "",
                                                                     std::vector<float>()) {
        config_.resample_period = ::ui::kResamplePeriod;
    }
};

PalmRejector::PalmRejector(const AndroidPalmFilterDeviceInfo& info,
                           std::unique_ptr<::ui::PalmDetectionFilter> filter)
      : mSharedPalmState(std::make_unique<::ui::SharedPalmDetectionFilterState>()),
@@ -523,10 +517,8 @@ PalmRejector::PalmRejector(const AndroidPalmFilterDeviceInfo& info,
        return;
    }
    std::unique_ptr<::ui::NeuralStylusPalmDetectionFilterModel> model =
            std::make_unique<::ui::OneDeviceTrainNeuralStylusPalmDetectionFilterModel>(
                    std::vector<float>());
    mPalmDetectionFilter =
            std::make_unique<::ui::NeuralStylusPalmDetectionFilter>(mDeviceInfo, std::move(model),
            std::make_unique<AndroidPalmRejectionModel>();
    mPalmDetectionFilter = std::make_unique<PalmFilterImplementation>(mDeviceInfo, std::move(model),
                                                                      mSharedPalmState.get());
}

@@ -648,12 +640,13 @@ std::vector<NotifyMotionArgs> PalmRejector::processMotion(const NotifyMotionArgs
        LOG_ALWAYS_FATAL_IF(checkArgs.action == ACTION_UNKNOWN, "%s", checkArgs.dump().c_str());
    }

    if (mSuppressedPointerIds != oldSuppressedIds) {
        if (argsWithoutUnwantedPointers.size() != 1 ||
            argsWithoutUnwantedPointers[0].pointerCount != args.pointerCount) {
            ALOGI("Palm detected, removing pointer ids %s from %s",
                  dumpSet(mSuppressedPointerIds).c_str(), args.dump().c_str());
        }
    // Only log if new pointers are getting rejected. That means mSuppressedPointerIds is not a
    // subset of oldSuppressedIds.
    if (!std::includes(oldSuppressedIds.begin(), oldSuppressedIds.end(),
                       mSuppressedPointerIds.begin(), mSuppressedPointerIds.end())) {
        ALOGI("Palm detected, removing pointer ids %s after %" PRId64 "ms from %s",
              dumpSet(mSuppressedPointerIds).c_str(), ns2ms(args.eventTime - args.downTime),
              args.dump().c_str());
    }

    return argsWithoutUnwantedPointers;
@@ -666,11 +659,21 @@ const AndroidPalmFilterDeviceInfo& PalmRejector::getPalmFilterDeviceInfo() {
std::string PalmRejector::dump() const {
    std::string out;
    out += "mDeviceInfo:\n";
    out += addLinePrefix(dumpDeviceInfo(mDeviceInfo), "  ");
    std::stringstream deviceInfo;
    deviceInfo << mDeviceInfo << ", touch_major_res=" << mDeviceInfo.touch_major_res
               << ", touch_minor_res=" << mDeviceInfo.touch_minor_res << "\n";
    out += addLinePrefix(deviceInfo.str(), "  ");
    out += "mSlotState:\n";
    out += addLinePrefix(mSlotState.dump(), "  ");
    out += "mSuppressedPointerIds: ";
    out += dumpSet(mSuppressedPointerIds) + "\n";
    std::stringstream state;
    state << *mSharedPalmState;
    out += "mSharedPalmState: " + state.str() + "\n";
    std::stringstream filter;
    filter << static_cast<const PalmFilterImplementation&>(*mPalmDetectionFilter);
    out += "mPalmDetectionFilter:\n";
    out += addLinePrefix(filter.str(), "  ") + "\n";
    return out;
}

+8 −0
Original line number Diff line number Diff line
@@ -4470,6 +4470,14 @@ void InputDispatcher::transformMotionEntryForInjectionLocked(
    if (it == mDisplayInfos.end()) return;
    const auto& transformToDisplay = it->second.transform.inverse() * injectedTransform;

    if (entry.xCursorPosition != AMOTION_EVENT_INVALID_CURSOR_POSITION &&
        entry.yCursorPosition != AMOTION_EVENT_INVALID_CURSOR_POSITION) {
        const vec2 cursor =
                MotionEvent::calculateTransformedXY(entry.source, transformToDisplay,
                                                    {entry.xCursorPosition, entry.yCursorPosition});
        entry.xCursorPosition = cursor.x;
        entry.yCursorPosition = cursor.y;
    }
    for (uint32_t i = 0; i < entry.pointerCount; i++) {
        entry.pointerCoords[i] =
                MotionEvent::calculateTransformedCoords(entry.source, transformToDisplay,
+50 −46
Original line number Diff line number Diff line
@@ -47,6 +47,10 @@ constexpr int MOVE = AMOTION_EVENT_ACTION_MOVE;
constexpr int UP = AMOTION_EVENT_ACTION_UP;
constexpr int CANCEL = AMOTION_EVENT_ACTION_CANCEL;

static nsecs_t toNs(std::chrono::nanoseconds duration) {
    return duration.count();
}

struct PointerData {
    float x;
    float y;
@@ -384,7 +388,7 @@ TEST(GetTouchesTest, ConvertDownEvent) {
    expected.reported_tool_type = ::ui::EventPointerType::kTouch;
    expected.stylus_button = false;

    ASSERT_EQ(expected, touches[0]) << toString(touches[0]);
    ASSERT_EQ(expected, touches[0]) << touches[0];
}

// --- UnwantedInteractionBlockerTest ---
@@ -630,41 +634,41 @@ TEST_F(PalmRejectorTestDeathTest, InconsistentEventCausesACrash) {
 */
TEST_F(PalmRejectorTest, TwoPointersAreCanceled) {
    std::vector<NotifyMotionArgs> argsList;
    constexpr nsecs_t downTime = 255955749837000;
    const nsecs_t downTime = toNs(0ms);

    mPalmRejector->processMotion(
            generateMotionArgs(downTime, downTime, DOWN, {{1342.0, 613.0, 79.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955759313000, MOVE, {{1406.0, 650.0, 52.0}}));
            generateMotionArgs(downTime, toNs(8ms), MOVE, {{1406.0, 650.0, 52.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955766361000, MOVE, {{1429.0, 672.0, 46.0}}));
            generateMotionArgs(downTime, toNs(16ms), MOVE, {{1429.0, 672.0, 46.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955775989000, MOVE, {{1417.0, 685.0, 41.0}}));
            generateMotionArgs(downTime, toNs(24ms), MOVE, {{1417.0, 685.0, 41.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955775989000, POINTER_1_DOWN,
            generateMotionArgs(downTime, toNs(32ms), POINTER_1_DOWN,
                               {{1417.0, 685.0, 41.0}, {1062.0, 697.0, 10.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955783039000, MOVE,
            generateMotionArgs(downTime, toNs(40ms), MOVE,
                               {{1414.0, 702.0, 41.0}, {1059.0, 731.0, 12.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955792536000, MOVE,
            generateMotionArgs(downTime, toNs(48ms), MOVE,
                               {{1415.0, 719.0, 44.0}, {1060.0, 760.0, 11.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955799474000, MOVE,
            generateMotionArgs(downTime, toNs(56ms), MOVE,
                               {{1421.0, 733.0, 42.0}, {1065.0, 769.0, 13.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955809177000, MOVE,
            generateMotionArgs(downTime, toNs(64ms), MOVE,
                               {{1426.0, 742.0, 43.0}, {1068.0, 771.0, 13.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955816131000, MOVE,
            generateMotionArgs(downTime, toNs(72ms), MOVE,
                               {{1430.0, 748.0, 45.0}, {1069.0, 772.0, 13.0}}));
    argsList = mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955825907000, MOVE,
            generateMotionArgs(downTime, toNs(80ms), MOVE,
                               {{1432.0, 750.0, 44.0}, {1069.0, 772.0, 13.0}}));
    ASSERT_EQ(1u, argsList.size());
    ASSERT_EQ(0 /* No FLAG_CANCELED */, argsList[0].flags);
    argsList = mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955832736000, MOVE,
            generateMotionArgs(downTime, toNs(88ms), MOVE,
                               {{1433.0, 751.0, 44.0}, {1070.0, 771.0, 13.0}}));
    ASSERT_EQ(2u, argsList.size());
    ASSERT_EQ(POINTER_0_UP, argsList[0].action);
@@ -674,94 +678,94 @@ TEST_F(PalmRejectorTest, TwoPointersAreCanceled) {
    ASSERT_EQ(0, argsList[1].flags);

    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955842432000, MOVE,
            generateMotionArgs(downTime, toNs(96ms), MOVE,
                               {{1433.0, 751.0, 42.0}, {1071.0, 770.0, 13.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955849380000, MOVE,
            generateMotionArgs(downTime, toNs(104ms), MOVE,
                               {{1433.0, 751.0, 45.0}, {1072.0, 769.0, 13.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955859046000, MOVE,
            generateMotionArgs(downTime, toNs(112ms), MOVE,
                               {{1433.0, 751.0, 43.0}, {1072.0, 768.0, 13.0}}));
    argsList = mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955869823000, MOVE,
            generateMotionArgs(downTime, toNs(120ms), MOVE,
                               {{1433.0, 751.0, 45.0}, {1072.0, 767.0, 13.0}}));
    ASSERT_EQ(1u, argsList.size());
    ASSERT_EQ(AMOTION_EVENT_ACTION_CANCEL, argsList[0].action);
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955875641000, MOVE,
            generateMotionArgs(downTime, toNs(128ms), MOVE,
                               {{1433.0, 751.0, 43.0}, {1072.0, 766.0, 13.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955882693000, MOVE,
            generateMotionArgs(downTime, toNs(136ms), MOVE,
                               {{1433.0, 750.0, 44.0}, {1072.0, 765.0, 13.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955892324000, MOVE,
            generateMotionArgs(downTime, toNs(144ms), MOVE,
                               {{1433.0, 750.0, 42.0}, {1072.0, 763.0, 14.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955899425000, MOVE,
            generateMotionArgs(downTime, toNs(152ms), MOVE,
                               {{1434.0, 750.0, 44.0}, {1073.0, 761.0, 14.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955909400000, MOVE,
            generateMotionArgs(downTime, toNs(160ms), MOVE,
                               {{1435.0, 750.0, 43.0}, {1073.0, 759.0, 15.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955915885000, MOVE,
            generateMotionArgs(downTime, toNs(168ms), MOVE,
                               {{1436.0, 750.0, 45.0}, {1074.0, 757.0, 15.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955925607000, MOVE,
            generateMotionArgs(downTime, toNs(176ms), MOVE,
                               {{1436.0, 750.0, 44.0}, {1074.0, 755.0, 15.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955932580000, MOVE,
            generateMotionArgs(downTime, toNs(184ms), MOVE,
                               {{1436.0, 750.0, 45.0}, {1074.0, 753.0, 15.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955942231000, MOVE,
            generateMotionArgs(downTime, toNs(192ms), MOVE,
                               {{1436.0, 749.0, 44.0}, {1074.0, 751.0, 15.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955949204000, MOVE,
            generateMotionArgs(downTime, toNs(200ms), MOVE,
                               {{1435.0, 748.0, 45.0}, {1074.0, 749.0, 15.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955959103000, MOVE,
            generateMotionArgs(downTime, toNs(208ms), MOVE,
                               {{1434.0, 746.0, 44.0}, {1074.0, 747.0, 14.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955965884000, MOVE,
            generateMotionArgs(downTime, toNs(216ms), MOVE,
                               {{1433.0, 744.0, 44.0}, {1075.0, 745.0, 14.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955975649000, MOVE,
            generateMotionArgs(downTime, toNs(224ms), MOVE,
                               {{1431.0, 741.0, 43.0}, {1075.0, 742.0, 13.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955982537000, MOVE,
            generateMotionArgs(downTime, toNs(232ms), MOVE,
                               {{1428.0, 738.0, 43.0}, {1076.0, 739.0, 12.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955992284000, MOVE,
            generateMotionArgs(downTime, toNs(240ms), MOVE,
                               {{1400.0, 726.0, 54.0}, {1076.0, 739.0, 13.0}}));
    argsList = mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955999348000, POINTER_1_UP,
            generateMotionArgs(downTime, toNs(248ms), POINTER_1_UP,
                               {{1362.0, 716.0, 55.0}, {1076.0, 739.0, 13.0}}));
    ASSERT_TRUE(argsList.empty());
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255955999348000, MOVE, {{1362.0, 716.0, 55.0}}));
            generateMotionArgs(downTime, toNs(256ms), MOVE, {{1362.0, 716.0, 55.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956008885000, MOVE, {{1347.0, 707.0, 54.0}}));
            generateMotionArgs(downTime, toNs(264ms), MOVE, {{1347.0, 707.0, 54.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956015791000, MOVE, {{1340.0, 698.0, 54.0}}));
            generateMotionArgs(downTime, toNs(272ms), MOVE, {{1340.0, 698.0, 54.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956025804000, MOVE, {{1338.0, 694.0, 55.0}}));
            generateMotionArgs(downTime, toNs(280ms), MOVE, {{1338.0, 694.0, 55.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956032314000, MOVE, {{1336.0, 690.0, 53.0}}));
            generateMotionArgs(downTime, toNs(288ms), MOVE, {{1336.0, 690.0, 53.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956042329000, MOVE, {{1334.0, 685.0, 47.0}}));
            generateMotionArgs(downTime, toNs(296ms), MOVE, {{1334.0, 685.0, 47.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956048979000, MOVE, {{1333.0, 679.0, 46.0}}));
            generateMotionArgs(downTime, toNs(304ms), MOVE, {{1333.0, 679.0, 46.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956058813000, MOVE, {{1332.0, 672.0, 45.0}}));
            generateMotionArgs(downTime, toNs(312ms), MOVE, {{1332.0, 672.0, 45.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956065592000, MOVE, {{1333.0, 666.0, 40.0}}));
            generateMotionArgs(downTime, toNs(320ms), MOVE, {{1333.0, 666.0, 40.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956075276000, MOVE, {{1336.0, 661.0, 24.0}}));
            generateMotionArgs(downTime, toNs(328ms), MOVE, {{1336.0, 661.0, 24.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956082198000, MOVE, {{1338.0, 656.0, 16.0}}));
            generateMotionArgs(downTime, toNs(336ms), MOVE, {{1338.0, 656.0, 16.0}}));
    mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956092059000, MOVE, {{1341.0, 649.0, 1.0}}));
            generateMotionArgs(downTime, toNs(344ms), MOVE, {{1341.0, 649.0, 1.0}}));
    argsList = mPalmRejector->processMotion(
            generateMotionArgs(downTime, 255956098764000, UP, {{1341.0, 649.0, 1.0}}));
            generateMotionArgs(downTime, toNs(352ms), UP, {{1341.0, 649.0, 1.0}}));
    ASSERT_TRUE(argsList.empty());
}