1f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown/* 2f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * Copyright (C) 2010 The Android Open Source Project 3f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * 4f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * you may not use this file except in compliance with the License. 6f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * You may obtain a copy of the License at 7f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * 8f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * 10f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * Unless required by applicable law or agreed to in writing, software 11f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * See the License for the specific language governing permissions and 14f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown * limitations under the License. 15f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown */ 161abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkey 1769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornpackage android.app; 1869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 19d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornimport android.content.Context; 2069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornimport android.content.pm.ActivityInfo; 2169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornimport android.content.pm.PackageManager; 226cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tateimport android.content.res.AssetManager; 2308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornimport android.content.res.Configuration; 2454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornimport android.graphics.PixelFormat; 25682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornimport android.os.Build; 2669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornimport android.os.Bundle; 273c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornimport android.os.Looper; 283c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornimport android.os.MessageQueue; 29d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornimport android.util.AttributeSet; 301e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackbornimport android.view.InputQueue; 3154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornimport android.view.Surface; 3274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackbornimport android.view.SurfaceHolder; 333c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackbornimport android.view.View; 34d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornimport android.view.ViewTreeObserver.OnGlobalLayoutListener; 351abdb7123025e52512b2ed7a518f8c754c35f50aJeff Sharkeyimport android.view.WindowManager; 36d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornimport android.view.inputmethod.InputMethodManager; 3769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 3869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornimport java.io.File; 3969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 4069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn/** 4169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Convenience for implementing an activity that will be implemented 4208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * purely in native code. That is, a game (or game-like thing). There 4308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * is no need to derive from this class; you can simply declare it in your 4408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * manifest, and use the NDK APIs from there. 4508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 4608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * <p>A typical manifest would look like: 4708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 4808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * {@sample development/ndk/platforms/android-9/samples/native-activity/AndroidManifest.xml 4908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * manifest} 5008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 5108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * <p>A very simple example of native code that is run by NativeActivity 5208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * follows. This reads input events from the user and uses OpenGLES to 5308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * draw into the native activity's window. 5408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 5508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * {@sample development/ndk/platforms/android-9/samples/native-activity/jni/main.c all} 5669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn */ 57d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornpublic class NativeActivity extends Activity implements SurfaceHolder.Callback2, 58d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn InputQueue.Callback, OnGlobalLayoutListener { 59e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn /** 60e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * Optional meta-that can be in the manifest for this component, specifying 61e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * the name of the native shared library to load. If not specified, 62e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * "main" is used. 63e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn */ 6469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn public static final String META_DATA_LIB_NAME = "android.app.lib_name"; 6569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 66e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn /** 67e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * Optional meta-that can be in the manifest for this component, specifying 68e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * the name of the main entry point for this native activity in the 69e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * {@link #META_DATA_LIB_NAME} native code. If not specified, 70e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * "ANativeActivity_onCreate" is used. 71e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn */ 72e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn public static final String META_DATA_FUNC_NAME = "android.app.func_name"; 73e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn 74e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn private static final String KEY_NATIVE_SAVED_STATE = "android:native_state"; 7508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 76d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private NativeContentView mNativeContentView; 77d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private InputMethodManager mIMM; 78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 7958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private long mNativeHandle; 8069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn private InputQueue mCurInputQueue; 823c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn private SurfaceHolder mCurSurfaceHolder; 833c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 84d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn final int[] mLocation = new int[2]; 85d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentX; 86d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentY; 87d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentWidth; 88d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentHeight; 89d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 90d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private boolean mDispatchingUnhandledKey; 91d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 923c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn private boolean mDestroyed; 933c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 9458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native long loadNativeCode(String path, String funcname, MessageQueue queue, 95805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String internalDataPath, String obbPath, String externalDataPath, int sdkVersion, 9608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn AssetManager assetMgr, byte[] savedState); 9758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void unloadNativeCode(long handle); 9858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onStartNative(long handle); 9958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onResumeNative(long handle); 10058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native byte[] onSaveInstanceStateNative(long handle); 10158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onPauseNative(long handle); 10258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onStopNative(long handle); 10358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onConfigurationChangedNative(long handle); 10458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onLowMemoryNative(long handle); 10558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onWindowFocusChangedNative(long handle, boolean focused); 10658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceCreatedNative(long handle, Surface surface); 10758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceChangedNative(long handle, Surface surface, 10874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn int format, int width, int height); 10958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceRedrawNeededNative(long handle, Surface surface); 11058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceDestroyedNative(long handle); 11158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onInputQueueCreatedNative(long handle, long queuePtr); 11258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onInputQueueDestroyedNative(long handle, long queuePtr); 11358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onContentRectChangedNative(long handle, int x, int y, int w, int h); 114d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 115d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn static class NativeContentView extends View { 116d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeActivity mActivity; 117d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 118d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public NativeContentView(Context context) { 119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn super(context); 120d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 121d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 122d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public NativeContentView(Context context, AttributeSet attrs) { 123d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn super(context, attrs); 124d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 125d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 1262c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 12769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 12869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 12969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String libname = "main"; 130e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn String funcname = "ANativeActivity_onCreate"; 13169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn ActivityInfo ai; 13269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 133d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 134d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 13574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn getWindow().takeSurface(this); 1361e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn getWindow().takeInputQueue(this); 13754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFormat(PixelFormat.RGB_565); 138d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn getWindow().setSoftInputMode( 139d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED 140d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 141d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 142d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView = new NativeContentView(this); 143d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.mActivity = this; 144d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn setContentView(mNativeContentView); 145d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.requestFocus(); 146d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.getViewTreeObserver().addOnGlobalLayoutListener(this); 14774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 14869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn try { 14969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn ai = getPackageManager().getActivityInfo( 15069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn getIntent().getComponent(), PackageManager.GET_META_DATA); 15169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (ai.metaData != null) { 15269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String ln = ai.metaData.getString(META_DATA_LIB_NAME); 15369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (ln != null) libname = ln; 154e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn ln = ai.metaData.getString(META_DATA_FUNC_NAME); 155e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn if (ln != null) funcname = ln; 15669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 15869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn throw new RuntimeException("Error getting activity info", e); 15969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 16069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 16169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String path = null; 16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 16374b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn File libraryFile = new File(ai.applicationInfo.nativeLibraryDir, 16474b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn System.mapLibraryName(libname)); 16574b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn if (libraryFile.exists()) { 16674b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn path = libraryFile.getPath(); 16769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 16869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 16969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (path == null) { 17069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn throw new IllegalArgumentException("Unable to find native library: " + libname); 17169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 17308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn byte[] nativeSavedState = savedInstanceState != null 17408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn ? savedInstanceState.getByteArray(KEY_NATIVE_SAVED_STATE) : null; 17508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 176e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(), 177e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey getAbsolutePath(getFilesDir()), getAbsolutePath(getObbDir()), 178e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey getAbsolutePath(getExternalFilesDir(null)), 179e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey Build.VERSION.SDK_INT, getAssets(), nativeSavedState); 180e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey 18169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (mNativeHandle == 0) { 18269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn throw new IllegalArgumentException("Unable to load native library: " + path); 18369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 18469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onCreate(savedInstanceState); 18569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 18669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 187e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey private static String getAbsolutePath(File file) { 188e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey return (file != null) ? file.getAbsolutePath() : null; 189e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey } 190e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey 19169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 19269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onDestroy() { 1933c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mDestroyed = true; 1943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mCurSurfaceHolder != null) { 19554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceDestroyedNative(mNativeHandle); 1963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = null; 1973c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 1983c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mCurInputQueue != null) { 199a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueDestroyedNative(mNativeHandle, mCurInputQueue.getNativePtr()); 2003c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurInputQueue = null; 2013c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 20269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn unloadNativeCode(mNativeHandle); 20369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onDestroy(); 20469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 20569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 20669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 20769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onPause() { 20869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onPause(); 20969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onPauseNative(mNativeHandle); 21069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 21269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 21369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onResume() { 21469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onResume(); 21569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onResumeNative(mNativeHandle); 21669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 21869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 21969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onSaveInstanceState(Bundle outState) { 22069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onSaveInstanceState(outState); 22108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn byte[] state = onSaveInstanceStateNative(mNativeHandle); 22208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != null) { 22308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn outState.putByteArray(KEY_NATIVE_SAVED_STATE, state); 22408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 22569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 22669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 22769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 22869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onStart() { 22969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onStart(); 23069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onStartNative(mNativeHandle); 23169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 23269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 23369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 23469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onStop() { 23569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onStop(); 23669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onStopNative(mNativeHandle); 23769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 23869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 23969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 24008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 24108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn super.onConfigurationChanged(newConfig); 24208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (!mDestroyed) { 24308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn onConfigurationChangedNative(mNativeHandle); 24408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 24508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 24608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 24708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn @Override 24874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void onLowMemory() { 24974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn super.onLowMemory(); 2503c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn onLowMemoryNative(mNativeHandle); 2523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 25374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 25474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 25574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn @Override 25669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 25769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onWindowFocusChanged(hasFocus); 2583c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2593c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn onWindowFocusChangedNative(mNativeHandle, hasFocus); 2603c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 26169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 26274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 26374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceCreated(SurfaceHolder holder) { 2643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = holder; 26654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceCreatedNative(mNativeHandle, holder.getSurface()); 2673c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 26874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 26974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 27074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 2713c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2723c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = holder; 27354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceChangedNative(mNativeHandle, holder.getSurface(), format, width, height); 2743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 27574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 27674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 277d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public void surfaceRedrawNeeded(SurfaceHolder holder) { 278d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (!mDestroyed) { 279d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mCurSurfaceHolder = holder; 280d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn onSurfaceRedrawNeededNative(mNativeHandle, holder.getSurface()); 281d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 282d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 283d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 28474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceDestroyed(SurfaceHolder holder) { 2853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = null; 2863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 28754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceDestroyedNative(mNativeHandle); 2883c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 28974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 290a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 2911e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn public void onInputQueueCreated(InputQueue queue) { 2923c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2933c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurInputQueue = queue; 294a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueCreatedNative(mNativeHandle, queue.getNativePtr()); 2953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 296a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 297a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 2981e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn public void onInputQueueDestroyed(InputQueue queue) { 2993c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 300a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueDestroyedNative(mNativeHandle, queue.getNativePtr()); 301a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright mCurInputQueue = null; 3023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 305d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public void onGlobalLayout() { 306d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.getLocationInWindow(mLocation); 307d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int w = mNativeContentView.getWidth(); 308d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int h = mNativeContentView.getHeight(); 309d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mLocation[0] != mLastContentX || mLocation[1] != mLastContentY 310d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || w != mLastContentWidth || h != mLastContentHeight) { 311d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentX = mLocation[0]; 312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentY = mLocation[1]; 313d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentWidth = w; 314d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentHeight = h; 315d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (!mDestroyed) { 316d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn onContentRectChangedNative(mNativeHandle, mLastContentX, 317d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentY, mLastContentWidth, mLastContentHeight); 318d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 319d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 320d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 321d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 32254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn void setWindowFlags(int flags, int mask) { 32354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFlags(flags, mask); 32454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 32554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 32654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn void setWindowFormat(int format) { 32754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFormat(format); 32854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 329d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 330d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void showIme(int mode) { 331d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM.showSoftInput(mNativeContentView, mode); 332d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 333d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 334d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void hideIme(int mode) { 335d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM.hideSoftInputFromWindow(mNativeContentView.getWindowToken(), mode); 336d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 33769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 338