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
26987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
27987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
2808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornnamespace android {
2908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
3008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornstatic struct {
3108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID mcc;
3208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID mnc;
3308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID locale;
3408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID screenLayout;
3508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID touchscreen;
3608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID keyboard;
3708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID keyboardHidden;
3808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID hardKeyboardHidden;
3908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID navigation;
4008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID navigationHidden;
4108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID orientation;
4208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    jfieldID uiMode;
4369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    jfieldID screenWidthDp;
4469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    jfieldID screenHeightDp;
4569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    jfieldID smallestScreenWidthDp;
4608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn} gConfigurationClassInfo;
4708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
4808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornvoid android_Configuration_getFromJava(
4908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        JNIEnv* env, jobject clazz, struct AConfiguration* out) {
5008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->mcc = env->GetIntField(clazz, gConfigurationClassInfo.mcc);
5108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->mnc = env->GetIntField(clazz, gConfigurationClassInfo.mnc);
5208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->screenLayout = env->GetIntField(clazz, gConfigurationClassInfo.screenLayout);
5308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->touchscreen = env->GetIntField(clazz, gConfigurationClassInfo.touchscreen);
5408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->keyboard = env->GetIntField(clazz, gConfigurationClassInfo.keyboard);
5508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->navigation = env->GetIntField(clazz, gConfigurationClassInfo.navigation);
5608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
5708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->inputFlags = env->GetIntField(clazz, gConfigurationClassInfo.keyboardHidden);
5808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    int hardKeyboardHidden = env->GetIntField(clazz, gConfigurationClassInfo.hardKeyboardHidden);
5908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    if (out->inputFlags == ACONFIGURATION_KEYSHIDDEN_NO
6008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            && hardKeyboardHidden == 2) {
6108d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn        out->inputFlags = ACONFIGURATION_KEYSHIDDEN_SOFT;
6208d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    }
6308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->inputFlags |= env->GetIntField(clazz, gConfigurationClassInfo.navigationHidden)
6408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn            << ResTable_config::SHIFT_NAVHIDDEN;
6508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
6608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->orientation = env->GetIntField(clazz, gConfigurationClassInfo.orientation);
6708d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn    out->uiMode = env->GetIntField(clazz, gConfigurationClassInfo.uiMode);
6869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
6969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    out->screenWidthDp = env->GetIntField(clazz, gConfigurationClassInfo.screenWidthDp);
7069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    out->screenHeightDp = env->GetIntField(clazz, gConfigurationClassInfo.screenHeightDp);
7169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    out->smallestScreenWidthDp = env->GetIntField(clazz,
7269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            gConfigurationClassInfo.smallestScreenWidthDp);
7308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
7408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
7508d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackbornint register_android_content_res_Configuration(JNIEnv* env)
7608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn{
77987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = FindClassOrDie(env, "android/content/res/Configuration");
7808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
79987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.mcc = GetFieldIDOrDie(env, clazz, "mcc", "I");
80987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.mnc = GetFieldIDOrDie(env, clazz, "mnc", "I");
81987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.locale = GetFieldIDOrDie(env, clazz, "locale", "Ljava/util/Locale;");
82987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.screenLayout = GetFieldIDOrDie(env, clazz, "screenLayout", "I");
83987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.touchscreen = GetFieldIDOrDie(env, clazz, "touchscreen", "I");
84987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.keyboard = GetFieldIDOrDie(env, clazz, "keyboard", "I");
85987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.keyboardHidden = GetFieldIDOrDie(env, clazz, "keyboardHidden", "I");
86987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.hardKeyboardHidden = GetFieldIDOrDie(env, clazz, "hardKeyboardHidden",
87987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                                 "I");
88987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.navigation = GetFieldIDOrDie(env, clazz, "navigation", "I");
89987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.navigationHidden = GetFieldIDOrDie(env, clazz, "navigationHidden", "I");
90987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.orientation = GetFieldIDOrDie(env, clazz, "orientation", "I");
91987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.uiMode = GetFieldIDOrDie(env, clazz, "uiMode", "I");
92987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.screenWidthDp = GetFieldIDOrDie(env, clazz, "screenWidthDp", "I");
93987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.screenHeightDp = GetFieldIDOrDie(env, clazz, "screenHeightDp", "I");
94987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gConfigurationClassInfo.smallestScreenWidthDp = GetFieldIDOrDie(env, clazz,
95987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                                    "smallestScreenWidthDp", "I");
9608d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
97f83c73ec2fa7ceecd625cb05900ead294db18c99Narayan Kamath    return 0;
9808d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}
9908d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn
10008d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn}; // namespace android
101