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 38048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanovimport dalvik.system.BaseDexClassLoader; 39048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov 4069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackbornimport java.io.File; 4169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 4269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn/** 4369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn * Convenience for implementing an activity that will be implemented 4408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * purely in native code. That is, a game (or game-like thing). There 4508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * is no need to derive from this class; you can simply declare it in your 4608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * manifest, and use the NDK APIs from there. 4708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * 483edfa8f67bc428435f96b050bf3a0b00b6be4d20Elliott Hughes * <p>A <a href="https://github.com/googlesamples/android-ndk/tree/master/native-activity">sample 493edfa8f67bc428435f96b050bf3a0b00b6be4d20Elliott Hughes * native activity</a> is available in the NDK samples. 5069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn */ 51d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornpublic class NativeActivity extends Activity implements SurfaceHolder.Callback2, 52d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn InputQueue.Callback, OnGlobalLayoutListener { 53e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn /** 54e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * Optional meta-that can be in the manifest for this component, specifying 55e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * the name of the native shared library to load. If not specified, 56e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * "main" is used. 57e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn */ 5869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn public static final String META_DATA_LIB_NAME = "android.app.lib_name"; 5969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 60e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn /** 61e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * Optional meta-that can be in the manifest for this component, specifying 62e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * the name of the main entry point for this native activity in the 63e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * {@link #META_DATA_LIB_NAME} native code. If not specified, 64e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn * "ANativeActivity_onCreate" is used. 65e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn */ 66e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn public static final String META_DATA_FUNC_NAME = "android.app.func_name"; 67e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn 68e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn private static final String KEY_NATIVE_SAVED_STATE = "android:native_state"; 6908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 70d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private NativeContentView mNativeContentView; 71d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private InputMethodManager mIMM; 72d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 7358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private long mNativeHandle; 7469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn private InputQueue mCurInputQueue; 763c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn private SurfaceHolder mCurSurfaceHolder; 773c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn final int[] mLocation = new int[2]; 79d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentX; 80d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentY; 81d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentWidth; 82d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mLastContentHeight; 83d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 84d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private boolean mDispatchingUnhandledKey; 85d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn private boolean mDestroyed; 873c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 8858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native long loadNativeCode(String path, String funcname, MessageQueue queue, 89805fd7ee0e5dc2939e85c84f78d9890a51982bc0Dianne Hackborn String internalDataPath, String obbPath, String externalDataPath, int sdkVersion, 90a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry Ivanov AssetManager assetMgr, byte[] savedState, ClassLoader classLoader, String libraryPath); 91048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov private native String getDlError(); 9258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void unloadNativeCode(long handle); 9358b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onStartNative(long handle); 9458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onResumeNative(long handle); 9558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native byte[] onSaveInstanceStateNative(long handle); 9658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onPauseNative(long handle); 9758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onStopNative(long handle); 9858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onConfigurationChangedNative(long handle); 9958b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onLowMemoryNative(long handle); 10058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onWindowFocusChangedNative(long handle, boolean focused); 10158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceCreatedNative(long handle, Surface surface); 10258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceChangedNative(long handle, Surface surface, 10374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn int format, int width, int height); 10458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceRedrawNeededNative(long handle, Surface surface); 10558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onSurfaceDestroyedNative(long handle); 10658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onInputQueueCreatedNative(long handle, long queuePtr); 10758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onInputQueueDestroyedNative(long handle, long queuePtr); 10858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat private native void onContentRectChangedNative(long handle, int x, int y, int w, int h); 109d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 110d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn static class NativeContentView extends View { 111d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn NativeActivity mActivity; 112d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 113d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public NativeContentView(Context context) { 114d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn super(context); 115d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 116d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 117d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public NativeContentView(Context context, AttributeSet attrs) { 118d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn super(context, attrs); 119d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 120d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 1212c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 12269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 12369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onCreate(Bundle savedInstanceState) { 12469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String libname = "main"; 125e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn String funcname = "ANativeActivity_onCreate"; 12669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn ActivityInfo ai; 127777ef95ebf18c61ff09e7567a06058d351c530caYohei Yukawa 128777ef95ebf18c61ff09e7567a06058d351c530caYohei Yukawa mIMM = getSystemService(InputMethodManager.class); 129d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 13074323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn getWindow().takeSurface(this); 1311e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn getWindow().takeInputQueue(this); 13254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFormat(PixelFormat.RGB_565); 133d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn getWindow().setSoftInputMode( 134d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED 135d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 136d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 137d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView = new NativeContentView(this); 138d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.mActivity = this; 139d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn setContentView(mNativeContentView); 140d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.requestFocus(); 141d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.getViewTreeObserver().addOnGlobalLayoutListener(this); 14274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 14369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn try { 14469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn ai = getPackageManager().getActivityInfo( 14569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn getIntent().getComponent(), PackageManager.GET_META_DATA); 14669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (ai.metaData != null) { 14769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn String ln = ai.metaData.getString(META_DATA_LIB_NAME); 14869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (ln != null) libname = ln; 149e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn ln = ai.metaData.getString(META_DATA_FUNC_NAME); 150e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn if (ln != null) funcname = ln; 15169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 15269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 15369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn throw new RuntimeException("Error getting activity info", e); 15469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 155048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov 156048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov BaseDexClassLoader classLoader = (BaseDexClassLoader) getClassLoader(); 157048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov String path = classLoader.findLibrary(libname); 158048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov 15969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (path == null) { 160b9c9026bdd0076014aeca62b088053d8fbce2326Dimitry Ivanov throw new IllegalArgumentException("Unable to find native library " + libname + 161b9c9026bdd0076014aeca62b088053d8fbce2326Dimitry Ivanov " using classloader: " + classLoader.toString()); 16269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 16369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 16408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn byte[] nativeSavedState = savedInstanceState != null 16508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn ? savedInstanceState.getByteArray(KEY_NATIVE_SAVED_STATE) : null; 16608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 167e21d91c694e828e6285cc50e79b2a6be6e8c692bDianne Hackborn mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(), 168e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey getAbsolutePath(getFilesDir()), getAbsolutePath(getObbDir()), 169e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey getAbsolutePath(getExternalFilesDir(null)), 170048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov Build.VERSION.SDK_INT, getAssets(), nativeSavedState, 171a55c7f15a3c386ec643f21eeb2f4e9fd7b03ba70Dimitry Ivanov classLoader, classLoader.getLdLibraryPath()); 172e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey 17369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn if (mNativeHandle == 0) { 174048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov throw new UnsatisfiedLinkError( 175048a0db7b512326d0fae0efa7fef7ea2d17a3dd8Dmitriy Ivanov "Unable to load native library \"" + path + "\": " + getDlError()); 17669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 17769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onCreate(savedInstanceState); 17869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 17969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 180e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey private static String getAbsolutePath(File file) { 181e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey return (file != null) ? file.getAbsolutePath() : null; 182e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey } 183e0475c828773aae42bf6bf54422df996d6b0fcefJeff Sharkey 18469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 18569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onDestroy() { 1863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mDestroyed = true; 1873c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mCurSurfaceHolder != null) { 18854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceDestroyedNative(mNativeHandle); 1893c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = null; 1903c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 1913c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (mCurInputQueue != null) { 192a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueDestroyedNative(mNativeHandle, mCurInputQueue.getNativePtr()); 1933c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurInputQueue = null; 1943c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 19569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn unloadNativeCode(mNativeHandle); 19669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onDestroy(); 19769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 19869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 19969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 20069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onPause() { 20169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onPause(); 20269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onPauseNative(mNativeHandle); 20369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 20469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 20569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 20669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onResume() { 20769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onResume(); 20869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onResumeNative(mNativeHandle); 20969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 21169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 21269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onSaveInstanceState(Bundle outState) { 21369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onSaveInstanceState(outState); 21408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn byte[] state = onSaveInstanceStateNative(mNativeHandle); 21508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (state != null) { 21608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn outState.putByteArray(KEY_NATIVE_SAVED_STATE, state); 21708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 21869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 21969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 22069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 22169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onStart() { 22269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onStart(); 22369969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onStartNative(mNativeHandle); 22469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 22569969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 22669969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 22769969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn protected void onStop() { 22869969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onStop(); 22969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn onStopNative(mNativeHandle); 23069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 23169969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn 23269969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn @Override 23308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn public void onConfigurationChanged(Configuration newConfig) { 23408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn super.onConfigurationChanged(newConfig); 23508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn if (!mDestroyed) { 23608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn onConfigurationChangedNative(mNativeHandle); 23708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 23808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn } 23908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 24008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn @Override 24174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void onLowMemory() { 24274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn super.onLowMemory(); 2433c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2443c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn onLowMemoryNative(mNativeHandle); 2453c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 24674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 24774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 24874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn @Override 24969969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 25069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn super.onWindowFocusChanged(hasFocus); 2513c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2523c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn onWindowFocusChangedNative(mNativeHandle, hasFocus); 2533c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 25469969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn } 25574323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 25674323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceCreated(SurfaceHolder holder) { 2573c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2583c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = holder; 25954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceCreatedNative(mNativeHandle, holder.getSurface()); 2603c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 26174323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 26274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 26374323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 2643c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2653c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = holder; 26654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceChangedNative(mNativeHandle, holder.getSurface(), format, width, height); 2673c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 26874323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 26974323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn 270d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public void surfaceRedrawNeeded(SurfaceHolder holder) { 271d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (!mDestroyed) { 272d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mCurSurfaceHolder = holder; 273d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn onSurfaceRedrawNeededNative(mNativeHandle, holder.getSurface()); 274d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 275d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 276d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 27774323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn public void surfaceDestroyed(SurfaceHolder holder) { 2783c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurSurfaceHolder = null; 2793c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 28054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn onSurfaceDestroyedNative(mNativeHandle); 2813c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 28274323fd1ab8eb11beea286d5c213c63e4b803141Dianne Hackborn } 283a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 2841e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn public void onInputQueueCreated(InputQueue queue) { 2853c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 2863c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn mCurInputQueue = queue; 287a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueCreatedNative(mNativeHandle, queue.getNativePtr()); 2883c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 289a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn } 290a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn 2911e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn public void onInputQueueDestroyed(InputQueue queue) { 2923c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn if (!mDestroyed) { 293a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright onInputQueueDestroyedNative(mNativeHandle, queue.getNativePtr()); 294a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright mCurInputQueue = null; 2953c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2963c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn } 2973c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn 298d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn public void onGlobalLayout() { 299d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mNativeContentView.getLocationInWindow(mLocation); 300d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int w = mNativeContentView.getWidth(); 301d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int h = mNativeContentView.getHeight(); 302d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (mLocation[0] != mLastContentX || mLocation[1] != mLastContentY 303d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || w != mLastContentWidth || h != mLastContentHeight) { 304d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentX = mLocation[0]; 305d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentY = mLocation[1]; 306d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentWidth = w; 307d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentHeight = h; 308d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (!mDestroyed) { 309d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn onContentRectChangedNative(mNativeHandle, mLastContentX, 310d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mLastContentY, mLastContentWidth, mLastContentHeight); 311d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 312d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 313d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 314d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 31554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn void setWindowFlags(int flags, int mask) { 31654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFlags(flags, mask); 31754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 31854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 31954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn void setWindowFormat(int format) { 32054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn getWindow().setFormat(format); 32154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn } 322d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 323d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void showIme(int mode) { 324d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM.showSoftInput(mNativeContentView, mode); 325d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 326d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 327d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void hideIme(int mode) { 328d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mIMM.hideSoftInputFromWindow(mNativeContentView.getWindowToken(), mode); 329d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 33069969e48f2bca9339662dddfacff0bbf6374ed7fDianne Hackborn} 331