[MOD][XPOSED][5.0+] Exi for Swiftkey [2.7.1][2020.09.22]]

Search This thread

Roughy

Senior Member
Jul 1, 2015
348
1,202
THIS MODULE IS NO LONGER MAINTAINED
It is still compatible with the versions of Swiftkey versions 7.6.7.4 to 7.5.8.5'ish, but not the latest versions.
Goodbye post: https://forum.xda-developers.com/showpost.php?p=83339967&postcount=1401

Exi for Swiftkey

Exi for Swiftkey is an Xposed Framework module that adds a number of features to the Swiftkey Keyboard.

LATEST RELEASE WILL TARGET THE NEWEST VERSION OF SWIFTKEY BETA.
THIS VERSION WILL BE NEWER THAN SWIFTKEY ( STABLE ).
CONFIRM WHAT VERSION OF SWIFTKEY YOU'RE ON BEFORE UPDATING MODULE.


The latest version supports Swiftkey 7.6.7.4 to 7.5.8.5'ish
Latest Swifkey version confirmed compatible is 7.5.8.5
Swiftkey - Latest: 7.5.7.4 Module unmaintained for a while, use old versions of Switkey
Swiftkey Beta - Latest: 7.5.8.5 Module unmaintained for a while, use old versions of Switkey

Latest version of this module is: 2.7.1
The Xposed Installer app does not update its list properly and may not list the latest version.
Please download the apk directly from the Xposed Repository below using a browser


You can use this module with the following frameworks:
EdXposed Magisk Module: Lollipop 5.0 - Android 9.0 Pie [ Instructions here ]
Tai-Chi: Lollipop 5.0 - Android 8.0 Oreo ( On some devices. Limited to specific version of module )
Official Xposed: Lollipop 5.0 - Android 8.0 Oreo

Known issues
If you are running OxygenOs, you will likely have to whitelist Exi for Swiftkey somewhere.
OnePlusAppBootManager prevents Exi's content provider from running, preventing the module from communicating with the config app. See this post for more info.

EdXposed can be a bit sketchy. Users have reported things spontaneously fixing themselves after reinstalling/clearing cache/ etc.

Info
This post contains basic info about the module and its features.
Detailed instructions on how to use it can be found in the next post down.

Since the Xposed Installer does not automatically update the module for you, I recommend disabling automatic updates for Swiftkey, and updating it and this module at the same time.

Note that Swiftkey no longer provides updates for Android versions below Lollipop.

Features:
  • Swipe selection [Gif]
    • Cursor movement
    • Selection (Gesture or swipe-from-key)
    • Multiple modes (Anywhere, spacebar, number row, hold-and-swipe)
  • More Suggestions [Gif]
    • Suggestions bar can be scrolled to view all suggestions
  • Custom Shortcuts [Gif]
    • Multiple shortcuts for same word
    • Trigger on verbatim input, suggestions, or flow
    • Dictionary importable from file (tab or space delimited)
  • Hotkeys ( Ctrl + key ) [Gif]
    • Define any key as CTRL
    • Supports Select all / Cut / Copy / Paste / Go to end / Undo / Redo / Toggle lots of stuff
  • Quick Actions
    • Display circular quick-menu by swiping up from spacebar [Gif]
    • Trigger corresponding hotkey by swiping from spacebar to key [Gif]
  • Popup-keys [Gif]
    • Customize popup alt-characters
  • Emoji [Gif]
    • Panels are fully customizable (Icon, position, emoji, row count)
    • Emoji importable from file ( line-break delimited )
    • Configurable font size
    • Assign default diverse-emoji color
  • Gifs
    • Remove Bing url redirect
    • Gifs from more sources
    • Disable safe-search
  • Intents [Details here]

    • Set theme
      Toggle incognito mode
      Toggle vibrate
  • Other
    • Remove empty space next to suggestions [Image]
    • Prevent period key from triggering on tap
    • Cursor stays where you place it, rather than moving to end of word
    • Disable auto-space after punctuation
    • Custom key-press sounds
    • Disable full-screen mode
    • Resize keyboard
    • Keyboard transparency
    • Remap hardware keys
    • Hide prediction's bar
    • Text selection with arrow keys ( mod + arrow key )
A more detailed explanation of the features can be found in the next post.

About:

Obfuscation:
The ClassHunter library was developed alongside this module to counteract Proguard obfuscation:
ClassHunter on Github

