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 
android_Configuration_getFromJava(JNIEnv * env,jobject clazz,struct AConfiguration * out)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 
register_android_content_res_Configuration(JNIEnv * env)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