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 #define FIND_CLASS(var, className) \ 74 var = env->FindClass(className); \ 75 LOG_FATAL_IF(! var, "Unable to find class " className); 76 77 #define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ 78 var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ 79 LOG_FATAL_IF(! var, "Unable to find field " fieldName); 80 81 int register_android_content_res_Configuration(JNIEnv* env) 82 { 83 jclass clazz; 84 FIND_CLASS(clazz, "android/content/res/Configuration"); 85 86 GET_FIELD_ID(gConfigurationClassInfo.mcc, clazz, 87 "mcc", "I"); 88 GET_FIELD_ID(gConfigurationClassInfo.mnc, clazz, 89 "mnc", "I"); 90 GET_FIELD_ID(gConfigurationClassInfo.locale, clazz, 91 "locale", "Ljava/util/Locale;"); 92 GET_FIELD_ID(gConfigurationClassInfo.screenLayout, clazz, 93 "screenLayout", "I"); 94 GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz, 95 "touchscreen", "I"); 96 GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz, 97 "keyboard", "I"); 98 GET_FIELD_ID(gConfigurationClassInfo.keyboardHidden, clazz, 99 "keyboardHidden", "I"); 100 GET_FIELD_ID(gConfigurationClassInfo.hardKeyboardHidden, clazz, 101 "hardKeyboardHidden", "I"); 102 GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz, 103 "navigation", "I"); 104 GET_FIELD_ID(gConfigurationClassInfo.navigationHidden, clazz, 105 "navigationHidden", "I"); 106 GET_FIELD_ID(gConfigurationClassInfo.orientation, clazz, 107 "orientation", "I"); 108 GET_FIELD_ID(gConfigurationClassInfo.uiMode, clazz, 109 "uiMode", "I"); 110 GET_FIELD_ID(gConfigurationClassInfo.screenWidthDp, clazz, 111 "screenWidthDp", "I"); 112 GET_FIELD_ID(gConfigurationClassInfo.screenHeightDp, clazz, 113 "screenHeightDp", "I"); 114 GET_FIELD_ID(gConfigurationClassInfo.smallestScreenWidthDp, clazz, 115 "smallestScreenWidthDp", "I"); 116 117 return 0; 118 } 119 120 }; // namespace android 121