1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.inputmethod.latin; 18 19 import com.android.inputmethod.keyboard.ProximityInfo; 20 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; 21 import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion; 22 23 import java.util.ArrayList; 24 import java.util.Locale; 25 import java.util.concurrent.locks.ReentrantReadWriteLock; 26 27 /** 28 * This class provides binary dictionary reading operations with locking. An instance of this class 29 * can be used by multiple threads. Note that different session IDs must be used when multiple 30 * threads get suggestions using this class. 31 */ 32 public final class ReadOnlyBinaryDictionary extends Dictionary { 33 /** 34 * A lock for accessing binary dictionary. Only closing binary dictionary is the operation 35 * that change the state of dictionary. 36 */ 37 private final ReentrantReadWriteLock mLock = new ReentrantReadWriteLock(); 38 39 private final BinaryDictionary mBinaryDictionary; 40 ReadOnlyBinaryDictionary(final String filename, final long offset, final long length, final boolean useFullEditDistance, final Locale locale, final String dictType)41 public ReadOnlyBinaryDictionary(final String filename, final long offset, final long length, 42 final boolean useFullEditDistance, final Locale locale, final String dictType) { 43 super(dictType); 44 mBinaryDictionary = new BinaryDictionary(filename, offset, length, useFullEditDistance, 45 locale, dictType, false /* isUpdatable */); 46 } 47 isValidDictionary()48 public boolean isValidDictionary() { 49 return mBinaryDictionary.isValidDictionary(); 50 } 51 52 @Override getSuggestions(final WordComposer composer, final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, final SettingsValuesForSuggestion settingsValuesForSuggestion, final int sessionId, final float[] inOutLanguageWeight)53 public ArrayList<SuggestedWordInfo> getSuggestions(final WordComposer composer, 54 final PrevWordsInfo prevWordsInfo, final ProximityInfo proximityInfo, 55 final SettingsValuesForSuggestion settingsValuesForSuggestion, 56 final int sessionId, final float[] inOutLanguageWeight) { 57 if (mLock.readLock().tryLock()) { 58 try { 59 return mBinaryDictionary.getSuggestions(composer, prevWordsInfo, proximityInfo, 60 settingsValuesForSuggestion, sessionId, inOutLanguageWeight); 61 } finally { 62 mLock.readLock().unlock(); 63 } 64 } 65 return null; 66 } 67 68 @Override isInDictionary(final String word)69 public boolean isInDictionary(final String word) { 70 if (mLock.readLock().tryLock()) { 71 try { 72 return mBinaryDictionary.isInDictionary(word); 73 } finally { 74 mLock.readLock().unlock(); 75 } 76 } 77 return false; 78 } 79 80 @Override shouldAutoCommit(final SuggestedWordInfo candidate)81 public boolean shouldAutoCommit(final SuggestedWordInfo candidate) { 82 if (mLock.readLock().tryLock()) { 83 try { 84 return mBinaryDictionary.shouldAutoCommit(candidate); 85 } finally { 86 mLock.readLock().unlock(); 87 } 88 } 89 return false; 90 } 91 92 @Override getFrequency(final String word)93 public int getFrequency(final String word) { 94 if (mLock.readLock().tryLock()) { 95 try { 96 return mBinaryDictionary.getFrequency(word); 97 } finally { 98 mLock.readLock().unlock(); 99 } 100 } 101 return NOT_A_PROBABILITY; 102 } 103 104 @Override getMaxFrequencyOfExactMatches(final String word)105 public int getMaxFrequencyOfExactMatches(final String word) { 106 if (mLock.readLock().tryLock()) { 107 try { 108 return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); 109 } finally { 110 mLock.readLock().unlock(); 111 } 112 } 113 return NOT_A_PROBABILITY; 114 } 115 116 @Override close()117 public void close() { 118 mLock.writeLock().lock(); 119 try { 120 mBinaryDictionary.close(); 121 } finally { 122 mLock.writeLock().unlock(); 123 } 124 } 125 } 126