Version History:

  • 2.7.1[ 22.09.2020 ] - Bug fix( Stable: 7.5.4.4 Beta: 7.5.5.15 ) [No release Post]
  • 2.7.0[ 15.05.2020 ] - Compatibility ( Stable: 7.5.4.4 Beta: 7.5.5.15 ) [Release Post]
  • 2.6.9[ 25.04.2020 ] - Arrow key selection, bug fixes ( Stable: 7.5.3.5 Beta: 7.5.4.2 ) [Release Post]
  • 2.6.8[ 03.04.2020 ] - Toolbar/Number row toggle actions, bug fixes, behavioral changes ( Stable: 7.5.1.7 Beta: 7.5.2.4 ) [Release Post]
  • 2.6.7[ 21.03.2020 ] - Toolbar toggle fix, Bing GIF NSFW region filter workaround ( Stable: 7.5.0.11 Beta: 7.5.1.5 ) [Release Post]
  • 2.6.6[ 18.03.2020 ] - Compatibility, emoji panel size modifier, toolbar gesture ( Stable: 7.5.0.11 Beta: 7.5.1.5 ) [Release Post]
  • 2.6.5[ 07.03.2020 ] - Bug fixes ( Stable: 7.4.9.11 Beta: 7.5.0.8 ) [Release Post]
  • 2.6.0[ 02.03.2020 ] - Compatibility, 10 Emoji, Newline action ( Stable: 7.4.9.11 Beta: 7.5.0.8 ) [Release Post]
  • 2.5.3[ 06.12.2019 ] - Compatibility ( Emoji panel ), translations ( Stable: 7.4.5.3 Beta: 7.4.4.7 ) [Release Post]
  • 2.5.1[ 19.11.2019 ] - Android 10 emoji, plain paste, autocorrect/incog toggles ( Stable: 7.4.2.69 Beta: 7.4.3.37 ) [Release Post]
  • 2.4.1[ 11.11.2019 ] - Compatibility ( Stable: 7.4.2.69 Beta: 7.4.3.32 ) [Release Post]
  • 2.4.0[ 02.10.2019 ] - Compatibility, Lenny ( Stable: 7.3.9.20 Beta: 7.4.0.17 ) [Release Post]
  • 2.3.6[ 29.08.2019 ] - Bug fixes ( Stable: 7.3.6.19 Beta: 7.3.7.18 ) [Release Post]
  • 2.3.5[ 22.08.2019 ] - Compatibility ( Stable: 7.3.6.19 Beta: 7.3.7.18 ) [Release Post]
  • 2.3.4 [ 18.07.2019 ] - Compatibility ( Stable: 7.3.3.12 Beta: 7.3.5.18 ) [Release Post]
  • 2.3.2 [ 06.07.2019 ] - Compatibility ( Stable: 7.3.2.19 Beta: 7.3.4.17 ) [Release Post]
  • 2.3.1 [ 24.06.2019 ] - Compatibility ( Stable: 7.3.2.19 Beta: 7.3.3.10 ) [Release Post]
  • 2.3.0 [ 17.06.2019 ] - Drag & Drop emoji, translations ( Stable: 7.3.0.21 Beta: 7.3.1.17 ) [Release Post]
  • 2.2.3 [ 05.06.2019 ] - Ampersand punctuation & Ellipse ( Stable: 7.3.0.21 Beta: 7.3.1.17 ) [Release Post]
  • 2.2.2 [ 26.05.2019 ] - Compatibility & Punctuation ( Stable: 7.3.0.21 Beta: 7.3.1.17 ) [Release Post]
  • 2.2.1 [ 26.04.2019 ] - Maintenance & Translations ( Stable: 7.2.8.25 Beta:7.2.9.36 ) [Release Post]
  • 2.2.0 [ 01.04.2019 ] - Backup & Restore, Compatibility ( Stable: 7.2.6.28 Beta: 7.2.7.16 ) [Release Post]
  • 2.1.3 [ 11.03.2019 ] - Compatibility, bug fixes ( Stable: 7.2.4.22 Beta: 7.2.4.22 ) [Release Post]
  • 2.1.0 [ 28.02.2019 ] - EdXposed fixes, remap only when keyboard open ( Stable: 7.2.3.24, Beta: 7.2.3.20 ) [Release Post]
  • 2.0.4 [ 16.02.2019 ] - Compatibility fixes ( Stable: 7.2.3.24, Beta: 7.2.3.20 ) [Release Post]
  • 2.0.3 [ 12.02.2019 ] - Theme/Incog intents, EdXposed shift fix ( Stable: 7.2.2.32, Beta: 7.2.3.20 ) [Release Post]
  • 1.9.1 [ 01.02.2019 ] - Custom portrait/landscape size, compatibility( Stable: 7.2.1.17, Beta: 7.2.2.31 ) [Release Post]
  • 1.8.2 [ 03.01.2019 ] - Compatibility fixes ( Stable: 7.1.9.24, Beta: 7.2.1.17 ) [Release Post]
  • 1.8.1 [ 05.12.2018 ] - Custom search, updated emoji, bug fixes ( Stable: 7.1.8.29, Beta: 7.1.9.23 ) [Release Post]
  • 1.7.2 [ 04.11.2018 ] - Compatibility, bug fix ( Stable: 7.1.7.?, Beta: 7.1.7.31 ) [Release Post]
  • 1.7.0 [ 01.11.2018 ] - Quick menu insert, vib quick setting, location feature ( Stable: 7.1.5.23, Beta: 7.1.6.28 ) [Release Post]
  • 1.6.0 [ 21.08.2018 ] - Compatibility, hide predictions, bug fixes ( Stable: ?, Beta: 7.1.2.20 ) [Release Post]
  • 1.5.4 [ 21.07.2018 ] - Can disable vertical swipe, fix full-screen / oreo crash ( Stable: 7.0.9.28, Beta: 7.1.0.17 ) [Release Post]
  • 1.5.3 [ 23.06.2018 ] - Compatibility fixes ( Stable: 7.0.7.28, Beta: 7.0.8.362 ) [Release Post]
  • 1.5.2 [ 31.05.2018 ] - Compatibility fixes, async setup ( Stable: 7.0.5.45, Beta: 7.0.6.25 ) [Release Post]
  • 1.4.3 [ 12.05.2018 ] - Compatibility fixes ( Stable: 7.0.4.20, Beta: 7.0.5.22 ) [Release Post]
  • 1.4.2 [ 17.04.2018 ] - Default diverse emoji, keyboard opacity fix ( Stable: 7.0.2.16, Beta: 7.0.3.17 ) [Release Post]
  • 1.4.1 [ 11.04.2018 ] - Hardware key remapping, undo/redo, transparent keyboard ( Stable: 7.0.2.15, Beta: 7.0.2.14 ) [Release Post]
  • 1.3.4 [ 23.01.2018 ] - Bug fixes, compatibility fixes ( Stable: 6.7.5.31, Beta: 6.7.6.17 ) [Release Post]
  • 1.3.3 [ 18.01.2018 ] - Bug fixes, Oreo support ( Stable: 6.7.4.31, Beta: 6.7.5.28 ) [Release Post]
  • 1.3.2 [ 15.01.2018 ] - Compatibility fixes, size multiplier, emoji vibrate toggle ( Stable: 6.7.4.31, Beta: 6.7.5.28 ) [Release Post]
  • 1.3.1 [ 06.12.2017 ] - shortcut ellipse removed, emoji vibrate, translations ( Stable: 6.7.2.22, Beta: 6.7.3.25 ) [Release Post]
  • 1.3.0 [ 30.11.2017 ] - RTL support, custom sounds, number-row swipe, popups case, nsfw gifs( Stable: 6.7.2.22, Beta: 6.7.3.25 ) [Release Post]
  • 1.2.1 [ 02.11.2017 ] - translations, remove existing popups, select old/new emoji panels, bug fixes( Stable: 6.7.0.18, Beta: 6.7.1.20 ) [Release Post]
  • 1.2.0 [ 28.10.2017 ] -Nougat, diverse emoji, restore defaults, bug fixes( Stable: 6.7.0.18, Beta: 6.7.1.15 ) [Release Post]
  • 1.1.1 [ 02.10.2017 ] -Flow shortcuts crash fix( Stable: 6.6.6.26, Beta: 6.6.9.19 ) [Release Post]
  • 1.1.0 [ 01.10.2017 ] - QuickMenu config, bug fixes( Stable: 6.6.6.26, Beta: 6.6.9.19 ) [Release Post]
  • 1.0.3 [ 10.09.2017 ] - Compatibility fixes ( Stable: 6.6.6.21, Beta: 6.6.7.28 ) [Release Post]
  • 1.0.2 [ 24.08.2017 ] - bug fixes, vertical swipe, punctuation auto-space ( Stable: 6.6.5.31, Beta: 6.6.6.17 ) [Release Post]
  • 1.0.1 [ 08.08.2017 ] - Bug fixes, ui tweaks ( Stable: 6.6.4.19, Beta: 6.6.5.24 ) [Release Post]
  • 1.0.0 [ 02.08.2017 ] - Initial Release ( Stable: 6.6.3.21, Beta: 6.6.4.15 )
Changes in 2.7.1 ( Compatibility ( Stable: 7.5.4.4 Beta: 7.5.5.15 ) ):[No release post]
  • Fixed
    - Crash caused by bad comparison when loading emoji order

Complete List of changes


Download:

Exi for Swiftkey on Xposed module repository

My own mirror of all versions


Bug reports:
This module tags its logcat messages with "Exi/"
If you run into any issues, please include any relevant xposed or logcat logs.
DO NOT bother the Swiftkey developers with any issues you encounter a result of using this module

Attributions:

Libraries used:
Thanks to:
  • Rovo89 for the Xposed Framework
  • Anyone I've forgotten to mention

Support the Project:
As it stands Exi for Swiftkey is entirely free, open-source, and completely without limitations.
Consider buying the developer a brownie if you found this module useful:

0QHOjBp.png

Bitcoin: 1Mx17r3DuwUzzp87zhZwfunsLQ2jpmTmfJ

PAYPAL

XDA:DevDB Information
Exi for Swiftkey, Xposed for all devices (see above for details)

Contributors
Roughy
Source Code: https://github.com/Nordskog/SwiftKeyExi

Xposed Package Name: com.mayulive.swiftkeyexi

Version Information
Status: Stable
Current Stable Version: 2.7.1
Stable Release Date: 2020-09-22

Created 2017-08-02
Last Updated 2020-09-21
 

Attachments

  • JXoyS4Y.png
    JXoyS4Y.png
    85.6 KB · Views: 17,576
  • MOq3ruu.png
    MOq3ruu.png
    103.9 KB · Views: 17,401
  • aIuGd0H.png
    aIuGd0H.png
    81.9 KB · Views: 17,470
  • Rn2r9eT.png
    Rn2r9eT.png
    33.7 KB · Views: 16,625
Last edited:

Roughy

Senior Member
Jul 1, 2015
348
1,202
Detailed Instructions

Below are detailed explanations of all the features and how to configure them.

NOTE: These instructions are severely out of date. Maybe check the release posts of the updates if you're after something specific


Shift / Delete / Modifier keys
The shift, delete, and modifier keys will be referred to frequently in these explanations.
The modifier is like a ctrl key, which by default is mapped to the symbols key (123 - switch to the symbols layout).
This mapping is configurable, and you can add and remove multiple keys as you see fit.
Likewise, what this module considers to be the shift/delete keys is up to you.
These mappings can be configured in settings under Keys.

Key Defintions
Keys can be defined by content or function, such as spacebar or enter key.
Keys which are defined by their content are identified by their display string.
That means that a key that the content of a key that displays as "A" is also "A".
This also applies to the more exotic Asian layouts.
There are some exceptions, such as the Japanese long-vowel ( ー ) key using a normal hyphen ( - ) instead.

Swipe
Settings - Specify swipe threshold and speed:
DPtjZdw.png
0bEzvvT.png

Threshold - This slider specifies how far you have to swipe before swipe-mode is triggered. The |--| bar above the slider displays the actual physical distance on screen.
Speed - This slider specifies how fast the cursor moves. The number of characters above the bar show how far the cursor will move when swiped that distance.

Swipe mode - how and where to swipe:
xm5iX2p.png
S9qeAN4.png

QFDO5mK.png
hlZ82Gp.png

