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

Commit 6abeba13 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Introduce PointerChoreographer stage in C++" into main

parents e14ebd16 c220018c
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -290,7 +290,7 @@ void PointerController::doInactivityTimeout() {
    fade(Transition::GRADUAL);
    fade(Transition::GRADUAL);
}
}


void PointerController::onDisplayViewportsUpdated(std::vector<DisplayViewport>& viewports) {
void PointerController::onDisplayViewportsUpdated(const std::vector<DisplayViewport>& viewports) {
    std::unordered_set<int32_t> displayIdSet;
    std::unordered_set<int32_t> displayIdSet;
    for (const DisplayViewport& viewport : viewports) {
    for (const DisplayViewport& viewport : viewports) {
        displayIdSet.insert(viewport.displayId);
        displayIdSet.insert(viewport.displayId);
+1 −1
Original line number Original line Diff line number Diff line
@@ -70,7 +70,7 @@ public:
    void setInactivityTimeout(InactivityTimeout inactivityTimeout);
    void setInactivityTimeout(InactivityTimeout inactivityTimeout);
    void doInactivityTimeout();
    void doInactivityTimeout();
    void reloadPointerResources();
    void reloadPointerResources();
    void onDisplayViewportsUpdated(std::vector<DisplayViewport>& viewports);
    void onDisplayViewportsUpdated(const std::vector<DisplayViewport>& viewports);


    void onDisplayInfosChangedLocked(const std::vector<gui::DisplayInfo>& displayInfos)
    void onDisplayInfosChangedLocked(const std::vector<gui::DisplayInfo>& displayInfos)
            REQUIRES(getLock());
            REQUIRES(getLock());
+58 −32
Original line number Original line Diff line number Diff line
@@ -262,7 +262,8 @@ static std::string getStringElementFromJavaArray(JNIEnv* env, jobjectArray array


class NativeInputManager : public virtual InputReaderPolicyInterface,
class NativeInputManager : public virtual InputReaderPolicyInterface,
                           public virtual InputDispatcherPolicyInterface,
                           public virtual InputDispatcherPolicyInterface,
                           public virtual PointerControllerPolicyInterface {
                           public virtual PointerControllerPolicyInterface,
                           public virtual PointerChoreographerPolicyInterface {
protected:
protected:
    virtual ~NativeInputManager();
    virtual ~NativeInputManager();


@@ -370,6 +371,9 @@ public:
    virtual PointerIconStyle getCustomPointerIconId();
    virtual PointerIconStyle getCustomPointerIconId();
    virtual void onPointerDisplayIdChanged(int32_t displayId, const FloatPoint& position);
    virtual void onPointerDisplayIdChanged(int32_t displayId, const FloatPoint& position);


    /* --- PointerControllerPolicyInterface implementation --- */
    virtual std::shared_ptr<PointerControllerInterface> createPointerController() override;

private:
private:
    sp<InputManagerInterface> mInputManager;
    sp<InputManagerInterface> mInputManager;


@@ -402,8 +406,12 @@ private:
        // Sprite controller singleton, created on first use.
        // Sprite controller singleton, created on first use.
        std::shared_ptr<SpriteController> spriteController{};
        std::shared_ptr<SpriteController> spriteController{};


        // TODO(b/293587049): Remove when the PointerChoreographer refactoring is complete.
        // Pointer controller singleton, created and destroyed as needed.
        // Pointer controller singleton, created and destroyed as needed.
        std::weak_ptr<PointerController> pointerController{};
        std::weak_ptr<PointerController> legacyPointerController{};

        // The list of PointerControllers created and managed by the PointerChoreographer.
        std::list<std::weak_ptr<PointerController>> pointerControllers{};


        // Input devices to be disabled
        // Input devices to be disabled
        std::set<int32_t> disabledInputDevices{};
        std::set<int32_t> disabledInputDevices{};
@@ -443,6 +451,9 @@ private:
            jmethodID method, const char* methodName,
            jmethodID method, const char* methodName,
            std::function<T(std::string)> opOnValue = [](auto&& v) { return std::move(v); });
            std::function<T(std::string)> opOnValue = [](auto&& v) { return std::move(v); });


    void forEachPointerControllerLocked(std::function<void(PointerController&)> apply)
            REQUIRES(mLock);

    static inline JNIEnv* jniEnv() { return AndroidRuntime::getJNIEnv(); }
    static inline JNIEnv* jniEnv() { return AndroidRuntime::getJNIEnv(); }
};
};


@@ -452,7 +463,7 @@ NativeInputManager::NativeInputManager(jobject serviceObj, const sp<Looper>& loo


    mServiceObj = env->NewGlobalRef(serviceObj);
    mServiceObj = env->NewGlobalRef(serviceObj);


    InputManager* im = new InputManager(this, *this);
    InputManager* im = new InputManager(this, *this, *this);
    mInputManager = im;
    mInputManager = im;
    defaultServiceManager()->addService(String16("inputflinger"), im);
    defaultServiceManager()->addService(String16("inputflinger"), im);
}
}
@@ -465,10 +476,8 @@ NativeInputManager::~NativeInputManager() {


void NativeInputManager::dump(std::string& dump) {
void NativeInputManager::dump(std::string& dump) {
    dump += "Input Manager State:\n";
    dump += "Input Manager State:\n";
    {
    dump += StringPrintf(INDENT "Interactive: %s\n", toString(mInteractive.load()));
    dump += StringPrintf(INDENT "Interactive: %s\n", toString(mInteractive.load()));
    }
    { // acquire lock
    {
        std::scoped_lock _l(mLock);
        std::scoped_lock _l(mLock);
        dump += StringPrintf(INDENT "System UI Lights Out: %s\n",
        dump += StringPrintf(INDENT "System UI Lights Out: %s\n",
                             toString(mLocked.systemUiLightsOut));
                             toString(mLocked.systemUiLightsOut));
@@ -480,11 +489,8 @@ void NativeInputManager::dump(std::string& dump) {
        dump += StringPrintf(INDENT "Pointer Capture: %s, seq=%" PRIu32 "\n",
        dump += StringPrintf(INDENT "Pointer Capture: %s, seq=%" PRIu32 "\n",
                             mLocked.pointerCaptureRequest.enable ? "Enabled" : "Disabled",
                             mLocked.pointerCaptureRequest.enable ? "Enabled" : "Disabled",
                             mLocked.pointerCaptureRequest.seq);
                             mLocked.pointerCaptureRequest.seq);
        auto pointerController = mLocked.pointerController.lock();
        forEachPointerControllerLocked([&dump](PointerController& pc) { pc.dump(dump); });
        if (pointerController != nullptr) {
    } // release lock
            pointerController->dump(dump);
        }
    }
    dump += "\n";
    dump += "\n";


    mInputManager->dump(dump);
    mInputManager->dump(dump);
@@ -524,10 +530,9 @@ void NativeInputManager::setDisplayViewports(JNIEnv* env, jobjectArray viewportO
    { // acquire lock
    { // acquire lock
        std::scoped_lock _l(mLock);
        std::scoped_lock _l(mLock);
        mLocked.viewports = viewports;
        mLocked.viewports = viewports;
        std::shared_ptr<PointerController> controller = mLocked.pointerController.lock();
        forEachPointerControllerLocked([viewports = std::move(viewports)](PointerController& pc) {
        if (controller != nullptr) {
            pc.onDisplayViewportsUpdated(viewports);
            controller->onDisplayViewportsUpdated(mLocked.viewports);
        });
        }
    } // release lock
    } // release lock


    mInputManager->getReader().requestRefreshConfiguration(
    mInputManager->getReader().requestRefreshConfiguration(
@@ -700,23 +705,51 @@ std::unordered_map<std::string, T> NativeInputManager::readMapFromInterleavedJav
    return map;
    return map;
}
}


void NativeInputManager::forEachPointerControllerLocked(
        std::function<void(PointerController&)> apply) {
    if (auto pc = mLocked.legacyPointerController.lock(); pc) {
        apply(*pc);
    }

    auto it = mLocked.pointerControllers.begin();
    while (it != mLocked.pointerControllers.end()) {
        auto pc = it->lock();
        if (!pc) {
            it = mLocked.pointerControllers.erase(it);
            continue;
        }
        apply(*pc);
    }
}

// TODO(b/293587049): Remove the old way of obtaining PointerController when the
//  PointerChoreographer refactoring is complete.
std::shared_ptr<PointerControllerInterface> NativeInputManager::obtainPointerController(
std::shared_ptr<PointerControllerInterface> NativeInputManager::obtainPointerController(
        int32_t /* deviceId */) {
        int32_t /* deviceId */) {
    ATRACE_CALL();
    ATRACE_CALL();
    std::scoped_lock _l(mLock);
    std::scoped_lock _l(mLock);


    std::shared_ptr<PointerController> controller = mLocked.pointerController.lock();
    std::shared_ptr<PointerController> controller = mLocked.legacyPointerController.lock();
    if (controller == nullptr) {
    if (controller == nullptr) {
        ensureSpriteControllerLocked();
        ensureSpriteControllerLocked();


        controller = PointerController::create(this, mLooper, *mLocked.spriteController);
        controller = PointerController::create(this, mLooper, *mLocked.spriteController);
        mLocked.pointerController = controller;
        mLocked.legacyPointerController = controller;
        updateInactivityTimeoutLocked();
        updateInactivityTimeoutLocked();
    }
    }


    return controller;
    return controller;
}
}


std::shared_ptr<PointerControllerInterface> NativeInputManager::createPointerController() {
    std::scoped_lock _l(mLock);
    ensureSpriteControllerLocked();
    std::shared_ptr<PointerController> pc =
            PointerController::create(this, mLooper, *mLocked.spriteController);
    mLocked.pointerControllers.emplace_back(pc);
    return pc;
}

void NativeInputManager::onPointerDisplayIdChanged(int32_t pointerDisplayId,
void NativeInputManager::onPointerDisplayIdChanged(int32_t pointerDisplayId,
                                                   const FloatPoint& position) {
                                                   const FloatPoint& position) {
    JNIEnv* env = jniEnv();
    JNIEnv* env = jniEnv();
@@ -1071,13 +1104,9 @@ void NativeInputManager::setSystemUiLightsOut(bool lightsOut) {
}
}


void NativeInputManager::updateInactivityTimeoutLocked() REQUIRES(mLock) {
void NativeInputManager::updateInactivityTimeoutLocked() REQUIRES(mLock) {
    std::shared_ptr<PointerController> controller = mLocked.pointerController.lock();
    forEachPointerControllerLocked([lightsOut = mLocked.systemUiLightsOut](PointerController& pc) {
    if (controller == nullptr) {
        pc.setInactivityTimeout(lightsOut ? InactivityTimeout::SHORT : InactivityTimeout::NORMAL);
        return;
    });
    }

    controller->setInactivityTimeout(mLocked.systemUiLightsOut ? InactivityTimeout::SHORT
                                                               : InactivityTimeout::NORMAL);
}
}


void NativeInputManager::setPointerDisplayId(int32_t displayId) {
void NativeInputManager::setPointerDisplayId(int32_t displayId) {
@@ -1247,7 +1276,7 @@ void NativeInputManager::reloadCalibration() {


void NativeInputManager::setPointerIconType(PointerIconStyle iconId) {
void NativeInputManager::setPointerIconType(PointerIconStyle iconId) {
    std::scoped_lock _l(mLock);
    std::scoped_lock _l(mLock);
    std::shared_ptr<PointerController> controller = mLocked.pointerController.lock();
    std::shared_ptr<PointerController> controller = mLocked.legacyPointerController.lock();
    if (controller != nullptr) {
    if (controller != nullptr) {
        controller->updatePointerIcon(iconId);
        controller->updatePointerIcon(iconId);
    }
    }
@@ -1255,15 +1284,12 @@ void NativeInputManager::setPointerIconType(PointerIconStyle iconId) {


void NativeInputManager::reloadPointerIcons() {
void NativeInputManager::reloadPointerIcons() {
    std::scoped_lock _l(mLock);
    std::scoped_lock _l(mLock);
    std::shared_ptr<PointerController> controller = mLocked.pointerController.lock();
    forEachPointerControllerLocked([](PointerController& pc) { pc.reloadPointerResources(); });
    if (controller != nullptr) {
        controller->reloadPointerResources();
    }
}
}


void NativeInputManager::setCustomPointerIcon(const SpriteIcon& icon) {
void NativeInputManager::setCustomPointerIcon(const SpriteIcon& icon) {
    std::scoped_lock _l(mLock);
    std::scoped_lock _l(mLock);
    std::shared_ptr<PointerController> controller = mLocked.pointerController.lock();
    std::shared_ptr<PointerController> controller = mLocked.legacyPointerController.lock();
    if (controller != nullptr) {
    if (controller != nullptr) {
        controller->setCustomPointerIcon(icon);
        controller->setCustomPointerIcon(icon);
    }
    }
@@ -1656,7 +1682,7 @@ void NativeInputManager::setStylusButtonMotionEventsEnabled(bool enabled) {


FloatPoint NativeInputManager::getMouseCursorPosition() {
FloatPoint NativeInputManager::getMouseCursorPosition() {
    std::scoped_lock _l(mLock);
    std::scoped_lock _l(mLock);
    const auto pc = mLocked.pointerController.lock();
    const auto pc = mLocked.legacyPointerController.lock();
    if (!pc) return {AMOTION_EVENT_INVALID_CURSOR_POSITION, AMOTION_EVENT_INVALID_CURSOR_POSITION};
    if (!pc) return {AMOTION_EVENT_INVALID_CURSOR_POSITION, AMOTION_EVENT_INVALID_CURSOR_POSITION};


    return pc->getPosition();
    return pc->getPosition();