From 08d5b8fad8d46ccb64db2fdcb4d66972ec87bf48 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Wed, 4 Aug 2010 11:12:40 -0700 Subject: [PATCH] More native work. Implement save/restore of state, and add native APIs for configuration information. Change-Id: I2a3ddc2ba605db58d7c8b2b31b9215fb323f90b5 --- api/current.xml | 11 + core/java/android/app/NativeActivity.java | 41 ++- core/java/android/content/res/Resources.java | 2 +- .../internal/app/PlatLogoActivity.java | 34 ++ core/jni/Android.mk | 3 +- core/jni/AndroidRuntime.cpp | 2 + core/jni/android_app_NativeActivity.cpp | 50 ++- .../jni/android_content_res_Configuration.cpp | 118 +++++++ core/res/AndroidManifest.xml | 3 + core/res/res/drawable-nodpi/platlogo.jpg | Bin 0 -> 102076 bytes .../android_content_res_Configuration.h | 36 ++ include/utils/AssetManager.h | 2 + include/utils/ResourceTypes.h | 119 +++---- libs/utils/AssetManager.cpp | 6 + native/android/Android.mk | 1 + native/android/asset_manager.cpp | 2 +- native/android/configuration.cpp | 202 +++++++++++ native/copy-to-ndk.sh | 55 +++ native/include/android/asset_manager.h | 10 - native/include/android/asset_manager_jni.h | 40 +++ native/include/android/configuration.h | 319 ++++++++++++++++++ native/include/android/native_activity.h | 10 +- native/include/android/native_window.h | 11 + 23 files changed, 995 insertions(+), 82 deletions(-) create mode 100644 core/java/com/android/internal/app/PlatLogoActivity.java create mode 100644 core/jni/android_content_res_Configuration.cpp create mode 100644 core/res/res/drawable-nodpi/platlogo.jpg create mode 100644 include/android_runtime/android_content_res_Configuration.h create mode 100644 native/android/configuration.cpp create mode 100644 native/copy-to-ndk.sh create mode 100644 native/include/android/asset_manager_jni.h create mode 100644 native/include/android/configuration.h diff --git a/api/current.xml b/api/current.xml index 841aa2166abbb..3d35388614fc0 100644 --- a/api/current.xml +++ b/api/current.xml @@ -26460,6 +26460,17 @@ + + A typical manifest would look like: + * + * {@sample development/ndk/platforms/android-9/samples/native-activity/AndroidManifest.xml + * manifest} + * + *

