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
26namespace android {
27
28static 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
46void 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
81int 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