Java tutorial
/* * Copyright (c) 2015 Menny Even-Danan * * 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.anysoftkeyboard.quicktextkeys; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v4.content.SharedPreferencesCompat; import android.text.TextUtils; import android.util.AttributeSet; import com.anysoftkeyboard.addons.AddOn; import com.anysoftkeyboard.addons.AddOnsFactory; import com.menny.android.anysoftkeyboard.R; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; public class QuickTextKeyFactory extends AddOnsFactory<QuickTextKey> { private static final QuickTextKeyFactory msInstance; private static final String XML_POPUP_KEYBOARD_RES_ID_ATTRIBUTE = "popupKeyboard"; private static final String XML_POPUP_LIST_TEXT_RES_ID_ATTRIBUTE = "popupListText"; private static final String XML_POPUP_LIST_OUTPUT_RES_ID_ATTRIBUTE = "popupListOutput"; private static final String XML_POPUP_LIST_ICONS_RES_ID_ATTRIBUTE = "popupListIcons"; private static final String XML_ICON_RES_ID_ATTRIBUTE = "keyIcon"; private static final String XML_KEY_LABEL_RES_ID_ATTRIBUTE = "keyLabel"; private static final String XML_KEY_OUTPUT_TEXT_RES_ID_ATTRIBUTE = "keyOutputText"; private static final String XML_ICON_PREVIEW_RES_ID_ATTRIBUTE = "iconPreview"; static { msInstance = new QuickTextKeyFactory(); } private QuickTextKeyFactory() { super("ASK_QKF", "com.anysoftkeyboard.plugin.QUICK_TEXT_KEY", "com.anysoftkeyboard.plugindata.quicktextkeys", "QuickTextKeys", "QuickTextKey", R.xml.quick_text_keys, true); } public static QuickTextKey getCurrentQuickTextKey(Context context) { return getOrderedEnabledQuickKeys(context).get(0); } public static List<QuickTextKey> getAllAvailableQuickKeys(Context applicationContext) { List<QuickTextKey> list = msInstance.getAllAddOns(applicationContext); //for now, only supporting popup-keyboard addons. List<QuickTextKey> filteredList = new ArrayList<>(list.size()); for (QuickTextKey quickTextKey : list) { filteredList.add(quickTextKey); } return Collections.unmodifiableList(filteredList); } public static void storeOrderedEnabledQuickKeys(Context applicationContext, List<QuickTextKey> orderedKeys) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext); String settingKey = applicationContext.getString(R.string.settings_key_ordered_active_quick_text_keys); Set<String> storedKeys = new HashSet<>(); List<String> quickKeyIdOrder = new ArrayList<>(orderedKeys.size()); for (QuickTextKey key : orderedKeys) { final String id = key.getId(); if (!storedKeys.contains(id)) quickKeyIdOrder.add(id); storedKeys.add(id); } SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(settingKey, TextUtils.join(",", quickKeyIdOrder)); SharedPreferencesCompat.EditorCompat.getInstance().apply(editor); } public static List<QuickTextKey> getOrderedEnabledQuickKeys(Context applicationContext) { List<QuickTextKey> quickTextKeys = new ArrayList<>(getAllAvailableQuickKeys(applicationContext)); //now, reading the ordered array of active keys SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext); String settingKey = applicationContext.getString(R.string.settings_key_ordered_active_quick_text_keys); List<String> quickKeyIdDefaultOrder = new ArrayList<>(quickTextKeys.size()); for (QuickTextKey key : quickTextKeys) { quickKeyIdDefaultOrder.add(key.getId()); } String quickKeyIdsOrderValue = sharedPreferences.getString(settingKey, TextUtils.join(",", quickKeyIdDefaultOrder)); String[] quickKeyIdsOrder = TextUtils.split(quickKeyIdsOrderValue, ","); ArrayList<QuickTextKey> orderedQuickTextKeys = new ArrayList<>(quickKeyIdsOrder.length); for (String keyId : quickKeyIdsOrder) { QuickTextKey addOn = msInstance.getAddOnById(keyId, applicationContext); if (addOn != null) orderedQuickTextKeys.add(addOn); } //forcing at least one key if (orderedQuickTextKeys.size() == 0) orderedQuickTextKeys.add(quickTextKeys.get(0)); return orderedQuickTextKeys; } @Override protected QuickTextKey createConcreteAddOn(Context askContext, Context context, String prefId, int nameResId, String description, boolean isHidden, int sortIndex, AttributeSet attrs) { final int popupKeyboardResId = attrs.getAttributeResourceValue(null, XML_POPUP_KEYBOARD_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID); final int popupListTextResId = attrs.getAttributeResourceValue(null, XML_POPUP_LIST_TEXT_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID); final int popupListOutputResId = attrs.getAttributeResourceValue(null, XML_POPUP_LIST_OUTPUT_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID); final int popupListIconsResId = attrs.getAttributeResourceValue(null, XML_POPUP_LIST_ICONS_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID); final int iconResId = attrs.getAttributeResourceValue(null, XML_ICON_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID); // Maybe should make a default final CharSequence keyLabel = getTextFromResourceOrText(context, attrs, XML_KEY_LABEL_RES_ID_ATTRIBUTE); final CharSequence keyOutputText = getTextFromResourceOrText(context, attrs, XML_KEY_OUTPUT_TEXT_RES_ID_ATTRIBUTE); final int keyIconPreviewResId = attrs.getAttributeResourceValue(null, XML_ICON_PREVIEW_RES_ID_ATTRIBUTE, AddOn.INVALID_RES_ID); if (((popupKeyboardResId == AddOn.INVALID_RES_ID) && ((popupListTextResId == AddOn.INVALID_RES_ID) || (popupListOutputResId == AddOn.INVALID_RES_ID))) || ((iconResId == AddOn.INVALID_RES_ID) && (keyLabel == null)) || (keyOutputText == null)) { String detailMessage = String.format(Locale.US, "Missing details for creating QuickTextKey! prefId %s, popupKeyboardResId: %d, popupListTextResId: %d, popupListOutputResId: %d, (iconResId: %d, keyLabel: %s), keyOutputText: %s", prefId, popupKeyboardResId, popupListTextResId, popupListOutputResId, iconResId, keyLabel, keyOutputText); throw new RuntimeException(detailMessage); } return new QuickTextKey(askContext, context, prefId, nameResId, popupKeyboardResId, popupListTextResId, popupListOutputResId, popupListIconsResId, iconResId, keyLabel, keyOutputText, keyIconPreviewResId, isHidden, description, sortIndex); } @Nullable private CharSequence getTextFromResourceOrText(Context context, AttributeSet attrs, String attributeName) { final int keyLabelResId = attrs.getAttributeResourceValue(null, attributeName, AddOn.INVALID_RES_ID); if (keyLabelResId != AddOn.INVALID_RES_ID) { return context.getResources().getText(keyLabelResId); } else { return null; } } }