Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8837deab authored by Satoshi Kataoka's avatar Satoshi Kataoka Committed by Android (Google) Code Review
Browse files

Merge "Fix Emoji recents"

parents 256937b4 ea7bfa5c
Loading
Loading
Loading
Loading
+1 −4
Original line number Original line Diff line number Diff line
@@ -505,10 +505,7 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange


    @Override
    @Override
    public void onKeyClick(final Key key) {
    public void onKeyClick(final Key key) {
        // TODO: Save emoticons to recents
        if (mEmojiCategory.getCurrentCategoryId() != CATEGORY_ID_EMOTICONS) {
        mEmojiKeyboardAdapter.addRecentKey(key);
        mEmojiKeyboardAdapter.addRecentKey(key);
        }
        mEmojiCategory.saveLastTypedCategoryPage();
        mEmojiCategory.saveLastTypedCategoryPage();
        final int code = key.getCode();
        final int code = key.getCode();
        if (code == Constants.CODE_OUTPUT_TEXT) {
        if (code == Constants.CODE_OUTPUT_TEXT) {
+9 −0
Original line number Original line Diff line number Diff line
@@ -155,6 +155,15 @@ public class Keyboard {
        return mKeys;
        return mKeys;
    }
    }


    public Key getKeyFromOutputText(final String outputText) {
        for (final Key key : getKeys()) {
            if (outputText.equals(key.getOutputText())) {
                return key;
            }
        }
        return null;
    }

    public Key getKey(final int code) {
    public Key getKey(final int code) {
        if (code == Constants.CODE_UNSPECIFIED) {
        if (code == Constants.CODE_UNSPECIFIED) {
            return null;
            return null;
+38 −16
Original line number Original line Diff line number Diff line
@@ -18,25 +18,27 @@ package com.android.inputmethod.keyboard.internal;


import android.content.SharedPreferences;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Log;


import com.android.inputmethod.keyboard.EmojiKeyboardView;
import com.android.inputmethod.keyboard.EmojiKeyboardView;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.StringUtils;


import java.util.ArrayDeque;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collection;
import java.util.List;


/**
/**
 * This is a Keyboard class where you can add keys dynamically shown in a grid layout
 * This is a Keyboard class where you can add keys dynamically shown in a grid layout
 */
 */
public class DynamicGridKeyboard extends Keyboard {
public class DynamicGridKeyboard extends Keyboard {
    private static final String TAG = DynamicGridKeyboard.class.getSimpleName();
    private static final int TEMPLATE_KEY_CODE_0 = 0x30;
    private static final int TEMPLATE_KEY_CODE_0 = 0x30;
    private static final int TEMPLATE_KEY_CODE_1 = 0x31;
    private static final int TEMPLATE_KEY_CODE_1 = 0x31;
    // Recent codes are saved as an integer array, so we use comma as a separater.
    private static final String RECENT_KEY_SEPARATOR = Constants.STRING_COMMA;


    private final SharedPreferences mPrefs;
    private final SharedPreferences mPrefs;
    private final int mLeftPadding;
    private final int mLeftPadding;
@@ -84,6 +86,9 @@ public class DynamicGridKeyboard extends Keyboard {
    }
    }


    private void addKey(final Key usedKey, final boolean addFirst) {
    private void addKey(final Key usedKey, final boolean addFirst) {
        if (usedKey == null) {
            return;
        }
        synchronized (mGridKeys) {
        synchronized (mGridKeys) {
            mCachedGridKeys = null;
            mCachedGridKeys = null;
            final GridKey key = new GridKey(usedKey);
            final GridKey key = new GridKey(usedKey);
@@ -109,27 +114,44 @@ public class DynamicGridKeyboard extends Keyboard {
    }
    }


    private void saveRecentKeys() {
    private void saveRecentKeys() {
        final StringBuilder sb = new StringBuilder();
        final ArrayList<Object> keys = CollectionUtils.newArrayList();
        for (final Key key : mGridKeys) {
        for (final Key key : mGridKeys) {
            sb.append(key.getCode()).append(RECENT_KEY_SEPARATOR);
            if (key.getOutputText() != null) {
                keys.add(key.getOutputText());
            } else {
                keys.add(key.getCode());
            }
            }
        Settings.writeEmojiRecentKeys(mPrefs, sb.toString());
        }
        }

        final String jsonStr = StringUtils.listToJsonStr(keys);
    public void loadRecentKeys(Collection<DynamicGridKeyboard> keyboards) {
        Settings.writeEmojiRecentKeys(mPrefs, jsonStr);
        final String str = Settings.readEmojiRecentKeys(mPrefs);
        for (String s : str.split(RECENT_KEY_SEPARATOR)) {
            if (TextUtils.isEmpty(s)) {
                continue;
    }
    }
            final int code = Integer.valueOf(s);

            for (DynamicGridKeyboard kbd : keyboards) {
    private static Key getKey(final Collection<DynamicGridKeyboard> keyboards, final Object o) {
        for (final DynamicGridKeyboard kbd : keyboards) {
            if (o instanceof Integer) {
                final int code = (Integer) o;
                final Key key = kbd.getKey(code);
                final Key key = kbd.getKey(code);
                if (key != null) {
                if (key != null) {
                    addKeyLast(key);
                    return key;
                    break;
                }
            } else if (o instanceof String) {
                final String outputText = (String) o;
                final Key key = kbd.getKeyFromOutputText(outputText);
                if (key != null) {
                    return key;
                }
            } else {
                Log.w(TAG, "Invalid object: " + o);
            }
            }
        }
        }
        return null;
    }

    public void loadRecentKeys(Collection<DynamicGridKeyboard> keyboards) {
        final String str = Settings.readEmojiRecentKeys(mPrefs);
        final List<Object> keys = StringUtils.jsonStrToList(str);
        for (final Object o : keys) {
            addKeyLast(getKey(keyboards, o));
        }
        }
    }
    }


+0 −1
Original line number Original line Diff line number Diff line
@@ -221,7 +221,6 @@ public final class Constants {
    }
    }


    public static final int MAX_INT_BIT_COUNT = 32;
    public static final int MAX_INT_BIT_COUNT = 32;
    public static final String STRING_COMMA = ",";


    private Constants() {
    private Constants() {
        // This utility class is not publicly instantiable.
        // This utility class is not publicly instantiable.
+74 −2
Original line number Original line Diff line number Diff line
@@ -16,16 +16,25 @@


package com.android.inputmethod.latin.utils;
package com.android.inputmethod.latin.utils;


import android.text.TextUtils;

import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.Constants;
import com.android.inputmethod.latin.settings.SettingsValues;
import com.android.inputmethod.latin.settings.SettingsValues;


import android.text.TextUtils;
import android.util.JsonReader;
import android.util.JsonWriter;
import android.util.Log;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Locale;


public final class StringUtils {
public final class StringUtils {
    private static final String TAG = StringUtils.class.getSimpleName();
    public static final int CAPITALIZE_NONE = 0;  // No caps, or mixed case
    public static final int CAPITALIZE_NONE = 0;  // No caps, or mixed case
    public static final int CAPITALIZE_FIRST = 1; // First only
    public static final int CAPITALIZE_FIRST = 1; // First only
    public static final int CAPITALIZE_ALL = 2;   // All caps
    public static final int CAPITALIZE_ALL = 2;   // All caps
@@ -390,4 +399,67 @@ public final class StringUtils {
        }
        }
        return bytes;
        return bytes;
    }
    }

    public static List<Object> jsonStrToList(String s) {
        final ArrayList<Object> retval = CollectionUtils.newArrayList();
        final JsonReader reader = new JsonReader(new StringReader(s));
        try {
            reader.beginArray();
            while(reader.hasNext()) {
                reader.beginObject();
                while (reader.hasNext()) {
                    final String name = reader.nextName();
                    if (name.equals(Integer.class.getSimpleName())) {
                        retval.add(reader.nextInt());
                    } else if (name.equals(String.class.getSimpleName())) {
                        retval.add(reader.nextString());
                    } else {
                        Log.w(TAG, "Invalid name: " + name);
                        reader.skipValue();
                    }
                }
                reader.endObject();
            }
            reader.endArray();
            return retval;
        } catch (IOException e) {
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
            }
        }
        return Collections.<Object>emptyList();
    }

    public static String listToJsonStr(List<Object> list) {
        if (list == null || list.isEmpty()) {
            return "";
        }
        final StringWriter sw = new StringWriter();
        final JsonWriter writer = new JsonWriter(sw);
        try {
            writer.beginArray();
            for (final Object o : list) {
                writer.beginObject();
                if (o instanceof Integer) {
                    writer.name(Integer.class.getSimpleName()).value((Integer)o);
                } else if (o instanceof String) {
                    writer.name(String.class.getSimpleName()).value((String)o);
                }
                writer.endObject();
            }
            writer.endArray();
            return sw.toString();
        } catch (IOException e) {
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
            }
        }
        return "";
    }
}
}
Loading