150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi/* 250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * Copyright (C) 2013 The Android Open Source Project 350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * 450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * you may not use this file except in compliance with the License. 650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * You may obtain a copy of the License at 750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * 850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * 1050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 1150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 1250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * See the License for the specific language governing permissions and 1450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi * limitations under the License. 1550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi */ 1650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 1750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#ifndef LATINIME_SUGGEST_OPTIONS_H 1850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#define LATINIME_SUGGEST_OPTIONS_H 1950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 2050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#include "defines.h" 2150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 2250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanaginamespace latinime { 2350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 2450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagiclass SuggestOptions{ 2550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi public: 26338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi SuggestOptions(const int *const options, const int length) 27338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi : mOptions(options), mLength(length) {} 28338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi 2950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi AK_FORCE_INLINE bool isGesture() const { 3050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi return getBoolOption(IS_GESTURE); 3150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi } 3250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 3350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi AK_FORCE_INLINE bool useFullEditDistance() const { 3450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi return getBoolOption(USE_FULL_EDIT_DISTANCE); 3550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi } 3650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 3759ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi AK_FORCE_INLINE bool blockOffensiveWords() const { 3859ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi return getBoolOption(BLOCK_OFFENSIVE_WORDS); 3959ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi } 4059ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi 41b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi AK_FORCE_INLINE bool enableSpaceAwareGesture() const { 42b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi return getBoolOption(SPACE_AWARE_GESTURE_ENABLED); 43b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi } 44b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi 45338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi AK_FORCE_INLINE bool getAdditionalFeaturesBoolOption(const int key) const { 46338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi return getBoolOption(key + ADDITIONAL_FEATURES_OPTIONS); 47338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi } 4850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 4950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi private: 5029432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa DISALLOW_IMPLICIT_CONSTRUCTORS(SuggestOptions); 5129432f843a8cd6ffb2be286104964592e80d77c9Ken Wakasa 5250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi // Need to update com.android.inputmethod.latin.NativeSuggestOptions when you add, remove or 5350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi // reorder options. 5450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi static const int IS_GESTURE = 0; 5550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi static const int USE_FULL_EDIT_DISTANCE = 1; 5659ed0c2db2714f36c18d0882c7845455b5b3dd43Keisuke Kuroyanagi static const int BLOCK_OFFENSIVE_WORDS = 2; 57b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi static const int SPACE_AWARE_GESTURE_ENABLED = 3; 58338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi // Additional features options are stored after the other options and used as setting values of 59338ef65077f43d6a35665a5c8eb6a44928332547Keisuke Kuroyanagi // experimental features. 60b8a9479b57007edb5cb12c628797f89a8164f596Keisuke Kuroyanagi static const int ADDITIONAL_FEATURES_OPTIONS = 4; 6150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 6250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi const int *const mOptions; 6350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi const int mLength; 6450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 6550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi AK_FORCE_INLINE bool isValidKey(const int key) const { 6650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi return 0 <= key && key < mLength; 6750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi } 6850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 6950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi AK_FORCE_INLINE bool getBoolOption(const int key) const { 7050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi if (isValidKey(key)) { 7150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi return mOptions[key] != 0; 7250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi } 7350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi return false; 7450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi } 7550db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi 7650db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi AK_FORCE_INLINE int getIntOption(const int key) const { 7750db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi if (isValidKey(key)) { 7850db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi return mOptions[key]; 7950db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi } 8050db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi return 0; 8150db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi } 8250db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi}; 8350db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi} // namespace latinime 8450db5f0fffdc35e9fe0bed27e7d630d571727e06Keisuke Kuroyanagi#endif // LATINIME_SUGGEST_OPTIONS_H 85