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

Search This thread

Roughy

Senior Member
Jul 1, 2015
348
1,207
Is it possible to add spacing between each row? I would like to add space between the L key and the backspace key. I would like to make the rows wider.

Also is there a way to customize the secondary punctuations in the period key like you did with the space bar? Thanks
@Roughy

Messing with key spacing should technically be possible now, though I haven't tried actually messing with it, nor do I really intend to do so.
Would need some pretty fancy configuration tools on Exi's side to make it useful.

Customize the secondary punctuations in the period key... like I did with the space bar? Not sure what you are referring to here.
You should be able to add popup keys to the period key, just like you can with any other key. The only different is that the "delete existing keys" option doesn't work for that one.
 
  • Like
Reactions: BadToThePhone

BadToThePhone

Senior Member
Dec 26, 2011
436
43
Spacing the rows would be nice if you do decide to try or get around to it. I don't need specific key spacing.

So what you are saying is I can't delete the question mark or exclamation point from the period key and just have a period or comma?

Is it possible to hide the period key and extend the space bar over the period keys place?
@Roughy
 

Roughy

Senior Member
Jul 1, 2015
348
1,207
Spacing the rows would be nice if you do decide to try or get around to it. I don't need specific key spacing.

So what you are saying is I can't delete the question mark or exclamation point from the period key and just have a period or comma?

Is it possible to hide the period key and extend the space bar over the period keys place?
@Roughy

Indeed. For some reason removing all the other popups keys doesn't work the same way as it does for the other keys, so you're stuck with whatever is already there.

Extending the space bar to cover the comma key should in fact be possible. Would probably have to mess with the sizing of the comma key too.
But again, theoretically a thing but nothing something I have confirmed, nor do I have any intention of adding it.

That would just be a simple on-off thing though, so I might actually give that a go sooner or later.
Add it to the github issues list maybe.
 
  • Like
Reactions: BadToThePhone

BadToThePhone

Senior Member
Dec 26, 2011
436
43
Indeed. For some reason removing all the other popups keys doesn't work the same way as it does for the other keys, so you're stuck with whatever is already there.

Extending the space bar to cover the comma key should in fact be possible. Would probably have to mess with the sizing of the comma key too.
But again, theoretically a thing but nothing something I have confirmed, nor do I have any intention of adding it.

That would just be a simple on-off thing though, so I might actually give that a go sooner or later.
Add it to the github issues list maybe.

If you could cover the comma or period key or both that would be nice. Then you can customize the space bar to anything to use any punctuation or letter. Extending the spacebar over those 2 keys would be helpful.

In the 3rd paragraph what are you taking about to add to github?

Thanks
 

Tchania

Senior Member
Apr 19, 2016
175
86
Working fine with SwiftKey 7.3.9.
But I think emojies appear bigger than before (not a problem though).
 

Taracair

Senior Member
Sep 10, 2011
417
87
Realme Narzo 30 5G
Guys, from some time I have a bad thing happening to me with SwiftKey.

It tends to cut the last letter of the word I'm typing.

I don't know if it's the SwiftKey itself or Exi. I have fiddled with some Exi settings but haven't changed anything major.

Do you also experience that issue?
 

Tchania

Senior Member
Apr 19, 2016
175
86
Guys, from some time I have a bad thing happening to me with SwiftKey.

It tends to cut the last letter of the word I'm typing.

I don't know if it's the SwiftKey itself or Exi. I have fiddled with some Exi settings but haven't changed anything major.

Do you also experience that issue?
Never experience such problems in my case.
Have you tried disabling exi module to see if it's related to exi?
Or maybe reinstall both SwiftKey and exi.
 

alwynjoshy

Senior Member
May 28, 2014
628
65
Chicago
How to get older versions of Swift keyboard, tried so many apks and all of them are get broke after installation, tried titanium backup still not works
 
Last edited:

alwynjoshy

Senior Member
May 28, 2014
628
65
Chicago

Attachments

  • Screenshot_20190922-214944.jpg
    Screenshot_20190922-214944.jpg
    123.2 KB · Views: 388
Last edited:

alwynjoshy

Senior Member
May 28, 2014
628
65
Chicago
I don't know why this happens.
Maybe try installing only one keyboard (I see you have beta as well).
No brother both have different package anme and stuffs so that is not the issues, new swiftkey builds like it cant be only installed from playstore, i downloaded around 5 apks all having same issues, i have the titanium backup of old apk but restoration also fails @Roughy
Screenshot-20190923-123335-png.png
 
Last edited:
No brother both have different package anme and stuffs so that is not the issues, new swiftkey builds like it cant be only installed from playstore, i downloaded around 5 apks all having same issues, i have the titanium backup of old apk but restoration also fails @Roughy
You get that because it is a split apk. AFAIK, titanium backup fails to restore split apks. Even if it restores, it force closes when you open it.
 

alwynjoshy

Senior Member
May 28, 2014
628
65
Chicago
@Roughy exi not working after 3 reboots, the exi only module has the issue all other has running fine. I have collected all the logs please look into.
Thanks for you work
 

Attachments

  • EdXposed_Module_error_20190925_015713.log
    42.2 KB · Views: 3
  • EdXposed_Verbose_all_20190925_015702.log
    43.9 KB · Views: 2

KaMyKaSii

Senior Member
Feb 25, 2015
1,391
686
the picture you see is an regular installation not titanium backup restore

As stated, you cannot install splitted apks as if they were regular (full) apks. I recommend that you install Aurora Store to properly download and install splitted apks, you just need to know the version code of the old SwiftKey you want to downgrade.
https://t.me/AuroraSupport
 

Attachments

  • Screenshot_20190925-110950923.png
    Screenshot_20190925-110950923.png
    213.3 KB · Views: 132
  • Screenshot_20190925-110954589.png
    Screenshot_20190925-110954589.png
    188 KB · Views: 132
  • Like
Reactions: Tchania

Top Liked Posts

  • There are no posts matching your filters.
  • 109
    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://xdaforums.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
    33
    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.