Merge branch 'dslul:master' into master

This commit is contained in:
Md. Rifat Hasan Jihan 2021-12-08 20:29:10 +06:00 committed by GitHub
commit 9342748335
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
78 changed files with 929 additions and 386 deletions

View file

@ -76,6 +76,15 @@ final class DynamicGridKeyboard extends Keyboard {
throw new RuntimeException("Can't find template key: code=" + code);
}
public int getDynamicOccupiedHeight() {
final int row = (mGridKeys.size() - 1) / mColumnsNum + 1;
return row * mVerticalStep;
}
public int getColumnsCount() {
return mColumnsNum;
}
public void addPendingKey(final Key usedKey) {
synchronized (mLock) {
mPendingKeys.addLast(usedKey);

View file

@ -21,9 +21,7 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.util.Log;
import android.util.Pair;
import androidx.core.graphics.PaintCompat;
import org.dslul.openboard.inputmethod.keyboard.Key;
@ -56,6 +54,8 @@ final class EmojiCategory {
private static final int ID_FLAGS = 9;
private static final int ID_EMOTICONS = 10;
private static final int MAX_LINE_COUNT_PER_PAGE = 3;
public final class CategoryProperties {
public final int mCategoryId;
public final int mPageCount;
@ -119,7 +119,7 @@ final class EmojiCategory {
private final SharedPreferences mPrefs;
private final Resources mRes;
private final int mMaxPageKeyCount;
private final int mMaxRecentsKeyCount;
private final KeyboardLayoutSet mLayoutSet;
private final HashMap<String, Integer> mCategoryNameToIdMap = new HashMap<>();
private final int[] mCategoryTabIconId = new int[sCategoryName.length];
@ -134,7 +134,7 @@ final class EmojiCategory {
final KeyboardLayoutSet layoutSet, final TypedArray emojiPaletteViewAttr) {
mPrefs = prefs;
mRes = res;
mMaxPageKeyCount = res.getInteger(R.integer.config_emoji_keyboard_max_page_key_count);
mMaxRecentsKeyCount = res.getInteger(R.integer.config_emoji_keyboard_max_recents_key_count);
mLayoutSet = layoutSet;
for (int i = 0; i < sCategoryName.length; ++i) {
mCategoryNameToIdMap.put(sCategoryName[i], i);
@ -170,7 +170,7 @@ final class EmojiCategory {
mCurrentCategoryId = defaultCategoryId;
}
if (mCurrentCategoryPageId >= getCategoryPageCount(mCurrentCategoryId)) {
if (mCurrentCategoryPageId >= computeCategoryPageCount(mCurrentCategoryId)) {
mCurrentCategoryPageId = 0;
}
}
@ -179,7 +179,7 @@ final class EmojiCategory {
// Load a keyboard of categoryId
getKeyboard(categoryId, 0 /* categoryPageId */);
final CategoryProperties properties =
new CategoryProperties(categoryId, getCategoryPageCount(categoryId));
new CategoryProperties(categoryId, computeCategoryPageCount(categoryId));
mShownCategories.add(properties);
}
@ -217,11 +217,11 @@ final class EmojiCategory {
return mCurrentCategoryId;
}
public int getCurrentCategoryPageSize() {
return getCategoryPageSize(mCurrentCategoryId);
public int getCurrentCategoryPageCount() {
return getCategoryPageCount(mCurrentCategoryId);
}
public int getCategoryPageSize(final int categoryId) {
public int getCategoryPageCount(final int categoryId) {
for (final CategoryProperties prop : mShownCategories) {
if (prop.mCategoryId == categoryId) {
return prop.mPageCount;
@ -283,38 +283,21 @@ final class EmojiCategory {
return getTabIdFromCategoryId(EmojiCategory.ID_RECENTS);
}
private int getCategoryPageCount(final int categoryId) {
private int computeCategoryPageCount(final int categoryId) {
final Keyboard keyboard = mLayoutSet.getKeyboard(sCategoryElementId[categoryId]);
return (keyboard.getSortedKeys().size() - 1) / mMaxPageKeyCount + 1;
return (keyboard.getSortedKeys().size() - 1) / computeMaxKeyCountPerPage() + 1;
}
// Returns a pair of the category id and the category page id from the view pager's page
// position. The category page id is numbered in each category. And the view page position
// is the position of the current shown page in the view pager which contains all pages of
// all categories.
public Pair<Integer, Integer> getCategoryIdAndPageIdFromPagePosition(final int position) {
int sum = 0;
for (final CategoryProperties properties : mShownCategories) {
final int temp = sum;
sum += properties.mPageCount;
if (sum > position) {
return new Pair<>(properties.mCategoryId, position - temp);
}
// Returns a keyboard from the recycler view's adapter position.
public DynamicGridKeyboard getKeyboardFromAdapterPosition(final int position) {
if (position >= 0 && position < getCurrentCategoryPageCount()) {
return getKeyboard(mCurrentCategoryId, position);
}
Log.w(TAG, "invalid position for categoryId : " + mCurrentCategoryId);
return null;
}
// Returns a keyboard from the view pager's page position.
public DynamicGridKeyboard getKeyboardFromPagePosition(final int position) {
final Pair<Integer, Integer> categoryAndId =
getCategoryIdAndPageIdFromPagePosition(position);
if (categoryAndId != null) {
return getKeyboard(categoryAndId.first, categoryAndId.second);
}
return null;
}
private static final Long getCategoryKeyboardMapKey(final int categoryId, final int id) {
private static Long getCategoryKeyboardMapKey(final int categoryId, final int id) {
return (((long) categoryId) << Integer.SIZE) | id;
}
@ -328,19 +311,20 @@ final class EmojiCategory {
if (categoryId == EmojiCategory.ID_RECENTS) {
final DynamicGridKeyboard kbd = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
mMaxPageKeyCount, categoryId);
mMaxRecentsKeyCount, categoryId);
mCategoryKeyboardMap.put(categoryKeyboardMapKey, kbd);
return kbd;
}
final Keyboard keyboard = mLayoutSet.getKeyboard(sCategoryElementId[categoryId]);
final Key[][] sortedKeys = sortKeysIntoPages(
keyboard.getSortedKeys(), mMaxPageKeyCount);
for (int pageId = 0; pageId < sortedKeys.length; ++pageId) {
final int keyCountPerPage = computeMaxKeyCountPerPage();
final Key[][] sortedKeysPages = sortKeysGrouped(
keyboard.getSortedKeys(), keyCountPerPage);
for (int pageId = 0; pageId < sortedKeysPages.length; ++pageId) {
final DynamicGridKeyboard tempKeyboard = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
mMaxPageKeyCount, categoryId);
for (final Key emojiKey : sortedKeys[pageId]) {
keyCountPerPage, categoryId);
for (final Key emojiKey : sortedKeysPages[pageId]) {
if (emojiKey == null) {
break;
}
@ -353,37 +337,33 @@ final class EmojiCategory {
}
}
public int getTotalPageCountOfAllCategories() {
int sum = 0;
for (CategoryProperties properties : mShownCategories) {
sum += properties.mPageCount;
}
return sum;
private int computeMaxKeyCountPerPage() {
final DynamicGridKeyboard tempKeyboard = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
0, 0);
return MAX_LINE_COUNT_PER_PAGE * tempKeyboard.getColumnsCount();
}
private static Comparator<Key> EMOJI_KEY_COMPARATOR = new Comparator<Key>() {
@Override
public int compare(final Key lhs, final Key rhs) {
final Rect lHitBox = lhs.getHitBox();
final Rect rHitBox = rhs.getHitBox();
if (lHitBox.top < rHitBox.top) {
return -1;
} else if (lHitBox.top > rHitBox.top) {
return 1;
}
if (lHitBox.left < rHitBox.left) {
return -1;
} else if (lHitBox.left > rHitBox.left) {
return 1;
}
if (lhs.getCode() == rhs.getCode()) {
return 0;
}
return lhs.getCode() < rhs.getCode() ? -1 : 1;
private static final Comparator<Key> EMOJI_KEY_COMPARATOR = (lhs, rhs) -> {
final Rect lHitBox = lhs.getHitBox();
final Rect rHitBox = rhs.getHitBox();
if (lHitBox.top < rHitBox.top) {
return -1;
} else if (lHitBox.top > rHitBox.top) {
return 1;
}
if (lHitBox.left < rHitBox.left) {
return -1;
} else if (lHitBox.left > rHitBox.left) {
return 1;
}
if (lhs.getCode() == rhs.getCode()) {
return 0;
}
return lhs.getCode() < rhs.getCode() ? -1 : 1;
};
private static Key[][] sortKeysIntoPages(final List<Key> inKeys, final int maxPageCount) {
private static Key[][] sortKeysGrouped(final List<Key> inKeys, final int maxPageCount) {
final ArrayList<Key> keys = new ArrayList<>(inKeys);
Collections.sort(keys, EMOJI_KEY_COMPARATOR);
final int pageCount = (keys.size() - 1) / maxPageCount + 1;

View file

@ -61,9 +61,9 @@ public final class EmojiCategoryPageIndicatorView extends View {
final float height = getHeight();
final float width = getWidth();
final float unitWidth = width / mCategoryPageSize;
final float left = unitWidth * mCurrentCategoryPageId + mOffset * unitWidth;
final float left = Math.min(unitWidth * mCurrentCategoryPageId + mOffset * unitWidth, width - unitWidth);
final float top = 0.0f;
final float right = left + unitWidth;
final float right = Math.min(left + unitWidth, width);
final float bottom = height * BOTTOM_MARGIN_RATIO;
canvas.drawRect(left, top, right, bottom, mPaint);
}

View file

@ -20,17 +20,16 @@ import android.content.res.Resources;
import android.view.View;
import android.widget.LinearLayout;
import androidx.recyclerview.widget.RecyclerView;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
final class EmojiLayoutParams {
private static final int DEFAULT_KEYBOARD_ROWS = 4;
public final int mEmojiPagerHeight;
private final int mEmojiPagerBottomMargin;
public final int mEmojiListHeight;
private final int mEmojiListBottomMargin;
public final int mEmojiKeyboardHeight;
private final int mEmojiCategoryPageIdViewHeight;
public final int mEmojiActionBarHeight;
@ -56,16 +55,16 @@ final class EmojiLayoutParams {
+ mKeyVerticalGap;
mEmojiActionBarHeight = baseheight / DEFAULT_KEYBOARD_ROWS
- (mKeyVerticalGap - mBottomPadding) / 2;
mEmojiPagerHeight = defaultKeyboardHeight - mEmojiActionBarHeight
mEmojiListHeight = defaultKeyboardHeight - mEmojiActionBarHeight
- mEmojiCategoryPageIdViewHeight;
mEmojiPagerBottomMargin = 0;
mEmojiKeyboardHeight = mEmojiPagerHeight - mEmojiPagerBottomMargin - 1;
mEmojiListBottomMargin = 0;
mEmojiKeyboardHeight = mEmojiListHeight - mEmojiListBottomMargin - 1;
}
public void setPagerProperties(final ViewPager2 vp) {
public void setEmojiListProperties(final RecyclerView vp) {
final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) vp.getLayoutParams();
lp.height = mEmojiKeyboardHeight;
lp.bottomMargin = mEmojiPagerBottomMargin;
lp.bottomMargin = mEmojiListBottomMargin;
vp.setLayoutParams(lp);
}

View file

@ -113,6 +113,20 @@ final class EmojiPageKeyboardView extends KeyboardView implements
mMoreKeysKeyboardContainer = inflater.inflate(moreKeysKeyboardLayoutId, null);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final Keyboard keyboard = getKeyboard();
if (keyboard instanceof DynamicGridKeyboard) {
final int width = keyboard.mOccupiedWidth + getPaddingLeft() + getPaddingRight();
final int occupiedHeight =
((DynamicGridKeyboard) keyboard).getDynamicOccupiedHeight();
final int height = occupiedHeight + getPaddingTop() + getPaddingBottom();
setMeasuredDimension(width, height);
return;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public void setHardwareAcceleratedDrawingEnabled(final boolean enabled) {
super.setHardwareAcceleratedDrawingEnabled(enabled);
@ -173,9 +187,7 @@ final class EmojiPageKeyboardView extends KeyboardView implements
Keyboard moreKeysKeyboard = mMoreKeysKeyboardCache.get(key);
if (moreKeysKeyboard == null) {
final MoreKeysKeyboard.Builder builder = new MoreKeysKeyboard.Builder(
getContext(), key, getKeyboard(),
true, key.getWidth(), key.getHeight(), // TODO This is cheating
newLabelPaint(key));
getContext(), key, getKeyboard(), false, 0, 0, newLabelPaint(key));
moreKeysKeyboard = builder.build();
mMoreKeysKeyboardCache.put(key, moreKeysKeyboard);
}
@ -382,9 +394,6 @@ final class EmojiPageKeyboardView extends KeyboardView implements
final Runnable pendingKeyDown = mPendingKeyDown;
final Key currentKey = mCurrentKey;
releaseCurrentKey(false /* withKeyRegistering */);
if (key == null) {
return false;
}
final boolean isShowingMoreKeysPanel = isShowingMoreKeysPanel();
if (isShowingMoreKeysPanel) {
@ -402,7 +411,7 @@ final class EmojiPageKeyboardView extends KeyboardView implements
callListenerOnReleaseKey(key, true /* withRegistering */);
}
}, KEY_RELEASE_DELAY_TIME);
} else {
} else if (key != null) {
callListenerOnReleaseKey(key, true /* withRegistering */);
}

View file

@ -182,7 +182,7 @@ final class EmojiPalettesAdapter extends RecyclerView.Adapter<EmojiPalettesAdapt
mActiveKeyboardViews.remove(position);
}
final Keyboard keyboard =
mEmojiCategory.getKeyboardFromPagePosition(position);
mEmojiCategory.getKeyboardFromAdapterPosition(position);
holder.getKeyboardView().setKeyboard(keyboard);
holder.getKeyboardView().setOnKeyEventListener(mListener);
//parent.addView(keyboardView);
@ -201,10 +201,9 @@ final class EmojiPalettesAdapter extends RecyclerView.Adapter<EmojiPalettesAdapt
@Override
public int getItemCount() {
return mEmojiCategory.getTotalPageCountOfAllCategories();
return mEmojiCategory.getCurrentCategoryPageCount();
}
static class ViewHolder extends RecyclerView.ViewHolder {
private EmojiPageKeyboardView customView;

View file

@ -21,7 +21,6 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Pair;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@ -34,6 +33,9 @@ import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabWidget;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.dslul.openboard.inputmethod.compat.TabHostCompat;
import org.dslul.openboard.inputmethod.keyboard.Key;
import org.dslul.openboard.inputmethod.keyboard.KeyboardActionListener;
@ -46,10 +48,12 @@ import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype;
import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
import androidx.viewpager2.widget.ViewPager2;
import org.jetbrains.annotations.NotNull;
import static org.dslul.openboard.inputmethod.latin.common.Constants.NOT_A_COORDINATE;
@ -78,6 +82,7 @@ public final class EmojiPalettesView extends LinearLayout
private EmojiPalettesAdapter mEmojiPalettesAdapter;
private final EmojiLayoutParams mEmojiLayoutParams;
private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener;
private final LinearLayoutManager mEmojiLayoutManager;
private ImageButton mDeleteKey;
private TextView mAlphabetKeyLeft;
@ -85,8 +90,7 @@ public final class EmojiPalettesView extends LinearLayout
// TODO: Remove this workaround.
private View mSpacebarIcon;
private TabHostCompat mTabHost;
private ViewPager2 mEmojiPager;
private int mCurrentPagerPosition = 0;
private RecyclerView mEmojiRecyclerView;
private EmojiCategoryPageIndicatorView mEmojiCategoryPageIndicatorView;
private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER;
@ -132,6 +136,7 @@ public final class EmojiPalettesView extends LinearLayout
R.styleable.EmojiPalettesView_categoryPageIndicatorBackground, 0);
emojiPalettesViewAttr.recycle();
mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener();
mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
}
@Override
@ -164,6 +169,7 @@ public final class EmojiPalettesView extends LinearLayout
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mTabHost = findViewById(R.id.emoji_category_tabhost);
mTabHost.setup();
for (final EmojiCategory.CategoryProperties properties
@ -183,51 +189,41 @@ public final class EmojiPalettesView extends LinearLayout
mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this);
mEmojiPager = findViewById(R.id.emoji_keyboard_pager);
mEmojiPager.setAdapter(mEmojiPalettesAdapter);
mEmojiPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
mEmojiRecyclerView = findViewById(R.id.emoji_keyboard_list);
mEmojiRecyclerView.setLayoutManager(mEmojiLayoutManager);
mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter);
mEmojiRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
mEmojiPalettesAdapter.onPageScrolled();
final Pair<Integer, Integer> newPos =
mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position);
final int newCategoryId = newPos.first;
final int newCategorySize = mEmojiCategory.getCategoryPageSize(newCategoryId);
final int currentCategoryId = mEmojiCategory.getCurrentCategoryId();
final int currentCategoryPageId = mEmojiCategory.getCurrentCategoryPageId();
final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageSize();
if (newCategoryId == currentCategoryId) {
mEmojiCategoryPageIndicatorView.setCategoryPageId(
newCategorySize, newPos.second, positionOffset);
} else if (newCategoryId > currentCategoryId) {
mEmojiCategoryPageIndicatorView.setCategoryPageId(
currentCategorySize, currentCategoryPageId, positionOffset);
} else if (newCategoryId < currentCategoryId) {
mEmojiCategoryPageIndicatorView.setCategoryPageId(
currentCategorySize, currentCategoryPageId, positionOffset - 1);
}
}
@Override
public void onPageSelected(int position) {
final Pair<Integer, Integer> newPos =
mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position);
setCurrentCategoryAndPageId(newPos.first /* categoryId */, newPos.second /* categoryPageId */,
false /* force */);
updateEmojiCategoryPageIdView();
mCurrentPagerPosition = position;
}
@Override
public void onPageScrollStateChanged(int state) {
public void onScrollStateChanged(@NonNull @NotNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// Ignore this message. Only want the actual page selected.
}
@Override
public void onScrolled(@NonNull @NotNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mEmojiPalettesAdapter.onPageScrolled();
final int offset = recyclerView.computeVerticalScrollOffset();
final int extent = recyclerView.computeVerticalScrollExtent();
final int range = recyclerView.computeVerticalScrollRange();
final float percentage = offset / (float) (range - extent);
final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageCount();
final int a = (int) (percentage * currentCategorySize);
final float b = percentage * currentCategorySize - a;
mEmojiCategoryPageIndicatorView.setCategoryPageId(
currentCategorySize, a, b);
final int firstCompleteVisibleBoard = mEmojiLayoutManager.findFirstCompletelyVisibleItemPosition();
final int firstVisibleBoard = mEmojiLayoutManager.findFirstVisibleItemPosition();
mEmojiCategory.setCurrentCategoryPageId(
firstCompleteVisibleBoard > 0 ? firstCompleteVisibleBoard : firstVisibleBoard);
}
});
mEmojiPager.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
mEmojiPager.setPersistentDrawingCache(PERSISTENT_NO_CACHE);
mEmojiLayoutParams.setPagerProperties(mEmojiPager);
mEmojiRecyclerView.setPersistentDrawingCache(PERSISTENT_NO_CACHE);
mEmojiLayoutParams.setEmojiListProperties(mEmojiRecyclerView);
mEmojiCategoryPageIndicatorView =
findViewById(R.id.emoji_category_page_id_view);
@ -283,8 +279,10 @@ public final class EmojiPalettesView extends LinearLayout
AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback(
Constants.CODE_UNSPECIFIED, this);
final int categoryId = mEmojiCategory.getCategoryId(tabId);
setCurrentCategoryAndPageId(categoryId, 0, false /* force */);
updateEmojiCategoryPageIdView();
if (categoryId != mEmojiCategory.getCurrentCategoryId()) {
setCurrentCategoryAndPageId(categoryId, 0, false /* force */);
updateEmojiCategoryPageIdView();
}
}
/**
@ -388,14 +386,17 @@ public final class EmojiPalettesView extends LinearLayout
final KeyDrawParams params = new KeyDrawParams();
params.updateParams(mEmojiLayoutParams.getActionBarHeight(), keyVisualAttr);
setupAlphabetKey(mAlphabetKeyLeft, switchToAlphaLabel, params);
mEmojiPager.setAdapter(mEmojiPalettesAdapter);
mEmojiPager.setCurrentItem(mCurrentPagerPosition, false);
if (mEmojiRecyclerView.getAdapter() == null) {
mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter);
setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(),
true /* force */);
}
}
public void stopEmojiPalettes() {
mEmojiPalettesAdapter.releaseCurrentKey(true /* withKeyRegistering */);
mEmojiPalettesAdapter.flushPendingRecentKeys();
mEmojiPager.setAdapter(null);
mEmojiRecyclerView.setAdapter(null);
}
public void setKeyboardActionListener(final KeyboardActionListener listener) {
@ -408,19 +409,14 @@ public final class EmojiPalettesView extends LinearLayout
return;
}
mEmojiCategoryPageIndicatorView.setCategoryPageId(
mEmojiCategory.getCurrentCategoryPageSize(),
mEmojiCategory.getCurrentCategoryPageCount(),
mEmojiCategory.getCurrentCategoryPageId(), 0.0f /* offset */);
}
private void setCurrentCategoryAndPageId(final int categoryId, final int categoryPageId,
final boolean force) {
final int oldCategoryId = mEmojiCategory.getCurrentCategoryId();
final int oldPageId = mEmojiCategory.getCurrentCategoryPageId();
final boolean firstPage = categoryPageId == 0;
mEmojiCategory.setCurrentCategoryPageId(categoryPageId);
if (oldCategoryId == categoryId && (!firstPage || oldPageId == 0) && !force) {
return;
}
final int oldCategoryPageId = mEmojiCategory.getCurrentCategoryPageId();
if (oldCategoryId == EmojiCategory.ID_RECENTS && categoryId != EmojiCategory.ID_RECENTS) {
// Needs to save pending updates for recent keys when we get out of the recents
@ -429,13 +425,11 @@ public final class EmojiPalettesView extends LinearLayout
mEmojiPalettesAdapter.flushPendingRecentKeys();
}
mEmojiCategory.setCurrentCategoryId(categoryId);
final Pair<Integer, Integer> pagerIds = mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(
mEmojiPager.getCurrentItem());
if (force || pagerIds.first != categoryId || (firstPage && pagerIds.second != 0)) {
final int newPagerPageId = mEmojiCategory.getPagerPageIdFromCategoryAndPageId(categoryId, categoryPageId);
final boolean smooth = pagerIds.first == categoryId && firstPage && pagerIds.second != 0;
mEmojiPager.setCurrentItem(newPagerPageId, smooth /* smoothScroll */);
if (force || oldCategoryId != categoryId || oldCategoryPageId != categoryPageId) {
mEmojiCategory.setCurrentCategoryId(categoryId);
mEmojiCategory.setCurrentCategoryPageId(categoryPageId);
mEmojiPalettesAdapter.notifyDataSetChanged();
mEmojiRecyclerView.scrollToPosition(categoryPageId);
}
final int newTabId = mEmojiCategory.getTabIdFromCategoryId(categoryId);

View file

@ -52,6 +52,7 @@ public final class KeyboardIconsSet {
public static final String NAME_PREVIOUS_KEY = "previous_key";
public static final String NAME_TAB_KEY = "tab_key";
public static final String NAME_SHORTCUT_KEY = "shortcut_key";
public static final String NAME_CLIPBOARD_KEY = "clipboard_key";
public static final String NAME_INCOGNITO_KEY = "incognito_key";
public static final String NAME_SHORTCUT_KEY_DISABLED = "shortcut_key_disabled";
public static final String NAME_LANGUAGE_SWITCH_KEY = "language_switch_key";
@ -80,6 +81,7 @@ public final class KeyboardIconsSet {
NAME_PREVIOUS_KEY, R.styleable.Keyboard_iconPreviousKey,
NAME_TAB_KEY, R.styleable.Keyboard_iconTabKey,
NAME_SHORTCUT_KEY, R.styleable.Keyboard_iconShortcutKey,
NAME_CLIPBOARD_KEY, R.styleable.Keyboard_iconClipboardKey,
NAME_INCOGNITO_KEY, R.styleable.Keyboard_iconIncognitoKey,
NAME_SPACE_KEY_FOR_NUMBER_LAYOUT, R.styleable.Keyboard_iconSpaceKeyForNumberLayout,
NAME_SHIFT_KEY_SHIFTED, R.styleable.Keyboard_iconShiftKeyShifted,

View file

@ -32,6 +32,7 @@ import android.os.Build;
import android.os.Debug;
import android.os.IBinder;
import android.os.Message;
import android.os.Process;
import android.text.InputType;
import android.util.Log;
import android.util.PrintWriterPrinter;
@ -186,6 +187,24 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
final HideSoftInputReceiver mHideSoftInputReceiver = new HideSoftInputReceiver(this);
final static class RestartAfterDeviceUnlockReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
// Restart the keyboard if credential encrypted storage is unlocked. This reloads the
// dictionary and other data from credential-encrypted storage (with the onCreate()
// method).
if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
final int myPid = Process.myPid();
Log.i(TAG, "Killing my process: pid=" + myPid);
Process.killProcess(myPid);
} else {
Log.e(TAG, "Unexpected intent " + intent);
}
}
}
final RestartAfterDeviceUnlockReceiver mRestartAfterDeviceUnlockReceiver = new RestartAfterDeviceUnlockReceiver();
private AlertDialog mOptionsDialog;
private final boolean mIsHardwareAcceleratedDrawingEnabled;
@ -625,6 +644,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
registerReceiver(mHideSoftInputReceiver, hideSoftInputFilter, PERMISSION_HIDE_SOFT_INPUT,
null /* scheduler */);
final IntentFilter restartAfterUnlockFilter = new IntentFilter();
restartAfterUnlockFilter.addAction(Intent.ACTION_USER_UNLOCKED);
registerReceiver(mRestartAfterDeviceUnlockReceiver, restartAfterUnlockFilter);
StatsUtils.onCreate(mSettings.getCurrent(), mRichImm);
}
@ -733,6 +756,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
unregisterReceiver(mRingerModeChangeReceiver);
unregisterReceiver(mDictionaryPackInstallReceiver);
unregisterReceiver(mDictionaryDumpBroadcastReceiver);
unregisterReceiver(mRestartAfterDeviceUnlockReceiver);
mStatsUtilsManager.onDestroy(this /* context */);
super.onDestroy();
}
@ -742,6 +766,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
unregisterReceiver(mDictionaryPackInstallReceiver);
unregisterReceiver(mDictionaryDumpBroadcastReceiver);
unregisterReceiver(mRingerModeChangeReceiver);
unregisterReceiver(mRestartAfterDeviceUnlockReceiver);
mInputLogic.recycle();
}
@ -1092,6 +1117,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
}
}
public CharSequence getSelection() {
return mInputLogic.mConnection.getSelectedText(0);
}
/**
* This is called when the user has clicked on the extracted text view,
* when running in fullscreen mode. The default implementation hides
@ -1559,10 +1588,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
currentSettingsValues.mInputAttributes.mShouldShowSuggestions
&& currentSettingsValues.isSuggestionsEnabledPerUserSettings();
final boolean shouldShowSuggestionsStripUnlessPassword = currentSettingsValues.mShowsVoiceInputKey
|| currentSettingsValues.mShowsClipboardKey
|| shouldShowSuggestionCandidates
|| currentSettingsValues.isApplicationSpecifiedCompletionsOn();
final boolean shouldShowSuggestionsStrip = shouldShowSuggestionsStripUnlessPassword
&& !currentSettingsValues.mInputAttributes.mIsPasswordField;
&& (!currentSettingsValues.mInputAttributes.mIsPasswordField || currentSettingsValues.mShowsClipboardKey);
mSuggestionStripView.updateVisibility(shouldShowSuggestionsStrip, isFullscreenMode());
if (!shouldShowSuggestionsStrip) {
return;

View file

@ -56,6 +56,7 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
// PREF_VOICE_MODE_OBSOLETE is obsolete. Use PREF_VOICE_INPUT_KEY instead.
public static final String PREF_VOICE_MODE_OBSOLETE = "voice_mode";
public static final String PREF_VOICE_INPUT_KEY = "pref_voice_input_key";
public static final String PREF_CLIPBOARD_CLIPBOARD_KEY = "pref_clipboard_clipboard_key";
public static final String PREF_EDIT_PERSONAL_DICTIONARY = "edit_personal_dictionary";
// PREF_AUTO_CORRECTION_THRESHOLD_OBSOLETE is obsolete. Use PREF_AUTO_CORRECTION instead.
public static final String PREF_AUTO_CORRECTION_THRESHOLD_OBSOLETE =
@ -77,6 +78,8 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang
"pref_show_language_switch_key";
public static final String PREF_SHOW_EMOJI_KEY =
"pref_show_emoji_key";
public static final String PREF_SHOW_CLIPBOARD_KEY =
"pref_show_clipboard_key";
public static final String PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST =
"pref_include_other_imes_in_language_switch_list";
public static final String PREF_CUSTOM_INPUT_STYLES = "custom_input_styles";

View file

@ -73,6 +73,7 @@ public class SettingsValues {
public final boolean mShowsHints;
public final boolean mShowsLanguageSwitchKey;
public final boolean mShowsEmojiKey;
public final boolean mShowsClipboardKey;
public final boolean mUsePersonalizedDicts;
public final boolean mUseDoubleSpacePeriod;
public final boolean mBlockPotentiallyOffensive;
@ -149,6 +150,7 @@ public class SettingsValues {
mShowsHints = prefs.getBoolean(Settings.PREF_SHOW_HINTS, true);
mShowsLanguageSwitchKey = prefs.getBoolean(Settings.PREF_SHOW_LANGUAGE_SWITCH_KEY, false);
mShowsEmojiKey = prefs.getBoolean(Settings.PREF_SHOW_EMOJI_KEY, false);
mShowsClipboardKey = prefs.getBoolean(Settings.PREF_SHOW_CLIPBOARD_KEY, false);
mUsePersonalizedDicts = prefs.getBoolean(Settings.PREF_KEY_USE_PERSONALIZED_DICTS, true);
mUseDoubleSpacePeriod = prefs.getBoolean(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true)
&& inputAttributes.mIsGeneralTextInput;
@ -188,7 +190,8 @@ public class SettingsValues {
//&& !mInputAttributes.mInputTypeNoAutoCorrect;
mSuggestionsEnabledPerUserSettings = !mInputAttributes.mIsPasswordField &&
readSuggestionsEnabled(prefs);
mIncognitoModeEnabled = Settings.readAlwaysIncognitoMode(prefs) || mInputAttributes.mNoLearning;
mIncognitoModeEnabled = Settings.readAlwaysIncognitoMode(prefs) || mInputAttributes.mNoLearning
|| mInputAttributes.mIsPasswordField;
mIsInternal = Settings.isInternal(prefs);
mHasCustomKeyPreviewAnimationParams = prefs.getBoolean(
DebugSettings.PREF_HAS_CUSTOM_KEY_PREVIEW_ANIMATION_PARAMS, false);

View file

@ -16,6 +16,8 @@
package org.dslul.openboard.inputmethod.latin.suggestions;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
@ -59,6 +61,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
public interface Listener {
void pickSuggestionManually(SuggestedWordInfo word);
void onCodeInput(int primaryCode, int x, int y, boolean isKeyRepeat);
void onTextInput(final String rawText);
CharSequence getSelection();
}
static final boolean DBG = DebugFlags.DEBUG_ENABLED;
@ -66,6 +70,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
private final ViewGroup mSuggestionsStrip;
private final ImageButton mVoiceKey;
private final ImageButton mClipboardKey;
private final ImageButton mOtherKey;
MainKeyboardView mMainKeyboardView;
@ -126,6 +131,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
mSuggestionsStrip = findViewById(R.id.suggestions_strip);
mVoiceKey = findViewById(R.id.suggestions_strip_voice_key);
mClipboardKey = findViewById(R.id.suggestions_strip_clipboard_key);
mOtherKey = findViewById(R.id.suggestions_strip_other_key);
mStripVisibilityGroup = new StripVisibilityGroup(this, mSuggestionsStrip);
@ -161,9 +167,13 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
R.styleable.Keyboard, defStyle, R.style.SuggestionStripView);
final Drawable iconVoice = keyboardAttr.getDrawable(R.styleable.Keyboard_iconShortcutKey);
final Drawable iconIncognito = keyboardAttr.getDrawable(R.styleable.Keyboard_iconIncognitoKey);
final Drawable iconClipboard = keyboardAttr.getDrawable(R.styleable.Keyboard_iconClipboardKey);
keyboardAttr.recycle();
mVoiceKey.setImageDrawable(iconVoice);
mVoiceKey.setOnClickListener(this);
mClipboardKey.setImageDrawable(iconClipboard);
mClipboardKey.setOnClickListener(this);
mClipboardKey.setOnLongClickListener(this);
mOtherKey.setImageDrawable(iconIncognito);
}
@ -181,7 +191,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
final int visibility = shouldBeVisible ? VISIBLE : (isFullscreenMode ? GONE : INVISIBLE);
setVisibility(visibility);
final SettingsValues currentSettingsValues = Settings.getInstance().getCurrent();
mVoiceKey.setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : INVISIBLE);
mVoiceKey.setVisibility(currentSettingsValues.mShowsVoiceInputKey ? VISIBLE : GONE);
mClipboardKey.setVisibility(currentSettingsValues.mShowsClipboardKey ? VISIBLE : (mVoiceKey.getVisibility() == GONE ? INVISIBLE : GONE));
mOtherKey.setVisibility(currentSettingsValues.mIncognitoModeEnabled ? VISIBLE : INVISIBLE);
}
@ -256,6 +267,23 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
@Override
public boolean onLongClick(final View view) {
if (view == mClipboardKey) {
ClipboardManager clipboardManager = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = clipboardManager.getPrimaryClip();
if (clipData != null && clipData.getItemCount() > 0 && clipData.getItemAt(0) != null) {
String clipString = clipData.getItemAt(0).coerceToText(getContext()).toString();
if (clipString.length() == 1) {
mListener.onTextInput(clipString);
} else if (clipString.length() > 1) {
//awkward workaround
mListener.onTextInput(clipString.substring(0, clipString.length() - 1));
mListener.onTextInput(clipString.substring(clipString.length() - 1));
}
}
AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback(
Constants.NOT_A_CODE, this);
return true;
}
AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback(
Constants.NOT_A_CODE, this);
return showMoreSuggestions();
@ -413,6 +441,15 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
false /* isKeyRepeat */);
return;
}
if (view == mClipboardKey) {
CharSequence selectionSequence = mListener.getSelection();
if (selectionSequence != null && selectionSequence.length() > 0
&& !Settings.getInstance().getCurrent().mInputAttributes.mIsPasswordField) {
ClipboardManager clipboardManager = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(ClipData.newPlainText(selectionSequence, selectionSequence));
}
return;
}
final Object tag = view.getTag();
// {@link Integer} tag is set at

View file

@ -18,14 +18,20 @@ package org.dslul.openboard.inputmethod.latin.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.Log;
import androidx.annotation.RequiresApi;
public final class DeviceProtectedUtils {
static final String TAG = DeviceProtectedUtils.class.getSimpleName();
public static SharedPreferences getSharedPreferences(final Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
return PreferenceManager.getDefaultSharedPreferences(context);
}
Context deviceProtectedContext = getDeviceProtectedContext(context);
SharedPreferences deviceProtectedPreferences = PreferenceManager.getDefaultSharedPreferences(deviceProtectedContext);
if (deviceProtectedPreferences.getAll().isEmpty()) {
@ -35,6 +41,7 @@ public final class DeviceProtectedUtils {
return deviceProtectedPreferences;
}
@RequiresApi(api = Build.VERSION_CODES.N)
private static Context getDeviceProtectedContext(final Context context) {
return context.isDeviceProtectedStorage()
? context : context.createDeviceProtectedStorageContext();

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_activities_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_activities_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_activities_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_activities_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_activities_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_activities_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_activities_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_activities_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_activities_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_activities_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_activities_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_activities_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_activities_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_activities_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_animals_nature_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_animals_nature_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_animals_nature_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_animals_nature_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_animals_nature_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_animals_nature_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_animals_nature_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_animals_nature_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_animals_nature_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_animals_nature_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_animals_nature_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_animals_nature_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_animals_nature_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_animals_nature_normal_lxx_light" />
</selector>

View file

@ -20,13 +20,13 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_emoticons_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_emoticons_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_emoticons_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_emoticons_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_emoticons_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_emoticons_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_emoticons_normal_lxx_dark" />
</selector>

View file

@ -20,13 +20,13 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_emoticons_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_emoticons_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_emoticons_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_emoticons_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_emoticons_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_emoticons_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_emoticons_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_flags_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_flags_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_flags_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_flags_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_flags_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_flags_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_flags_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_flags_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_flags_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_flags_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_flags_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_flags_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_flags_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_flags_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_food_drink_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_food_drink_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_food_drink_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_food_drink_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_food_drink_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_food_drink_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_food_drink_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_food_drink_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_food_drink_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_food_drink_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_food_drink_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_food_drink_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_food_drink_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_food_drink_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_objects_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_objects_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_objects_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_objects_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_objects_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_objects_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_objects_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_objects_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_objects_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_objects_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_objects_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_objects_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_objects_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_objects_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_people_body_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_people_body_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_people_body_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_people_body_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_people_body_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_people_body_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_people_body_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_people_body_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_people_body_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_people_body_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_people_body_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_people_body_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_people_body_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_people_body_normal_lxx_light" />
</selector>

View file

@ -19,13 +19,13 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_recents_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_recents_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_recents_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_recents_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_recents_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_recents_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_recents_normal_lxx_dark" />
</selector>

View file

@ -19,13 +19,13 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_recents_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_recents_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_recents_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_recents_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_recents_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_recents_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_recents_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_smileys_emotion_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_smileys_emotion_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_smileys_emotion_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_symbols_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_symbols_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_symbols_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_symbols_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_symbols_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_symbols_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_symbols_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_symbols_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_symbols_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_symbols_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_symbols_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_symbols_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_symbols_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_symbols_normal_lxx_light" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_travel_places_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_travel_places_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_travel_places_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_travel_places_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_travel_places_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
<bitmap android:src="@drawable/ic_emoji_travel_places_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
</item>
<item android:drawable="@drawable/ic_emoji_travel_places_normal_lxx_dark" />
</selector>

View file

@ -1,13 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<bitmap android:src="@drawable/ic_emoji_travel_places_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_travel_places_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_pressed="true">
<bitmap android:src="@drawable/ic_emoji_travel_places_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_travel_places_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:state_selected="true">
<bitmap android:src="@drawable/ic_emoji_travel_places_normal_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
<bitmap android:src="@drawable/ic_emoji_travel_places_activated_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
</item>
<item android:drawable="@drawable/ic_emoji_travel_places_normal_lxx_light" />
</selector>

View file

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/sym_keyboard_shift_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />
android:src="@drawable/sym_keyboard_shift_locked_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_dark" />

View file

@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/sym_keyboard_shift_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />
android:src="@drawable/sym_keyboard_shift_locked_lxx_dark" android:tint="@color/icon_tint_system_accent_lxx_light" />

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#CACACA"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,2h-4.18C14.4,0.84 13.3,0 12,0c-1.3,0 -2.4,0.84 -2.82,2L5,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM12,2c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM19,20L5,20L5,4h2v3h10L17,4h2v16z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#414141"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,2h-4.18C14.4,0.84 13.3,0 12,0c-1.3,0 -2.4,0.84 -2.82,2L5,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,4c0,-1.1 -0.9,-2 -2,-2zM12,2c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM19,20L5,20L5,4h2v3h10L17,4h2v16z"/>
</vector>

View file

@ -59,8 +59,8 @@
</FrameLayout>
</org.dslul.openboard.inputmethod.compat.TabHostCompat>
</LinearLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/emoji_keyboard_pager"
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/emoji_keyboard_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />

View file

@ -20,34 +20,45 @@
<merge
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
We just need to ignore the system's audio and haptic feedback settings. -->
<LinearLayout
android:id="@+id/suggestions_strip"
android:id="@+id/suggestions_strip_wrapper"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/config_suggestions_strip_horizontal_margin"
android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin"
android:hapticFeedbackEnabled="false"
android:soundEffectsEnabled="false" />
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
We just need to ignore the system's audio and haptic feedback settings. -->
<ImageButton
android:id="@+id/suggestions_strip_other_key"
android:layout_width="@dimen/config_suggestions_strip_edge_key_width"
android:layout_height="fill_parent"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
style="?attr/suggestionWordStyle"
android:contentDescription="@string/more_keys_strip_description" />
<ImageButton
android:id="@+id/suggestions_strip_voice_key"
android:layout_width="@dimen/config_suggestions_strip_edge_key_width"
android:layout_height="fill_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:contentDescription="@string/spoken_description_mic"
style="?attr/suggestionWordStyle" />
android:soundEffectsEnabled="false">
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
We just need to ignore the system's audio and haptic feedback settings. -->
<ImageButton
android:id="@+id/suggestions_strip_other_key"
android:layout_width="@dimen/config_suggestions_strip_edge_key_width"
android:layout_height="fill_parent"
android:layout_weight="0"
style="?attr/suggestionWordStyle"
android:contentDescription="@string/more_keys_strip_description" />
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
We just need to ignore the system's audio and haptic feedback settings. -->
<LinearLayout
android:id="@+id/suggestions_strip"
android:orientation="horizontal"
android:maxWidth="100dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:hapticFeedbackEnabled="false"
android:soundEffectsEnabled="false" />
<ImageButton
android:id="@+id/suggestions_strip_voice_key"
android:layout_width="@dimen/config_suggestions_strip_edge_key_width"
android:layout_height="fill_parent"
android:contentDescription="@string/spoken_description_mic"
style="?attr/suggestionWordStyle" />
<ImageButton
android:id="@+id/suggestions_strip_clipboard_key"
android:layout_width="@dimen/config_suggestions_strip_edge_key_width"
android:scaleType="fitCenter"
android:layout_height="fill_parent"
android:contentDescription="@string/spoken_description_mic"
style="?attr/suggestionWordStyle" />
</LinearLayout>
</merge>

View file

@ -77,8 +77,9 @@
<dimen name="config_gesture_floating_preview_vertical_padding">15dp</dimen>
<!-- Emoji keyboard -->
<fraction name="config_emoji_keyboard_key_width">10%p</fraction>
<fraction name="config_emoji_keyboard_row_height">50%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">54%p</fraction>
<integer name="config_emoji_keyboard_max_page_key_count">20</integer>
<fraction name="config_emoji_keyboard_key_width">8.33%p</fraction>
<fraction name="config_emoji_keyboard_row_height">40%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">70%p</fraction>
<fraction name="config_emoji_keyboard_key_label_size">70%p</fraction>
<integer name="config_emoji_keyboard_max_recents_key_count">32</integer>
</resources>

View file

@ -65,8 +65,9 @@
<dimen name="config_gesture_floating_preview_vertical_padding">17dp</dimen>
<!-- Emoji keyboard -->
<fraction name="config_emoji_keyboard_key_width">10%p</fraction>
<fraction name="config_emoji_keyboard_row_height">33%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">70%p</fraction>
<integer name="config_emoji_keyboard_max_page_key_count">30</integer>
<fraction name="config_emoji_keyboard_key_width">8.33%p</fraction>
<fraction name="config_emoji_keyboard_row_height">40%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">64%p</fraction>
<fraction name="config_emoji_keyboard_key_label_size">64%p</fraction>
<integer name="config_emoji_keyboard_max_recents_key_count">36</integer>
</resources>

View file

@ -82,8 +82,9 @@
<dimen name="config_gesture_floating_preview_round_radius">3dp</dimen>
<!-- Emoji keyboard -->
<fraction name="config_emoji_keyboard_key_width">12.5%p</fraction>
<fraction name="config_emoji_keyboard_row_height">33%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">60%p</fraction>
<integer name="config_emoji_keyboard_max_page_key_count">24</integer>
<fraction name="config_emoji_keyboard_key_width">11.11%p</fraction>
<fraction name="config_emoji_keyboard_row_height">28%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">78%p</fraction>
<fraction name="config_emoji_keyboard_key_label_size">78%p</fraction>
<integer name="config_emoji_keyboard_max_recents_key_count">36</integer>
</resources>

View file

@ -65,6 +65,7 @@
<!-- Emoji keyboard -->
<fraction name="config_emoji_keyboard_key_width">7.69%p</fraction>
<fraction name="config_emoji_keyboard_row_height">33%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">60%p</fraction>
<integer name="config_emoji_keyboard_max_page_key_count">39</integer>
<fraction name="config_emoji_keyboard_key_letter_size">58%p</fraction>
<fraction name="config_emoji_keyboard_key_label_size">58%p</fraction>
<integer name="config_emoji_keyboard_max_recents_key_count">39</integer>
</resources>

View file

@ -81,7 +81,8 @@
<!-- Emoji keyboard -->
<fraction name="config_emoji_keyboard_key_width">10%p</fraction>
<fraction name="config_emoji_keyboard_row_height">33%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">68%p</fraction>
<integer name="config_emoji_keyboard_max_page_key_count">30</integer>
<fraction name="config_emoji_keyboard_row_height">30%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">64%p</fraction>
<fraction name="config_emoji_keyboard_key_label_size">64%p</fraction>
<integer name="config_emoji_keyboard_max_recents_key_count">39</integer>
</resources>

View file

@ -23,19 +23,15 @@
<color name="highlight_color_lxx_light">@android:color/system_accent1_500</color>
<color name="gesture_trail_color_lxx_light">@android:color/system_accent1_200</color>
<color name="sliding_key_input_preview_color_lxx_light">@android:color/system_accent1_900</color>
<color name="action_key_background_lxx_light">@android:color/system_accent1_500</color>
<color name="action_key_background_lxx_light">@color/highlight_color_lxx_light</color>
<color name="action_key_background_pressed_lxx_light">@android:color/system_accent1_200</color>
<color name="icon_tint_system_accent_lxx_light">@color/highlight_color_lxx_light</color>
<!-- System theming colors for LXX_Dark theme, overriding some colors in main colors.xml -->
<color name="highlight_color_lxx_dark">@android:color/system_accent1_500</color>
<color name="gesture_trail_color_lxx_dark">@android:color/system_accent1_200</color>
<color name="sliding_key_input_preview_color_lxx_dark">@android:color/system_accent1_900</color>
<color name="action_key_background_lxx_dark">@android:color/system_accent1_500</color>
<color name="action_key_background_lxx_dark">@color/highlight_color_lxx_dark</color>
<color name="action_key_background_pressed_lxx_dark">@android:color/system_accent1_200</color>
<!-- System theming color for icons in Material themes. The colors are different because the
icons have some transparency (so the background color affects shading) -->
<!-- Both themes apply this color as a tint to the normal_lxx_dark icons -->
<color name="icon_tint_system_accent_lxx_dark">@android:color/system_accent1_300</color>
<color name="icon_tint_system_accent_lxx_light">@android:color/system_accent1_600</color>
<color name="icon_tint_system_accent_lxx_dark">@color/highlight_color_lxx_dark</color>
</resources>

View file

@ -19,29 +19,8 @@
-->
<resources>
<style name="KeyboardIcons.LXX_Dark">
<!-- Keyboard icons -->
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_dark</item>
<style name="KeyboardIcons.LXX_Dark" parent="KeyboardIcons.LXX_Dark.Parent">
<!-- Use system accent color for shifted shift key -->
<item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_dark_system_accent</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_dark</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_lxx_dark</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_dark</item>
<item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_dark</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_dark</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_dark</item>
<item name="iconSendKey">@drawable/sym_keyboard_send_lxx_dark</item>
<item name="iconNextKey">@drawable/sym_keyboard_next_lxx_dark</item>
<item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_dark</item>
<item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_dark</item>
<item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_dark</item>
<item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_dark</item>
<item name="iconIncognitoKey">@drawable/sym_keyboard_incognito_lxx_dark</item>
<item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_lxx_dark</item>
<item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_dark</item>
<item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_lxx_dark</item>
<item name="iconZwjKey">@drawable/sym_keyboard_zwj_lxx_dark</item>
<item name="iconEmojiActionKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
<item name="iconEmojiNormalKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
</style>
</resources>

View file

@ -19,29 +19,8 @@
-->
<resources>
<style name="KeyboardIcons.LXX_Light">
<!-- Keyboard icons -->
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_light</item>
<style name="KeyboardIcons.LXX_Light" parent="KeyboardIcons.LXX_Light.Parent">
<!-- Use system accent color for shifted shift key -->
<item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_light_system_accent</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_light</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_lxx_light</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_light</item>
<item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_light</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_light</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_light</item>
<item name="iconSendKey">@drawable/sym_keyboard_send_lxx_light</item>
<item name="iconNextKey">@drawable/sym_keyboard_next_lxx_light</item>
<item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_light</item>
<item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_light</item>
<item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_light</item>
<item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_light</item>
<item name="iconIncognitoKey">@drawable/sym_keyboard_incognito_lxx_light</item>
<item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_lxx_light</item>
<item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_light</item>
<item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_lxx_light</item>
<item name="iconZwjKey">@drawable/sym_keyboard_zwj_lxx_light</item>
<item name="iconEmojiActionKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
<item name="iconEmojiNormalKey">@drawable/sym_keyboard_smiley_lxx_light</item>
</style>
</resources>

View file

@ -270,6 +270,7 @@
<attr name="iconPreviousKey" format="reference" />
<attr name="iconTabKey" format="reference" />
<attr name="iconShortcutKey" format="reference" />
<attr name="iconClipboardKey" format="reference" />
<attr name="iconIncognitoKey" format="reference" />
<attr name="iconSpaceKeyForNumberLayout" format="reference" />
<attr name="iconShiftKeyShifted" format="reference" />

View file

@ -88,9 +88,10 @@
<!-- Emoji keyboard -->
<fraction name="config_emoji_keyboard_key_width">12.5%p</fraction>
<fraction name="config_emoji_keyboard_row_height">33%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">68%p</fraction>
<integer name="config_emoji_keyboard_max_page_key_count">24</integer>
<fraction name="config_emoji_keyboard_row_height">28%p</fraction>
<fraction name="config_emoji_keyboard_key_letter_size">78%p</fraction>
<fraction name="config_emoji_keyboard_key_label_size">78%p</fraction>
<integer name="config_emoji_keyboard_max_recents_key_count">32</integer>
<!-- Key codes of hardware keys that can be used to toggle the Emoji layout.
Each array defines a comma-separated tuple containing:

View file

@ -54,6 +54,7 @@
<item>dvorak</item>
<item>colemak</item>
<item>colemak_dh</item>
<item>workman</item>
<item>bepo</item>
<item>pcqwerty</item>
</string-array>
@ -65,6 +66,7 @@
<item>Dvorak</item>
<item>Colemak</item>
<item>Colemak Mod-DH</item>
<item>Workman</item>
<item>Bépo</item>
<item>PC</item>
</string-array>
@ -78,6 +80,7 @@
<string name="subtype_generic_dvorak" translatable="false">%s (Dvorak)</string>
<string name="subtype_generic_colemak" translatable="false">%s (Colemak)</string>
<string name="subtype_generic_colemak_dh" translatable="false">%s (Colemak Mod-DH)</string>
<string name="subtype_generic_workman" translatable="false">%s (Workman)</string>
<string name="subtype_generic_bepo" translatable="false">%s (Bépo)</string>
<string name="subtype_generic_pcqwerty" translatable="false">%s (PC)</string>

View file

@ -29,6 +29,7 @@
<item name="iconSearchKey">@drawable/sym_keyboard_search_holo_dark</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_holo_dark</item>
<item name="iconShortcutKey">@drawable/sym_keyboard_voice_holo_dark</item>
<item name="iconClipboardKey">@drawable/sym_keyboard_clipboard_dark</item>
<item name="iconIncognitoKey">@drawable/sym_keyboard_incognito_dark</item>
<item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_holo_dark</item>
<item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_holo_dark</item>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2014, The Android Open Source Project
**
** 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.
*/
-->
<resources>
<style name="KeyboardIcons.LXX_Dark.Parent">
<!-- Keyboard icons -->
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_dark</item>
<item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_dark</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_dark</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_lxx_dark</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_dark</item>
<item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_dark</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_dark</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_dark</item>
<item name="iconSendKey">@drawable/sym_keyboard_send_lxx_dark</item>
<item name="iconNextKey">@drawable/sym_keyboard_next_lxx_dark</item>
<item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_dark</item>
<item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_dark</item>
<item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_dark</item>
<item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_dark</item>
<item name="iconClipboardKey">@drawable/sym_keyboard_clipboard_dark</item>
<item name="iconIncognitoKey">@drawable/sym_keyboard_incognito_lxx_dark</item>
<item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_lxx_dark</item>
<item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_dark</item>
<item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_lxx_dark</item>
<item name="iconZwjKey">@drawable/sym_keyboard_zwj_lxx_dark</item>
<item name="iconEmojiActionKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
<item name="iconEmojiNormalKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
</style>
</resources>

View file

@ -19,29 +19,5 @@
-->
<resources>
<style name="KeyboardIcons.LXX_Dark">
<!-- Keyboard icons -->
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_dark</item>
<item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_dark</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_dark</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_lxx_dark</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_dark</item>
<item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_dark</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_dark</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_dark</item>
<item name="iconSendKey">@drawable/sym_keyboard_send_lxx_dark</item>
<item name="iconNextKey">@drawable/sym_keyboard_next_lxx_dark</item>
<item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_dark</item>
<item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_dark</item>
<item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_dark</item>
<item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_dark</item>
<item name="iconIncognitoKey">@drawable/sym_keyboard_incognito_lxx_dark</item>
<item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_lxx_dark</item>
<item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_dark</item>
<item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_lxx_dark</item>
<item name="iconZwjKey">@drawable/sym_keyboard_zwj_lxx_dark</item>
<item name="iconEmojiActionKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
<item name="iconEmojiNormalKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
</style>
<style name="KeyboardIcons.LXX_Dark" parent="KeyboardIcons.LXX_Dark.Parent" />
</resources>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2014, The Android Open Source Project
**
** 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.
*/
-->
<resources>
<style name="KeyboardIcons.LXX_Light.Parent">
<!-- Keyboard icons -->
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_light</item>
<item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_light</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_light</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_lxx_light</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_light</item>
<item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_light</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_light</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_light</item>
<item name="iconSendKey">@drawable/sym_keyboard_send_lxx_light</item>
<item name="iconNextKey">@drawable/sym_keyboard_next_lxx_light</item>
<item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_light</item>
<item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_light</item>
<item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_light</item>
<item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_light</item>
<item name="iconClipboardKey">@drawable/sym_keyboard_clipboard_light</item>
<item name="iconIncognitoKey">@drawable/sym_keyboard_incognito_lxx_light</item>
<item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_lxx_light</item>
<item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_light</item>
<item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_lxx_light</item>
<item name="iconZwjKey">@drawable/sym_keyboard_zwj_lxx_light</item>
<item name="iconEmojiActionKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
<item name="iconEmojiNormalKey">@drawable/sym_keyboard_smiley_lxx_light</item>
</style>
</resources>

View file

@ -19,29 +19,5 @@
-->
<resources>
<style name="KeyboardIcons.LXX_Light">
<!-- Keyboard icons -->
<item name="iconShiftKey">@drawable/sym_keyboard_shift_lxx_light</item>
<item name="iconShiftKeyShifted">@drawable/sym_keyboard_shift_locked_lxx_light</item>
<item name="iconDeleteKey">@drawable/sym_keyboard_delete_lxx_light</item>
<item name="iconTabKey">@drawable/sym_keyboard_tab_lxx_light</item>
<item name="iconSettingsKey">@drawable/sym_keyboard_settings_lxx_light</item>
<item name="iconSpaceKey">@null</item>
<item name="iconEnterKey">@drawable/sym_keyboard_return_lxx_light</item>
<item name="iconGoKey">@drawable/sym_keyboard_go_lxx_light</item>
<item name="iconSearchKey">@drawable/sym_keyboard_search_lxx_light</item>
<item name="iconSendKey">@drawable/sym_keyboard_send_lxx_light</item>
<item name="iconNextKey">@drawable/sym_keyboard_next_lxx_light</item>
<item name="iconDoneKey">@drawable/sym_keyboard_done_lxx_light</item>
<item name="iconPreviousKey">@drawable/sym_keyboard_previous_lxx_light</item>
<item name="iconShortcutKey">@drawable/sym_keyboard_voice_lxx_light</item>
<item name="iconShortcutKeyDisabled">@drawable/sym_keyboard_voice_off_lxx_light</item>
<item name="iconIncognitoKey">@drawable/sym_keyboard_incognito_lxx_light</item>
<item name="iconSpaceKeyForNumberLayout">@drawable/sym_keyboard_space_lxx_light</item>
<item name="iconLanguageSwitchKey">@drawable/sym_keyboard_language_switch_lxx_light</item>
<item name="iconZwnjKey">@drawable/sym_keyboard_zwnj_lxx_light</item>
<item name="iconZwjKey">@drawable/sym_keyboard_zwj_lxx_light</item>
<item name="iconEmojiActionKey">@drawable/sym_keyboard_smiley_lxx_dark</item>
<item name="iconEmojiNormalKey">@drawable/sym_keyboard_smiley_lxx_light</item>
</style>
<style name="KeyboardIcons.LXX_Light" parent="KeyboardIcons.LXX_Light.Parent" />
</resources>

View file

@ -179,6 +179,10 @@
<!-- The summary text to describe the reason why the "Voice input key" option is disabled. [CHAR LIMIT=100] -->
<string name="voice_input_disabled_summary">No voice input methods enabled. Check Languages&#160;&amp; input settings.</string>
<!-- Preferences item for enabling pasting from keyboard -->
<string name="show_clipboard_key">Clipboard key</string>
<string name="show_clipboard_key_summary">Press to copy, long-press to paste.</string>
<!-- Title for configuring input method settings [CHAR LIMIT=35] -->
<string name="configure_input_method">Configure input methods</string>
@ -351,6 +355,17 @@ language among those that use the Latin alphabet. This keyboard is laid out in t
disposition that offers additional keys, but smaller keys compared to other common dispositions for
mobile devices. [CHAR LIMIT=25] -->
<string name="subtype_no_language_colemak_dh">Alphabet (Colemak Mod-DH)</string>
<!-- This string is displayed in the description for a keyboard type. It refers specifically to
the Latin alphabet, as opposed to Cyrillic, Arabic, Hebrew or other scripts.
When the device is configured to use a language using a script other than the Latin alphabet, the
user still needs a keyboard that can input Latin characters for passwords or login names for
example, and a way to switch to this Latin alphabet keyboard. This string is the description for
this keyboard, so users of other scripts should understand when they read this that it represents a
keyboard that is meant for them to be able to enter Latin characters as opposed to the script they
are used to. This keyboard does not provide a dictionary, and it is not tied to any specific
language among those that use the Latin alphabet. This keyboard is laid out in the Workman
disposition rather than other common dispositions for Latin languages. [CHAR LIMIT=25] -->
<string name="subtype_no_language_workman">Alphabet (Workman)</string>
<string name="subtype_no_language_pcqwerty">Alphabet (PC)</string>
<!-- Description for Emoji keyboard subtype [CHAR LIMIT=25] -->
<string name="subtype_emoji">Emoji</string>

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2011, The Android Open Source Project
**
** 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.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res-auto"
>
<include
latin:keyboardLayout="@xml/key_styles_common" />
Ideally just the keyWidth should be different and the spacer should adjust to fill
the available space. -->
<!-- First row -->
<Row>
<include
latin:keyboardLayout="@xml/rowkeys_workman1"
latin:keyWidth="9.0%p" />
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillRight" />
</Row>
<!-- Second row -->
<Row>
<include
latin:keyboardLayout="@xml/rowkeys_workman2"
latin:keyWidth="9.0%p" />
<Key
latin:keyStyle="enterKeyStyle"
latin:keyWidth="fillRight" />
</Row>
<!-- Third row -->
<Row>
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="10.0%p" />
<include
latin:keyboardLayout="@xml/rowkeys_workman3"
latin:keyWidth="9.0%p" />
<include
latin:keyboardLayout="@xml/keys_exclamation_question"
latin:keyWidth="9.0%p" />
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="fillRight" />
</Row>
<!-- Fourth row -->
<include
latin:keyboardLayout="@xml/row_qwerty4" />
</merge>

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,8 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLabelSize="60%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -21,7 +21,8 @@
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="90%p"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -22,7 +22,7 @@
xmlns:latin="http://schemas.android.com/apk/res-auto"
latin:keyWidth="@fraction/config_emoji_keyboard_key_width"
latin:keyLetterSize="@fraction/config_emoji_keyboard_key_letter_size"
latin:keyLabelSize="60%p"
latin:keyLabelSize="@fraction/config_emoji_keyboard_key_label_size"
latin:rowHeight="@fraction/config_emoji_keyboard_row_height"
>
<GridRows

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2008, The Android Open Source Project
**
** 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.
*/
-->
<Keyboard
xmlns:latin="http://schemas.android.com/apk/res-auto"
>
<include
latin:keyboardLayout="@xml/rows_workman" />
</Keyboard>

View file

@ -21,7 +21,8 @@
<merge xmlns:latin="http://schemas.android.com/apk/res-auto">
<!-- U+00A3: "£" POUND SIGN
U+20AC: "€" EURO SIGN
U+00A2: "¢" CENT SIGN -->
U+00A2: "¢" CENT SIGN
U+20BA: "₺" TURKISH LIRA SIGN -->
<key-style
latin:styleName="currencyKeyStyle"
latin:keySpec="!text/keyspec_currency"
@ -39,4 +40,7 @@
<key-style
latin:styleName="moreCurrency4KeyStyle"
latin:keySpec="&#x00A2;" />
<key-style
latin:styleName="moreCurrency5KeyStyle"
latin:keySpec="&#x20BA;"/>
</merge>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2012, The Android Open Source Project
**
** 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.
*/
-->
<KeyboardLayoutSet
xmlns:latin="http://schemas.android.com/apk/res-auto">
<Element
latin:elementName="alphabet"
latin:elementKeyboard="@xml/kbd_workman"
latin:enableProximityCharsCorrection="true"
latin:supportsSplitLayout="true" />
<Element
latin:elementName="symbols"
latin:elementKeyboard="@xml/kbd_symbols" />
<Element
latin:elementName="symbolsShifted"
latin:elementKeyboard="@xml/kbd_symbols_shift" />
<Element
latin:elementName="phone"
latin:elementKeyboard="@xml/kbd_phone" />
<Element
latin:elementName="phoneSymbols"
latin:elementKeyboard="@xml/kbd_phone_symbols" />
<Element
latin:elementName="number"
latin:elementKeyboard="@xml/kbd_number" />
</KeyboardLayoutSet>

View file

@ -71,4 +71,10 @@
android:title="@string/voice_input"
android:defaultValue="true"
android:persistent="true" />
<CheckBoxPreference
android:key="pref_show_clipboard_key"
android:title="@string/show_clipboard_key"
android:summary="@string/show_clipboard_key_summary"
android:defaultValue="false"
android:persistent="true" />
</PreferenceScreen>

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2014, The Android Open Source Project
**
** 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.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res-auto"
>
<Key
latin:keySpec="!text/keyspec_q"
latin:keyHintLabel="1"
latin:additionalMoreKeys="1"
latin:moreKeys="!text/morekeys_q" />
<Key
latin:keySpec="d"
latin:keyHintLabel="2"
latin:additionalMoreKeys="2"
latin:moreKeys="!text/morekeys_w" />
<Key
latin:keySpec="r"
latin:keyHintLabel="3"
latin:additionalMoreKeys="3"
latin:moreKeys="!text/morekeys_e" />
<Key
latin:keySpec="!text/keyspec_w"
latin:keyHintLabel="4"
latin:additionalMoreKeys="4"
latin:moreKeys="!text/morekeys_r" />
<Key
latin:keySpec="b"
latin:keyHintLabel="5"
latin:additionalMoreKeys="5"
latin:moreKeys="!text/morekeys_t" />
<Key
latin:keySpec="j"
latin:keyHintLabel="6"
latin:additionalMoreKeys="6"
latin:moreKeys="!text/morekeys_y" />
<Key
latin:keySpec="f"
latin:keyHintLabel="7"
latin:additionalMoreKeys="7"
latin:moreKeys="!text/morekeys_u" />
<Key
latin:keySpec="u"
latin:keyHintLabel="8"
latin:additionalMoreKeys="8"
latin:moreKeys="!text/morekeys_i" />
<Key
latin:keySpec="p"
latin:keyHintLabel="9"
latin:additionalMoreKeys="9"
latin:moreKeys="!text/morekeys_o" />
<Key
latin:keySpec=";"
latin:keyHintLabel="0"
latin:additionalMoreKeys="0" />
</merge>

View file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2014, The Android Open Source Project
**
** 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.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res-auto"
>
<Key
latin:keySpec="a"
latin:keyHintLabel="\@"
latin:additionalMoreKeys="\\@"
latin:moreKeys="!text/morekeys_a" />
<Key
latin:keySpec="s"
latin:keyHintLabel="#"
latin:additionalMoreKeys="#"
latin:moreKeys="!text/morekeys_s" />
<Key
latin:keySpec="h"
latin:keyHintLabel="$"
latin:additionalMoreKeys="$"
latin:moreKeys="!text/morekeys_d" />
<Key
latin:keySpec="t"
latin:keyHintLabel="%"
latin:additionalMoreKeys="%" />
<Key
latin:keySpec="g"
latin:keyHintLabel="&amp;"
latin:additionalMoreKeys="&amp;"
latin:moreKeys="!text/morekeys_g" />
<Key
latin:keySpec="!text/keyspec_y"
latin:keyHintLabel="-"
latin:additionalMoreKeys="-"
latin:moreKeys="!text/morekeys_h" />
<Key
latin:keySpec="n"
latin:keyHintLabel="+"
latin:additionalMoreKeys="+"
latin:moreKeys="!text/morekeys_j" />
<Key
latin:keySpec="e"
latin:keyHintLabel="("
latin:additionalMoreKeys="("
latin:moreKeys="!text/morekeys_k" />
<Key
latin:keySpec="o"
latin:keyHintLabel=")"
latin:additionalMoreKeys=")"
latin:moreKeys="!text/morekeys_l" />
<Key
latin:keySpec="i"/>
</merge>

View file

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2014, The Android Open Source Project
**
** 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.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res-auto"
>
<Key
latin:keySpec="z"
latin:keyHintLabel="*"
latin:additionalMoreKeys="*"
latin:moreKeys="!text/morekeys_z" />
<Key
latin:keySpec="!text/keyspec_x"
latin:keyHintLabel="&quot;"
latin:additionalMoreKeys="&quot;"
latin:moreKeys="!text/morekeys_x" />
<Key
latin:keySpec="m"
latin:keyHintLabel="&apos;"
latin:additionalMoreKeys="&apos;"
latin:moreKeys="!text/morekeys_c" />
<Key
latin:keySpec="c"
latin:keyHintLabel=":"
latin:additionalMoreKeys=":"
latin:moreKeys="!text/morekeys_v" />
<Key
latin:keySpec="v"
latin:keyHintLabel=";"
latin:additionalMoreKeys=";" />
<Key
latin:keySpec="k"
latin:keyHintLabel="!"
latin:additionalMoreKeys="!"
latin:moreKeys="!text/morekeys_n" />
<Key
latin:keySpec="l"
latin:keyHintLabel="\?"
latin:additionalMoreKeys="\\?" />
</merge>

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2010, The Android Open Source Project
**
** 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.
*/
-->
<merge
xmlns:latin="http://schemas.android.com/apk/res-auto"
>
<include
latin:keyboardLayout="@xml/key_styles_common" />
<switch>
<case
latin:numberRowEnabled="true"
>
<Row
latin:keyWidth="10%p"
>
<include
latin:keyboardLayout="@xml/rowkeys_symbols1" />
</Row>
</case>
</switch>
<Row
latin:keyWidth="10%p"
>
<include
latin:keyboardLayout="@xml/rowkeys_workman1" />
</Row>
<Row
latin:keyWidth="10%p"
>
<include
latin:keyboardLayout="@xml/rowkeys_workman2" />
</Row>
<Row
latin:keyWidth="10%p"
>
<Key
latin:keyStyle="shiftKeyStyle"
latin:keyWidth="15%p"
latin:visualInsetsRight="1%p" />
<include
latin:keyboardLayout="@xml/rowkeys_workman3" />
<Key
latin:keyStyle="deleteKeyStyle"
latin:keyWidth="fillRight"
latin:visualInsetsLeft="1%p" />
</Row>
<!-- Fourth row -->
<include
latin:keyboardLayout="@xml/row_qwerty4" />
</merge>