Swipe Anywhere - Swipe mode can be triggered by swiping anywhere, except for on the spacebar or enter keys. Swiftkey's flow and swipe gestures interfere with swipe selection in this mode, and are therefore disabled.
Swipe on Spacebar - Swipe will only trigger on the spacebar. This means you can use flow and swipe-gestures are normal. You can still switch between languages as usual, but have to wait the popup to appear before swiping to select it.
Hold any and Swipe - Swiping requires two fingers. Hold down one finger and use the second to swipe.
Hold Shift and Swipe - Swiping requires two fingers. Hold down one finger on the shift key and use the second to swipe.

Selection Mode - how to swipe-select text .
a4kOMwt.png
aPfDki2.png

Two-finger Gesture - Select text by using two-finger pinch and zoom gestures.
Swipe from shift/delete - Swipe from the shift key to select to the right, from the delete key to select to the left. What keys are treated as shift/delete can be configured under Keys.

Spacebar Swipe-up mode- Behavior when swiping up from space .
gTfn0CB.png
jkTV0hg.png

Quick-menu - Swiping up from the spacebar will display a circular quick-action menu with select all / copy / paste / go-to-end. This menu is currently not customizable.
Hotkeys - You can swipe from the spacebar to any of the keys defined in in the Hotkeys tab, and trigger their corresponding action.

Emoji

Overview:
The emoji panel tab is split into two sections:
46P3MlE.png
e3OYPtj.png

Top: A list of panels you can choose emoji from. This is also where imported emoji will first appear.
Bottom: The panels that will appear inside Swiftkey.

The existing templates in the top pane cannot be modified or deleted, as we may make additions to them as Android evolves.
You can create a new panel here to manually input emoji, or create a new panel by importing from a line-break delimited file.

In the bottom pane you can add or remove panels as you see fit, and add emoji (individually or by selecting add-all from the menu) from the templates in the top pane.
The one exception is the Recent Emoji panel (Denoted by a clock icon), which you may only change the position or icon of.

Setting icon and position:
svJXMxx.png


Any of the panels can be renamed or moved around by long clicking on them.
You may also hit the pick button to choose an icon from any of the existing emoji panels.

Setting row count:
By selecting Column Size from the menu, you can specify the column width for each emoji panel.

Dictionary
Overview:
eMbdlQo.png

The dictionary tab lets you specify shortcut - word mappings.
In the above screenshot the shortcut is "xx", and typing it in the keyboard results in all the nested words showing up as suggestions.
This is particularly powerful when combined with the More Suggestions feature, allowing you to scroll through all of them.

Swiftkey's existing shortcut solution will only trigger if you spell out the trigger verbatim. It also doesn't allow certain characters, such as emoji, in the mapped word.
Our solution can also be configured to be inserted if the primary suggestion matches the shortcut, and even inserted during flow.
These options can be configured under settings.

Secondary suggestions:
SFdic2h.png

By default shortcuts will be inserted starting from the primary suggestion.
When defining the shortcut, or changing it after creation by clicking the shortcut itself, you can configure the mapped words to be inserted as secondary suggestions instead.
This means the primary, center suggestion remains, and your shortcuts will be inserted starting with the second suggestion (right side in most languages).
The behavior is the same as when Swiftkey provides emoji predictions.

Hotkeys
Overview:
KWsgIFK.png

Hotkeys are basically just Ctrl - a/x/c/v combos we are all familiar with on full-sized keyboards.
Our equivalent for Ctrl is the Modifier key, which can be set to one or more keys under settings - Keys.
The default Modifier Key is the Symbols layout key ( 123 ).
Available actions are Select all / Copy / cut / paste / go to end.

Configuring a key:
KdlMBk3.png

With the exception of keys defined by their function (spacebar, enter key etc), most keys are defined by the character they display.
In general means you just punch in the character the key is displaying and everything should work out. This applies to the more exotic Asian languages as well.
There are occasionally some discrepancies though. For instance, the long-vowel symbol "ー" in the Japanese layout actually displays a standard hyphen "-".

Popups
Overview:
UGNNFya.png

The alternate characters that popup when long-pressing a key can be configured to your liking.
Because different layouts shift the position of these keys around, their positions are defined as either center, or any of the remaining positions starting from left to right.

When you first add a popup, you will be asked to set a parent key. This is the key that popups will appear under.

Configuring keys:
q7Mrjgv.png

Once the parent key has been added you can click any empty space to add a key there, or the PLUS button to add more slots.
Slots already occupied by characters are greyed out. If Swiftkey does not provide any characters for the empty slots, they will simply be ignored.
Any popup characters provided by Swiftkey will be shifted to the right to make space for our insertions.
padUNkj.png

This is the result of the above configuration. There is an existing symbol ( + ) which is shifted from it's center slot to the first position, and then shifted again by the "1" we insert there.
Our "5" wants to be in slot 5, so it ends up after it.

Settings
Overview:
B7GsLwc.png

The settings panel provides a few additional tweaks.

Emoji Panel
Replace Emoji Panel: If disabled, Swiftkey's original emoji panel will be used instead
Emoji Size: The emoji font size can be configured to some degree. The default value is 12.

Flow & Suggestions
More Suggestions: If enabled, the suggestions bar will be made scrollable, and display many more suggestions.
Suggestion shortcuts: If enabled, shortcuts will trigger on the primary suggestion, instead of only on verbatim input
Flow shortcuts: If enabled, shortcuts will also be inserted when you flow. Suggestion shortcuts must be enabled for this to work.
No auto-correct after swiping: When moving the cursor, Swiftkey sometimes insists on inserting the primary suggestion when you hit space, instead of inserting a space. If enabled, a space will always be inserted.
Maximize suggestions: Swiftkey recently added gaps to both sides of the suggestions bar to make their menu button easier to hit. If enabled, the suggestions bar will fill the screen like it used to.

Misc
Disable period tap: Apparently many people hit the period button by mistake. If enabled, a quick tap will no longer trigger it. It must instead be clicked proper.
Quick-Menu color: Set the color used to highlight the selected item in the quick-menu.

Keys:
Dy903E4.png

Here you can choose which keys will be treated as shift, delete, and modifiers keys by this module.
See the beginning of this post for a more detailed explanation.

rSQeIvR.png

Unlike Hotkeys, here you can define keys not only be their content, but also their function.
By default it makes sense for the shift and delete keys to be mapped to their respective keys,
but some languages do not have a shift key, and in others the delete key is an a completely unreasonable location.
The content field is only available if Letter or Symbol key is picked from the list.
 
Last edited:

oroboros74

Senior Member
Jan 3, 2013
1,163
195
I was looking forward to this. Looks great! Awesome UI! Might I suggest a video tutorial explaining all the options?
 

lover

Senior Member
Mar 14, 2006
705
91
I definitely will try it once xposed for Nougat comes. Hopefully soon (fingers crossed)
 
This looks very interesting.... Hmmm...

I think I'll give it a try now :)

______________
PLEASE NOTE: I welcome any member to help with further valuable information/clarification for any of my posts.

×MY DEVELOPMENTS×
[APP][TOOL][4.2+]The SELinux Toggler
[ZIP][TOOL][AIO]BusyBox Stericson Binary Installer v1.26.2 {BB/TB Auto-Symlink}
×IN DEVELOPMENT×
[APP][TOOL][4.2+][OFFICIAL]The SELinux Switch
Will Supersede "The SELinux Toggler"
×IDEAS FOR DEVELOPMENT×
[APP][UNOFFICIAL][4.2+]XDA Forum {Classic}
[APP][UNOFFICIAL][4.2+]XDA Reader {Classic}
 

Nekrozys

Member
Aug 28, 2013
13
8
Bruxelles
YES !
I've been wanting this for years. I used to use SwipeSelection on a jailbroken iPhone 4 before I moved to Android and this was one of my biggest let down when doing so.
So happy to find so many improvement coming to the Swiftkey keyboard.
 
  • Like
Reactions: Dji_Ronku

oroboros74

Senior Member
Jan 3, 2013
1,163
195
Some quick notes on the UI.

First off, nice! There are a few tweaks I would make (not necessary, just to make it look prettier):

- Confusing to see "Settings" twice when you open it. I understand the first one is referred to Swipe settings, right? Maybe just change it to "Customize" or something else.
- It seems like you could remove some of the extra white-space under Swipe > settings (where threshold and speed is), making that section a bit more compact. Also those two icons aren't very indicative of threshold and speed...

A few feature requests:
- On the Swipe screen, add a button like you have on the other screens (buttom right) where you can test the settings.
- Add option to hide launcher icon
- The first two requests here: https://www.reddit.com/r/xposed/com..._across_the_space_bar_in_swiftkey_to/dgthb3u/ (You already have the third)
- Add option to donate!