A very simple example of native code that is run by NativeActivity + * follows. This reads input events from the user and uses OpenGLES to + * draw into the native activity's window. + * + * {@sample development/ndk/platforms/android-9/samples/native-activity/jni/main.c all} */ public class NativeActivity extends Activity implements SurfaceHolder.Callback2, InputQueue.Callback, OnGlobalLayoutListener { public static final String META_DATA_LIB_NAME = "android.app.lib_name"; + public static final String KEY_NATIVE_SAVED_STATE = "android:native_state"; + private NativeContentView mNativeContentView; private InputMethodManager mIMM; private InputMethodCallback mInputMethodCallback; @@ -59,14 +75,15 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2, private native int loadNativeCode(String path, MessageQueue queue, String internalDataPath, String externalDataPath, int sdkVersion, - AssetManager assetMgr); + AssetManager assetMgr, byte[] savedState); private native void unloadNativeCode(int handle); private native void onStartNative(int handle); private native void onResumeNative(int handle); - private native void onSaveInstanceStateNative(int handle); + private native byte[] onSaveInstanceStateNative(int handle); private native void onPauseNative(int handle); private native void onStopNative(int handle); + private native void onConfigurationChangedNative(int handle); private native void onLowMemoryNative(int handle); private native void onWindowFocusChangedNative(int handle, boolean focused); private native void onSurfaceCreatedNative(int handle, Surface surface); @@ -165,10 +182,13 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2, throw new IllegalArgumentException("Unable to find native library: " + libname); } + byte[] nativeSavedState = savedInstanceState != null + ? savedInstanceState.getByteArray(KEY_NATIVE_SAVED_STATE) : null; + mNativeHandle = loadNativeCode(path, Looper.myQueue(), getFilesDir().toString(), Environment.getExternalStorageAppFilesDirectory(ai.packageName).toString(), - Build.VERSION.SDK_INT, getAssets()); + Build.VERSION.SDK_INT, getAssets(), nativeSavedState); if (mNativeHandle == 0) { throw new IllegalArgumentException("Unable to load native library: " + path); @@ -206,7 +226,10 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2, @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - onSaveInstanceStateNative(mNativeHandle); + byte[] state = onSaveInstanceStateNative(mNativeHandle); + if (state != null) { + outState.putByteArray(KEY_NATIVE_SAVED_STATE, state); + } } @Override @@ -221,6 +244,14 @@ public class NativeActivity extends Activity implements SurfaceHolder.Callback2, onStopNative(mNativeHandle); } + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (!mDestroyed) { + onConfigurationChangedNative(mNativeHandle); + } + } + @Override public void onLowMemory() { super.onLowMemory(); diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 0608cc02bf3dd..9bb3b75124f3d 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -1288,7 +1288,7 @@ public class Resources { height = mMetrics.widthPixels; } int keyboardHidden = mConfiguration.keyboardHidden; - if (keyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO + if (keyboardHidden == Configuration.KEYBOARDHIDDEN_NO && mConfiguration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { keyboardHidden = Configuration.KEYBOARDHIDDEN_SOFT; diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java new file mode 100644 index 0000000000000..ce5959d1ea915 --- /dev/null +++ b/core/java/com/android/internal/app/PlatLogoActivity.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.app; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.ImageView; + +public class PlatLogoActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ImageView content = new ImageView(this); + content.setImageResource(com.android.internal.R.drawable.platlogo); + content.setScaleType(ImageView.ScaleType.FIT_CENTER); + + setContentView(content); + } +} diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 5c37c7c52ab74..efdc3994ff77d 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -135,7 +135,8 @@ LOCAL_SRC_FILES:= \ android_backup_BackupDataOutput.cpp \ android_backup_FileBackupHelperBase.cpp \ android_backup_BackupHelperDispatcher.cpp \ - android_content_res_ObbScanner.cpp + android_content_res_ObbScanner.cpp \ + android_content_res_Configuration.cpp LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 7fe56a765e0ac..62ca2efe3b8b2 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -167,6 +167,7 @@ extern int register_android_view_InputQueue(JNIEnv* env); extern int register_android_view_KeyEvent(JNIEnv* env); extern int register_android_view_MotionEvent(JNIEnv* env); extern int register_android_content_res_ObbScanner(JNIEnv* env); +extern int register_android_content_res_Configuration(JNIEnv* env); static AndroidRuntime* gCurRuntime = NULL; @@ -1340,6 +1341,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_view_MotionEvent), REG_JNI(register_android_content_res_ObbScanner), + REG_JNI(register_android_content_res_Configuration), }; /* diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp index 1feb3b3ecda94..0932473aa859c 100644 --- a/core/jni/android_app_NativeActivity.cpp +++ b/core/jni/android_app_NativeActivity.cpp @@ -600,7 +600,7 @@ static bool mainWorkCallback(int fd, int events, void* data) { static jint loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQueue, jstring internalDataDir, jstring externalDataDir, int sdkVersion, - jobject jAssetMgr) + jobject jAssetMgr, jbyteArray savedState) { LOG_TRACE("loadNativeCode_native"); @@ -666,7 +666,18 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jobject messageQ code->assetManager = assetManagerForJavaObject(env, jAssetMgr); - code->createActivityFunc(code, NULL, 0); + jbyte* rawSavedState = NULL; + jsize rawSavedSize = 0; + if (savedState != NULL) { + rawSavedState = env->GetByteArrayElements(savedState, NULL); + rawSavedSize = env->GetArrayLength(savedState); + } + + code->createActivityFunc(code, rawSavedState, rawSavedSize); + + if (rawSavedState != NULL) { + env->ReleaseByteArrayElements(savedState, rawSavedState, 0); + } } return (jint)code; @@ -706,17 +717,31 @@ onResume_native(JNIEnv* env, jobject clazz, jint handle) } } -static void +static jbyteArray onSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle) { LOG_TRACE("onSaveInstanceState_native"); + + jbyteArray array = NULL; + if (handle != 0) { NativeCode* code = (NativeCode*)handle; if (code->callbacks.onSaveInstanceState != NULL) { size_t len = 0; - code->callbacks.onSaveInstanceState(code, &len); + jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len); + if (len > 0) { + array = env->NewByteArray(len); + if (array != NULL) { + env->SetByteArrayRegion(array, 0, len, state); + } + } + if (state != NULL) { + free(state); + } } } + + return array; } static void @@ -743,6 +768,18 @@ onStop_native(JNIEnv* env, jobject clazz, jint handle) } } +static void +onConfigurationChanged_native(JNIEnv* env, jobject clazz, jint handle) +{ + LOG_TRACE("onConfigurationChanged_native"); + if (handle != 0) { + NativeCode* code = (NativeCode*)handle; + if (code->callbacks.onConfigurationChanged != NULL) { + code->callbacks.onConfigurationChanged(code); + } + } +} + static void onLowMemory_native(JNIEnv* env, jobject clazz, jint handle) { @@ -934,14 +971,15 @@ finishPreDispatchKeyEvent_native(JNIEnv* env, jobject clazz, jint handle, } static const JNINativeMethod g_methods[] = { - { "loadNativeCode", "(Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;)I", + { "loadNativeCode", "(Ljava/lang/String;Landroid/os/MessageQueue;Ljava/lang/String;Ljava/lang/String;ILandroid/content/res/AssetManager;[B)I", (void*)loadNativeCode_native }, { "unloadNativeCode", "(I)V", (void*)unloadNativeCode_native }, { "onStartNative", "(I)V", (void*)onStart_native }, { "onResumeNative", "(I)V", (void*)onResume_native }, - { "onSaveInstanceStateNative", "(I)V", (void*)onSaveInstanceState_native }, + { "onSaveInstanceStateNative", "(I)[B", (void*)onSaveInstanceState_native }, { "onPauseNative", "(I)V", (void*)onPause_native }, { "onStopNative", "(I)V", (void*)onStop_native }, + { "onConfigurationChangedNative", "(I)V", (void*)onConfigurationChanged_native }, { "onLowMemoryNative", "(I)V", (void*)onLowMemory_native }, { "onWindowFocusChangedNative", "(IZ)V", (void*)onWindowFocusChanged_native }, { "onSurfaceCreatedNative", "(ILandroid/view/Surface;)V", (void*)onSurfaceCreated_native }, diff --git a/core/jni/android_content_res_Configuration.cpp b/core/jni/android_content_res_Configuration.cpp new file mode 100644 index 0000000000000..28a43ab09f76b --- /dev/null +++ b/core/jni/android_content_res_Configuration.cpp @@ -0,0 +1,118 @@ +/* + * Copyright 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "Configuration" + +#include +#include "utils/misc.h" + +#include "jni.h" +#include +#include "android_runtime/AndroidRuntime.h" + +namespace android { + +static struct { + jclass clazz; + + jfieldID mcc; + jfieldID mnc; + jfieldID locale; + jfieldID screenLayout; + jfieldID touchscreen; + jfieldID keyboard; + jfieldID keyboardHidden; + jfieldID hardKeyboardHidden; + jfieldID navigation; + jfieldID navigationHidden; + jfieldID orientation; + jfieldID uiMode; +} gConfigurationClassInfo; + +void android_Configuration_getFromJava( + JNIEnv* env, jobject clazz, struct AConfiguration* out) { + out->mcc = env->GetIntField(clazz, gConfigurationClassInfo.mcc); + out->mnc = env->GetIntField(clazz, gConfigurationClassInfo.mnc); + out->screenLayout = env->GetIntField(clazz, gConfigurationClassInfo.screenLayout); + out->touchscreen = env->GetIntField(clazz, gConfigurationClassInfo.touchscreen); + out->keyboard = env->GetIntField(clazz, gConfigurationClassInfo.keyboard); + out->navigation = env->GetIntField(clazz, gConfigurationClassInfo.navigation); + + out->inputFlags = env->GetIntField(clazz, gConfigurationClassInfo.keyboardHidden); + int hardKeyboardHidden = env->GetIntField(clazz, gConfigurationClassInfo.hardKeyboardHidden); + if (out->inputFlags == ACONFIGURATION_KEYSHIDDEN_NO + && hardKeyboardHidden == 2) { + out->inputFlags = ACONFIGURATION_KEYSHIDDEN_SOFT; + } + out->inputFlags |= env->GetIntField(clazz, gConfigurationClassInfo.navigationHidden) + << ResTable_config::SHIFT_NAVHIDDEN; + + out->orientation = env->GetIntField(clazz, gConfigurationClassInfo.orientation); + out->uiMode = env->GetIntField(clazz, gConfigurationClassInfo.uiMode); +} + +/* + * JNI registration. + */ +static JNINativeMethod gMethods[] = { + /* name, signature, funcPtr */ + //{ "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)Z", + // (void*) android_content_res_ObbScanner_getObbInfo }, +}; + +#define FIND_CLASS(var, className) \ + var = env->FindClass(className); \ + LOG_FATAL_IF(! var, "Unable to find class " className); \ + var = jclass(env->NewGlobalRef(var)); + +#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ + var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ + LOG_FATAL_IF(! var, "Unable to find field " fieldName); + +int register_android_content_res_Configuration(JNIEnv* env) +{ + FIND_CLASS(gConfigurationClassInfo.clazz, "android/content/res/Configuration"); + + GET_FIELD_ID(gConfigurationClassInfo.mcc, gConfigurationClassInfo.clazz, + "mcc", "I"); + GET_FIELD_ID(gConfigurationClassInfo.mnc, gConfigurationClassInfo.clazz, + "mnc", "I"); + GET_FIELD_ID(gConfigurationClassInfo.locale, gConfigurationClassInfo.clazz, + "locale", "Ljava/util/Locale;"); + GET_FIELD_ID(gConfigurationClassInfo.screenLayout, gConfigurationClassInfo.clazz, + "screenLayout", "I"); + GET_FIELD_ID(gConfigurationClassInfo.touchscreen, gConfigurationClassInfo.clazz, + "touchscreen", "I"); + GET_FIELD_ID(gConfigurationClassInfo.keyboard, gConfigurationClassInfo.clazz, + "keyboard", "I"); + GET_FIELD_ID(gConfigurationClassInfo.keyboardHidden, gConfigurationClassInfo.clazz, + "keyboardHidden", "I"); + GET_FIELD_ID(gConfigurationClassInfo.hardKeyboardHidden, gConfigurationClassInfo.clazz, + "hardKeyboardHidden", "I"); + GET_FIELD_ID(gConfigurationClassInfo.navigation, gConfigurationClassInfo.clazz, + "navigation", "I"); + GET_FIELD_ID(gConfigurationClassInfo.navigationHidden, gConfigurationClassInfo.clazz, + "navigationHidden", "I"); + GET_FIELD_ID(gConfigurationClassInfo.orientation, gConfigurationClassInfo.clazz, + "orientation", "I"); + GET_FIELD_ID(gConfigurationClassInfo.uiMode, gConfigurationClassInfo.clazz, + "uiMode", "I"); + + return AndroidRuntime::registerNativeMethods(env, "android/content/res/Configuration", gMethods, + NELEM(gMethods)); +} + +}; // namespace android diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 82f822f0dc67c..19b30cc4e7a6e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1275,6 +1275,9 @@ android:finishOnCloseSystemDialogs="true" android:excludeFromRecents="true"> + + diff --git a/core/res/res/drawable-nodpi/platlogo.jpg b/core/res/res/drawable-nodpi/platlogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e7780c12b1a4a16619afb5449697a83062a1844 GIT binary patch literal 102076 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 literal 0 HcmV?d00001 diff --git a/include/android_runtime/android_content_res_Configuration.h b/include/android_runtime/android_content_res_Configuration.h new file mode 100644 index 0000000000000..2f5a98249cb7c --- /dev/null +++ b/include/android_runtime/android_content_res_Configuration.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ANDROID_CONTENT_RES_CONFIGURATION_H +#define _ANDROID_CONTENT_RES_CONFIGURATION_H + +#include +#include + +#include "jni.h" + +struct AConfiguration : android::ResTable_config { +}; + +namespace android { + +extern void android_Configuration_getFromJava( + JNIEnv* env, jobject clazz, struct AConfiguration* out); + +} // namespace android + + +#endif // _ANDROID_CONTENT_RES_CONFIGURATION_H diff --git a/include/utils/AssetManager.h b/include/utils/AssetManager.h index 97694ff0a997c..9e2bf37e8fa48 100644 --- a/include/utils/AssetManager.h +++ b/include/utils/AssetManager.h @@ -129,6 +129,8 @@ public: */ void setConfiguration(const ResTable_config& config, const char* locale = NULL); + void getConfiguration(ResTable_config* outConfig) const; + typedef Asset::AccessMode AccessMode; // typing shortcut /* diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h index c7d9ff1dd6789..da86da41006d0 100644 --- a/include/utils/ResourceTypes.h +++ b/include/utils/ResourceTypes.h @@ -31,6 +31,8 @@ #include #include +#include + namespace android { /** ******************************************************************** @@ -822,25 +824,25 @@ struct ResTable_config }; enum { - ORIENTATION_ANY = 0x0000, - ORIENTATION_PORT = 0x0001, - ORIENTATION_LAND = 0x0002, - ORIENTATION_SQUARE = 0x0003, + ORIENTATION_ANY = ACONFIGURATION_ORIENTATION_ANY, + ORIENTATION_PORT = ACONFIGURATION_ORIENTATION_PORT, + ORIENTATION_LAND = ACONFIGURATION_ORIENTATION_LAND, + ORIENTATION_SQUARE = ACONFIGURATION_ORIENTATION_SQUARE, }; enum { - TOUCHSCREEN_ANY = 0x0000, - TOUCHSCREEN_NOTOUCH = 0x0001, - TOUCHSCREEN_STYLUS = 0x0002, - TOUCHSCREEN_FINGER = 0x0003, + TOUCHSCREEN_ANY = ACONFIGURATION_TOUCHSCREEN_ANY, + TOUCHSCREEN_NOTOUCH = ACONFIGURATION_TOUCHSCREEN_NOTOUCH, + TOUCHSCREEN_STYLUS = ACONFIGURATION_TOUCHSCREEN_STYLUS, + TOUCHSCREEN_FINGER = ACONFIGURATION_TOUCHSCREEN_FINGER, }; enum { - DENSITY_DEFAULT = 0, - DENSITY_LOW = 120, - DENSITY_MEDIUM = 160, - DENSITY_HIGH = 240, - DENSITY_NONE = 0xffff + DENSITY_DEFAULT = ACONFIGURATION_DENSITY_DEFAULT, + DENSITY_LOW = ACONFIGURATION_DENSITY_LOW, + DENSITY_MEDIUM = ACONFIGURATION_DENSITY_MEDIUM, + DENSITY_HIGH = ACONFIGURATION_DENSITY_HIGH, + DENSITY_NONE = ACONFIGURATION_DENSITY_NONE }; union { @@ -853,33 +855,34 @@ struct ResTable_config }; enum { - KEYBOARD_ANY = 0x0000, - KEYBOARD_NOKEYS = 0x0001, - KEYBOARD_QWERTY = 0x0002, - KEYBOARD_12KEY = 0x0003, + KEYBOARD_ANY = ACONFIGURATION_KEYBOARD_ANY, + KEYBOARD_NOKEYS = ACONFIGURATION_KEYBOARD_NOKEYS, + KEYBOARD_QWERTY = ACONFIGURATION_KEYBOARD_QWERTY, + KEYBOARD_12KEY = ACONFIGURATION_KEYBOARD_12KEY, }; enum { - NAVIGATION_ANY = 0x0000, - NAVIGATION_NONAV = 0x0001, - NAVIGATION_DPAD = 0x0002, - NAVIGATION_TRACKBALL = 0x0003, - NAVIGATION_WHEEL = 0x0004, + NAVIGATION_ANY = ACONFIGURATION_NAVIGATION_ANY, + NAVIGATION_NONAV = ACONFIGURATION_NAVIGATION_NONAV, + NAVIGATION_DPAD = ACONFIGURATION_NAVIGATION_DPAD, + NAVIGATION_TRACKBALL = ACONFIGURATION_NAVIGATION_TRACKBALL, + NAVIGATION_WHEEL = ACONFIGURATION_NAVIGATION_WHEEL, }; enum { MASK_KEYSHIDDEN = 0x0003, - KEYSHIDDEN_ANY = 0x0000, - KEYSHIDDEN_NO = 0x0001, - KEYSHIDDEN_YES = 0x0002, - KEYSHIDDEN_SOFT = 0x0003, + KEYSHIDDEN_ANY = ACONFIGURATION_KEYSHIDDEN_ANY, + KEYSHIDDEN_NO = ACONFIGURATION_KEYSHIDDEN_NO, + KEYSHIDDEN_YES = ACONFIGURATION_KEYSHIDDEN_YES, + KEYSHIDDEN_SOFT = ACONFIGURATION_KEYSHIDDEN_SOFT, }; enum { MASK_NAVHIDDEN = 0x000c, - NAVHIDDEN_ANY = 0x0000, - NAVHIDDEN_NO = 0x0004, - NAVHIDDEN_YES = 0x0008, + SHIFT_NAVHIDDEN = 2, + NAVHIDDEN_ANY = ACONFIGURATION_NAVHIDDEN_ANY << SHIFT_NAVHIDDEN, + NAVHIDDEN_NO = ACONFIGURATION_NAVHIDDEN_NO << SHIFT_NAVHIDDEN, + NAVHIDDEN_YES = ACONFIGURATION_NAVHIDDEN_YES << SHIFT_NAVHIDDEN, }; union { @@ -929,32 +932,34 @@ struct ResTable_config enum { // screenLayout bits for screen size class. MASK_SCREENSIZE = 0x0f, - SCREENSIZE_ANY = 0x00, - SCREENSIZE_SMALL = 0x01, - SCREENSIZE_NORMAL = 0x02, - SCREENSIZE_LARGE = 0x03, - SCREENSIZE_XLARGE = 0x04, + SCREENSIZE_ANY = ACONFIGURATION_SCREENSIZE_ANY, + SCREENSIZE_SMALL = ACONFIGURATION_SCREENSIZE_SMALL, + SCREENSIZE_NORMAL = ACONFIGURATION_SCREENSIZE_NORMAL, + SCREENSIZE_LARGE = ACONFIGURATION_SCREENSIZE_LARGE, + SCREENSIZE_XLARGE = ACONFIGURATION_SCREENSIZE_XLARGE, // screenLayout bits for wide/long screen variation. MASK_SCREENLONG = 0x30, - SCREENLONG_ANY = 0x00, - SCREENLONG_NO = 0x10, - SCREENLONG_YES = 0x20, + SHIFT_SCREENLONG = 4, + SCREENLONG_ANY = ACONFIGURATION_SCREENLONG_ANY << SHIFT_SCREENLONG, + SCREENLONG_NO = ACONFIGURATION_SCREENLONG_NO << SHIFT_SCREENLONG, + SCREENLONG_YES = ACONFIGURATION_SCREENLONG_YES << SHIFT_SCREENLONG, }; enum { // uiMode bits for the mode type. MASK_UI_MODE_TYPE = 0x0f, - UI_MODE_TYPE_ANY = 0x00, - UI_MODE_TYPE_NORMAL = 0x01, - UI_MODE_TYPE_DESK = 0x02, - UI_MODE_TYPE_CAR = 0x03, + UI_MODE_TYPE_ANY = ACONFIGURATION_UI_MODE_TYPE_ANY, + UI_MODE_TYPE_NORMAL = ACONFIGURATION_UI_MODE_TYPE_NORMAL, + UI_MODE_TYPE_DESK = ACONFIGURATION_UI_MODE_TYPE_DESK, + UI_MODE_TYPE_CAR = ACONFIGURATION_UI_MODE_TYPE_CAR, // uiMode bits for the night switch. MASK_UI_MODE_NIGHT = 0x30, - UI_MODE_NIGHT_ANY = 0x00, - UI_MODE_NIGHT_NO = 0x10, - UI_MODE_NIGHT_YES = 0x20, + SHIFT_UI_MODE_NIGHT = 4, + UI_MODE_NIGHT_ANY = ACONFIGURATION_UI_MODE_NIGHT_ANY << SHIFT_UI_MODE_NIGHT, + UI_MODE_NIGHT_NO = ACONFIGURATION_UI_MODE_NIGHT_NO << SHIFT_UI_MODE_NIGHT, + UI_MODE_NIGHT_YES = ACONFIGURATION_UI_MODE_NIGHT_YES << SHIFT_UI_MODE_NIGHT, }; union { @@ -1023,19 +1028,19 @@ struct ResTable_config // match the corresponding ones in android.content.pm.ActivityInfo and // attrs_manifest.xml. enum { - CONFIG_MCC = 0x0001, - CONFIG_MNC = 0x0002, - CONFIG_LOCALE = 0x0004, - CONFIG_TOUCHSCREEN = 0x0008, - CONFIG_KEYBOARD = 0x0010, - CONFIG_KEYBOARD_HIDDEN = 0x0020, - CONFIG_NAVIGATION = 0x0040, - CONFIG_ORIENTATION = 0x0080, - CONFIG_DENSITY = 0x0100, - CONFIG_SCREEN_SIZE = 0x0200, - CONFIG_VERSION = 0x0400, - CONFIG_SCREEN_LAYOUT = 0x0800, - CONFIG_UI_MODE = 0x1000 + CONFIG_MCC = ACONFIGURATION_MCC, + CONFIG_MNC = ACONFIGURATION_MCC, + CONFIG_LOCALE = ACONFIGURATION_LOCALE, + CONFIG_TOUCHSCREEN = ACONFIGURATION_TOUCHSCREEN, + CONFIG_KEYBOARD = ACONFIGURATION_KEYBOARD, + CONFIG_KEYBOARD_HIDDEN = ACONFIGURATION_KEYBOARD_HIDDEN, + CONFIG_NAVIGATION = ACONFIGURATION_NAVIGATION, + CONFIG_ORIENTATION = ACONFIGURATION_ORIENTATION, + CONFIG_DENSITY = ACONFIGURATION_DENSITY, + CONFIG_SCREEN_SIZE = ACONFIGURATION_SCREEN_SIZE, + CONFIG_VERSION = ACONFIGURATION_VERSION, + CONFIG_SCREEN_LAYOUT = ACONFIGURATION_SCREEN_LAYOUT, + CONFIG_UI_MODE = ACONFIGURATION_UI_MODE }; // Compare two configuration, returning CONFIG_* flags set for each value diff --git a/libs/utils/AssetManager.cpp b/libs/utils/AssetManager.cpp index 60a0d82e255d9..e09e755861dcd 100644 --- a/libs/utils/AssetManager.cpp +++ b/libs/utils/AssetManager.cpp @@ -232,6 +232,12 @@ void AssetManager::setConfiguration(const ResTable_config& config, const char* l } } +void AssetManager::getConfiguration(ResTable_config* outConfig) const +{ + AutoMutex _l(mLock); + *outConfig = *mConfig; +} + /* * Open an asset. * diff --git a/native/android/Android.mk b/native/android/Android.mk index 950a1e9a7ad12..bd2b27af7f189 100644 --- a/native/android/Android.mk +++ b/native/android/Android.mk @@ -7,6 +7,7 @@ include $(CLEAR_VARS) # LOCAL_SRC_FILES:= \ asset_manager.cpp \ + configuration.cpp \ input.cpp \ looper.cpp \ native_activity.cpp \ diff --git a/native/android/asset_manager.cpp b/native/android/asset_manager.cpp index 36c381ef1b840..3f7c1b69af176 100644 --- a/native/android/asset_manager.cpp +++ b/native/android/asset_manager.cpp @@ -17,7 +17,7 @@ #define LOG_TAG "NAsset" #include -#include +#include #include #include #include diff --git a/native/android/configuration.cpp b/native/android/configuration.cpp new file mode 100644 index 0000000000000..d76164ff418eb --- /dev/null +++ b/native/android/configuration.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "Configuration" +#include + +#include + +#include + +using namespace android; + +AConfiguration* AConfiguration_new() { + AConfiguration* config = new AConfiguration; + memset(config, 0, sizeof(AConfiguration)); + return config; +} + +void AConfiguration_delete(AConfiguration* config) { + delete config; +} + +void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am) { + ((AssetManager*)am)->getConfiguration(out); +} + +void AConfiguration_copy(AConfiguration* dest, AConfiguration* src) { + *dest = *src; +} + +int32_t AConfiguration_getMcc(AConfiguration* config) { + return config->mcc; +} + +int32_t AConfiguration_getMnc(AConfiguration* config) { + return config->mnc; +} + +void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage) { + outLanguage[0] = config->language[0]; + outLanguage[1] = config->language[1]; +} + +void AConfiguration_getCountry(AConfiguration* config, char* outCountry) { + outCountry[0] = config->country[0]; + outCountry[1] = config->country[1]; +} + +int32_t AConfiguration_getOrientation(AConfiguration* config) { + return config->orientation; +} + +int32_t AConfiguration_getTouchscreen(AConfiguration* config) { + return config->touchscreen; +} + +int32_t AConfiguration_getDensity(AConfiguration* config) { + return config->density; +} + +int32_t AConfiguration_getKeyboard(AConfiguration* config) { + return config->keyboard; +} + +int32_t AConfiguration_getNavigation(AConfiguration* config) { + return config->navigation; +} + +int32_t AConfiguration_getKeysHidden(AConfiguration* config) { + return config->inputFlags&ResTable_config::MASK_KEYSHIDDEN; +} + +int32_t AConfiguration_getNavHidden(AConfiguration* config) { + return (config->inputFlags&ResTable_config::MASK_NAVHIDDEN) + >> ResTable_config::SHIFT_NAVHIDDEN; +} + +int32_t AConfiguration_getSdkVersion(AConfiguration* config) { + return config->sdkVersion; +} + +int32_t AConfiguration_getScreenSize(AConfiguration* config) { + return config->screenLayout&ResTable_config::MASK_SCREENSIZE; +} + +int32_t AConfiguration_getScreenLong(AConfiguration* config) { + return (config->screenLayout&ResTable_config::MASK_SCREENLONG) + >> ResTable_config::SHIFT_SCREENLONG; +} + +int32_t AConfiguration_getUiModeType(AConfiguration* config) { + return config->uiMode&ResTable_config::MASK_UI_MODE_TYPE; +} + +int32_t AConfiguration_getUiModeNight(AConfiguration* config) { + return (config->uiMode&ResTable_config::MASK_UI_MODE_NIGHT) + >> ResTable_config::SHIFT_UI_MODE_NIGHT; + +} + +// ---------------------------------------------------------------------- + +void AConfiguration_setMcc(AConfiguration* config, int32_t mcc) { + config->mcc = mcc; +} + +void AConfiguration_setMnc(AConfiguration* config, int32_t mnc) { + config->mnc = mnc; +} + +void AConfiguration_setLanguage(AConfiguration* config, const char* language) { + config->language[0] = language[0]; + config->language[1] = language[1]; +} + +void AConfiguration_setCountry(AConfiguration* config, const char* country) { + config->country[0] = country[0]; + config->country[1] = country[1]; +} + +void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation) { + config->orientation = orientation; +} + +void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen) { + config->touchscreen = touchscreen; +} + +void AConfiguration_setDensity(AConfiguration* config, int32_t density) { + config->density = density; +} + +void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard) { + config->keyboard = keyboard; +} + +void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation) { + config->navigation = navigation; +} + +void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden) { + config->inputFlags = (config->inputFlags&~ResTable_config::MASK_KEYSHIDDEN) + | (keysHidden&ResTable_config::MASK_KEYSHIDDEN); +} + +void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden) { + config->inputFlags = (config->inputFlags&~ResTable_config::MASK_NAVHIDDEN) + | ((navHidden<sdkVersion = sdkVersion; +} + +void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize) { + config->screenLayout = (config->screenLayout&~ResTable_config::MASK_SCREENSIZE) + | (screenSize&ResTable_config::MASK_SCREENSIZE); +} + +void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong) { + config->screenLayout = (config->screenLayout&~ResTable_config::MASK_SCREENLONG) + | ((screenLong<uiMode = (config->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) + | (uiModeType&ResTable_config::MASK_UI_MODE_TYPE); +} + +void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight) { + config->uiMode = (config->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT) + | ((uiModeNight<diff(*config2)); +} + +int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested) { + return base->match(*requested); +} + +int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test, + AConfiguration* requested) { + return base->isBetterThan(*test, requested); +} diff --git a/native/copy-to-ndk.sh b/native/copy-to-ndk.sh new file mode 100644 index 0000000000000..4f5a16a4b5956 --- /dev/null +++ b/native/copy-to-ndk.sh @@ -0,0 +1,55 @@ +# Take care of copying current header files over to the correct +# location in the NDK. + +copyndkheaders() { + local CURR_PLATFORM=android-9 + local ALL_PLATFORMS="$CURR_PLATFORM android-8 android-5 android-4 android-3" + + local SRC_HEADERS=$ANDROID_BUILD_TOP/frameworks/base/native/include/android + local NDK_PLATFORMS=$ANDROID_BUILD_TOP/development/ndk/platforms + local DST_HEADERS=$NDK_PLATFORMS/$CURR_PLATFORM + + local SRC_LIB_ANDROID=$ANDROID_PRODUCT_OUT/system/lib/libandroid.so + local DST_LIB_ANDROID=$NDK_PLATFORMS/$CURR_PLATFORM/arch-arm/usr/lib/libandroid.so + + local didsomething="" + + #echo "SRC_HEADERS: $SRC_HEADERS" + + for i in $(cd $SRC_HEADERS; ls *.h); do + local src=$SRC_HEADERS/$i + local changed="" + for j in $ALL_PLATFORMS; do + local dst=$NDK_PLATFORMS/$j/arch-arm/usr/include/android/$i + if [ "$changed" == "" -a -e $dst ]; then + #echo "Exists: $dst" + if diff $src $dst >/dev/null; then + echo "$i: has not changed from $j" >/dev/null + changed="false" + else + changed="true" + echo "$i: has changed from $j" >/dev/null + fi + fi + done + if [ "$changed" == "true" -o "$changed" == "" ]; then + echo "Updating: $i" + cp $src $NDK_PLATFORMS/$CURR_PLATFORM/arch-arm/usr/include/android/$i + didsomething="true" + fi + done + + if diff $SRC_LIB_ANDROID $DST_LIB_ANDROID >/dev/null; then + echo "libandroid.so: has not changed" >/dev/null + else + echo "Updating: $DST_LIB_ANDROID" + cp $SRC_LIB_ANDROID $DST_LIB_ANDROID + didsomething="true" + fi + if [ "$didsomething" != "" ]; then + echo "Headers changed... rebuilding platforms." + sh $ANDROID_BUILD_TOP/ndk/build/tools/build-platforms.sh + fi +} + +copyndkheaders diff --git a/native/include/android/asset_manager.h b/native/include/android/asset_manager.h index 89989f8cc4f50..4fa0ef3a3a122 100644 --- a/native/include/android/asset_manager.h +++ b/native/include/android/asset_manager.h @@ -18,8 +18,6 @@ #ifndef ANDROID_ASSET_MANAGER_H #define ANDROID_ASSET_MANAGER_H -#include - #ifdef __cplusplus extern "C" { #endif @@ -42,14 +40,6 @@ enum { }; -/** - * Given a Dalvik AssetManager object, obtain the corresponding native AAssetManager - * object. Note that the caller is responsible for obtaining and holding a VM reference - * to the jobject to prevent its being garbage collected while the native object is - * in use. - */ -AAssetManager* AAssetManager_fromJava(JNIEnv* env, jobject assetManager); - /** * Open the named directory within the asset hierarchy. The directory can then * be inspected with the AAssetDir functions. To open the top-level directory, diff --git a/native/include/android/asset_manager_jni.h b/native/include/android/asset_manager_jni.h new file mode 100644 index 0000000000000..aec2d3c97c07a --- /dev/null +++ b/native/include/android/asset_manager_jni.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef ANDROID_ASSET_MANAGER_JNI_H +#define ANDROID_ASSET_MANAGER_JNI_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Given a Dalvik AssetManager object, obtain the corresponding native AAssetManager + * object. Note that the caller is responsible for obtaining and holding a VM reference + * to the jobject to prevent its being garbage collected while the native object is + * in use. + */ +AAssetManager* AAssetManager_fromJava(JNIEnv* env, jobject assetManager); + +#ifdef __cplusplus +}; +#endif + +#endif // ANDROID_ASSET_MANAGER_JNI_H diff --git a/native/include/android/configuration.h b/native/include/android/configuration.h new file mode 100644 index 0000000000000..79b9b1e302ed8 --- /dev/null +++ b/native/include/android/configuration.h @@ -0,0 +1,319 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_CONFIGURATION_H +#define ANDROID_CONFIGURATION_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct AConfiguration; +typedef struct AConfiguration AConfiguration; + +enum { + ACONFIGURATION_ORIENTATION_ANY = 0x0000, + ACONFIGURATION_ORIENTATION_PORT = 0x0001, + ACONFIGURATION_ORIENTATION_LAND = 0x0002, + ACONFIGURATION_ORIENTATION_SQUARE = 0x0003, + + ACONFIGURATION_TOUCHSCREEN_ANY = 0x0000, + ACONFIGURATION_TOUCHSCREEN_NOTOUCH = 0x0001, + ACONFIGURATION_TOUCHSCREEN_STYLUS = 0x0002, + ACONFIGURATION_TOUCHSCREEN_FINGER = 0x0003, + + ACONFIGURATION_DENSITY_DEFAULT = 0, + ACONFIGURATION_DENSITY_LOW = 120, + ACONFIGURATION_DENSITY_MEDIUM = 160, + ACONFIGURATION_DENSITY_HIGH = 240, + ACONFIGURATION_DENSITY_NONE = 0xffff, + + ACONFIGURATION_KEYBOARD_ANY = 0x0000, + ACONFIGURATION_KEYBOARD_NOKEYS = 0x0001, + ACONFIGURATION_KEYBOARD_QWERTY = 0x0002, + ACONFIGURATION_KEYBOARD_12KEY = 0x0003, + + ACONFIGURATION_NAVIGATION_ANY = 0x0000, + ACONFIGURATION_NAVIGATION_NONAV = 0x0001, + ACONFIGURATION_NAVIGATION_DPAD = 0x0002, + ACONFIGURATION_NAVIGATION_TRACKBALL = 0x0003, + ACONFIGURATION_NAVIGATION_WHEEL = 0x0004, + + ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000, + ACONFIGURATION_KEYSHIDDEN_NO = 0x0001, + ACONFIGURATION_KEYSHIDDEN_YES = 0x0002, + ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003, + + ACONFIGURATION_NAVHIDDEN_ANY = 0x0000, + ACONFIGURATION_NAVHIDDEN_NO = 0x0001, + ACONFIGURATION_NAVHIDDEN_YES = 0x0002, + + ACONFIGURATION_SCREENSIZE_ANY = 0x00, + ACONFIGURATION_SCREENSIZE_SMALL = 0x01, + ACONFIGURATION_SCREENSIZE_NORMAL = 0x02, + ACONFIGURATION_SCREENSIZE_LARGE = 0x03, + ACONFIGURATION_SCREENSIZE_XLARGE = 0x04, + + ACONFIGURATION_SCREENLONG_ANY = 0x00, + ACONFIGURATION_SCREENLONG_NO = 0x1, + ACONFIGURATION_SCREENLONG_YES = 0x2, + + ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00, + ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01, + ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02, + ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03, + + ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00, + ACONFIGURATION_UI_MODE_NIGHT_NO = 0x10, + ACONFIGURATION_UI_MODE_NIGHT_YES = 0x20, + + ACONFIGURATION_MCC = 0x0001, + ACONFIGURATION_MNC = 0x0002, + ACONFIGURATION_LOCALE = 0x0004, + ACONFIGURATION_TOUCHSCREEN = 0x0008, + ACONFIGURATION_KEYBOARD = 0x0010, + ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020, + ACONFIGURATION_NAVIGATION = 0x0040, + ACONFIGURATION_ORIENTATION = 0x0080, + ACONFIGURATION_DENSITY = 0x0100, + ACONFIGURATION_SCREEN_SIZE = 0x0200, + ACONFIGURATION_VERSION = 0x0400, + ACONFIGURATION_SCREEN_LAYOUT = 0x0800, + ACONFIGURATION_UI_MODE = 0x1000, +}; + +/** + * Create a new AConfiguration, initialized with no values set. + */ +AConfiguration* AConfiguration_new(); + +/** + * Free an AConfiguration that was previously created with + * AConfiguration_new(). + */ +void AConfiguration_delete(AConfiguration* config); + +/** + * Create and return a new AConfiguration based on the current configuration in + * use in the given AssetManager. + */ +void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am); + +/** + * Copy the contents of 'src' to 'dest'. + */ +void AConfiguration_copy(AConfiguration* dest, AConfiguration* src); + +/** + * Return the current MCC set in the configuration. 0 if not set. + */ +int32_t AConfiguration_getMcc(AConfiguration* config); + +/** + * Set the current MCC in the configuration. 0 to clear. + */ +void AConfiguration_setMcc(AConfiguration* config, int32_t mcc); + +/** + * Return the current MNC set in the configuration. 0 if not set. + */ +int32_t AConfiguration_getMnc(AConfiguration* config); + +/** + * Set the current MNC in the configuration. 0 to clear. + */ +void AConfiguration_setMnc(AConfiguration* config, int32_t mnc); + +/** + * Return the current language code set in the configuration. The output will + * be filled with an array of two characters. They are not 0-terminated. If + * a language is not set, they will be 0. + */ +void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage); + +/** + * Set the current language code in the configuration, from the first two + * characters in the string. + */ +void AConfiguration_setLanguage(AConfiguration* config, const char* language); + +/** + * Return the current country code set in the configuration. The output will + * be filled with an array of two characters. They are not 0-terminated. If + * a country is not set, they will be 0. + */ +void AConfiguration_getCountry(AConfiguration* config, char* outCountry); + +/** + * Set the current country code in the configuration, from the first two + * characters in the string. + */ +void AConfiguration_setCountry(AConfiguration* config, const char* country); + +/** + * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration. + */ +int32_t AConfiguration_getOrientation(AConfiguration* config); + +/** + * Set the current orientation in the configuration. + */ +void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation); + +/** + * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration. + */ +int32_t AConfiguration_getTouchscreen(AConfiguration* config); + +/** + * Set the current touchscreen in the configuration. + */ +void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen); + +/** + * Return the current ACONFIGURATION_DENSITY_* set in the configuration. + */ +int32_t AConfiguration_getDensity(AConfiguration* config); + +/** + * Set the current density in the configuration. + */ +void AConfiguration_setDensity(AConfiguration* config, int32_t density); + +/** + * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration. + */ +int32_t AConfiguration_getKeyboard(AConfiguration* config); + +/** + * Set the current keyboard in the configuration. + */ +void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard); + +/** + * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration. + */ +int32_t AConfiguration_getNavigation(AConfiguration* config); + +/** + * Set the current navigation in the configuration. + */ +void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation); + +/** + * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration. + */ +int32_t AConfiguration_getKeysHidden(AConfiguration* config); + +/** + * Set the current keys hidden in the configuration. + */ +void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden); + +/** + * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration. + */ +int32_t AConfiguration_getNavHidden(AConfiguration* config); + +/** + * Set the current nav hidden in the configuration. + */ +void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden); + +/** + * Return the current SDK (API) version set in the configuration. + */ +int32_t AConfiguration_getSdkVersion(AConfiguration* config); + +/** + * Set the current SDK version in the configuration. + */ +void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion); + +/** + * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration. + */ +int32_t AConfiguration_getScreenSize(AConfiguration* config); + +/** + * Set the current screen size in the configuration. + */ +void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize); + +/** + * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration. + */ +int32_t AConfiguration_getScreenLong(AConfiguration* config); + +/** + * Set the current screen long in the configuration. + */ +void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong); + +/** + * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration. + */ +int32_t AConfiguration_getUiModeType(AConfiguration* config); + +/** + * Set the current UI mode type in the configuration. + */ +void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType); + +/** + * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration. + */ +int32_t AConfiguration_getUiModeNight(AConfiguration* config); + +/** + * Set the current UI mode night in the configuration. + */ +void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight); + +/** + * Perform a diff between two configurations. Returns a bit mask of + * ACONFIGURATION_* constants, each bit set meaning that configuration element + * is different between them. + */ +int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2); + +/** + * Determine whether 'base' is a valid configuration for use within the + * environment 'requested'. Returns 0 if there are any values in 'base' + * that conflict with 'requested'. Returns 1 if it does not conflict. + */ +int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested); + +/** + * Determine whether the configuration in 'test' is better than the existing + * configuration in 'base'. If 'requested' is non-NULL, this decision is based + * on the overall configuration given there. If it is NULL, this decision is + * simply based on which configuration is more specific. Returns non-0 if + * 'test' is better than 'base'. + * + * This assumes you have already filtered the configurations with + * AConfiguration_match(). + */ +int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test, + AConfiguration* requested); + +#ifdef __cplusplus +}; +#endif + +#endif // ANDROID_CONFIGURATION_H diff --git a/native/include/android/native_activity.h b/native/include/android/native_activity.h index ee4204d884f21..d74e1ce5a3d3c 100644 --- a/native/include/android/native_activity.h +++ b/native/include/android/native_activity.h @@ -196,6 +196,12 @@ typedef struct ANativeActivityCallbacks { */ void (*onContentRectChanged)(ANativeActivity* activity, const ARect* rect); + /** + * The current device AConfiguration has changed. The new configuration can + * be retrieved from assetManager. + */ + void (*onConfigurationChanged)(ANativeActivity* activity); + /** * The system is running low on memory. Use this callback to release * resources you do not need, to help the system avoid killing more @@ -208,7 +214,9 @@ typedef struct ANativeActivityCallbacks { * This is the function that must be in the native code to instantiate the * application's native activity. It is called with the activity instance (see * above); if the code is being instantiated from a previously saved instance, - * the savedState will be non-NULL and point to the saved data. + * the savedState will be non-NULL and point to the saved data. You must make + * any copy of this data you need -- it will be released after you return from + * this function. */ typedef void ANativeActivity_createFunc(ANativeActivity* activity, void* savedState, size_t savedStateSize); diff --git a/native/include/android/native_window.h b/native/include/android/native_window.h index 7599d7e550f6c..ad03d0e930da5 100644 --- a/native/include/android/native_window.h +++ b/native/include/android/native_window.h @@ -36,12 +36,23 @@ struct ANativeWindow; typedef struct ANativeWindow ANativeWindow; typedef struct ANativeWindow_Buffer { + // The number of pixels that are show horizontally. int32_t width; + + // The number of pixels that are shown vertically. int32_t height; + + // The number of *pixels* that a line in the buffer takes in + // memory. This may be >= width. int32_t stride; + + // The format of the buffer. One of WINDOW_FORMAT_* int32_t format; + + // The actual bits. void* bits; + // Do not touch. uint32_t reserved[6]; } ANativeWindow_Buffer;