// here codes represents codes for word1
 private int calculateSimilarity(WordComposer composer, CharSequence word2) {
   int score = 0;
   CharSequence word1 = composer.getTypedWord();
   int length = word1.length() < word2.length() ? word1.length() : word2.length();
   for (int i = 0; i < length; i++) {
     char c1 = word1.charAt(i);
     char c2 = word2.charAt(i);
     if (c1 == c2) {
       score++;
     } else {
       // check code similarity?
       int[] codes = composer.getCodesAt(i);
       for (int code : codes) {
         if ((char) code == c2) {
           score++;
         }
       }
     }
   }
   if (word1.charAt(word1.length() - 1) == word2.charAt(word2.length() - 1)) {
     score += 3;
   }
   score -= Math.abs(word2.length() - word1.length()) / 2;
   return score;
 }
  @Override
  public void getBigrams(
      final WordComposer composer,
      final CharSequence previousWord,
      final WordCallback callback,
      int[] nextLettersFrequencies) {
    CharSequence typed = composer.getTypedWord();
    if (guesses == null) {
      guesses = new ArrayList<String>(maxGuesses);
    }

    if (isValidWord(typed) && !guesses.contains(typed)) {
      guesses.add(0, typed.toString());
    }

    if (typed == null || previousWord == null) {
      return;
    }
    if (typed.length() == 0 || previousWord.length() == 0) {
      return;
    }
    int minDist = Integer.MAX_VALUE;
    // int maxScore = 0;
    String firstChar = String.valueOf(typed.charAt(0));
    String[] projection = {Bigrams.WORD1, Bigrams.WORD2, Bigrams.FREQ};
    String selection =
        "SUBSTR("
            + Bigrams.WORD2
            + ", 1, 1)=? AND "
            + Bigrams.LENGTH1
            + "<? AND "
            + Bigrams.LENGTH2
            + "<?";
    String[] selectionArgs = {
      firstChar,
      String.valueOf(previousWord.length() + maxLengthDiff),
      String.valueOf(typed.length() + maxLengthDiff)
    };
    String sortOrder = Bigrams.FREQ + " DESC";
    Cursor c =
        mContentResolver.query(
            Bigrams.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
    while (c.moveToNext()) {
      String[] guessed = {c.getString(0), c.getString(1)};
      if (!guesses.contains(guessed[1])) {
        int distance = levenshteinDistance(typed, guessed[0]);
        distance += levenshteinDistance(previousWord.toString(), guessed[1]);
        if (distance <= minDist && !guesses.contains(guessed[1])) {
          minDist = distance;
          int i = guesses.contains(typed) ? 1 : 0;
          guesses.add(i, guessed[1]);
        }

        if (guesses.size() == maxGuesses) {
          break;
        }
      }
    }
    c.close();
  }
  public void getWordsFromSwype(WordComposer composer) {
    CharSequence typed = composer.getTypedWord();
    if (typed == null || typed.length() == 0) {
      return;
    }
    int minDist = Integer.MAX_VALUE;
    if (isValidWord(typed) && !guesses.contains(typed)) {
      guesses.add(0, typed.toString());
    }
    String firstChar = String.valueOf(typed.charAt(0));
    String[] projection = {Unigrams.TOKEN, Unigrams.FREQ};
    String selection = Unigrams.LENGTH + "<? AND SUBSTR(" + Unigrams.TOKEN + ", 1, 1)=?";
    String[] selectionArgs = {String.valueOf(typed.length() + maxLengthDiff), firstChar};
    Cursor c =
        mContentResolver.query(
            Unigrams.CONTENT_URI, projection, selection, selectionArgs, Unigrams.FREQ + " DESC");
    while (c.moveToNext()) {
      String curString = c.getString(0);

      int distance = levenshteinDistance(typed, curString);
      if (distance <= minDist && !guesses.contains(curString)) {
        minDist = distance;
        int i = guesses.contains(typed) ? 1 : 0;
        guesses.add(i, curString);
      }
      if (guesses.size() == maxGuesses) {
        break;
      }
    }
    c.close();
  }
  @Override
  public void getWords(WordComposer composer, WordCallback callback, int[] nextLettersFrequencies) {
    CharSequence typed = composer.getTypedWord();
    // int maxScore = 0;
    int minDist = Integer.MAX_VALUE;
    if (typed == null || typed.length() == 0) {
      return;
    }
    String firstChar = String.valueOf(typed.charAt(0));
    String[] projection = {Unigrams.TOKEN, Unigrams.FREQ};
    String selection = Unigrams.LENGTH + "<? AND SUBSTR(" + Unigrams.TOKEN + ", 1, 1)=?";
    String[] selectionArgs = {String.valueOf(typed.length() + maxLengthDiff), firstChar};
    Cursor c =
        mContentResolver.query(
            Unigrams.CONTENT_URI, projection, selection, selectionArgs, Unigrams.FREQ + " DESC");
    while (c.moveToNext()) {
      String curString = c.getString(0);
      int distance = levenshteinDistance(typed, curString);
      if (distance <= minDist && !guesses.contains(curString)) {
        minDist = distance;
        guesses.add(0, curString);
      }
      /*int score = calculateSimilarity(composer, curString);
      			//This is mad sketchy
      //			if(score >= maxScore && !guesses.contains(curString)){
      				maxScore = score;
      				guesses.add(0, curString);
      			}*/

      if (guesses.size() == maxGuesses) {
        break;
      }
    }
    c.close();
    // TODO: callback business?
  }