PS
I would also like to see swipe left to delete word!
 
Last edited:

leongzxc

Senior Member
Oct 14, 2011
1,046
221
stable original xposed... please come to nougat quick!!! :D

so many useful modules i've missed :(

my android feels like an ios now on nougat.
 

XGARX

Member
Jun 9, 2016
36
5
I always press the period instead of space bar. Is there a way to make the space bar bigger? Wider
 

oroboros74

Senior Member
Jan 3, 2013
1,163
195
I hope you don't mind more feedback. This is adding on to my previous post!

- "Settings" under Swipe might be better named as "Sensitivity".

- Threshold icon: Might be better represented with an image of the space bar with the dynamic threshold |--| showing the distance covered. I actually only understood what "Threshold" meant after reading your explanation: "Trigger" might be better.

In fact, maybe in the future you want to consider putting the explanations of each function as popups when you long press the titles or something (?).

- "Dictionary" in my mind has a distinct meaning: Custom words (like names, etc) that I want included in my autocorrect. Maybe this should be called "Shortcuts". Or am I missing something?

- "Modifier": I instinctively clicked on the "modifier" button thinking I was supposed to set it up there. A popup shows up and I think I can click on the "modifier" button there too because it looks greyed out. I would instead of a greyed out modifier box, actually include the icon of the modifier (an icon of the symbols key). This would change if the user customizes the modifier key in settings.

Also why only "Go to End" and not "Go to beginning"?

- Dunno if this is a bug or not: Even though I have "more suggestions" enabled, I initially only see the first three, even when the words are short. It seems with all the extra space I should be able to see at least a fourth suggestion.

- In settings, "Shift Keys/Delete Keys/Modifier Keys" should be renamed to "Add Shift Keys/Add Delete Keys/Add Modifier Keys".

- Create a way to access Exi and its settings from the keyboard.

- Create the option to export settings or better yet to backup them up to our Google account. Anyone using Swiftkey will have one.

Have I said how beautiful and awesome the app is?
 
  • Like
Reactions: Colchenero

kouzelnik3

Senior Member
I was waiting for any application like this and I must say thank you!
As it's said above "more suggestion" doesn't work. I see only three words. Everything else seems to be working fine. That's the first I would fix. If I see more, I'll write you again. [emoji4]
Keep up the good work!
 

Roughy

Senior Member
Jul 1, 2015
348
1,202
Thank you for all your kinds words.

I'm seeing the same bits and pieces mentioned by multiple people, so I'll try to summarize my thoughts on everything here.
Some people about asked about making donations. There is a bitcoin donation address in the top release post, as well as a paypal "donate to me" button under my name. A brownie would be highly appreciated.

For starters I want to get any bugs and important UI changes sorted out.

Bugs:
- More suggestions is not working -> The two bug reports on this have me somewhat confused. @oroboros74 @kouzelnik3 do you mean that you initially only see the standard 3 suggestions, but scrolling to display more (What more suggestions enables) works correctly?
- Popups are always in upper caps -> Depends on existing popups. Will fix.

UI improvements:
- Should add a button to bring up the keyboard to test swipe settings
- The "Settings" under swipe should be renamed "Sensitivity"
- White space under these settings should be reduced
- Add option to hide launcher icon
- Rename "Dictionary" to "Shortcuts"
- Swipe Threshold and Speed indicators are confusing. -> Rename Threshold to "Trigger Distance" maybe. I am personally fond of the current speed indicator, as it's the only non-arbitrary display I can think of. Anything else wouldn't give the user any meaningful idea of how fast it is going to move. Not sure what to do about that one.
- Include "Add to" before the Shift Keys / Delete Keys / Modifier Keys menu items in settings.

Feature improvements:
- Add emoji to emoji predictions -> Same behavior can be accomplished using a shortcut with Secondary Suggestion enabled.

Feature requests will remain on the back-burner for now, until everything else is sorted out.

Feature requests:
- Gesture (Swipe from number?) to switch to different layouts -> Maybe later
- Implementing Swiftkey's existing gestures (swipe left to delete etc)
- "Go to beginning" action in addition to "Go to end" -> The reason this doesn't exist is because it's not a pre-defined keyboard action (go to end is). It can certainly be done though.
- Method to access the Exi config app from Swiftkey
- In-app explanations of all the configuration options -> Would be a bit of work. Later.
- Toggle to disable full-screen keyboard -> Looking at the original could it should be doable. Will investigate. @godlesplay
- Ability to backup settings. -> For now you'll need to manually backup the app using android's existing backup features (or just copy the whole folder). Complete and partial backup/restore is a task for another day.

Other comments:

- "Modifier": I instinctively clicked on the "modifier" button thinking I was supposed to set it up there. A popup shows up and I think I can click on the "modifier" button there too because it looks greyed out. I would instead of a greyed out modifier box, actually include the icon of the modifier (an icon of the symbols key). This would change if the user customizes the modifier key in settings.
This originally displayed 123 (The default key configured), but was changed to MODIFIER after I implemented arbitrary key mappings. The Modifier key is always greyed to communicate that it cannot be pressed.
Having it display the actual key currently configured might be difficult, as you can add multiple keys, or even have none.

I always press the period instead of space bar. Is there a way to make the space bar bigger? Wider
Possibly. I currently hook the method that decides where the actual keys are positioned, but only read them. I'm not sure if modifying them from here is viable, but it might be doable. That'll be a feature for down the road though.
 
Last edited:

rogerinnyc

Senior Member
Feb 1, 2006
336
136
OnePlus 9 Pro
Really nice module. Thanks! Only "bug" I currently see is that the default modifier of the symbols key doesn't seen to work with the hot keys (although the space bar does)

In the feature request category, it would be nice to fix SwiftKey's annoying habit of inserting a space before each colon and semi-colon and dash.
 

Roughy

Senior Member
Jul 1, 2015
348
1,202
Really nice module. Thanks! Only "bug" I currently see is that the default modifier of the symbols key doesn't seen to work with the hot keys (although the space bar does)

In the feature request category, it would be nice to fix SwiftKey's annoying habit of inserting a space before each colon and semi-colon and dash.

May I ask what language layout are you using? Might be that the symbols key is given a different tag in some other languages, though I haven't run into any problems with that yet.
 

