コード例 #1
0
static jfloat android_view_MotionEvent_nativeGetAxisValue(JNIEnv* env, jclass clazz,
        jlong nativePtr, jint axis, jint pointerIndex, jint historyPos) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    
    //ActionsCode(authro:songzhining, comment: fix BUG00232351)
    if (pointerIndex >= pointerCount) {        
        ALOGE("Error pointerIndex! count=%d, index=%d", pointerCount, pointerIndex);
        pointerIndex = 0;
    }
    
    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
        return 0;
    }

    if (historyPos == HISTORY_CURRENT) {
        return event->getAxisValue(axis, pointerIndex);
    } else {
        size_t historySize = event->getHistorySize();
        if (!validateHistoryPos(env, historyPos, historySize)) {
            return 0;
        }
        return event->getHistoricalAxisValue(axis, pointerIndex, historyPos);
    }
}
コード例 #2
0
TEST_F(MotionEventTest, OffsetLocation) {
    MotionEvent event;
    initializeEventWithHistory(&event);

    event.offsetLocation(5.0f, -2.0f);

    ASSERT_EQ(X_OFFSET + 5.0f, event.getXOffset());
    ASSERT_EQ(Y_OFFSET - 2.0f, event.getYOffset());
}
コード例 #3
0
TEST_F(MotionEventTest, CopyFrom_KeepHistory) {
    MotionEvent event;
    initializeEventWithHistory(&event);

    MotionEvent copy;
    copy.copyFrom(&event, true /*keepHistory*/);

    ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&event));
}
コード例 #4
0
static jint android_view_MotionEvent_nativeGetToolType(JNIEnv* env, jclass clazz,
        jint nativePtr, jint pointerIndex) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
        return -1;
    }
    return event->getToolType(pointerIndex);
}
コード例 #5
0
static jint android_view_MotionEvent_nativeCopy(JNIEnv* env, jclass clazz,
        jint destNativePtr, jint sourceNativePtr, jboolean keepHistory) {
    MotionEvent* destEvent = reinterpret_cast<MotionEvent*>(destNativePtr);
    if (!destEvent) {
        destEvent = new MotionEvent();
    }
    MotionEvent* sourceEvent = reinterpret_cast<MotionEvent*>(sourceNativePtr);
    destEvent->copyFrom(sourceEvent, keepHistory);
    return reinterpret_cast<jint>(destEvent);
}
コード例 #6
0
static void android_view_MotionEvent_nativeWriteToParcel(JNIEnv* env, jclass clazz,
        jint nativePtr, jobject parcelObj) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    Parcel* parcel = parcelForJavaObject(env, parcelObj);

    status_t status = event->writeToParcel(parcel);
    if (status) {
        jniThrowRuntimeException(env, "Failed to write MotionEvent parcel.");
    }
}
static jlong nativeSendMotionEvent(JNIEnv* env, jobject clazz, jlong ptr, jobject eventObj) {
    sp<InputQueue> queue = reinterpret_cast<InputQueue*>(ptr);
    MotionEvent* originalEvent = android_view_MotionEvent_getNativePtr(env, eventObj);
    if (!originalEvent) {
        jniThrowRuntimeException(env, "Could not obtain MotionEvent pointer.");
        return -1;
    }
    MotionEvent* event = queue->createMotionEvent();
    event->copyFrom(originalEvent, true /* keepHistory */);
    queue->enqueueEvent(event);
    return reinterpret_cast<jlong>(event);
}
コード例 #8
0
static void android_view_MotionEvent_nativeGetPointerProperties(JNIEnv* env, jclass clazz,
        jint nativePtr, jint pointerIndex, jobject outPointerPropertiesObj) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    if (!validatePointerIndex(env, pointerIndex, pointerCount)
            || !validatePointerProperties(env, outPointerPropertiesObj)) {
        return;
    }

    const PointerProperties* pointerProperties = event->getPointerProperties(pointerIndex);
    pointerPropertiesFromNative(env, pointerProperties, outPointerPropertiesObj);
}
コード例 #9
0
static jlong android_view_MotionEvent_nativeGetEventTimeNanos(JNIEnv* env, jclass clazz,
        jint nativePtr, jint historyPos) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    if (historyPos == HISTORY_CURRENT) {
        return event->getEventTime();
    } else {
        size_t historySize = event->getHistorySize();
        if (!validateHistoryPos(env, historyPos, historySize)) {
            return 0;
        }
        return event->getHistoricalEventTime(historyPos);
    }
}
コード例 #10
0
static jint android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz,
        jint nativePtr,
        jint deviceId, jint source, jint action, jint flags, jint edgeFlags,
        jint metaState, jint buttonState,
        jfloat xOffset, jfloat yOffset, jfloat xPrecision, jfloat yPrecision,
        jlong downTimeNanos, jlong eventTimeNanos,
        jint pointerCount, jobjectArray pointerPropertiesObjArray,
        jobjectArray pointerCoordsObjArray) {
    if (!validatePointerCount(env, pointerCount)
            || !validatePointerPropertiesArray(env, pointerPropertiesObjArray, pointerCount)
            || !validatePointerCoordsObjArray(env, pointerCoordsObjArray, pointerCount)) {
        return 0;
    }

    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    if (!event) {
        event = new MotionEvent();
    }

    PointerProperties pointerProperties[pointerCount];
    PointerCoords rawPointerCoords[pointerCount];

    for (jint i = 0; i < pointerCount; i++) {
        jobject pointerPropertiesObj = env->GetObjectArrayElement(pointerPropertiesObjArray, i);
        if (!pointerPropertiesObj) {
            goto Error;
        }
        pointerPropertiesToNative(env, pointerPropertiesObj, &pointerProperties[i]);
        env->DeleteLocalRef(pointerPropertiesObj);

        jobject pointerCoordsObj = env->GetObjectArrayElement(pointerCoordsObjArray, i);
        if (!pointerCoordsObj) {
            jniThrowNullPointerException(env, "pointerCoords");
            goto Error;
        }
        pointerCoordsToNative(env, pointerCoordsObj, xOffset, yOffset, &rawPointerCoords[i]);
        env->DeleteLocalRef(pointerCoordsObj);
    }

    event->initialize(deviceId, source, action, flags, edgeFlags, metaState, buttonState,
            xOffset, yOffset, xPrecision, yPrecision,
            downTimeNanos, eventTimeNanos, pointerCount, pointerProperties, rawPointerCoords);

    return reinterpret_cast<jint>(event);

Error:
    if (!nativePtr) {
        delete event;
    }
    return 0;
}
コード例 #11
0
TEST_F(MotionEventTest, Parcel) {
    Parcel parcel;

    MotionEvent inEvent;
    initializeEventWithHistory(&inEvent);
    MotionEvent outEvent;

    // Round trip.
    inEvent.writeToParcel(&parcel);
    parcel.setDataPosition(0);
    outEvent.readFromParcel(&parcel);

    ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&outEvent));
}
コード例 #12
0
static jint android_view_MotionEvent_nativeGetToolType(JNIEnv* env, jclass clazz,
        jlong nativePtr, jint pointerIndex) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    
    //ActionsCode(authro:songzhining, comment: fix BUG00232351)
    if (pointerIndex >= pointerCount) {        
        ALOGE("Error pointerIndex! count=%d, index=%d", pointerCount, pointerIndex);
        pointerIndex = 0;
    }
    
    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
        return -1;
    }
    return event->getToolType(pointerIndex);
}
コード例 #13
0
static void android_view_MotionEvent_nativeTransform(JNIEnv* env, jclass clazz,
        jint nativePtr, jobject matrixObj) {
    SkMatrix* matrix = android_graphics_Matrix_getSkMatrix(env, matrixObj);
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);

    float m[9];
    m[0] = SkScalarToFloat(matrix->get(SkMatrix::kMScaleX));
    m[1] = SkScalarToFloat(matrix->get(SkMatrix::kMSkewX));
    m[2] = SkScalarToFloat(matrix->get(SkMatrix::kMTransX));
    m[3] = SkScalarToFloat(matrix->get(SkMatrix::kMSkewY));
    m[4] = SkScalarToFloat(matrix->get(SkMatrix::kMScaleY));
    m[5] = SkScalarToFloat(matrix->get(SkMatrix::kMTransY));
    m[6] = SkScalarToFloat(matrix->get(SkMatrix::kMPersp0));
    m[7] = SkScalarToFloat(matrix->get(SkMatrix::kMPersp1));
    m[8] = SkScalarToFloat(matrix->get(SkMatrix::kMPersp2));
    event->transform(m);
}
コード例 #14
0
static void android_view_MotionEvent_nativeGetPointerCoords(JNIEnv* env, jclass clazz,
        jlong nativePtr, jint pointerIndex, jint historyPos, jobject outPointerCoordsObj) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    
    //ActionsCode(authro:songzhining, comment: fix BUG00232351)
    if (pointerIndex >= pointerCount) {        
        ALOGE("Error pointerIndex! count=%d, index=%d", pointerCount, pointerIndex);
        pointerIndex = 0;
    }
    
    if (!validatePointerIndex(env, pointerIndex, pointerCount)
            || !validatePointerCoords(env, outPointerCoordsObj)) {
        return;
    }

    const PointerCoords* rawPointerCoords;
    if (historyPos == HISTORY_CURRENT) {
        rawPointerCoords = event->getRawPointerCoords(pointerIndex);
    } else {
        size_t historySize = event->getHistorySize();
        if (!validateHistoryPos(env, historyPos, historySize)) {
            return;
        }
        rawPointerCoords = event->getHistoricalRawPointerCoords(pointerIndex, historyPos);
    }
    pointerCoordsFromNative(env, rawPointerCoords, event->getXOffset(), event->getYOffset(),
            outPointerCoordsObj);
}
コード例 #15
0
static void android_view_MotionEvent_nativeAddBatch(JNIEnv* env, jclass clazz,
        jint nativePtr, jlong eventTimeNanos, jobjectArray pointerCoordsObjArray,
        jint metaState) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    if (!validatePointerCoordsObjArray(env, pointerCoordsObjArray, pointerCount)) {
        return;
    }

    PointerCoords rawPointerCoords[pointerCount];

    for (size_t i = 0; i < pointerCount; i++) {
        jobject pointerCoordsObj = env->GetObjectArrayElement(pointerCoordsObjArray, i);
        if (!pointerCoordsObj) {
            jniThrowNullPointerException(env, "pointerCoords");
            return;
        }
        pointerCoordsToNative(env, pointerCoordsObj,
                event->getXOffset(), event->getYOffset(), &rawPointerCoords[i]);
        env->DeleteLocalRef(pointerCoordsObj);
    }

    event->addSample(eventTimeNanos, rawPointerCoords);
    event->setMetaState(event->getMetaState() | metaState);
}
コード例 #16
0
static jfloat android_view_MotionEvent_nativeGetAxisValue(JNIEnv* env, jclass clazz,
        jint nativePtr, jint axis, jint pointerIndex, jint historyPos) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    if (!validatePointerIndex(env, pointerIndex, pointerCount)) {
        return 0;
    }

    if (historyPos == HISTORY_CURRENT) {
        return event->getAxisValue(axis, pointerIndex);
    } else {
        size_t historySize = event->getHistorySize();
        if (!validateHistoryPos(env, historyPos, historySize)) {
            return 0;
        }
        return event->getHistoricalAxisValue(axis, pointerIndex, historyPos);
    }
}
コード例 #17
0
bool AutoScrollWidgetPager::onTouchEvent(const MotionEvent& ev) {
    if (mStopScrollWhenTouch) {
        if (ev.getAction() == MotionEvent::ACTION_DOWN && mIsAutoScroll) {
            mIsStopByTouch = true;
            stopAutoScroll();
        } else if (ev.getAction() == MotionEvent::ACTION_UP && mIsStopByTouch) {
            startAutoScroll();
        }
    }

    WidgetController* pParent = dynamic_cast<WidgetController*>(getParent());
    if (mSlideBorderMode == SLIDE_BORDER_MODE_TO_PARENT || mSlideBorderMode == SLIDE_BORDER_MODE_CYCLE) {
        mTouchX = ev.getX();
        if (ev.getAction() == MotionEvent::ACTION_DOWN) {
            mDownX = mTouchX;
        }
        int32_t currentItem = getCurrentItem();
        IPagerProvider* adapter = getProvider();
        int32_t pageCount = adapter == NULL ? 0 : adapter->getCount();
        /**
         * current index is first one and slide to right or current index is last one and slide to left.<br/>
         * if slide border mode is to parent, then requestDisallowInterceptTouchEvent false.<br/>
         * else scroll to last one when current item is first one, scroll to first one when current item is last
         * one.
         */
        if ((currentItem == 0 && mDownX <= mTouchX) || (currentItem == pageCount - 1 && mDownX >= mTouchX)) {
            if (mSlideBorderMode == SLIDE_BORDER_MODE_TO_PARENT) {
                if (pParent)
                    pParent->requestDisallowInterceptTouchEvent(false);
            } else {
                if (pageCount > 1) {
                    setCurrentItem(pageCount - currentItem - 1, mIsBorderAnimation);
                }
                if (pParent)
                    pParent->requestDisallowInterceptTouchEvent(true);
            }
            return WidgetPager::onTouchEvent(ev);
        }
    }
    if (pParent)
        pParent->requestDisallowInterceptTouchEvent(true);
    return WidgetPager::onTouchEvent(ev);
}
コード例 #18
0
jobject android_view_MotionEvent_obtainAsCopy(JNIEnv* env, const MotionEvent* event) {
    jobject eventObj = env->CallStaticObjectMethod(gMotionEventClassInfo.clazz,
            gMotionEventClassInfo.obtain);
    if (env->ExceptionCheck() || !eventObj) {
        ALOGE("An exception occurred while obtaining a motion event.");
        LOGE_EX(env);
        env->ExceptionClear();
        return NULL;
    }

    MotionEvent* destEvent = android_view_MotionEvent_getNativePtr(env, eventObj);
    if (!destEvent) {
        destEvent = new MotionEvent();
        android_view_MotionEvent_setNativePtr(env, eventObj, destEvent);
    }

    destEvent->copyFrom(event, true);
    return eventObj;
}
コード例 #19
0
static void android_view_MotionEvent_nativeGetPointerProperties(JNIEnv* env, jclass clazz,
        jlong nativePtr, jint pointerIndex, jobject outPointerPropertiesObj) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    
    //ActionsCode(authro:songzhining, comment: fix BUG00232351)
    if (pointerIndex >= pointerCount) {        
        ALOGE("Error pointerIndex! count=%d, index=%d", pointerCount, pointerIndex);
        pointerIndex = 0;
    }
    
    if (!validatePointerIndex(env, pointerIndex, pointerCount)
            || !validatePointerProperties(env, outPointerPropertiesObj)) {
        return;
    }

    const PointerProperties* pointerProperties = event->getPointerProperties(pointerIndex);
    pointerPropertiesFromNative(env, pointerProperties, outPointerPropertiesObj);
}
コード例 #20
0
static jint android_view_MotionEvent_nativeReadFromParcel(JNIEnv* env, jclass clazz,
        jint nativePtr, jobject parcelObj) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    if (!event) {
        event = new MotionEvent();
    }

    Parcel* parcel = parcelForJavaObject(env, parcelObj);

    status_t status = event->readFromParcel(parcel);
    if (status) {
        if (!nativePtr) {
            delete event;
        }
        jniThrowRuntimeException(env, "Failed to read MotionEvent parcel.");
        return 0;
    }
    return reinterpret_cast<jint>(event);
}
コード例 #21
0
static MotionEvent* convertCCTouchToMotionEvent(CCTouch* pcc, int eventMask) {
	CCPoint loc = pcc->getLocation();
	nsecs_t time = (nsecs_t)CCUtils::currentTimeMillis();
	time = milliseconds_to_nanoseconds(time);
	s_pp.id = pcc->getID();
	MotionEvent* me = new MotionEvent();
	me->initialize(0,
				   0,
				   eventMask,
				   0,
				   0,
				   0,
				   0,
				   loc.x,
				   loc.y,
				   loc.x,
				   loc.y,
				   time,
				   time,
				   1,
				   &s_pp,
				   &s_pc);
	return me;
}
コード例 #22
0
TEST_F(MotionEventTest, Properties) {
    MotionEvent event;

    // Initialize, add samples and check properties.
    initializeEventWithHistory(&event);
    ASSERT_NO_FATAL_FAILURE(assertEqualsEventWithHistory(&event));

    // Set source.
    event.setSource(AINPUT_SOURCE_JOYSTICK);
    ASSERT_EQ(static_cast<int>(AINPUT_SOURCE_JOYSTICK), event.getSource());

    // Set action.
    event.setAction(AMOTION_EVENT_ACTION_CANCEL);
    ASSERT_EQ(AMOTION_EVENT_ACTION_CANCEL, event.getAction());

    // Set meta state.
    event.setMetaState(AMETA_CTRL_ON);
    ASSERT_EQ(AMETA_CTRL_ON, event.getMetaState());
}
コード例 #23
0
static void android_view_MotionEvent_nativeGetPointerCoords(JNIEnv* env, jclass clazz,
        jint nativePtr, jint pointerIndex, jint historyPos, jobject outPointerCoordsObj) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    size_t pointerCount = event->getPointerCount();
    if (!validatePointerIndex(env, pointerIndex, pointerCount)
            || !validatePointerCoords(env, outPointerCoordsObj)) {
        return;
    }

    const PointerCoords* rawPointerCoords;
    if (historyPos == HISTORY_CURRENT) {
        rawPointerCoords = event->getRawPointerCoords(pointerIndex);
    } else {
        size_t historySize = event->getHistorySize();
        if (!validateHistoryPos(env, historyPos, historySize)) {
            return;
        }
        rawPointerCoords = event->getHistoricalRawPointerCoords(pointerIndex, historyPos);
    }
    pointerCoordsFromNative(env, rawPointerCoords, event->getXOffset(), event->getYOffset(),
            outPointerCoordsObj);
}
status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env,
        bool consumeBatches, nsecs_t frameTime, bool* outConsumedBatch) {
    if (kDebugDispatchCycle) {
        ALOGD("channel '%s' ~ Consuming input events, consumeBatches=%s, frameTime=%lld.",
                getInputChannelName(), consumeBatches ? "true" : "false", (long long)frameTime);
    }

    if (consumeBatches) {
        mBatchedInputEventPending = false;
    }
    if (outConsumedBatch) {
        *outConsumedBatch = false;
    }

    ScopedLocalRef<jobject> receiverObj(env, NULL);
    bool skipCallbacks = false;
    for (;;) {
        uint32_t seq;
        InputEvent* inputEvent;
        status_t status = mInputConsumer.consume(&mInputEventFactory,
                consumeBatches, frameTime, &seq, &inputEvent);
        if (status) {
            if (status == WOULD_BLOCK) {
                if (!skipCallbacks && !mBatchedInputEventPending
                        && mInputConsumer.hasPendingBatch()) {
                    // There is a pending batch.  Come back later.
                    if (!receiverObj.get()) {
                        receiverObj.reset(jniGetReferent(env, mReceiverWeakGlobal));
                        if (!receiverObj.get()) {
                            ALOGW("channel '%s' ~ Receiver object was finalized "
                                    "without being disposed.", getInputChannelName());
                            return DEAD_OBJECT;
                        }
                    }

                    mBatchedInputEventPending = true;
                    if (kDebugDispatchCycle) {
                        ALOGD("channel '%s' ~ Dispatching batched input event pending notification.",
                                getInputChannelName());
                    }
                    env->CallVoidMethod(receiverObj.get(),
                            gInputEventReceiverClassInfo.dispatchBatchedInputEventPending);
                    if (env->ExceptionCheck()) {
                        ALOGE("Exception dispatching batched input events.");
                        mBatchedInputEventPending = false; // try again later
                    }
                }
                return OK;
            }
            ALOGE("channel '%s' ~ Failed to consume input event.  status=%d",
                    getInputChannelName(), status);
            return status;
        }
        assert(inputEvent);

        if (!skipCallbacks) {
            if (!receiverObj.get()) {
                receiverObj.reset(jniGetReferent(env, mReceiverWeakGlobal));
                if (!receiverObj.get()) {
                    ALOGW("channel '%s' ~ Receiver object was finalized "
                            "without being disposed.", getInputChannelName());
                    return DEAD_OBJECT;
                }
            }

            jobject inputEventObj;
            switch (inputEvent->getType()) {
            case AINPUT_EVENT_TYPE_KEY:
                if (kDebugDispatchCycle) {
                    ALOGD("channel '%s' ~ Received key event.", getInputChannelName());
                }
                inputEventObj = android_view_KeyEvent_fromNative(env,
                        static_cast<KeyEvent*>(inputEvent));
                break;

            case AINPUT_EVENT_TYPE_MOTION: {
                if (kDebugDispatchCycle) {
                    ALOGD("channel '%s' ~ Received motion event.", getInputChannelName());
                }
                MotionEvent* motionEvent = static_cast<MotionEvent*>(inputEvent);
                if ((motionEvent->getAction() & AMOTION_EVENT_ACTION_MOVE) && outConsumedBatch) {
                    *outConsumedBatch = true;
                }
                inputEventObj = android_view_MotionEvent_obtainAsCopy(env, motionEvent);
                break;
            }

            default:
                assert(false); // InputConsumer should prevent this from ever happening
                inputEventObj = NULL;
            }

            if (inputEventObj) {
                if (kDebugDispatchCycle) {
                    ALOGD("channel '%s' ~ Dispatching input event.", getInputChannelName());
                }
                env->CallVoidMethod(receiverObj.get(),
                        gInputEventReceiverClassInfo.dispatchInputEvent, seq, inputEventObj);
                if (env->ExceptionCheck()) {
                    ALOGE("Exception dispatching input event.");
                    skipCallbacks = true;
                }
                env->DeleteLocalRef(inputEventObj);
            } else {
                ALOGW("channel '%s' ~ Failed to obtain event object.", getInputChannelName());
                skipCallbacks = true;
            }
        }

        if (skipCallbacks) {
            mInputConsumer.sendFinishedSignal(seq, false);
        }
    }
}
コード例 #25
0
void InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent(
        size_t samplesToAppendBeforeDispatch, size_t samplesToAppendAfterDispatch) {
    status_t status;

    const int32_t deviceId = 1;
    const int32_t source = AINPUT_SOURCE_TOUCHSCREEN;
    const int32_t action = AMOTION_EVENT_ACTION_MOVE;
    const int32_t flags = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED;
    const int32_t edgeFlags = AMOTION_EVENT_EDGE_FLAG_TOP;
    const int32_t metaState = AMETA_ALT_LEFT_ON | AMETA_ALT_ON;
    const float xOffset = -10;
    const float yOffset = -20;
    const float xPrecision = 0.25;
    const float yPrecision = 0.5;
    const nsecs_t downTime = 3;
    const size_t pointerCount = 3;
    const int32_t pointerIds[pointerCount] = { 2, 0, 1 };

    Vector<nsecs_t> sampleEventTimes;
    Vector<PointerCoords> samplePointerCoords;

    for (size_t i = 0; i <= samplesToAppendAfterDispatch + samplesToAppendBeforeDispatch; i++) {
        sampleEventTimes.push(i + 10);
        for (size_t j = 0; j < pointerCount; j++) {
            samplePointerCoords.push();
            samplePointerCoords.editTop().x = 100 * i + j;
            samplePointerCoords.editTop().y = 200 * i + j;
            samplePointerCoords.editTop().pressure = 0.5 * i + j;
            samplePointerCoords.editTop().size = 0.7 * i + j;
            samplePointerCoords.editTop().touchMajor = 1.5 * i + j;
            samplePointerCoords.editTop().touchMinor = 1.7 * i + j;
            samplePointerCoords.editTop().toolMajor = 2.5 * i + j;
            samplePointerCoords.editTop().toolMinor = 2.7 * i + j;
            samplePointerCoords.editTop().orientation = 3.5 * i + j;
        }
    }

    status = mPublisher->publishMotionEvent(deviceId, source, action, flags, edgeFlags,
            metaState, xOffset, yOffset, xPrecision, yPrecision,
            downTime, sampleEventTimes[0], pointerCount, pointerIds, samplePointerCoords.array());
    ASSERT_EQ(OK, status)
            << "publisher publishMotionEvent should return OK";

    for (size_t i = 0; i < samplesToAppendBeforeDispatch; i++) {
        size_t sampleIndex = i + 1;
        status = mPublisher->appendMotionSample(sampleEventTimes[sampleIndex],
                samplePointerCoords.array() + sampleIndex * pointerCount);
        ASSERT_EQ(OK, status)
                << "publisher appendMotionEvent should return OK";
    }

    status = mPublisher->sendDispatchSignal();
    ASSERT_EQ(OK, status)
            << "publisher sendDispatchSignal should return OK";

    for (size_t i = 0; i < samplesToAppendAfterDispatch; i++) {
        size_t sampleIndex = i + 1 + samplesToAppendBeforeDispatch;
        status = mPublisher->appendMotionSample(sampleEventTimes[sampleIndex],
                samplePointerCoords.array() + sampleIndex * pointerCount);
        ASSERT_EQ(OK, status)
                << "publisher appendMotionEvent should return OK";
    }

    status = mConsumer->receiveDispatchSignal();
    ASSERT_EQ(OK, status)
            << "consumer receiveDispatchSignal should return OK";

    InputEvent* event;
    status = mConsumer->consume(& mEventFactory, & event);
    ASSERT_EQ(OK, status)
            << "consumer consume should return OK";

    ASSERT_TRUE(event != NULL)
            << "consumer should have returned non-NULL event";
    ASSERT_EQ(AINPUT_EVENT_TYPE_MOTION, event->getType())
            << "consumer should have returned a motion event";

    size_t lastSampleIndex = samplesToAppendBeforeDispatch + samplesToAppendAfterDispatch;

    MotionEvent* motionEvent = static_cast<MotionEvent*>(event);
    EXPECT_EQ(deviceId, motionEvent->getDeviceId());
    EXPECT_EQ(source, motionEvent->getSource());
    EXPECT_EQ(action, motionEvent->getAction());
    EXPECT_EQ(flags, motionEvent->getFlags());
    EXPECT_EQ(edgeFlags, motionEvent->getEdgeFlags());
    EXPECT_EQ(metaState, motionEvent->getMetaState());
    EXPECT_EQ(xPrecision, motionEvent->getXPrecision());
    EXPECT_EQ(yPrecision, motionEvent->getYPrecision());
    EXPECT_EQ(downTime, motionEvent->getDownTime());
    EXPECT_EQ(sampleEventTimes[lastSampleIndex], motionEvent->getEventTime());
    EXPECT_EQ(pointerCount, motionEvent->getPointerCount());
    EXPECT_EQ(lastSampleIndex, motionEvent->getHistorySize());

    for (size_t i = 0; i < pointerCount; i++) {
        SCOPED_TRACE(i);
        EXPECT_EQ(pointerIds[i], motionEvent->getPointerId(i));
    }

    for (size_t sampleIndex = 0; sampleIndex < lastSampleIndex; sampleIndex++) {
        SCOPED_TRACE(sampleIndex);
        EXPECT_EQ(sampleEventTimes[sampleIndex],
                motionEvent->getHistoricalEventTime(sampleIndex));
        for (size_t i = 0; i < pointerCount; i++) {
            SCOPED_TRACE(i);
            size_t offset = sampleIndex * pointerCount + i;
            EXPECT_EQ(samplePointerCoords[offset].x,
                    motionEvent->getHistoricalRawX(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].y,
                    motionEvent->getHistoricalRawY(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].x + xOffset,
                    motionEvent->getHistoricalX(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].y + yOffset,
                    motionEvent->getHistoricalY(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].pressure,
                    motionEvent->getHistoricalPressure(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].size,
                    motionEvent->getHistoricalSize(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].touchMajor,
                    motionEvent->getHistoricalTouchMajor(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].touchMinor,
                    motionEvent->getHistoricalTouchMinor(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].toolMajor,
                    motionEvent->getHistoricalToolMajor(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].toolMinor,
                    motionEvent->getHistoricalToolMinor(i, sampleIndex));
            EXPECT_EQ(samplePointerCoords[offset].orientation,
                    motionEvent->getHistoricalOrientation(i, sampleIndex));
        }
    }

    SCOPED_TRACE(lastSampleIndex);
    EXPECT_EQ(sampleEventTimes[lastSampleIndex], motionEvent->getEventTime());
    for (size_t i = 0; i < pointerCount; i++) {
        SCOPED_TRACE(i);
        size_t offset = lastSampleIndex * pointerCount + i;
        EXPECT_EQ(samplePointerCoords[offset].x, motionEvent->getRawX(i));
        EXPECT_EQ(samplePointerCoords[offset].y, motionEvent->getRawY(i));
        EXPECT_EQ(samplePointerCoords[offset].x + xOffset, motionEvent->getX(i));
        EXPECT_EQ(samplePointerCoords[offset].y + yOffset, motionEvent->getY(i));
        EXPECT_EQ(samplePointerCoords[offset].pressure, motionEvent->getPressure(i));
        EXPECT_EQ(samplePointerCoords[offset].size, motionEvent->getSize(i));
        EXPECT_EQ(samplePointerCoords[offset].touchMajor, motionEvent->getTouchMajor(i));
        EXPECT_EQ(samplePointerCoords[offset].touchMinor, motionEvent->getTouchMinor(i));
        EXPECT_EQ(samplePointerCoords[offset].toolMajor, motionEvent->getToolMajor(i));
        EXPECT_EQ(samplePointerCoords[offset].toolMinor, motionEvent->getToolMinor(i));
        EXPECT_EQ(samplePointerCoords[offset].orientation, motionEvent->getOrientation(i));
    }

    status = mConsumer->sendFinishedSignal();
    ASSERT_EQ(OK, status)
            << "consumer sendFinishedSignal should return OK";

    status = mPublisher->receiveFinishedSignal();
    ASSERT_EQ(OK, status)
            << "publisher receiveFinishedSignal should return OK";

    status = mPublisher->reset();
    ASSERT_EQ(OK, status)
            << "publisher reset should return OK";
}
コード例 #26
0
static void android_view_MotionEvent_nativeSetDownTimeNanos(JNIEnv* env, jclass clazz,
        jint nativePtr, jlong downTimeNanos) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    event->setDownTime(downTimeNanos);
}
コード例 #27
0
static void android_view_MotionEvent_nativeScale(JNIEnv* env, jclass clazz,
        jint nativePtr, jfloat scale) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    event->scale(scale);
}
コード例 #28
0
static jlong android_view_MotionEvent_nativeGetDownTimeNanos(JNIEnv* env, jclass clazz,
        jint nativePtr) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    return event->getDownTime();
}
コード例 #29
0
static jint android_view_MotionEvent_nativeFindPointerIndex(JNIEnv* env, jclass clazz,
        jint nativePtr, jint pointerId) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    return jint(event->findPointerIndex(pointerId));
}
コード例 #30
0
static jint android_view_MotionEvent_nativeGetHistorySize(JNIEnv* env, jclass clazz,
        jint nativePtr) {
    MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
    return jint(event->getHistorySize());
}