input event的flag赋值流程





void TouchInputMapper::cookAndDispatch(nsecs_t when) {
             ......
              uint32_t policyFlags = 0;
             ......


 if (consumeRawTouches(when, policyFlags)) {
        mCurrentRawState.rawPointerData.clear();
    }


}


到了bool TouchInputMapper::consumeRawTouches(nsecs_t when, uint32_t policyFlags) {
           ......
           dispatchVirtualKey(when, policyFlags,
                        AKEY_EVENT_ACTION_UP,
                        AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY);
            }
           ......
}

之后是void TouchInputMapper::dispatchVirtualKey(nsecs_t when, uint32_t policyFlags,
        int32_t keyEventAction, int32_t keyEventFlags) {

                       ......

                      policyFlags |= POLICY_FLAG_VIRTUAL;

                      .......

                      NotifyKeyArgs args(when, getDeviceId(), AINPUT_SOURCE_KEYBOARD, policyFlags,keyEventAction, keyEventFlags, keyCode, scanCode, metaState, downTime);
                    getListener()->notifyKey(&args);

                     ......

}


到void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {

               ......

                  if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {
        policyFlags |= POLICY_FLAG_VIRTUAL;
        flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;
    }
    if (policyFlags & POLICY_FLAG_FUNCTION) {
        metaState |= AMETA_FUNCTION_ON;
    }


    policyFlags |= POLICY_FLAG_TRUSTED;
ALOGE("matt-policyFlags1=0x%x",policyFlags);

               ......

KeyEvent event;
    event.initialize(args->deviceId, args->source, args->action,
            flags, keyCode, args->scanCode, metaState, 0,
            args->downTime, args->eventTime);


    mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);

             .......

}


到了void NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent,
        uint32_t& policyFlags) {

 bool interactive = mInteractive.load();
ALOGE("matt-policyFlags2=0x%x",policyFlags);
    if (interactive) {
        policyFlags |= POLICY_FLAG_INTERACTIVE;
    }
    if ((policyFlags & POLICY_FLAG_TRUSTED)) {
ALOGE("matt-policyFlags & POLICY_FLAG_TRUSTED");
        nsecs_t when = keyEvent->getEventTime();
        JNIEnv* env = jniEnv();
        jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent);
        jint wmActions;
        if (keyEventObj) {
            wmActions = env->CallIntMethod(mServiceObj,
                    gServiceClassInfo.interceptKeyBeforeQueueing,
                    keyEventObj, policyFlags);
            if (checkAndClearExceptionFromCallback(env, "interceptKeyBeforeQueueing")) {
                wmActions = 0;
            }
            android_view_KeyEvent_recycle(env, keyEventObj);
            env->DeleteLocalRef(keyEventObj);
        } else {
            ALOGE("Failed to obtain key event object for interceptKeyBeforeQueueing.");
            wmActions = 0;
        }


        handleInterceptActions(wmActions, when, /*byref*/ policyFlags);
    } else {
        if (interactive) {
            policyFlags |= POLICY_FLAG_PASS_TO_USER;
        }
    }
ALOGE("matt-policyFlags3=0x%x",policyFlags);
}    

log入下:

09-15 10:34:49.914  2343  3332 E InputReader: matt-policyFlags=0
09-15 10:34:49.914  2343  3332 D InputDispatcher: matt-notifyKey - eventTime=94196055000, deviceId=9, source=0x101, policyFlags=0x2, action=0x1, flags=0x48, keyCode=0x3, scanCode=0x66, metaState=0x0, downTime=94153105000
09-15 10:34:49.914  2343  3332 E InputDispatcher: matt-policyFlags1=0x2000002
09-15 10:34:49.914  2343  3332 E InputManager-JNI: matt-policyFlags2=0x2000002
09-15 10:34:49.914  2343  3332 E InputManager-JNI: matt-policyFlags & POLICY_FLAG_TRUSTED
09-15 10:34:49.914  2343  3332 E InputManager-JNI: matt-policyFlags3=0x62000002


整个flag的赋值流程就结束了













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值