android_content_res_Configuration.cpp revision fef966ae4629f09158576de4cedef38e83d50b2b
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;
4169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    jfieldID screenWidthDp;
4269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    jfieldID screenHeightDp;
4369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    jfieldID smallestScreenWidthDp;
4408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} gConfigurationClassInfo;
4508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
4608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornvoid android_Configuration_getFromJava(
4708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        JNIEnv* env, jobject clazz, struct AConfiguration* out) {
4808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->mcc = env->GetIntField(clazz, gConfigurationClassInfo.mcc);
4908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->mnc = env->GetIntField(clazz, gConfigurationClassInfo.mnc);
5008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->screenLayout = env->GetIntField(clazz, gConfigurationClassInfo.screenLayout);
5108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->touchscreen = env->GetIntField(clazz, gConfigurationClassInfo.touchscreen);
5208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->keyboard = env->GetIntField(clazz, gConfigurationClassInfo.keyboard);
5308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->navigation = env->GetIntField(clazz, gConfigurationClassInfo.navigation);
5408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
5508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->inputFlags = env->GetIntField(clazz, gConfigurationClassInfo.keyboardHidden);
5608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    int hardKeyboardHidden = env->GetIntField(clazz, gConfigurationClassInfo.hardKeyboardHidden);
5708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    if (out->inputFlags == ACONFIGURATION_KEYSHIDDEN_NO
5808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            && hardKeyboardHidden == 2) {
5908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        out->inputFlags = ACONFIGURATION_KEYSHIDDEN_SOFT;
6008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    }
6108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->inputFlags |= env->GetIntField(clazz, gConfigurationClassInfo.navigationHidden)
6208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            << ResTable_config::SHIFT_NAVHIDDEN;
6308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
6408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->orientation = env->GetIntField(clazz, gConfigurationClassInfo.orientation);
6508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->uiMode = env->GetIntField(clazz, gConfigurationClassInfo.uiMode);
6669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
6769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    out->screenWidthDp = env->GetIntField(clazz, gConfigurationClassInfo.screenWidthDp);
6869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    out->screenHeightDp = env->GetIntField(clazz, gConfigurationClassInfo.screenHeightDp);
6969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    out->smallestScreenWidthDp = env->GetIntField(clazz,
7069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            gConfigurationClassInfo.smallestScreenWidthDp);
7108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
7208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
7308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn/*
7408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn * JNI registration.
7508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn */
7608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic JNINativeMethod gMethods[] = {
7708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    /* name, signature, funcPtr */
7808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    //{ "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)Z",
7908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    //        (void*) android_content_res_ObbScanner_getObbInfo },
8008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn};
8108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
8208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#define FIND_CLASS(var, className) \
8308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        var = env->FindClass(className); \
8417cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro        LOG_FATAL_IF(! var, "Unable to find class " className);
8508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
8608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
8708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
8808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
8908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
9008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornint register_android_content_res_Configuration(JNIEnv* env)
9108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{
9217cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    jclass clazz;
9317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    FIND_CLASS(clazz, "android/content/res/Configuration");
9408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
9517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.mcc, clazz,
9608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "mcc", "I");
9717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.mnc, clazz,
9808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "mnc", "I");
9917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.locale, clazz,
10008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "locale", "Ljava/util/Locale;");
10117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.screenLayout, clazz,
10208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "screenLayout", "I");
10317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.touchscreen, clazz,
10408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "touchscreen", "I");
10517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.keyboard, clazz,
10608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "keyboard", "I");
10717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.keyboardHidden, clazz,
10808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "keyboardHidden", "I");
10917cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.hardKeyboardHidden, clazz,
11008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "hardKeyboardHidden", "I");
11117cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.navigation, clazz,
11208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "navigation", "I");
11317cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.navigationHidden, clazz,
11408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "navigationHidden", "I");
11517cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.orientation, clazz,
11608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "orientation", "I");
11717cc33a35729733aaa0a7706f38b1c45f0b1590aCarl Shapiro    GET_FIELD_ID(gConfigurationClassInfo.uiMode, clazz,
11808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            "uiMode", "I");
119fef966ae4629f09158576de4cedef38e83d50b2bDianne Hackborn    GET_FIELD_ID(gConfigurationClassInfo.screenWidthDp, clazz,
12069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            "screenWidthDp", "I");
121fef966ae4629f09158576de4cedef38e83d50b2bDianne Hackborn    GET_FIELD_ID(gConfigurationClassInfo.screenHeightDp, clazz,
12269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            "screenHeightDp", "I");
123fef966ae4629f09158576de4cedef38e83d50b2bDianne Hackborn    GET_FIELD_ID(gConfigurationClassInfo.smallestScreenWidthDp, clazz,
12469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            "smallestScreenWidthDp", "I");
12508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
12608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    return AndroidRuntime::registerNativeMethods(env, "android/content/res/Configuration", gMethods,
12708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            NELEM(gMethods));
12808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
12908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
13008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}; // namespace android
131