micku7zu / quickcursor Goto Github PK
View Code? Open in Web Editor NEWQuick Cursor: One-Handed mode
Home Page: https://play.google.com/store/apps/details?id=com.quickcursor
Quick Cursor: One-Handed mode
Home Page: https://play.google.com/store/apps/details?id=com.quickcursor
Global system action not supported
Split screen action doesn't work or can't be selected. It worked before in Android 12 or older versions.
Unfortunately, there is no solution for this issue
Issue raised on Android issue tracker here: https://issuetracker.google.com/issues/225186417.
Star the issue and maybe they will change their mind
The commit from 2021 December 02 in Android source code that removed this function can be seen here: https://android.googlesource.com/platform/frameworks/base/+/1ad80ead9205e5a6dd54d6de6706b865f496b803%5E%21. The commit description is:
Document the split-screen action
The split-screen behavior is changed, so systemui doesn't
support this action with a single activity. We don't handle
this action by default from sc-v2. If SystemUI has any behavior
changed, they could register this action to support it.
The action for GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN was removed from AOSP Android 13. Other manufacturers might implement this functionality back.
GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN doesn't work anymore in Android 13+.
This was reported by an user on email and I can't reproduce the issue on my devices so far.
If you have this issue, please reply with your device model and Android version. I try to gather more info to understand when and why it happens, to reproduce it myself and try to fix it.
Thanks!
The "Change brightness" action doesn't work correctly on Samsung devices with Adaptive brightness turned on.
The action changes the brightness to the correct value but the screen brightness it is not changed, or it is changed really slow.
This is a bug from Samsung and can be reproduced with ADB:
adb shell settings put system screen_brightness 255
adb shell settings put system screen_brightness 0
The only workaround found yet it is to disable the "Adaptive brightness".
There are possible fixes that can be implemented in Quick Cursor but all of them are hacks that are hard to support:
So currently there is no acceptable solution to implement in Quick Cursor.
Issue was reported on Reddit here:
https://www.reddit.com/r/androidapps/comments/105hc14/which_are_the_best_apps_to_try_in_2023/j3eztmu/
and the response is also available on Reddit here:
https://www.reddit.com/r/androidapps/comments/105hc14/which_are_the_best_apps_to_try_in_2023/j3g0os0/
When off, I get "instant" response, in particular on the A key and the backspace key (and probably numlock and enter as well.) With QC active, there's a 0.1 - 0.2s of a lag -- in other words, hitting backspace has a noticeable (but minor) delay before activating.
Yes, the triggers over the keyboard adds a minor delay over the letters they cover ("Q", "A", "P", "Backspace", etc). There are workarounds and solutions for this, depending on personal preference:
As you can see in this screenshot, the triggers overlaps some of the keyboard keys but this depends A LOT on many many variables: keyboard layout (keyboard app, android version, etc), screen size, personal "screen zoom" or "font size" adjusted from settings, curved display or not, etc.
So there are no two identical setups available, each one has a different trigger size that works for them which might overlap or not the keyboard. I tested it on many devices and sometimes a small trigger size works excellent on some devices but not so good on others, where you need to make it bigger, overlapping more of the keyboard.
So, when the app was first released 2-3 years ago, it didn't have many features, and one of the first feedback (example 1, example 2, example 3) was that they can't use the keyboard correctly because the triggers are triggered when they type.
I was surprised because on my device I could set the triggers small enough to not overlap but still to be triggered, then I discovered that this does not apply to all use cases and I had to implement some workarounds:
As you discovered yourself, the "pass trigger clicks" workaround is a hack, because this can't be achieved without a hack. It is an Android limitation or a security feature.
In Android only 1 app can "capture" a touch event, and that app can't be changed for the lifespan of that touch event, so I have two options in Quick Cursor:
It is clear that triggers needs to listen to touch events, which means that when the user touches the trigger, that touch is completely reserved for Quick Cursor app, it can't be passed to other app.
So, when a user touches the trigger (first 0-100ms), it is not clear yet what they want to do, because that touch can be a simple tap or a swipe, or a long tap, it is still not decided. Screenshot of some touch examples https://i.imgur.com/9kXVcBL.png. Here it also depends A LOT on the touchscreen sampling rate and touchscreen sensitivity, I personally experienced a huge difference in sensitivity between devices. There are some devices where I can't simply tap on the screen without triggering also a 'move' event, it's always: 'down', 'move', 'up'. In other devices it is always 'down' and 'up' for a tap.
First delay: So, the user touches the trigger and until the 'up' event (that he released the screen) or a certain amount has passed (300ms, 500ms, to be considered a long tap, not a simple tap), I can't decide if he wanted to press what's under the trigger (a letter) or he wants to grab a cursor.
Second delay: After the event was decided (tap, long tap, swipe, etc)(0-299ms delay), depending on how fast the tap was (it can be even under 20ms, this one depends on how the user taps and the touchscreen/device "performance"), I have to pass the click through the tracker to the letter behind the tracker, and this is not possible in Android in a normal way, but this app being an accessibility service, I can simulate a tap on the screen at the position the user clicked behind the tracker, which implies some kind of hack and it adds another delay (pretty hard to measure and extremely hard to check how much difference between devices is) but it shouldn't be that much.
The keyboard app receives the new fake touch event after (first delay + second delay)ms and process the touch event themselves.
There is also another Android limitation: there can't be two simultaneous touch events from different input devices. Example:
So I can't simulate the touch under the trigger until the real touch event has finished.
I hope everything is clear now, why it happens, what workarounds are available.
Of course, choosing the best workaround for this depends on what you prefer. I personally prefer to make the triggers as small as possible but still be usable AND to pass the clicks through the triggers. There are a lot of users with the triggers raised above the keyboard, and a lot with them completely disabled. It depends
The "Change volume" action doesn't work outside of Quick Cursor app on OnePlus/Oppo/Realme device.
This issue happens only on Oxygen OS, Color OS and Realme UI (all 3 are based on the same system).
This is currently being investigated. I don't have more details on it yet.
Can you add QuickCursor to F-Droid? The free tier (non-pro) version at least.
This is the inclusion policy that must be met to be able to submit. More info about submitting can be found here.
Here is the issue tracker to request your package to be available on F-Droid. After submitting, they can assist on what is needed to be done (if anything) to get it on F-Droid.
Google Chrome Android, and other browsers based on Chromium (Brave, Vivaldi, etc), automatically changes the tab switcher to a list when Quick Cursor is enabled.
Tab preview and grouping are not working when the tab switcher is rendered as list.
Disable "Simplified view for open tabs" from Chrome accessibility settings.
Steps:
Chromium (Google Chrome) has a feature that automatically detects when touch exploration or an accessibility service that can perform gestures is enabled and it enables "Simplified view for open tabs" automatically.
You can find the method that detects the accessibility service with "canPerformGesture" permission or touch exploration on Chromium source code website. File ui/android/java/src/org/chromium/ui/util/AccessibilityUtil.java, method isAccessibilityEnabled()
Some manufacturers (Xiaomi, Huawei, Samsung and others) are stopping background apps (like Quick Cursor) even when the user doesn't want this.
Unfortunately, there is no solution for me as a developer to fix this. I don't have enough permissions to bypass their mechanisms.
The solution is to check what tricks/hacks/whitelists/locks you have to do specifically for your device in order to keep an app open for a long period of time.
Usually there are some tricks that apply to all manufacturers, but each manufacturer have different settings and it can also change on each Android version:
I can't maintain a list of all possible ways because each manufacturer on each Android version have a different complex way to stop a background app.
Huge congrats to Google Pixel and other close to AOSP devices that don't stop a background accessibility app.
The Quick Cursor accessibility service is greyed out and can't be enabled. Clicking the greyed out item shows a popup:
Restricted setting
For your security, this setting is currently unavailable.
Learn more
This issue happens in Android 13+ because "ACCESS_RESTRICTED_SETTINGS" is set to "deny" or "ignore" when the app was installed from outside an app store.
More details:
There are two options in order to fix this:
Gestures are not replicated in real time. It would be much easier and nicer if the gestures (swipe, drag & drop, etc) would be simulated at the same time the tracker moves.
Unfortunately, this is not possible in Android right now. I would love to implement that, but Android doesn't support this feature yet.
I understand and know that it would be much easier to swipe or to drag & drop if the gesture is mirrored in real time with the cursor, but Android doesn't support two simultaneous touches from two different sources. Examples:
This is described in Android Documentation - dispatchGesture:
I tried implementing this and the gesture is automatically canceled if Quick Cursor simulates a touch on the screen when the user still touches the screen. A user touch cancels a simulated touch in progress, and vice versa.
Hopefully this limitation will be fixed in future Android versions.
The only solution right now is to use recorded gesture and then replicate them.
The click doesn't work on Samsung device. The following error message appear:
Quick Cursor couldn't send the gesture because the Android Accessibility Service stopped to dispatch gestures. This is a known bug in some devices and can be triggered by other apps that use accessibility services or by some integrated ones, like the One-Handed mode on Samsung devices. To resolve this issue, disable and enable the Quick Cursor accessibility service or restart your device. If you keep having this problem for unknown reasons, please try the limited mode.
Disable Samsung "One-Handed mode": Settings -> Advanced features -> One-handed mode turned off
Uninstall Samsung "One Hand Operation +" app.
Restart the device
Samsung "One-Handed mode" and "One Hand Operation +" have a bug that breaks the gesture replication in Android. There is no explanation or reason why this happens, it just stops working. It looks like the 2022 December Android 13 update fixed this issue, at least on some devices that I tried. I still need more feedback if this is resolved for all their devices.
The dispatchGesture accessibility method is not working if one of that two services is enabled.
Found your app, bought the pro license and it somewhat fulfills my needs but I was actually looking for something that Quick Cursor partially does and would like to make a suggestion for a mode that fits my niche use case.
Size for everything is adjustable but the generally idea is for Quick Cursor to be permanently "mounted" to the bottom of the phone where your thumb can easily manage to move around and instead of mapping movements 1:1, it becomes basically a mouse cursor with the space QC takes acting as a trackpad on a laptop, so for example if you need to reach near the bottom you can just "scroll" the mouse to it and use the available functions of tap, swipe to navigate.
My idea comes from The Big Phone Problem where the concept is to remove all direct interactions with the device so it can be fully navigated one handed, this takes away majority of issues with one handed use on modern phones, QC currently partially fulfills this but for example if I have to tap something to either the far left / right, QC kind of gives up since you're not really moving a "mouse" but just extending your normal movements X amount of pixels.
Tracker Actions can be mapped to open if you long press in the "trackpad" area, maybe you can have an option to disable the navbar completely and have all functions mapped in Tracker Actions for a more seamless experience.
I don't know much of how Android dev works so many there are no APIs that support what I'm asking for but another example that somewhat showcases what I'm asking for is the Samsung Z Flip 4 touchpad please mute the audio, it's terrible.
Sorry for the wall of text, looking forward to hearing how feasible this is.
The "Change brightness" action doesn't work correctly because the minimum brightness or maximum brightness is not enough
According to Android documentation, the "screen_brightness" Android setting must be an integer value between 0 - 255
This can be tested using ADB:
adb shell settings put system screen_brightness 0
adb shell settings put system screen_brightness 1
adb shell settings put system screen_brightness 25
adb shell settings put system screen_brightness 150
adb shell settings put system screen_brightness 255
The Android documentation is pretty easy and clear, but the documentation is not respected, and in reality, the screen_brightness range is different between Android versions and different manufacturers.
And after some feedback from users and debug, there are some exceptions and complications that are not specified anywhere:
It tends to go wonky when you rotate to portrait mode. Moto - - Edge. It's good other than that
The back gesture navigation overlaps the Quick Cursor triggers and I can't grab a cursor.
This issue happens only on Oxygen OS, Color OS and Realme UI (all 3 are based on the same system) because they have a bug in their gesture navigation system. They don't respect the Android documentation about system gesture exclusion. Screenshot
OnePlus, Oppo and Realme UI are the only ones that don't respect this documentation and I can't fix this issue. I don't have enough permission to overlap the system gesture navigations.
There is an open bug raised in the OnePlus forum but they didn't fix it yet: https://community.oneplus.com/thread/1246522
Quick Cursor is not the only app that suffers from this bug, this is a bug in OnePlus implementation and can't be fixed by app developers.
Quick Cursor clicks don't work inside the Android file picker starting with Android 12:
Unfortunately, this is not a Quick Cursor issue, so I can't fix it.
This is an issue inside the AOSP file picker and I've raised a bug here.
For more details check here: https://issuetracker.google.com/issues/268844489
Google Chrome UI changes when Quick Cursor is enabled:
Chromium based browsers (Google Chrome, Brave, Vivaldi, etc) automatically detects when touch exploration or an accessibility service that can perform gestures (like Quick Cursor) is enabled and automatically changes the UI to adapt for accessibility needs.
It doesn't let the user decide if they want to UI to be adapted for accessibility needs, Chrome automatically makes this decision based on what accessibility services are running.
There is no way for me as a developer to exclude Quick Cursor from that check, Chrome doesn't have any exceptions, it checks for any accessibility service that can perform gestures on screens.
You can find the method that detects the accessibility service with "canPerformGesture" permission or touch exploration on Chromium source code website. File ui/android/java/src/org/chromium/ui/util/AccessibilityUtil.java, method isAccessibilityEnabled()
Because Chrome checks for any accessibility service that have the permission to "simulate a touch on the screen". Not all accessibility services needs or have this permission, but Quick Cursor needs this to simulate the tap at the cursor position.
Can you make gesture recorder more longer like before. Now its hard to move some apps of dragging something. Its take less 3 sec now when use gesture recorder. Hope you can fix this.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.