Top Liked Posts

  • There are no posts matching your filters.
  • 5
    Can anyone tell me what I need to learn to be able to update Exi which is compatible with the latest SwiftKey versions? I am willing to learn and do it, even if it takes me months.
    I am quite desperate tbh. Exi is just too good and useful. I am using a two-year old Swiftkey version and it has started to slow down for me I think. Multiple bugs + Autocorrect is visibly erroneous. Maybe @Roughy himself can guide me please?

    It is... not simple.
    Base requirement is very solid knowledge of java. You will be reading through a lot of decompiled, obfuscated java code with no named methods, fields or variables.

    At one point in time the code of the module itself was pretty clean, but with every Swiftkey update it slowly devolved into a clusterfuck of undocumented interdependent hooks.

    The basic process is decompiling Swiftkey ( you want base.apk ) with JadXGui, exporting it as a gradle project and opening it up in Android Studio. Now you've got readable code you can read and walk around, but most of the code will have any useful names replaces with jibberish, so you have no idea what does what.

    Then how do you know what does what?
    Some things /have/ to be named, usually when you need to pass references along to Android. The base Keyboard class that provides Android with the root keyboard view, for instance, can easily be located because of this.

    Enums are all intact, which can be very helpful.

    Looking through the obfuscated class definitions can often also gives you clues as to what they are for.

    At the end of the day you'll probably find something that looks potentially relevant. From there on it's down to inserting hooks that print runtime information on what's being passed to and returned from various methods.

    SwiftkeyExi has a bunch of utility methods to facilitate this, such as SteppedHookLog that hooks every single method of a class and prints a hierarchy of calls with their arguments at runtime.

    TraverseLayout() prints a hierarchy of all the views with some of their properties. Very handy for wrapping your head around the actual keyboard layout.

    Looking at actual layout files can also be helpful for finding things, as anything references there will not be obfuscated.

    If something is broken the problem will often by that the method being hooked has moved somewhere else, or been modified in a way that makes it unrecognizable. If you sorta remember what it used to look like ( I would often go back to previous versions and compare ) you can pick out some markers that let you locate it elsewhere, but without you're pretty much toast.

    The module was built on the assumption that everything would always be changing and classes and methods would move around.
    Dealing with that is what all the profiles all over the place. These profiles are generated using another library I wrote: ClassHunter.
    These profiles had to be manually updated from time to time, and of course every time we fail to locate the target class and have to go manually digging through the code to find it again.

    Having said that, trying to fix this module would be nigh impossible, even if you already had a solid understanding of both java and working with xposed.

    There's too much black magic voodoo going on. Everything relies on everything and you have very little way of knowing whether or not any given layer of the clusterfuck is working correctly or not.

    It's too big, too complex, too interconnected.

    You'd be better of deciding on the core features you want and starting from scratch.
    1
    SwiftKey and the Exi for SwiftKey module work without Xposed/Lsposed
    root is not required
    xposed is not required
    lsposed is not required

    Download: Exi for SwiftKey module
    Downlload: SwiftKey v2 new keyboard

    Works on android 12
    Hi, could you tell me why you chose that version? I have a better modified version by me split apksq, well, remove languages and garbage, if it doesn't cost much work to edit it, maybe I could look at it and remove more unnecessary things and make it compatible with exi? And thanks for the apk.

    PD delete extensión.zip
  • 107
    THIS MODULE IS NO LONGER MAINTAINED
    It is still compatible with the versions of Swiftkey versions 7.6.7.4 to 7.5.8.5'ish, but not the latest versions.
    Goodbye post: https://forum.xda-developers.com/showpost.php?p=83339967&postcount=1401

    Exi for Swiftkey

    Exi for Swiftkey is an Xposed Framework module that adds a number of features to the Swiftkey Keyboard.

    LATEST RELEASE WILL TARGET THE NEWEST VERSION OF SWIFTKEY BETA.
    THIS VERSION WILL BE NEWER THAN SWIFTKEY ( STABLE ).
    CONFIRM WHAT VERSION OF SWIFTKEY YOU'RE ON BEFORE UPDATING MODULE.


    The latest version supports Swiftkey 7.6.7.4 to 7.5.8.5'ish
    Latest Swifkey version confirmed compatible is 7.5.8.5
    Swiftkey - Latest: 7.5.7.4 Module unmaintained for a while, use old versions of Switkey
    Swiftkey Beta - Latest: 7.5.8.5 Module unmaintained for a while, use old versions of Switkey

    Latest version of this module is: 2.7.1
    The Xposed Installer app does not update its list properly and may not list the latest version.
    Please download the apk directly from the Xposed Repository below using a browser


    You can use this module with the following frameworks:
    EdXposed Magisk Module: Lollipop 5.0 - Android 9.0 Pie [ Instructions here ]
    Tai-Chi: Lollipop 5.0 - Android 8.0 Oreo ( On some devices. Limited to specific version of module )
    Official Xposed: Lollipop 5.0 - Android 8.0 Oreo

    Known issues
    If you are running OxygenOs, you will likely have to whitelist Exi for Swiftkey somewhere.
    OnePlusAppBootManager prevents Exi's content provider from running, preventing the module from communicating with the config app. See this post for more info.

    EdXposed can be a bit sketchy. Users have reported things spontaneously fixing themselves after reinstalling/clearing cache/ etc.

    Info
    This post contains basic info about the module and its features.
    Detailed instructions on how to use it can be found in the next post down.

    Since the Xposed Installer does not automatically update the module for you, I recommend disabling automatic updates for Swiftkey, and updating it and this module at the same time.

    Note that Swiftkey no longer provides updates for Android versions below Lollipop.

    Features:
    • Swipe selection [Gif]
      • Cursor movement
      • Selection (Gesture or swipe-from-key)
      • Multiple modes (Anywhere, spacebar, number row, hold-and-swipe)
    • More Suggestions [Gif]
      • Suggestions bar can be scrolled to view all suggestions
    • Custom Shortcuts [Gif]
      • Multiple shortcuts for same word
      • Trigger on verbatim input, suggestions, or flow
      • Dictionary importable from file (tab or space delimited)
    • Hotkeys ( Ctrl + key ) [Gif]
      • Define any key as CTRL
      • Supports Select all / Cut / Copy / Paste / Go to end / Undo / Redo / Toggle lots of stuff
    • Quick Actions
      • Display circular quick-menu by swiping up from spacebar [Gif]
      • Trigger corresponding hotkey by swiping from spacebar to key [Gif]
    • Popup-keys [Gif]
      • Customize popup alt-characters
    • Emoji [Gif]
      • Panels are fully customizable (Icon, position, emoji, row count)
      • Emoji importable from file ( line-break delimited )
      • Configurable font size
      • Assign default diverse-emoji color
    • Gifs
      • Remove Bing url redirect
      • Gifs from more sources
      • Disable safe-search
    • Intents [Details here]

      • Set theme
        Toggle incognito mode
        Toggle vibrate
    • Other
      • Remove empty space next to suggestions [Image]
      • Prevent period key from triggering on tap
      • Cursor stays where you place it, rather than moving to end of word
      • Disable auto-space after punctuation
      • Custom key-press sounds
      • Disable full-screen mode
      • Resize keyboard
      • Keyboard transparency
      • Remap hardware keys
      • Hide prediction's bar
      • Text selection with arrow keys ( mod + arrow key )
    A more detailed explanation of the features can be found in the next post.

    About:

    Obfuscation:
    The ClassHunter library was developed alongside this module to counteract Proguard obfuscation:
    ClassHunter on Github

    Version History:

    • 2.7.1[ 22.09.2020 ] - Bug fix( Stable: 7.5.4.4 Beta: 7.5.5.15 ) [No release Post]
    • 2.7.0[ 15.05.2020 ] - Compatibility ( Stable: 7.5.4.4 Beta: 7.5.5.15 ) [Release Post]
    • 2.6.9[ 25.04.2020 ] - Arrow key selection, bug fixes ( Stable: 7.5.3.5 Beta: 7.5.4.2 ) [Release Post]
    • 2.6.8[ 03.04.2020 ] - Toolbar/Number row toggle actions, bug fixes, behavioral changes ( Stable: 7.5.1.7 Beta: 7.5.2.4 ) [Release Post]
    • 2.6.7[ 21.03.2020 ] - Toolbar toggle fix, Bing GIF NSFW region filter workaround ( Stable: 7.5.0.11 Beta: 7.5.1.5 ) [Release Post]
    • 2.6.6[ 18.03.2020 ] - Compatibility, emoji panel size modifier, toolbar gesture ( Stable: 7.5.0.11 Beta: 7.5.1.5 ) [Release Post]
    • 2.6.5[ 07.03.2020 ] - Bug fixes ( Stable: 7.4.9.11 Beta: 7.5.0.8 ) [Release Post]
    • 2.6.0[ 02.03.2020 ] - Compatibility, 10 Emoji, Newline action ( Stable: 7.4.9.11 Beta: 7.5.0.8 ) [Release Post]
    • 2.5.3[ 06.12.2019 ] - Compatibility ( Emoji panel ), translations ( Stable: 7.4.5.3 Beta: 7.4.4.7 ) [Release Post]
    • 2.5.1[ 19.11.2019 ] - Android 10 emoji, plain paste, autocorrect/incog toggles ( Stable: 7.4.2.69 Beta: 7.4.3.37 ) [Release Post]
    • 2.4.1[ 11.11.2019 ] - Compatibility ( Stable: 7.4.2.69 Beta: 7.4.3.32 ) [Release Post]
    • 2.4.0[ 02.10.2019 ] - Compatibility, Lenny ( Stable: 7.3.9.20 Beta: 7.4.0.17 ) [Release Post]
    • 2.3.6[ 29.08.2019 ] - Bug fixes ( Stable: 7.3.6.19 Beta: 7.3.7.18 ) [Release Post]
    • 2.3.5[ 22.08.2019 ] - Compatibility ( Stable: 7.3.6.19 Beta: 7.3.7.18 ) [Release Post]
    • 2.3.4 [ 18.07.2019 ] - Compatibility ( Stable: 7.3.3.12 Beta: 7.3.5.18 ) [Release Post]
    • 2.3.2 [ 06.07.2019 ] - Compatibility ( Stable: 7.3.2.19 Beta: 7.3.4.17 ) [Release Post]
    • 2.3.1 [ 24.06.2019 ] - Compatibility ( Stable: 7.3.2.19 Beta: 7.3.3.10 ) [Release Post]
    • 2.3.0 [ 17.06.2019 ] - Drag & Drop emoji, translations ( Stable: 7.3.0.21 Beta: 7.3.1.17 ) [Release Post]
    • 2.2.3 [ 05.06.2019 ] - Ampersand punctuation & Ellipse ( Stable: 7.3.0.21 Beta: 7.3.1.17 ) [Release Post]
    • 2.2.2 [ 26.05.2019 ] - Compatibility & Punctuation ( Stable: 7.3.0.21 Beta: 7.3.1.17 ) [Release Post]
    • 2.2.1 [ 26.04.2019 ] - Maintenance & Translations ( Stable: 7.2.8.25 Beta:7.2.9.36 ) [Release Post]
    • 2.2.0 [ 01.04.2019 ] - Backup & Restore, Compatibility ( Stable: 7.2.6.28 Beta: 7.2.7.16 ) [Release Post]
    • 2.1.3 [ 11.03.2019 ] - Compatibility, bug fixes ( Stable: 7.2.4.22 Beta: 7.2.4.22 ) [Release Post]
    • 2.1.0 [ 28.02.2019 ] - EdXposed fixes, remap only when keyboard open ( Stable: 7.2.3.24, Beta: 7.2.3.20 ) [Release Post]
    • 2.0.4 [ 16.02.2019 ] - Compatibility fixes ( Stable: 7.2.3.24, Beta: 7.2.3.20 ) [Release Post]
    • 2.0.3 [ 12.02.2019 ] - Theme/Incog intents, EdXposed shift fix ( Stable: 7.2.2.32, Beta: 7.2.3.20 ) [Release Post]
    • 1.9.1 [ 01.02.2019 ] - Custom portrait/landscape size, compatibility( Stable: 7.2.1.17, Beta: 7.2.2.31 ) [Release Post]
    • 1.8.2 [ 03.01.2019 ] - Compatibility fixes ( Stable: 7.1.9.24, Beta: 7.2.1.17 ) [Release Post]
    • 1.8.1 [ 05.12.2018 ] - Custom search, updated emoji, bug fixes ( Stable: 7.1.8.29, Beta: 7.1.9.23 ) [Release Post]
    • 1.7.2 [ 04.11.2018 ] - Compatibility, bug fix ( Stable: 7.1.7.?, Beta: 7.1.7.31 ) [Release Post]
    • 1.7.0 [ 01.11.2018 ] - Quick menu insert, vib quick setting, location feature ( Stable: 7.1.5.23, Beta: 7.1.6.28 ) [Release Post]
    • 1.6.0 [ 21.08.2018 ] - Compatibility, hide predictions, bug fixes ( Stable: ?, Beta: 7.1.2.20 ) [Release Post]
    • 1.5.4 [ 21.07.2018 ] - Can disable vertical swipe, fix full-screen / oreo crash ( Stable: 7.0.9.28, Beta: 7.1.0.17 ) [Release Post]
    • 1.5.3 [ 23.06.2018 ] - Compatibility fixes ( Stable: 7.0.7.28, Beta: 7.0.8.362 ) [Release Post]
    • 1.5.2 [ 31.05.2018 ] - Compatibility fixes, async setup ( Stable: 7.0.5.45, Beta: 7.0.6.25 ) [Release Post]
    • 1.4.3 [ 12.05.2018 ] - Compatibility fixes ( Stable: 7.0.4.20, Beta: 7.0.5.22 ) [Release Post]
    • 1.4.2 [ 17.04.2018 ] - Default diverse emoji, keyboard opacity fix ( Stable: 7.0.2.16, Beta: 7.0.3.17 ) [Release Post]
    • 1.4.1 [ 11.04.2018 ] - Hardware key remapping, undo/redo, transparent keyboard ( Stable: 7.0.2.15, Beta: 7.0.2.14 ) [Release Post]
    • 1.3.4 [ 23.01.2018 ] - Bug fixes, compatibility fixes ( Stable: 6.7.5.31, Beta: 6.7.6.17 ) [Release Post]
    • 1.3.3 [ 18.01.2018 ] - Bug fixes, Oreo support ( Stable: 6.7.4.31, Beta: 6.7.5.28 ) [Release Post]
    • 1.3.2 [ 15.01.2018 ] - Compatibility fixes, size multiplier, emoji vibrate toggle ( Stable: 6.7.4.31, Beta: 6.7.5.28 ) [Release Post]
    • 1.3.1 [ 06.12.2017 ] - shortcut ellipse removed, emoji vibrate, translations ( Stable: 6.7.2.22, Beta: 6.7.3.25 ) [Release Post]
    • 1.3.0 [ 30.11.2017 ] - RTL support, custom sounds, number-row swipe, popups case, nsfw gifs( Stable: 6.7.2.22, Beta: 6.7.3.25 ) [Release Post]
    • 1.2.1 [ 02.11.2017 ] - translations, remove existing popups, select old/new emoji panels, bug fixes( Stable: 6.7.0.18, Beta: 6.7.1.20 ) [Release Post]
    • 1.2.0 [ 28.10.2017 ] -Nougat, diverse emoji, restore defaults, bug fixes( Stable: 6.7.0.18, Beta: 6.7.1.15 ) [Release Post]
    • 1.1.1 [ 02.10.2017 ] -Flow shortcuts crash fix( Stable: 6.6.6.26, Beta: 6.6.9.19 ) [Release Post]
    • 1.1.0 [ 01.10.2017 ] - QuickMenu config, bug fixes( Stable: 6.6.6.26, Beta: 6.6.9.19 ) [Release Post]
    • 1.0.3 [ 10.09.2017 ] - Compatibility fixes ( Stable: 6.6.6.21, Beta: 6.6.7.28 ) [Release Post]
    • 1.0.2 [ 24.08.2017 ] - bug fixes, vertical swipe, punctuation auto-space ( Stable: 6.6.5.31, Beta: 6.6.6.17 ) [Release Post]
    • 1.0.1 [ 08.08.2017 ] - Bug fixes, ui tweaks ( Stable: 6.6.4.19, Beta: 6.6.5.24 ) [Release Post]
    • 1.0.0 [ 02.08.2017 ] - Initial Release ( Stable: 6.6.3.21, Beta: 6.6.4.15 )
    Changes in 2.7.1 ( Compatibility ( Stable: 7.5.4.4 Beta: 7.5.5.15 ) ):[No release post]
    • Fixed
      - Crash caused by bad comparison when loading emoji order

    Complete List of changes


    Download:

    Exi for Swiftkey on Xposed module repository

    My own mirror of all versions


    Bug reports:
    This module tags its logcat messages with "Exi/"
    If you run into any issues, please include any relevant xposed or logcat logs.
    DO NOT bother the Swiftkey developers with any issues you encounter a result of using this module

    Attributions:

    Libraries used:
    Thanks to:
    • Rovo89 for the Xposed Framework
    • Anyone I've forgotten to mention

    Support the Project:
    As it stands Exi for Swiftkey is entirely free, open-source, and completely without limitations.
    Consider buying the developer a brownie if you found this module useful:

    0QHOjBp.png

    Bitcoin: 1Mx17r3DuwUzzp87zhZwfunsLQ2jpmTmfJ

    PAYPAL

    XDA:DevDB Information
    Exi for Swiftkey, Xposed for all devices (see above for details)

    Contributors
    Roughy
    Source Code: https://github.com/Nordskog/SwiftKeyExi

    Xposed Package Name: com.mayulive.swiftkeyexi

    Version Information
    Status: Stable
    Current Stable Version: 2.7.1
    Stable Release Date: 2020-09-22

    Created 2017-08-02
    Last Updated 2020-09-21
    31
    So, hey.

    The short story is that there have been some life-altering stuff going on and I really can't afford to spend the time working on this anymore. I need to get my **** together.

    The last release of Exi was 2.7.0, and it targeted Swiftkey versions 7.6.7.4 ( stable ) and 7.5.8.5 ( beta ).
    I've just stopped updating Swiftkey, I honestly haven't used any of the new features they've added over the past 2 years.

    I'd like to say I might sit down and get it working with the latest version of Swiftkey again, but honestly having to constantly work around ( completely unintentional ) sabotage gets old pretty fast.

    I will probably stick to working on things that won't blow up in my face every couple of weeks.

    Thank you for all your support over the years, and for all the fish.

    Roughy out.
    24
    Detailed Instructions

    Below are detailed explanations of all the features and how to configure them.

    NOTE: These instructions are severely out of date. Maybe check the release posts of the updates if you're after something specific


    Shift / Delete / Modifier keys
    The shift, delete, and modifier keys will be referred to frequently in these explanations.
    The modifier is like a ctrl key, which by default is mapped to the symbols key (123 - switch to the symbols layout).
    This mapping is configurable, and you can add and remove multiple keys as you see fit.
    Likewise, what this module considers to be the shift/delete keys is up to you.
    These mappings can be configured in settings under Keys.

    Key Defintions
    Keys can be defined by content or function, such as spacebar or enter key.
    Keys which are defined by their content are identified by their display string.
    That means that a key that the content of a key that displays as "A" is also "A".
    This also applies to the more exotic Asian layouts.
    There are some exceptions, such as the Japanese long-vowel ( ー ) key using a normal hyphen ( - ) instead.

    Swipe
    Settings - Specify swipe threshold and speed:
    DPtjZdw.png
    0bEzvvT.png

    Threshold - This slider specifies how far you have to swipe before swipe-mode is triggered. The |--| bar above the slider displays the actual physical distance on screen.
    Speed - This slider specifies how fast the cursor moves. The number of characters above the bar show how far the cursor will move when swiped that distance.

    Swipe mode - how and where to swipe:
    xm5iX2p.png
    S9qeAN4.png

    QFDO5mK.png
    hlZ82Gp.png

    Swipe Anywhere - Swipe mode can be triggered by swiping anywhere, except for on the spacebar or enter keys. Swiftkey's flow and swipe gestures interfere with swipe selection in this mode, and are therefore disabled.
    Swipe on Spacebar - Swipe will only trigger on the spacebar. This means you can use flow and swipe-gestures are normal. You can still switch between languages as usual, but have to wait the popup to appear before swiping to select it.
    Hold any and Swipe - Swiping requires two fingers. Hold down one finger and use the second to swipe.
    Hold Shift and Swipe - Swiping requires two fingers. Hold down one finger on the shift key and use the second to swipe.

    Selection Mode - how to swipe-select text .
    a4kOMwt.png
    aPfDki2.png

    Two-finger Gesture - Select text by using two-finger pinch and zoom gestures.
    Swipe from shift/delete - Swipe from the shift key to select to the right, from the delete key to select to the left. What keys are treated as shift/delete can be configured under Keys.

    Spacebar Swipe-up mode- Behavior when swiping up from space .
    gTfn0CB.png
    jkTV0hg.png

    Quick-menu - Swiping up from the spacebar will display a circular quick-action menu with select all / copy / paste / go-to-end. This menu is currently not customizable.
    Hotkeys - You can swipe from the spacebar to any of the keys defined in in the Hotkeys tab, and trigger their corresponding action.

    Emoji

    Overview:
    The emoji panel tab is split into two sections:
    46P3MlE.png
    e3OYPtj.png

    Top: A list of panels you can choose emoji from. This is also where imported emoji will first appear.
    Bottom: The panels that will appear inside Swiftkey.

    The existing templates in the top pane cannot be modified or deleted, as we may make additions to them as Android evolves.
    You can create a new panel here to manually input emoji, or create a new panel by importing from a line-break delimited file.

    In the bottom pane you can add or remove panels as you see fit, and add emoji (individually or by selecting add-all from the menu) from the templates in the top pane.
    The one exception is the Recent Emoji panel (Denoted by a clock icon), which you may only change the position or icon of.

    Setting icon and position:
    svJXMxx.png


    Any of the panels can be renamed or moved around by long clicking on them.
    You may also hit the pick button to choose an icon from any of the existing emoji panels.

    Setting row count:
    By selecting Column Size from the menu, you can specify the column width for each emoji panel.

    Dictionary
    Overview:
    eMbdlQo.png

    The dictionary tab lets you specify shortcut - word mappings.
    In the above screenshot the shortcut is "xx", and typing it in the keyboard results in all the nested words showing up as suggestions.
    This is particularly powerful when combined with the More Suggestions feature, allowing you to scroll through all of them.

    Swiftkey's existing shortcut solution will only trigger if you spell out the trigger verbatim. It also doesn't allow certain characters, such as emoji, in the mapped word.
    Our solution can also be configured to be inserted if the primary suggestion matches the shortcut, and even inserted during flow.
    These options can be configured under settings.

    Secondary suggestions:
    SFdic2h.png

    By default shortcuts will be inserted starting from the primary suggestion.
    When defining the shortcut, or changing it after creation by clicking the shortcut itself, you can configure the mapped words to be inserted as secondary suggestions instead.
    This means the primary, center suggestion remains, and your shortcuts will be inserted starting with the second suggestion (right side in most languages).
    The behavior is the same as when Swiftkey provides emoji predictions.

    Hotkeys
    Overview:
    KWsgIFK.png

    Hotkeys are basically just Ctrl - a/x/c/v combos we are all familiar with on full-sized keyboards.
    Our equivalent for Ctrl is the Modifier key, which can be set to one or more keys under settings - Keys.
    The default Modifier Key is the Symbols layout key ( 123 ).
    Available actions are Select all / Copy / cut / paste / go to end.

    Configuring a key:
    KdlMBk3.png

    With the exception of keys defined by their function (spacebar, enter key etc), most keys are defined by the character they display.
    In general means you just punch in the character the key is displaying and everything should work out. This applies to the more exotic Asian languages as well.
    There are occasionally some discrepancies though. For instance, the long-vowel symbol "ー" in the Japanese layout actually displays a standard hyphen "-".

    Popups
    Overview:
    UGNNFya.png

    The alternate characters that popup when long-pressing a key can be configured to your liking.
    Because different layouts shift the position of these keys around, their positions are defined as either center, or any of the remaining positions starting from left to right.

    When you first add a popup, you will be asked to set a parent key. This is the key that popups will appear under.

    Configuring keys:
    q7Mrjgv.png

    Once the parent key has been added you can click any empty space to add a key there, or the PLUS button to add more slots.
    Slots already occupied by characters are greyed out. If Swiftkey does not provide any characters for the empty slots, they will simply be ignored.
    Any popup characters provided by Swiftkey will be shifted to the right to make space for our insertions.
    padUNkj.png

    This is the result of the above configuration. There is an existing symbol ( + ) which is shifted from it's center slot to the first position, and then shifted again by the "1" we insert there.
    Our "5" wants to be in slot 5, so it ends up after it.

    Settings
    Overview:
    B7GsLwc.png

    The settings panel provides a few additional tweaks.

    Emoji Panel
    Replace Emoji Panel: If disabled, Swiftkey's original emoji panel will be used instead
    Emoji Size: The emoji font size can be configured to some degree. The default value is 12.

    Flow & Suggestions
    More Suggestions: If enabled, the suggestions bar will be made scrollable, and display many more suggestions.
    Suggestion shortcuts: If enabled, shortcuts will trigger on the primary suggestion, instead of only on verbatim input
    Flow shortcuts: If enabled, shortcuts will also be inserted when you flow. Suggestion shortcuts must be enabled for this to work.
    No auto-correct after swiping: When moving the cursor, Swiftkey sometimes insists on inserting the primary suggestion when you hit space, instead of inserting a space. If enabled, a space will always be inserted.
    Maximize suggestions: Swiftkey recently added gaps to both sides of the suggestions bar to make their menu button easier to hit. If enabled, the suggestions bar will fill the screen like it used to.

    Misc
    Disable period tap: Apparently many people hit the period button by mistake. If enabled, a quick tap will no longer trigger it. It must instead be clicked proper.
    Quick-Menu color: Set the color used to highlight the selected item in the quick-menu.

    Keys:
    Dy903E4.png

    Here you can choose which keys will be treated as shift, delete, and modifiers keys by this module.
    See the beginning of this post for a more detailed explanation.

    rSQeIvR.png

    Unlike Hotkeys, here you can define keys not only be their content, but also their function.
    By default it makes sense for the shift and delete keys to be mapped to their respective keys,
    but some languages do not have a shift key, and in others the delete key is an a completely unreasonable location.
    The content field is only available if Letter or Symbol key is picked from the list.
    20
    Exi for Swiftkey 2.3.5 release

    2.3.5 [22.08.2019 ] - Compatibility ( Stable: 7.3.6.19 Beta: 7.3.7.18 )

    Changes in 2.3.5
    • Fixed
      - Compatibility targeting 7.3.7.18 ( Everything, backwards compatible except custom sound )
    • Changed
      - Toolbar shortcut removed

    The Xposed Installer app does not appear to be refreshing properly and may not list the latest version.
    Please download it directly from the Xposed Repository below using a browser.


    Download:
    Exi for Swiftkey on Xposed module repository
    My own mirror of all versions

    Notes:

    ClassHunter

    A large part of what makes maintaining Xposed modules for apps difficult is that the code is all obfuscated and minimized.
    The names and locations of all the classes and methods are garbled anew for every update, so you can't just figure these things out once and be done with it.

    I developed ClassHunter to allow me to generate profiles for classes and methods, and find them in every release of Swiftkey.
    We just chuck the profile at it and use the class or method it decides is the most similar.

    Traditionally Proguard has been used for obfuscation, but Google recently introduced the R8 engine, which behaves /slightly/ differently. Or maybe they just changed the proguard rules.
    The most significant change in the output is the access modifiers changed pretty much everywhere ( public, private, protected ). These access modifiers decide on what bits of code are allowed to access other bits of code.

    Ideally ClassHunter would have been able to cope with this just fine, but it turns out I never implemented proper similarity score calculation for modifiers, and mostly just relied on a perfect match. In many cases I also did not weight these scores properly, so a class could be a 90% match, but because of a mismatched modifier the score would get lowered to 45%.

    So most of the work this time has been improving ClassHunter. Modifiers now have proper similarity scores, class profile scores are weighted more reasonably, and several locations that used to rely on perfect matches now pass along the corresponding similarity score instead.

    All this extra works naturally means that the one-time setup that causes Swiftkey to freeze for a while after an update takes longer than before.
    Initially this was all the way up to 185 seconds on my device, up from about 20 seconds. After implementing some simpler score checking to weed out candidates whose max score would never meet a certain threshold, that is down to about 25 seconds, only slightly slower than before.

    With these improvements the old profiles will identify the correct classes ( and the new profiles the old classes ).

    Compatibility

    Next came figuring out why all sorts of things were broken.
    In rare cases I am forced to rely on the assumption that methods will appear in a certain order, have a specific name ( usually tied to the order ), or is the only one with a specific modifier.
    In some cases methods will be removed entirely from the class, or a bunch of new methods will have been added to it making it difficult to track down the right one. The obfuscation and minimizing process will often split a class into several smaller classes.

    Needless to say anywhere this approach was used was completely broken.

    The method were we insert our gesture and keyboard overlay views can no longer be differentiated from its brethren, and we now instead rely on another method that it coincidentally calls just before returning the view we are interested in. It's the only method that takes an array ( varargs in this case ) of Views, making it far more unique and easier to identify than the old one.

    The exact method that informs us of a swiftkey-key being pressed is no longer identifiable, so we hook every similar-ish method and rely on our gesture overlay view to tell us if it was a key-up or key-down.
    We hook another method to cancel key actions, and when there's a KeyDown event we decide whether or not we want to cancel the corresponding event.
    I'm not entirely sure how this is all set up, but before we could just cancel all key actions /before/ the KeyDown hook and it would still allow the current one through.
    Probably as a result of us hooking a slightly different method now it will also cancel the current action, meaning you couldn't enter the symbols/numbers layout if you had symbols set as a modifier. This was solved by setting a flag that you could set to have it cancel all events /after/ the end of the current KeyDown event.

    Apart from this there was a lot of adjusting and updating method profiles to make them work with both the stable and beta branches of Swiftkey, so we could avoid having to release an update that was not compatible with both.

    In one case the class has changed so much that the it cannot be identifier in both stable and beta using the same profile.
    I currently have it set to search for both profiles, and using the one that best matches its profile.
    That will hopefully keep it going long enough for stable to catch up to beta, then I can remove it.

    Everything should work fine in both beta and stable, with the exception of custom sounds which only works in beta. Will have to wait for stable to catch up.

    The toolbar shortcut to open the Exi config app was working, but it would sometimes remain visible when the toolbar itself was minimized.
    Removed rather than trying to fix.
    18
    Exi for Swiftkey 2.6.8 release

    2.6.8 [03.04.2020 ] - Toolbar/Number row toggle actions, bug fixes, behavioral changes ( Stable: 7.5.1.7 Beta: 7.5.2.4 )

    Changes in 2.6.8
    • Fixed
      - Emoji panel locking up Swiftkey ( Beta 7.5.2.4 )
      - Quick-menu in sectioned layouts ( Chinese stroke etc )
      - Long popup strings being inserted incorrectly in certain fields
    • Added
      - Text action to toggle number row
      - Text action to toggle toolbar
    • Changed
      - Maximize predictions retains toolbar toggle button by default ( swipe gesture in settings )
      - Made Swipe gesture to open toolbar less sensitive

    The Xposed Installer app does not appear to be refreshing properly and may not list the latest version.
    Please download it directly from the Xposed Repository below using a browser.


    Download:
    Exi for Swiftkey on Xposed module repository
    My own mirror of all versions

    Notes:

    Toolbar toggle stuff @death_jax @mario0318
    Swiping the predictions to toggle the toolbar is now configurable, and disabled by default. The old button is used otherwise.
    If you do choose to enable the swipe gesture, it now takes a bit more effort to trigger.
    There is also an action you can configure to the quick-menu or hotkeys for toggling the toolbar now, if that's your cup of tea.

    Number row toggle @oroboros74
    Number row toggle added as an action for the time being, so quick-menu or hotkey.

    Long popup strings ( and quick menu in some layouts ) @aadi50
    If a popup key string is longer than 1 character it will now be intercepted and inserted into the field directly, instead of relying on Swiftkey to handle it.
    This solves... whatever Swiftkey was doing with password fields.

    This was supposed to be simple, but it turns out we were not already tracking Popup key instances.

    When a key is created, Swiftkey first calls a method that lets us know the type of key and its contents.
    A bit later it will the actual constructor of the key class several times, each resulting in a new key object.
    Some of these represent the popup keys, some are phantom keys that do not seem to exist, and finally a single one of them will be the actual key.
    All we know is that they're all related to the same key somehow.

    With some observation you can tell that it creates the lower case popup keys, an empty key, the upper case popup keys, and then finally the actual key.
    This all happens directly after we've inserted our custom popup keys, so we can use this information to figure out what the content of each popup key is, and finally use that to decide which keys we should intercept and handle ourselves.

    Before discovering this I had been discarding keys that were obviously incorrect based on their area; the x/y left/top/right/bottom positions in the layout.
    Keys never fill the entire height or width of the layout, so we obviously wouldn't care about those.
    However, popup keys /do/ fill the popup window they appear in.

    They were keys other than popup keys that had the same height-filling area though.
    It turns out that, in some layouts, the keyboard is split into several different sections.
    The spacebar row is its own little section, and the keys they go into it should fill the height of it.

    This includes the spacebar in these layouts, which we would previously have treated as invalid and discarded, thus breaking the quick-menu.

    The final piece of this puzzle was figuring out how to intercept the popup key.
    When there is some kind of interaction with a key Swiftkey may call one of 4 different methods: Down, up, cancel, and one more unknown.
    These methods are all identical and, once obfuscated, we cannot really tell them apart, so we've been hooking them all and just asking the layer that we use to handle swipe selection what the last motion event was. If it was down then the key event was probably also down.

    Popup keys trigger on the UP event, so we need to identify that. Luckily the 4 methods always appear in the same order, so figuring out which is which and just hooking them in order works.
    We wait for the UP event, check if the key is a popup, and then cancel it, right? Unfortunately this will never tell the popup key that the user is done with it, and it will remain visible.
    In addition to cancelling the UP event, we also have to call the CANCEL event on the key to make it go away.

    All that, to fix popups with long strings in password fields. At least we got the quick menu working in a few more layouts out of it too.

    Emoji panel freeze

    When we display the emoji variant indicator and the selection popup, we need to color a few elements accordingly.
    In these panels Swiftkey uses either a light or dark theme so we don't have to worry about theme-specific weirdness, but we do need to know whether it's treating the current theme as a dark or a light theme.

    Since the emoji would respond to this change I had previously looked up the ID of a resource the emoji would query when shown, and then check if it was using the light or dark variant.
    Unfortunately they have removed this resource, so an exception is thrown when it cannot be found. Multiply this by a million emoji and you have a freeze on your hands.

    I was hoping I could continue to use the same hook with a different resource, but unfortunately they've completely ditched that system and all the dark/light resources in that section of the code are irrelevant now.

    After a bit of searching I realized the method we use to set and keep track of the current theme name returns an object that only has 2 methods, both of which return booleans.
    Exactly what these booleans represent I do not know, but they seem to always be true with light themes, and false with dark themes.

    I imagine in some themes they will not be matched, but they were for everything I tried so good enough.