android_app_NativeActivity.cpp revision d76b67c340d1564abf8d14d976fdaf83bf2b3320
169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn/* 269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * 469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * you may not use this file except in compliance with the License. 669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * You may obtain a copy of the License at 769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * 869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * 1069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Unless required by applicable law or agreed to in writing, software 1169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * See the License for the specific language governing permissions and 1469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * limitations under the License. 1569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn */ 1669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 1769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#define LOG_TAG "NativeActivity" 1869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <utils/Log.h> 1969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include <poll.h> 213c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include <dlfcn.h> 22d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn#include <fcntl.h> 233c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 2469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn#include <android_runtime/AndroidRuntime.h> 25289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_view_Surface.h> 26289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android_runtime/android_app_NativeActivity.h> 2754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#include <surfaceflinger/Surface.h> 2854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#include <ui/egl/android_natives.h> 29a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <ui/InputTransport.h> 303c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include <utils/PollLoop.h> 3169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 323c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "JNIHelp.h" 333c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_os_MessageQueue.h" 343c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_InputChannel.h" 353c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#include "android_view_KeyEvent.h" 3669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 37d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn//#define LOG_TRACE(...) 38d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn#define LOG_TRACE(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) 39d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 4069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornnamespace android 4169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 4269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 433c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic struct { 443c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn jclass clazz; 453c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 463c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn jmethodID dispatchUnhandledKeyEvent; 4754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFlags; 4854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn jmethodID setWindowFormat; 49d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID showIme; 50d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jmethodID hideIme; 513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} gNativeActivityClassInfo; 523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 5354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 5454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 55289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct ActivityWork { 56289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t cmd; 57289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg1; 58289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t arg2; 59289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 60289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 61289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornenum { 62289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_DEF_KEY = 1, 63289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FORMAT, 64289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn CMD_SET_WINDOW_FLAGS, 65d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_SHOW_SOFT_INPUT, 66d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn CMD_HIDE_SOFT_INPUT, 67289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn}; 68289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 69289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic void write_work(int fd, int32_t cmd, int32_t arg1=0, int32_t arg2=0) { 70289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 71289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.cmd = cmd; 72289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg1 = arg1; 73289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn work.arg2 = arg2; 74289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 75d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("write_work: cmd=%d", cmd); 76d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 77289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornrestart: 78289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = write(fd, &work, sizeof(work)); 79289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0 && errno == EINTR) { 80289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn goto restart; 81289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 82289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 83289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(work)) return; 84289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 85289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0) LOGW("Failed writing to work fd: %s", strerror(errno)); 86289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn else LOGW("Truncated writing to work fd: %d", res); 87289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 88289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 89289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstatic bool read_work(int fd, ActivityWork* outWork) { 90289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int res = read(fd, outWork, sizeof(ActivityWork)); 91289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn // no need to worry about EINTR, poll loop will just come back again. 92289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res == sizeof(ActivityWork)) return true; 93289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 94289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res < 0) LOGW("Failed reading work fd: %s", strerror(errno)); 95289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn else LOGW("Truncated reading work fd: %d", res); 96289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return false; 97289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 98289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 99289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn// ------------------------------------------------------------------------ 100289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 101d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} // namespace android 102d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 103d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornusing namespace android; 104d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 105d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornAInputQueue::AInputQueue(const sp<InputChannel>& channel, int workWrite) : 106d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mWorkWrite(workWrite), mConsumer(channel) { 107d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int msgpipe[2]; 108d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (pipe(msgpipe)) { 109d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOGW("could not create pipe: %s", strerror(errno)); 110d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyRead = mDispatchKeyWrite = -1; 111d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 112d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyRead = msgpipe[0]; 113d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyWrite = msgpipe[1]; 114d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int result = fcntl(mDispatchKeyRead, F_SETFL, O_NONBLOCK); 115d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make AInputQueue read pipe " 116d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 117d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn result = fcntl(mDispatchKeyWrite, F_SETFL, O_NONBLOCK); 118d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make AInputQueue write pipe " 119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 1203c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 121d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 122d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 123d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornAInputQueue::~AInputQueue() { 124d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn close(mDispatchKeyRead); 125d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn close(mDispatchKeyWrite); 126d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 127d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 128d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid AInputQueue::attachLooper(ALooper* looper, ALooper_callbackFunc* callback, void* data) { 129d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mPollLoop = static_cast<android::PollLoop*>(looper); 130d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mPollLoop->setLooperCallback(mConsumer.getChannel()->getReceivePipeFd(), 131d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn POLLIN, callback, data); 132d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mPollLoop->setLooperCallback(mDispatchKeyRead, 133d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn POLLIN, callback, data); 134d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 135d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 136d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid AInputQueue::detachLooper() { 137d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mPollLoop->removeCallback(mConsumer.getChannel()->getReceivePipeFd()); 138d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mPollLoop->removeCallback(mDispatchKeyRead); 139d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 140d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 141d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornint32_t AInputQueue::hasEvents() { 142d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn struct pollfd pfd[2]; 143d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 144d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].fd = mConsumer.getChannel()->getReceivePipeFd(); 145d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].events = POLLIN; 146d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].revents = 0; 147d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[1].fd = mDispatchKeyRead; 148d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].events = POLLIN; 149d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn pfd[0].revents = 0; 1503c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 151d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int nfd = poll(pfd, 2, 0); 152d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (nfd <= 0) return 0; 153d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return (pfd[0].revents == POLLIN || pfd[1].revents == POLLIN) ? 1 : -1; 154d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 155d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 156d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornint32_t AInputQueue::getEvent(AInputEvent** outEvent) { 157d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn *outEvent = NULL; 158d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 159d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn char byteread; 160d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ssize_t nRead = read(mDispatchKeyRead, &byteread, 1); 161d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (nRead == 1) { 1623c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mLock.lock(); 163d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mDispatchingKeys.size() > 0) { 164d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn KeyEvent* kevent = mDispatchingKeys[0]; 165d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn *outEvent = kevent; 166d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchingKeys.removeAt(0); 167d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDeliveringKeys.add(kevent); 1683c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 1693c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mLock.unlock(); 170d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (*outEvent != NULL) { 171d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return 0; 172d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 1733c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 1743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 175d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t res = mConsumer.receiveDispatchSignal(); 176d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res != android::OK) { 177d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOGE("channel '%s' ~ Failed to receive dispatch signal. status=%d", 178d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mConsumer.getChannel()->getName().string(), res); 179d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return -1; 180d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 181d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 182d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn InputEvent* myEvent = NULL; 183d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn res = mConsumer.consume(&mInputEventFactory, &myEvent); 184d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res != android::OK) { 185d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOGW("channel '%s' ~ Failed to consume input event. status=%d", 186d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mConsumer.getChannel()->getName().string(), res); 187d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mConsumer.sendFinishedSignal(); 188d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return -1; 189d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 190d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 191d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn *outEvent = myEvent; 192d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return 0; 193d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 194d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 195d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid AInputQueue::finishEvent(AInputEvent* event, bool handled) { 196d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn bool needFinished = true; 197d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 198d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (!handled && ((InputEvent*)event)->getType() == INPUT_EVENT_TYPE_KEY 199d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn && ((KeyEvent*)event)->hasDefaultAction()) { 200d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // The app didn't handle this, but it may have a default action 201d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // associated with it. We need to hand this back to Java to be 202d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // executed. 203d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn doDefaultKey((KeyEvent*)event); 204d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn needFinished = false; 205d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 206d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 207d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn const size_t N = mDeliveringKeys.size(); 208d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn for (size_t i=0; i<N; i++) { 209d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mDeliveringKeys[i] == event) { 210d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn delete event; 211d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDeliveringKeys.removeAt(i); 212d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn needFinished = false; 213d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn break; 2143c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2153c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2163c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 217d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (needFinished) { 218d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t res = mConsumer.sendFinishedSignal(); 219d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res != android::OK) { 220d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOGW("Failed to send finished signal on channel '%s'. status=%d", 221d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mConsumer.getChannel()->getName().string(), res); 222d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 223d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 224d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 225d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 226d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid AInputQueue::dispatchEvent(android::KeyEvent* event) { 227d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.lock(); 228d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("dispatchEvent: dispatching=%d write=%d\n", mDispatchingKeys.size(), 229d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchKeyWrite); 230d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mDispatchingKeys.add(event); 231d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.unlock(); 2323c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 233d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornrestart: 234d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn char dummy = 0; 235d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int res = write(mDispatchKeyWrite, &dummy, sizeof(dummy)); 236d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res < 0 && errno == EINTR) { 237d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn goto restart; 238d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 239d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 240d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res == sizeof(dummy)) return; 241d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 242d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (res < 0) LOGW("Failed writing to dispatch fd: %s", strerror(errno)); 243d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn else LOGW("Truncated writing to dispatch fd: %d", res); 244d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 245d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 246d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornKeyEvent* AInputQueue::consumeUnhandledEvent() { 247d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn KeyEvent* event = NULL; 248d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 249d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.lock(); 250d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mPendingKeys.size() > 0) { 251d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn event = mPendingKeys[0]; 252d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mPendingKeys.removeAt(0); 253d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 254d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.unlock(); 255d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 256d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("consumeUnhandledEvent: KeyEvent=%p", event); 257d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 258d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return event; 259d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 260d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 261d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid AInputQueue::doDefaultKey(KeyEvent* keyEvent) { 262d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.lock(); 263d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("Default key: pending=%d write=%d\n", mPendingKeys.size(), mWorkWrite); 264d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mPendingKeys.size() <= 0 && mWorkWrite >= 0) { 265d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(mWorkWrite, CMD_DEF_KEY); 266d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 267d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mPendingKeys.add(keyEvent); 268d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLock.unlock(); 269d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 270d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 271d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornnamespace android { 2723c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 27354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 27454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 27554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 27654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Native state for interacting with the NativeActivity class. 27754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 278289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornstruct NativeCode : public ANativeActivity { 2792e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn NativeCode(void* _dlhandle, ANativeActivity_createFunc* _createFunc) { 280d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset((ANativeActivity*)this, 0, sizeof(ANativeActivity)); 281d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn memset(&callbacks, 0, sizeof(callbacks)); 28274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn dlhandle = _dlhandle; 28374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn createActivityFunc = _createFunc; 28454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 285a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn inputChannel = NULL; 286a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn nativeInputQueue = NULL; 2873c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mainWorkRead = mainWorkWrite = -1; 28874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 28974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 29074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn ~NativeCode() { 291289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (callbacks.onDestroy != NULL) { 292289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn callbacks.onDestroy(this); 293289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 294289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env != NULL && clazz != NULL) { 295289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn env->DeleteGlobalRef(clazz); 2963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2973c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (pollLoop != NULL && mainWorkRead >= 0) { 2983c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn pollLoop->removeCallback(mainWorkRead); 2993c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3003c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (nativeInputQueue != NULL) { 3013c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn nativeInputQueue->mWorkWrite = -1; 3023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 303a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn setSurface(NULL); 304a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn setInputChannel(NULL); 3053c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkRead >= 0) close(mainWorkRead); 3063c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mainWorkWrite >= 0) close(mainWorkWrite); 30774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (dlhandle != NULL) { 30854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // for now don't unload... we probably should clean this 30954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // up and only keep one open dlhandle per proc, since there 31054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn // is really no benefit to unloading the code. 31154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn //dlclose(dlhandle); 31274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 31374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 31474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 31574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn void setSurface(jobject _surface) { 31674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (_surface != NULL) { 317289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn nativeWindow = android_Surface_getNativeWindow(env, _surface); 31874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } else { 31954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn nativeWindow = NULL; 32074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 32174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 32274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 323a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn status_t setInputChannel(jobject _channel) { 324a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (inputChannel != NULL) { 325a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn delete nativeInputQueue; 326289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn env->DeleteGlobalRef(inputChannel); 327a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 328a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn inputChannel = NULL; 329a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn nativeInputQueue = NULL; 330a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (_channel != NULL) { 331289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn inputChannel = env->NewGlobalRef(_channel); 332a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn sp<InputChannel> ic = 333289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn android_view_InputChannel_getInputChannel(env, _channel); 334a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (ic != NULL) { 335d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn nativeInputQueue = new AInputQueue(ic, mainWorkWrite); 336a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (nativeInputQueue->getConsumer().initialize() != android::OK) { 337a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn delete nativeInputQueue; 338a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn nativeInputQueue = NULL; 339a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return UNKNOWN_ERROR; 340a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 341a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } else { 342a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return UNKNOWN_ERROR; 343a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 344a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 345a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return OK; 346a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 347a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 3482e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivityCallbacks callbacks; 34969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 35069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* dlhandle; 3512e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn ANativeActivity_createFunc* createActivityFunc; 35274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 353682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn String8 internalDataPath; 354682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn String8 externalDataPath; 355682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 35654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> nativeWindow; 357d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowWidth; 358d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t lastWindowHeight; 359d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 360a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn jobject inputChannel; 361d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn struct AInputQueue* nativeInputQueue; 3623c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 3633c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn // These are used to wake up the main thread to process work. 3643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkRead; 3653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int mainWorkWrite; 3663c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn sp<PollLoop> pollLoop; 36769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 36869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 369289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFormat( 370289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t format) { 371289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 372289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FORMAT, format); 373289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 374289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 375289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornvoid android_NativeActivity_setWindowFlags( 376289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t values, int32_t mask) { 377289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 378289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn write_work(code->mainWorkWrite, CMD_SET_WINDOW_FLAGS, values, mask); 379289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn} 380289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 381d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_showSoftInput( 382d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 383d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 384d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_SHOW_SOFT_INPUT, flags); 385d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 386d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 387d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornvoid android_NativeActivity_hideSoftInput( 388d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags) { 389d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = static_cast<NativeCode*>(activity); 390d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn write_work(code->mainWorkWrite, CMD_HIDE_SOFT_INPUT, flags); 391d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 392d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 39354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 39454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 39554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 39654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Callback for handling native events on the application's main thread. 39754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 3983c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornstatic bool mainWorkCallback(int fd, int events, void* data) { 3993c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn NativeCode* code = (NativeCode*)data; 400289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if ((events & POLLIN) == 0) { 401289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return true; 402289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 403289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 404289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ActivityWork work; 405289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (!read_work(code->mainWorkRead, &work)) { 406289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn return true; 407289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 408d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 409d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("mainWorkCallback: cmd=%d", work.cmd); 410d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 411289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn switch (work.cmd) { 412289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_DEF_KEY: { 413289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn KeyEvent* keyEvent; 414d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn while ((keyEvent=code->nativeInputQueue->consumeUnhandledEvent()) != NULL) { 415289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn jobject inputEventObj = android_view_KeyEvent_fromNative( 416289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env, keyEvent); 417289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 418289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.dispatchUnhandledKeyEvent, inputEventObj); 419289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn int32_t res = code->nativeInputQueue->getConsumer().sendFinishedSignal(); 420289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (res != OK) { 421289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn LOGW("Failed to send finished signal on channel '%s'. status=%d", 422289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->nativeInputQueue->getConsumer().getChannel()->getName().string(), res); 423289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } 4243c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 425289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 426289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FORMAT: { 427289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 428289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFormat, work.arg1); 429289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 430289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn case CMD_SET_WINDOW_FLAGS: { 431289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env->CallVoidMethod(code->clazz, 432289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn gNativeActivityClassInfo.setWindowFlags, work.arg1, work.arg2); 433289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn } break; 434d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_SHOW_SOFT_INPUT: { 435d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 436d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.showIme, work.arg1); 437d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 438d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn case CMD_HIDE_SOFT_INPUT: { 439d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->env->CallVoidMethod(code->clazz, 440d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.hideIme, work.arg1); 441d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } break; 442289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn default: 443289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn LOGW("Unknown work command: %d", work.cmd); 444289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn break; 4453c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 4463c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 4473c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return true; 4483c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn} 4493c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 45054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn// ------------------------------------------------------------------------ 45154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 45269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic jint 453682674154e3fe88f6061245145f934f25f1a2eb8Dianne HackbornloadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQueue, 454682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn jstring internalDataDir, jstring externalDataDir, int sdkVersion) 45569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 456d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("loadNativeCode_native"); 457d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 45869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn const char* pathStr = env->GetStringUTFChars(path, NULL); 45969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = NULL; 46069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 46169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn void* handle = dlopen(pathStr, RTLD_LAZY); 46269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 46369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env->ReleaseStringUTFChars(path, pathStr); 46469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 46569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != NULL) { 4662e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn code = new NativeCode(handle, (ANativeActivity_createFunc*) 4672e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn dlsym(handle, "ANativeActivity_onCreate")); 46869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->createActivityFunc == NULL) { 4692e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn LOGW("ANativeActivity_onCreate not found"); 47069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 47169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return 0; 47269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 4733c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 4743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->pollLoop = android_os_MessageQueue_getPollLoop(env, messageQueue); 4753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (code->pollLoop == NULL) { 4763c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn LOGW("Unable to retrieve MessageQueue's PollLoop"); 4773c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn delete code; 4783c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 4793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 4803c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 4813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn int msgpipe[2]; 4823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (pipe(msgpipe)) { 4833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn LOGW("could not create pipe: %s", strerror(errno)); 4843c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn delete code; 4853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn return 0; 4863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 4873c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkRead = msgpipe[0]; 4883c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->mainWorkWrite = msgpipe[1]; 489d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int result = fcntl(code->mainWorkRead, F_SETFL, O_NONBLOCK); 490d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work read pipe " 491d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 492d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn result = fcntl(code->mainWorkWrite, F_SETFL, O_NONBLOCK); 493d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn SLOGW_IF(result != 0, "Could not make main work write pipe " 494d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "non-blocking: %s", strerror(errno)); 4953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn code->pollLoop->setCallback(code->mainWorkRead, POLLIN, mainWorkCallback, code); 4963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 497289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->ANativeActivity::callbacks = &code->callbacks; 498289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn if (env->GetJavaVM(&code->vm) < 0) { 4992e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn LOGW("NativeActivity GetJavaVM failed"); 5002e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn delete code; 5012e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn return 0; 5022e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackborn } 503289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->env = env; 504289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->clazz = env->NewGlobalRef(clazz); 505682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 506682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); 507682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn code->internalDataPath = dirStr; 508289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->internalDataPath = code->internalDataPath.string(); 509682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn env->ReleaseStringUTFChars(path, dirStr); 510682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 511682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn dirStr = env->GetStringUTFChars(externalDataDir, NULL); 512682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn code->externalDataPath = dirStr; 513289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->externalDataPath = code->externalDataPath.string(); 514682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn env->ReleaseStringUTFChars(path, dirStr); 515682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 516289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->sdkVersion = sdkVersion; 517682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn 518289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->createActivityFunc(code, NULL, 0); 51969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 52069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 52169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return (jint)code; 52269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 52369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 52469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 52569969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornunloadNativeCode_native(JNIEnv* env, jobject clazz, jint handle) 52669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 527d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("unloadNativeCode_native"); 52869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 52969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 53069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn delete code; 53169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 53269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 53369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 53469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 53569969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStart_native(JNIEnv* env, jobject clazz, jint handle) 53669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 537d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onStart_native"); 53869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 53969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 54069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStart != NULL) { 541289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStart(code); 54269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 54369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 54469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 54569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 54669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 54769969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonResume_native(JNIEnv* env, jobject clazz, jint handle) 54869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 549d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onResume_native"); 55069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 55169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 55269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onResume != NULL) { 553289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onResume(code); 55469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 55569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 55669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 55769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 55869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 55969969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle) 56069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 561d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSaveInstanceState_native"); 56269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 56369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 56469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onSaveInstanceState != NULL) { 56569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn size_t len = 0; 566289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onSaveInstanceState(code, &len); 56769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 56869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 56969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 57069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 57169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 57269969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonPause_native(JNIEnv* env, jobject clazz, jint handle) 57369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 574d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onPause_native"); 57569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 57669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 57769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onPause != NULL) { 578289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onPause(code); 57969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 58069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 58169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 58269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 58369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 58469969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonStop_native(JNIEnv* env, jobject clazz, jint handle) 58569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onStop_native"); 58769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 58869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 58969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onStop != NULL) { 590289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onStop(code); 59169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 59269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 59369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 59469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 59569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 59669969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonLowMemory_native(JNIEnv* env, jobject clazz, jint handle) 59769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 598d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onLowMemory_native"); 59969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 60069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 60169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onLowMemory != NULL) { 602289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onLowMemory(code); 60369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 60469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 60569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 60669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 60769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic void 60869969e48f2bca9339662dddfacff0bbf6374ed7fDianne HackbornonWindowFocusChanged_native(JNIEnv* env, jobject clazz, jint handle, jboolean focused) 60969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 610d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onWindowFocusChanged_native"); 61169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (handle != 0) { 61269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn NativeCode* code = (NativeCode*)handle; 61369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (code->callbacks.onWindowFocusChanged != NULL) { 614289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onWindowFocusChanged(code, focused ? 1 : 0); 61569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 61669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 61769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 61869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 61974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 62074323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 62174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 622d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceCreated_native"); 62374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 62474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 62574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(surface); 62654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowCreated != NULL) { 627289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowCreated(code, 62854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 62974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 63074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 63174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 63274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 633d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic int32_t getWindowProp(ANativeWindow* window, int what) { 634d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int value; 635d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int res = window->query(window, what, &value); 636d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn return res < 0 ? res : value; 637d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 638d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 63974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 64074323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceChanged_native(JNIEnv* env, jobject clazz, jint handle, jobject surface, 64174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn jint format, jint width, jint height) 64274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 643d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceChanged_native"); 64474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 64574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 64654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn sp<ANativeWindow> oldNativeWindow = code->nativeWindow; 64754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->setSurface(surface); 64854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (oldNativeWindow != code->nativeWindow) { 6498ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn if (oldNativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 650289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 6518ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn oldNativeWindow.get()); 6528ae5a8e7c04c7b204b739dfcd5da9e2e0f83e1ebDianne Hackborn } 653d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL) { 654d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowCreated != NULL) { 655d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowCreated(code, 656d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 657d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 658d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowWidth = getWindowProp(code->nativeWindow.get(), 659d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 660d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->lastWindowHeight = getWindowProp(code->nativeWindow.get(), 661d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 662d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 663d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } else { 664d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // Maybe it resized? 665d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newWidth = getWindowProp(code->nativeWindow.get(), 666d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_WIDTH); 667d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t newHeight = getWindowProp(code->nativeWindow.get(), 668d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NATIVE_WINDOW_HEIGHT); 669d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (newWidth != code->lastWindowWidth 670d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || newHeight != code->lastWindowHeight) { 671d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onNativeWindowResized != NULL) { 672d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowResized(code, 673d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeWindow.get()); 674d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 67554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 67674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 67774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 67874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 67974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 68074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornstatic void 681d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornonSurfaceRedrawNeeded_native(JNIEnv* env, jobject clazz, jint handle) 682d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 683d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceRedrawNeeded_native"); 684d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 685d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 686d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowRedrawNeeded != NULL) { 687d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onNativeWindowRedrawNeeded(code, code->nativeWindow.get()); 688d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 689d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 690d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 691d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 692d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 69374323fd1ab8eb11beea286d5c213c63e4b803141Dianne HackbornonSurfaceDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject surface) 69474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn{ 695d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onSurfaceDestroyed_native"); 69674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn if (handle != 0) { 69774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn NativeCode* code = (NativeCode*)handle; 69854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn if (code->nativeWindow != NULL && code->callbacks.onNativeWindowDestroyed != NULL) { 699289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onNativeWindowDestroyed(code, 70054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn code->nativeWindow.get()); 70174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 70274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn code->setSurface(NULL); 70374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 70474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn} 70574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 706a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 707a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelCreated_native(JNIEnv* env, jobject clazz, jint handle, jobject channel) 708a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 709d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onInputChannelCreated_native"); 710a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 711a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 712a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn status_t err = code->setInputChannel(channel); 713a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (err != OK) { 714a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", 715a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn "Error setting input channel"); 716a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn return; 717a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 718a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->callbacks.onInputQueueCreated != NULL) { 719289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onInputQueueCreated(code, 720a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->nativeInputQueue); 721a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 722a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 723a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 724a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 725a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornstatic void 726a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne HackbornonInputChannelDestroyed_native(JNIEnv* env, jobject clazz, jint handle, jobject channel) 727a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn{ 728d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onInputChannelDestroyed_native"); 729a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (handle != 0) { 730a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn NativeCode* code = (NativeCode*)handle; 731a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn if (code->nativeInputQueue != NULL 732a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn && code->callbacks.onInputQueueDestroyed != NULL) { 733289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn code->callbacks.onInputQueueDestroyed(code, 734a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->nativeInputQueue); 735a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 736a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn code->setInputChannel(NULL); 737a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 738a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} 739a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 740d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 741d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackbornonContentRectChanged_native(JNIEnv* env, jobject clazz, jint handle, 742d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn jint x, jint y, jint w, jint h) 743d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 744d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("onContentRectChanged_native"); 745d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 746d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 747d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->callbacks.onContentRectChanged != NULL) { 748d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ARect rect; 749d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.left = x; 750d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.top = y; 751d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.right = x+w; 752d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn rect.bottom = y+h; 753d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->callbacks.onContentRectChanged(code, &rect); 754d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 755d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 756d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 757d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 758d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstatic void 759d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne HackborndispatchKeyEvent_native(JNIEnv* env, jobject clazz, jint handle, jobject eventObj) 760d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn{ 761d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn LOG_TRACE("dispatchKeyEvent_native"); 762d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (handle != 0) { 763d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeCode* code = (NativeCode*)handle; 764d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (code->nativeInputQueue != NULL) { 765d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn KeyEvent* event = new KeyEvent(); 766d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android_view_KeyEvent_toNative(env, eventObj, INPUT_EVENT_NATURE_KEY, event); 767d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn code->nativeInputQueue->dispatchEvent(event); 768d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 769d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 770d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn} 771d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 77269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const JNINativeMethod g_methods[] = { 773682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn { "loadNativeCode", "(Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;I)I", 774682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn (void*)loadNativeCode_native }, 77569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native }, 77669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStartNative", "(I)V", (void*)onStart_native }, 77769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onResumeNative", "(I)V", (void*)onResume_native }, 77869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onSaveInstanceStateNative", "(I)V", (void*)onSaveInstanceState_native }, 77969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onPauseNative", "(I)V", (void*)onPause_native }, 78069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onStopNative", "(I)V", (void*)onStop_native }, 78169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native }, 78269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native }, 78354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceCreatedNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceCreated_native }, 78454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceChangedNative", "(ILandroid/view/Surface;III)V", (void*)onSurfaceChanged_native }, 785d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "onSurfaceRedrawNeededNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceRedrawNeeded_native }, 78654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn { "onSurfaceDestroyedNative", "(I)V", (void*)onSurfaceDestroyed_native }, 787a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn { "onInputChannelCreatedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelCreated_native }, 788a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn { "onInputChannelDestroyedNative", "(ILandroid/view/InputChannel;)V", (void*)onInputChannelDestroyed_native }, 789d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "onContentRectChangedNative", "(IIIII)V", (void*)onContentRectChanged_native }, 790d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn { "dispatchKeyEventNative", "(ILandroid/view/KeyEvent;)V", (void*)dispatchKeyEvent_native }, 79169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn}; 79269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 79369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornstatic const char* const kNativeActivityPathName = "android/app/NativeActivity"; 79469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 7953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define FIND_CLASS(var, className) \ 7963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = env->FindClass(className); \ 7973c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn LOG_FATAL_IF(! var, "Unable to find class " className); \ 7983c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = jclass(env->NewGlobalRef(var)); 7993c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 8003c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn#define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ 8013c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn var = env->GetMethodID(clazz, methodName, fieldDescriptor); \ 8023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn LOG_FATAL_IF(! var, "Unable to find method" methodName); 8033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 80469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornint register_android_app_NativeActivity(JNIEnv* env) 80569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn{ 80669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn //LOGD("register_android_app_NativeActivity"); 80769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 8083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn FIND_CLASS(gNativeActivityClassInfo.clazz, kNativeActivityPathName); 80954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 8103c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.dispatchUnhandledKeyEvent, 8113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn gNativeActivityClassInfo.clazz, 8123c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn "dispatchUnhandledKeyEvent", "(Landroid/view/KeyEvent;)V"); 81354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 81454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.setWindowFlags, 81554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn gNativeActivityClassInfo.clazz, 81654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn "setWindowFlags", "(II)V"); 81754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.setWindowFormat, 81854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn gNativeActivityClassInfo.clazz, 81954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn "setWindowFormat", "(I)V"); 820d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.showIme, 821d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.clazz, 822d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "showIme", "(I)V"); 823d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn GET_METHOD_ID(gNativeActivityClassInfo.hideIme, 824d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn gNativeActivityClassInfo.clazz, 825d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn "hideIme", "(I)V"); 82654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 82769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn return AndroidRuntime::registerNativeMethods( 82869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn env, kNativeActivityPathName, 82969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn g_methods, NELEM(g_methods)); 83069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 83169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 832a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn} // namespace android 833