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 7969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private int 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 94e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn private native int loadNativeCode(String path, String funcname, MessageQueue queue, 95805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String internalDataPath, String obbPath, String externalDataPath, int sdkVersion, 9608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn AssetManager assetMgr, byte[] savedState); 9769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private native void unloadNativeCode(int handle); 9869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 9969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private native void onStartNative(int handle); 10069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private native void onResumeNative(int handle); 10108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn private native byte[] onSaveInstanceStateNative(int handle); 10269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private native void onPauseNative(int handle); 10369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private native void onStopNative(int handle); 10408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn private native void onConfigurationChangedNative(int handle); 10569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private native void onLowMemoryNative(int handle); 10669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn private native void onWindowFocusChangedNative(int handle, boolean focused); 10754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn private native void onSurfaceCreatedNative(int handle, Surface surface); 10854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn private native void onSurfaceChangedNative(int handle, Surface surface, 10974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn int format, int width, int height); 110d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private native void onSurfaceRedrawNeededNative(int handle, Surface surface); 11154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn private native void onSurfaceDestroyedNative(int handle); 112a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright private native void onInputQueueCreatedNative(int handle, int queuePtr); 113a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright private native void onInputQueueDestroyedNative(int handle, int queuePtr); 114d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private native void onContentRectChangedNative(int handle, int x, int y, int w, int h); 115d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 116d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn static class NativeContentView extends View { 117d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeActivity mActivity; 118d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public NativeContentView(Context context) { 120d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn super(context); 121d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 122d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 123d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public NativeContentView(Context context, AttributeSet attrs) { 124d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn super(context, attrs); 125d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 126d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 1272c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 12869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 12969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 13069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String libname = "main"; 131e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn String funcname = "ANativeActivity_onCreate"; 13269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn ActivityInfo ai; 13369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 134d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 135d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 13674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn getWindow().takeSurface(this); 1371e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn getWindow().takeInputQueue(this); 13854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFormat(PixelFormat.RGB_565); 139d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn getWindow().setSoftInputMode( 140d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED 141d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 142d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 143d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView = new NativeContentView(this); 144d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.mActivity = this; 145d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn setContentView(mNativeContentView); 146d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.requestFocus(); 147d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.getViewTreeObserver().addOnGlobalLayoutListener(this); 14874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 14969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn try { 15069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn ai = getPackageManager().getActivityInfo( 15169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn getIntent().getComponent(), PackageManager.GET_META_DATA); 15269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (ai.metaData != null) { 15369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String ln = ai.metaData.getString(META_DATA_LIB_NAME); 15469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (ln != null) libname = ln; 155e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn ln = ai.metaData.getString(META_DATA_FUNC_NAME); 156e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn if (ln != null) funcname = ln; 15769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 15869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 15969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn throw new RuntimeException("Error getting activity info", e); 16069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 16169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String path = null; 16369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 16474b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn File libraryFile = new File(ai.applicationInfo.nativeLibraryDir, 16574b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn System.mapLibraryName(libname)); 16674b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn if (libraryFile.exists()) { 16774b1ed3231b8cafcf4e5cb3f03d794acd5080004Dianne Hackborn path = libraryFile.getPath(); 16869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 16969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 17069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (path == null) { 17169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn throw new IllegalArgumentException("Unable to find native library: " + libname); 17269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 17408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn byte[] nativeSavedState = savedInstanceState != null 17508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn ? savedInstanceState.getByteArray(KEY_NATIVE_SAVED_STATE) : null; 17608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 177e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(), 178e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey getAbsolutePath(getFilesDir()), getAbsolutePath(getObbDir()), 179e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey getAbsolutePath(getExternalFilesDir(null)), 180e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey Build.VERSION.SDK_INT, getAssets(), nativeSavedState); 181e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey 18269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (mNativeHandle == 0) { 18369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn throw new IllegalArgumentException("Unable to load native library: " + path); 18469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 18569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onCreate(savedInstanceState); 18669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 18769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 188e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey private static String getAbsolutePath(File file) { 189e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey return (file != null) ? file.getAbsolutePath() : null; 190e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey } 191e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey 19269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 19369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onDestroy() { 1943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mDestroyed = true; 1953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mCurSurfaceHolder != null) { 19654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceDestroyedNative(mNativeHandle); 1973c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = null; 1983c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 1993c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mCurInputQueue != null) { 200a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueDestroyedNative(mNativeHandle, mCurInputQueue.getNativePtr()); 2013c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurInputQueue = null; 2023c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 20369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn unloadNativeCode(mNativeHandle); 20469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onDestroy(); 20569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 20669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 20769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 20869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onPause() { 20969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onPause(); 21069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onPauseNative(mNativeHandle); 21169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 21369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 21469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onResume() { 21569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onResume(); 21669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onResumeNative(mNativeHandle); 21769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 21969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 22069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onSaveInstanceState(Bundle outState) { 22169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onSaveInstanceState(outState); 22208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn byte[] state = onSaveInstanceStateNative(mNativeHandle); 22308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != null) { 22408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn outState.putByteArray(KEY_NATIVE_SAVED_STATE, state); 22508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 22669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 22769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 22869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 22969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onStart() { 23069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onStart(); 23169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onStartNative(mNativeHandle); 23269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 23369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 23469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 23569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onStop() { 23669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onStop(); 23769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onStopNative(mNativeHandle); 23869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 23969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 24069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 24108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 24208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn super.onConfigurationChanged(newConfig); 24308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (!mDestroyed) { 24408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn onConfigurationChangedNative(mNativeHandle); 24508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 24608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 24708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 24808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn @Override 24974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void onLowMemory() { 25074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn super.onLowMemory(); 2513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn onLowMemoryNative(mNativeHandle); 2533c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 25474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 25574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 25674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn @Override 25769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 25869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onWindowFocusChanged(hasFocus); 2593c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2603c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn onWindowFocusChangedNative(mNativeHandle, hasFocus); 2613c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 26269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 26374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 26474323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceCreated(SurfaceHolder holder) { 2653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2663c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = holder; 26754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceCreatedNative(mNativeHandle, holder.getSurface()); 2683c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 26974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 27074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 27174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 2723c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2733c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = holder; 27454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceChangedNative(mNativeHandle, holder.getSurface(), format, width, height); 2753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 27674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 27774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 278d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public void surfaceRedrawNeeded(SurfaceHolder holder) { 279d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (!mDestroyed) { 280d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mCurSurfaceHolder = holder; 281d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn onSurfaceRedrawNeededNative(mNativeHandle, holder.getSurface()); 282d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 283d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 284d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 28574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceDestroyed(SurfaceHolder holder) { 2863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = null; 2873c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 28854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceDestroyedNative(mNativeHandle); 2893c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 29074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 291a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 2921e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn public void onInputQueueCreated(InputQueue queue) { 2933c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurInputQueue = queue; 295a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueCreatedNative(mNativeHandle, queue.getNativePtr()); 2963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 297a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 298a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 2991e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn public void onInputQueueDestroyed(InputQueue queue) { 3003c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 301a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueDestroyedNative(mNativeHandle, queue.getNativePtr()); 302a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright mCurInputQueue = null; 3033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 3053c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 306d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public void onGlobalLayout() { 307d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.getLocationInWindow(mLocation); 308d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int w = mNativeContentView.getWidth(); 309d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int h = mNativeContentView.getHeight(); 310d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mLocation[0] != mLastContentX || mLocation[1] != mLastContentY 311d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || w != mLastContentWidth || h != mLastContentHeight) { 312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentX = mLocation[0]; 313d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentY = mLocation[1]; 314d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentWidth = w; 315d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentHeight = h; 316d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (!mDestroyed) { 317d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn onContentRectChangedNative(mNativeHandle, mLastContentX, 318d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentY, mLastContentWidth, mLastContentHeight); 319d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 320d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 321d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 322d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 32354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn void setWindowFlags(int flags, int mask) { 32454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFlags(flags, mask); 32554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 32654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 32754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn void setWindowFormat(int format) { 32854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFormat(format); 32954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 330d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 331d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void showIme(int mode) { 332d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM.showSoftInput(mNativeContentView, mode); 333d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 334d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 335d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void hideIme(int mode) { 336d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM.hideSoftInputFromWindow(mNativeContentView.getWindowToken(), mode); 337d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 33869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 339