1 /* 2 * Copyright 2010, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "Configuration" 18 19 #include <utils/Log.h> 20 #include "utils/misc.h" 21 22 #include "jni.h" 23 #include <android_runtime/android_content_res_Configuration.h> 24 #include "android_runtime/AndroidRuntime.h" 25 26 namespace android { 27 28 static struct { 29 jfieldID mcc; 30 jfieldID mnc; 31 jfieldID locale; 32 jfieldID screenLayout; 33 jfieldID touchscreen; 34 jfieldID keyboard; 35 jfieldID keyboardHidden; 36 jfieldID hardKeyboardHidden; 37 jfieldID navigation; 38 jfieldID navigationHidden; 39 jfieldID orientation; 40 jfieldID uiMode; 41 jfieldID screenWidthDp; 42 jfieldID screenHeightDp; 43 jfieldID smallestScreenWidthDp; 44 } gConfigurationClassInfo; 45 46 void android_Configuration_getFromJava( 47 JNIEnv* env, jobject clazz, struct AConfiguration* out) { 48 out->mcc = env->GetIntField(clazz, gConfigurationClassInfo.mcc); 49 out->mnc = env->GetIntField(clazz, gConfigurationClassInfo.mnc); 50 out->screenLayout = env->GetIntField(clazz, gConfigurationClassInfo.screenLayout); 51 out->touchscreen = env->GetIntField(clazz, gConfigurationClassInfo.touchscreen); 52 out->keyboard = env->GetIntField(clazz, gConfigurationClassInfo.keyboard); 53 out->navigation = env->GetIntField(clazz, gConfigurationClassInfo.navigation); 54 55 out->inputFlags = env->GetIntField(clazz, gConfigurationClassInfo.keyboardHidden); 56 int hardKeyboardHidden = env->GetIntField(clazz, gConfigurationClassInfo.hardKeyboardHidden); 57 if (out->inputFlags == ACONFIGURATION_KEYSHIDDEN_NO 58 && hardKeyboardHidden == 2) { 59 out->inputFlags = ACONFIGURATION_KEYSHIDDEN_SOFT; 60 } 61 out->inputFlags |= env->GetIntField(clazz, gConfigurationClassInfo.navigationHidden) 62 << ResTable_config::SHIFT_NAVHIDDEN; 63 64 out->orientation = env->GetIntField(clazz, gConfigurationClassInfo.orientation); 65 out->uiMode = env->GetIntField(clazz, gConfigurationClassInfo.uiMode); 66 67 out->screenWidthDp = env->GetIntField(clazz, gConfigurationClassInfo.screenWidthDp); 68 out->screenHeightDp = env->GetIntField(clazz, gConfigurationClassInfo.screenHeightDp); 69 out->smallestScreenWidthDp = env->GetIntField(clazz, 70 gConfigurationClassInfo.smallestScreenWidthDp); 71 } 72 73 /* 74 * JNI registration. 75 */ 76 static JNINativeMethod gMethods[] = { 77 /* name, signature, funcPtr */ 78 //{ "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)Z", 79 // (void*) android_content_res_ObbScanner_getObbInfo }, 80 }; 81 82 #define FIND_CLASS(var, className) \ 83 var = env->FindClass(className); \ 84 LOG_FATAL_IF(! var, "Unable to find class " className); 85 86 #define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 87 var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 88 LOG_FATAL_IF(! var, "Unable to find field " fieldName); 89 90 int register_android_content_res_Configuration(JNIEnv* env) 91 { 92 jclass clazz; 93 FIND_CLASS(clazz, "android/content/res/Configuration"); 94 95 GET_FIELD_ID(gConfigurationClassInfo.mcc, clazz, 96 "mcc", "I"); 97 GET_FIELD_ID(gConfigurationClassInfo.mnc, clazz, 98 "mnc", "I"); 99 GET_FIELD_ID(gConfigurationClassInfo.locale, clazz, 100 "locale", "Ljava/util/Locale;"); 101 GET_FIELD_ID(gConfigurationClassInfo.screenLayout, clazz, 102 "screenLayout", "I"); 103 GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz, 104 "touchscreen", "I"); 105 GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz, 106 "keyboard", "I"); 107 GET_FIELD_ID(gConfigurationClassInfo.keyboardHidden, clazz, 108 "keyboardHidden", "I"); 109 GET_FIELD_ID(gConfigurationClassInfo.hardKeyboardHidden, clazz, 110 "hardKeyboardHidden", "I"); 111 GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz, 112 "navigation", "I"); 113 GET_FIELD_ID(gConfigurationClassInfo.navigationHidden, clazz, 114 "navigationHidden", "I"); 115 GET_FIELD_ID(gConfigurationClassInfo.orientation, clazz, 116 "orientation", "I"); 117 GET_FIELD_ID(gConfigurationClassInfo.uiMode, clazz, 118 "uiMode", "I"); 119 GET_FIELD_ID(gConfigurationClassInfo.screenWidthDp, clazz, 120 "screenWidthDp", "I"); 121 GET_FIELD_ID(gConfigurationClassInfo.screenHeightDp, clazz, 122 "screenHeightDp", "I"); 123 GET_FIELD_ID(gConfigurationClassInfo.smallestScreenWidthDp, clazz, 124 "smallestScreenWidthDp", "I"); 125 126 return AndroidRuntime::registerNativeMethods(env, "android/content/res/Configuration", gMethods, 127 NELEM(gMethods)); 128 } 129 130 }; // namespace android 131