LatinIME/java/src/com/android/inputmethod/latin/EmojiAltPhysicalKeyDetector.java
Dan Zivkovic edd94a449e Ignore the Emoji key when not connected.
When the LatinIME does not have an active InputConnection, it will not try
to toggle the Emoji keyboard.

Bug 19513415.

Change-Id: I31f928cd7db1cddd771c548cd3dc42f8af64d0e2
2015-02-26 11:10:37 -08:00

107 lines
3.7 KiB
Java

/*
* Copyright (C) 2014, 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.latin;
import android.util.Log;
import android.view.KeyEvent;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.latin.settings.Settings;
/**
* A class for detecting Emoji-Alt physical key.
*/
final class EmojiAltPhysicalKeyDetector {
private static final String TAG = "EmojiAltPhysicalKeyDetector";
private final RichInputConnection mRichInputConnection;
// True if the Alt key has been used as a modifier. In this case the Alt key up isn't
// recognized as an emoji key.
private boolean mAltHasBeenUsedAsAModifier;
public EmojiAltPhysicalKeyDetector(final RichInputConnection richInputConnection) {
mRichInputConnection = richInputConnection;
}
/**
* Record a down key event.
* @param keyEvent a down key event.
*/
public void onKeyDown(final KeyEvent keyEvent) {
if (isAltKey(keyEvent)) {
mAltHasBeenUsedAsAModifier = false;
}
if (containsAltModifier(keyEvent)) {
mAltHasBeenUsedAsAModifier = true;
}
}
/**
* Determine whether an up key event is a special key up or not.
* @param keyEvent an up key event.
*/
public void onKeyUp(final KeyEvent keyEvent) {
if (keyEvent.isCanceled()) {
// This key up event was a part of key combinations and should be ignored.
return;
}
if (!isAltKey(keyEvent)) {
mAltHasBeenUsedAsAModifier |= containsAltModifier(keyEvent);
return;
}
if (containsAltModifier(keyEvent)) {
mAltHasBeenUsedAsAModifier = true;
return;
}
if (!Settings.getInstance().getCurrent().mEnableEmojiAltPhysicalKey) {
return;
}
if (mAltHasBeenUsedAsAModifier) {
return;
}
if (!mRichInputConnection.isConnected()) {
Log.w(TAG, "onKeyUp() : No connection to text view");
return;
}
onEmojiAltKeyDetected();
}
private static void onEmojiAltKeyDetected() {
KeyboardSwitcher.getInstance().onToggleEmojiKeyboard();
}
private static boolean isAltKey(final KeyEvent keyEvent) {
final int keyCode = keyEvent.getKeyCode();
return keyCode == KeyEvent.KEYCODE_ALT_LEFT || keyCode == KeyEvent.KEYCODE_ALT_RIGHT;
}
private static boolean containsAltModifier(final KeyEvent keyEvent) {
final int metaState = keyEvent.getMetaState();
// TODO: Support multiple keyboards. Take device id into account.
switch (keyEvent.getKeyCode()) {
case KeyEvent.KEYCODE_ALT_LEFT:
// Return true if Left-Alt is pressed with Right-Alt pressed.
return (metaState & KeyEvent.META_ALT_RIGHT_ON) != 0;
case KeyEvent.KEYCODE_ALT_RIGHT:
// Return true if Right-Alt is pressed with Left-Alt pressed.
return (metaState & KeyEvent.META_ALT_LEFT_ON) != 0;
default:
return (metaState & (KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_RIGHT_ON)) != 0;
}
}
}