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的赋值流程就结束了