@Override
 public final boolean addWord(String word, int frequency) {
   if (mActualDictionary != null) {
     return mActualDictionary.addWord(word, frequency);
   } else {
     Logger.d(TAG, "There is no actual dictionary to use for adding word! How come?");
     return false;
   }
 }
  public static List<KeyboardAddOnAndBuilder> getEnabledKeyboards(Context askContext) {
    final List<KeyboardAddOnAndBuilder> allAddOns = msInstance.getAllAddOns(askContext);
    Logger.i(
        TAG, "Creating enabled addons list. I have a total of " + allAddOns.size() + " addons");

    // getting shared prefs to determine which to create.
    final SharedPreferences sharedPreferences =
        PreferenceManager.getDefaultSharedPreferences(askContext);

    final ArrayList<KeyboardAddOnAndBuilder> enabledAddOns = new ArrayList<>();
    for (int addOnIndex = 0; addOnIndex < allAddOns.size(); addOnIndex++) {
      final KeyboardAddOnAndBuilder addOn = allAddOns.get(addOnIndex);

      final boolean addOnEnabled =
          sharedPreferences.getBoolean(addOn.getId(), addOn.getKeyboardDefaultEnabled());

      if (addOnEnabled) {
        enabledAddOns.add(addOn);
      }
    }

    // Fix: issue 219
    // Check if there is any keyboards created if not, lets create a default english keyboard
    if (enabledAddOns.size() == 0) {
      final SharedPreferences.Editor editor = sharedPreferences.edit();
      final KeyboardAddOnAndBuilder addOn = allAddOns.get(0);
      editor.putBoolean(addOn.getId(), true);
      SharedPreferencesCompat.EditorCompat.getInstance().apply(editor);
      enabledAddOns.add(addOn);
    }

    if (BuildConfig.TESTING_BUILD) {
      for (final KeyboardAddOnAndBuilder addOn : enabledAddOns) {
        Logger.d(TAG, "Factory provided addon: %s", addOn.getId());
      }
    }

    return enabledAddOns;
  }
  @Override
  protected KeyboardAddOnAndBuilder createConcreteAddOn(
      Context askContext,
      Context context,
      String prefId,
      int nameId,
      String description,
      int sortIndex,
      AttributeSet attrs) {
    final int layoutResId =
        attrs.getAttributeResourceValue(null, XML_LAYOUT_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID);
    final int landscapeLayoutResId =
        attrs.getAttributeResourceValue(
            null, XML_LANDSCAPE_LAYOUT_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID);
    final int iconResId =
        attrs.getAttributeResourceValue(
            null, XML_ICON_RES_ID_ATTRIBUTE, R.drawable.sym_keyboard_notification_icon);
    final String defaultDictionary = attrs.getAttributeValue(null, XML_DICTIONARY_NAME_ATTRIBUTE);
    final String additionalIsLetterExceptions =
        attrs.getAttributeValue(null, XML_ADDITIONAL_IS_LETTER_EXCEPTIONS_ATTRIBUTE);
    String sentenceSeparators =
        attrs.getAttributeValue(null, XML_SENTENCE_SEPARATOR_CHARACTERS_ATTRIBUTE);
    if (TextUtils.isEmpty(sentenceSeparators)) sentenceSeparators = DEFAULT_SENTENCE_SEPARATORS;
    final int physicalTranslationResId =
        attrs.getAttributeResourceValue(
            null, XML_PHYSICAL_TRANSLATION_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID);
    // A keyboard is enabled by default if it is the first one (index==1)
    final boolean keyboardDefault =
        attrs.getAttributeBooleanValue(null, XML_DEFAULT_ATTRIBUTE, sortIndex == 1);

    // asserting
    if ((prefId == null)
        || (nameId == AddOn.INVALID_RES_ID)
        || (layoutResId == AddOn.INVALID_RES_ID)) {
      Logger.e(
          TAG,
          "External Keyboard does not include all mandatory details! Will not create keyboard.");
      return null;
    } else {
      if (BuildConfig.DEBUG) {
        Logger.d(
            TAG,
            "External keyboard details: prefId:"
                + prefId
                + " nameId:"
                + nameId
                + " resId:"
                + layoutResId
                + " landscapeResId:"
                + landscapeLayoutResId
                + " iconResId:"
                + iconResId
                + " defaultDictionary:"
                + defaultDictionary);
      }
      return new KeyboardAddOnAndBuilder(
          askContext,
          context,
          prefId,
          nameId,
          layoutResId,
          landscapeLayoutResId,
          defaultDictionary,
          iconResId,
          physicalTranslationResId,
          additionalIsLetterExceptions,
          sentenceSeparators,
          description,
          sortIndex,
          keyboardDefault);
    }
  }