android_content_res_Configuration.cpp revision 17cc33a35729733aaa0a7706f38b1c45f0b1590a
108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn/*
208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * Copyright 2010, The Android Open Source Project
308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn *
408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * you may not use this file except in compliance with the License.
608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * You may obtain a copy of the License at
708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn *
808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn *     http://www.apache.org/licenses/LICENSE-2.0
908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn *
1008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
1108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * See the License for the specific language governing permissions and
1408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * limitations under the License.
1508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn */
1608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
1708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#define LOG_TAG "Configuration"
1808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
1908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#include <utils/Log.h>
2008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#include "utils/misc.h"
2108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
2208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#include "jni.h"
2308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#include <android_runtime/android_content_res_Configuration.h>
2408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#include "android_runtime/AndroidRuntime.h"
2508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
2608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornnamespace android {
2708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
2808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic struct {
2908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID mcc;
3008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID mnc;
3108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID locale;
3208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID screenLayout;
3308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID touchscreen;
3408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID keyboard;
3508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID keyboardHidden;
3608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID hardKeyboardHidden;
3708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID navigation;
3808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID navigationHidden;
3908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID orientation;
4008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID uiMode;
4108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} gConfigurationClassInfo;
4208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
4308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornvoid android_Configuration_getFromJava(
4408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        JNIEnv* env, jobject clazz, struct AConfiguration* out) {
4508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->mcc = env->GetIntField(clazz, gConfigurationClassInfo.mcc);
4608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->mnc = env->GetIntField(clazz, gConfigurationClassInfo.mnc);
4708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->screenLayout = env->GetIntField(clazz, gConfigurationClassInfo.screenLayout);
4808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->touchscreen = env->GetIntField(clazz, gConfigurationClassInfo.touchscreen);
4908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->keyboard = env->GetIntField(clazz, gConfigurationClassInfo.keyboard);
5008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->navigation = env->GetIntField(clazz, gConfigurationClassInfo.navigation);
5108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
5208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->inputFlags = env->GetIntField(clazz, gConfigurationClassInfo.keyboardHidden);
5308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    int hardKeyboardHidden = env->GetIntField(clazz, gConfigurationClassInfo.hardKeyboardHidden);
5408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    if (out->inputFlags == ACONFIGURATION_KEYSHIDDEN_NO
5508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            && hardKeyboardHidden == 2) {
5608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        out->inputFlags = ACONFIGURATION_KEYSHIDDEN_SOFT;
5708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    }
5808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->inputFlags |= env->GetIntField(clazz, gConfigurationClassInfo.navigationHidden)
5908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            << ResTable_config::SHIFT_NAVHIDDEN;
6008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
6108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->orientation = env->GetIntField(clazz, gConfigurationClassInfo.orientation);
6208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->uiMode = env->GetIntField(clazz, gConfigurationClassInfo.uiMode);
6308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
6408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
6508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn/*
6608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * JNI registration.
6708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn */
6808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic JNINativeMethod gMethods[] = {
6908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    /* name, signature, funcPtr */
7008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    //{ "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)Z",
7108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    //        (void*) android_content_res_ObbScanner_getObbInfo },
7208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn};
7308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
7408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#define FIND_CLASS(var, className) \
7508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        var = env->FindClass(className); \
7617cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro        LOG_FATAL_IF(! var, "Unable to find class " className);
7708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
7808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
7908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
8008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
8108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
8208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornint register_android_content_res_Configuration(JNIEnv* env)
8308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{
8417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
8517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/content/res/Configuration");
8608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
8717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.mcc, clazz,
8808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "mcc", "I");
8917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.mnc, clazz,
9008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "mnc", "I");
9117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.locale, clazz,
9208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "locale", "Ljava/util/Locale;");
9317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.screenLayout, clazz,
9408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "screenLayout", "I");
9517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz,
9608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "touchscreen", "I");
9717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz,
9808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "keyboard", "I");
9917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.keyboardHidden, clazz,
10008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "keyboardHidden", "I");
10117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.hardKeyboardHidden, clazz,
10208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "hardKeyboardHidden", "I");
10317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz,
10408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "navigation", "I");
10517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.navigationHidden, clazz,
10608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "navigationHidden", "I");
10717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.orientation, clazz,
10808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "orientation", "I");
10917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.uiMode, clazz,
11008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "uiMode", "I");
11108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
11208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    return AndroidRuntime::registerNativeMethods(env, "android/content/res/Configuration", gMethods,
11308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            NELEM(gMethods));
11408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
11508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
11608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}; // namespace android
117