blob: 886929425a69f1aae4f257141486343308621655 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.pinyin;
import android.content.Context;
import android.content.res.Configuration;
import android.view.Display;
import android.view.WindowManager;
/**
* Global environment configurations for showing soft keyboard and candidate
* view. All original dimension values are defined in float, and the real size
* is calculated from the float values of and screen size. In this way, this
* input method can work even when screen size is changed.
*/
public class Environment {
/**
* The key height for portrait mode. It is relative to the screen height.
*/
private static final float KEY_HEIGHT_RATIO_PORTRAIT = 0.105f;
/**
* The key height for landscape mode. It is relative to the screen height.
*/
private static final float KEY_HEIGHT_RATIO_LANDSCAPE = 0.147f;
/**
* The height of the candidates area for portrait mode. It is relative to
* screen height.
*/
private static final float CANDIDATES_AREA_HEIGHT_RATIO_PORTRAIT = 0.084f;
/**
* The height of the candidates area for portrait mode. It is relative to
* screen height.
*/
private static final float CANDIDATES_AREA_HEIGHT_RATIO_LANDSCAPE = 0.125f;
/**
* How much should the balloon width be larger than width of the real key.
* It is relative to the smaller one of screen width and height.
*/
private static final float KEY_BALLOON_WIDTH_PLUS_RATIO = 0.08f;
/**
* How much should the balloon height be larger than that of the real key.
* It is relative to the smaller one of screen width and height.
*/
private static final float KEY_BALLOON_HEIGHT_PLUS_RATIO = 0.07f;
/**
* The text size for normal keys. It is relative to the smaller one of
* screen width and height.
*/
private static final float NORMAL_KEY_TEXT_SIZE_RATIO = 0.075f;
/**
* The text size for function keys. It is relative to the smaller one of
* screen width and height.
*/
private static final float FUNCTION_KEY_TEXT_SIZE_RATIO = 0.055f;
/**
* The text size balloons of normal keys. It is relative to the smaller one
* of screen width and height.
*/
private static final float NORMAL_BALLOON_TEXT_SIZE_RATIO = 0.14f;
/**
* The text size balloons of function keys. It is relative to the smaller
* one of screen width and height.
*/
private static final float FUNCTION_BALLOON_TEXT_SIZE_RATIO = 0.085f;
/**
* The configurations are managed in a singleton.
*/
private static Environment mInstance;
private int mScreenWidth;
private int mScreenHeight;
private int mKeyHeight;
private int mCandidatesAreaHeight;
private int mKeyBalloonWidthPlus;
private int mKeyBalloonHeightPlus;
private int mNormalKeyTextSize;
private int mFunctionKeyTextSize;
private int mNormalBalloonTextSize;
private int mFunctionBalloonTextSize;
private Configuration mConfig = new Configuration();
private boolean mDebug = false;
private Environment() {
}
public static Environment getInstance() {
if (null == mInstance) {
mInstance = new Environment();
}
return mInstance;
}
public void onConfigurationChanged(Configuration newConfig, Context context) {
if (mConfig.orientation != newConfig.orientation) {
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display d = wm.getDefaultDisplay();
mScreenWidth = d.getWidth();
mScreenHeight = d.getHeight();
int scale;
if (mScreenHeight > mScreenWidth) {
mKeyHeight = (int) (mScreenHeight * KEY_HEIGHT_RATIO_PORTRAIT);
mCandidatesAreaHeight = (int) (mScreenHeight * CANDIDATES_AREA_HEIGHT_RATIO_PORTRAIT);
scale = mScreenWidth;
} else {
mKeyHeight = (int) (mScreenHeight * KEY_HEIGHT_RATIO_LANDSCAPE);
mCandidatesAreaHeight = (int) (mScreenHeight * CANDIDATES_AREA_HEIGHT_RATIO_LANDSCAPE);
scale = mScreenHeight;
}
mNormalKeyTextSize = (int) (scale * NORMAL_KEY_TEXT_SIZE_RATIO);
mFunctionKeyTextSize = (int) (scale * FUNCTION_KEY_TEXT_SIZE_RATIO);
mNormalBalloonTextSize = (int) (scale * NORMAL_BALLOON_TEXT_SIZE_RATIO);
mFunctionBalloonTextSize = (int) (scale * FUNCTION_BALLOON_TEXT_SIZE_RATIO);
mKeyBalloonWidthPlus = (int) (scale * KEY_BALLOON_WIDTH_PLUS_RATIO);
mKeyBalloonHeightPlus = (int) (scale * KEY_BALLOON_HEIGHT_PLUS_RATIO);
}
mConfig.updateFrom(newConfig);
}
public Configuration getConfiguration() {
return mConfig;
}
public int getScreenWidth() {
return mScreenWidth;
}
public int getScreenHeight() {
return mScreenHeight;
}
public int getHeightForCandidates() {
return mCandidatesAreaHeight;
}
public float getKeyXMarginFactor() {
return 1.0f;
}
public float getKeyYMarginFactor() {
if (Configuration.ORIENTATION_LANDSCAPE == mConfig.orientation) {
return 0.7f;
}
return 1.0f;
}
public int getKeyHeight() {
return mKeyHeight;
}
public int getKeyBalloonWidthPlus() {
return mKeyBalloonWidthPlus;
}
public int getKeyBalloonHeightPlus() {
return mKeyBalloonHeightPlus;
}
public int getSkbHeight() {
if (Configuration.ORIENTATION_PORTRAIT == mConfig.orientation) {
return mKeyHeight * 4;
} else if (Configuration.ORIENTATION_LANDSCAPE == mConfig.orientation) {
return mKeyHeight * 4;
}
return 0;
}
public int getKeyTextSize(boolean isFunctionKey) {
if (isFunctionKey) {
return mFunctionKeyTextSize;
} else {
return mNormalKeyTextSize;
}
}
public int getBalloonTextSize(boolean isFunctionKey) {
if (isFunctionKey) {
return mFunctionBalloonTextSize;
} else {
return mNormalBalloonTextSize;
}
}
public boolean hasHardKeyboard() {
if (mConfig.keyboard == Configuration.KEYBOARD_NOKEYS
|| mConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
return false;
}
return true;
}
public boolean needDebug() {
return mDebug;
}
}