Skip to content

Latest commit

 

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Paddington

A status bar that isn't pressed up against the edge of your screen.

Samsung packs the status bar icons so close to the sides that they sit there hugging the bezel like they're about to slide off. Paddington is an LSPosed module that adds extra horizontal padding on both sides so the icons stop living on the very edge.

That's the whole product. One slider, one big toggle, nothing else. No account, no analytics, no "unlock the dark theme" nonsense. It hooks the status bar, adds the padding, and gets out of the way.

You need root and LSPosed for this. There is no non-root way to add padding to the system status bar. If that's not your setup, you can leave now, no hard feelings.

what it does

  • Configurable side padding — 0–64 dp, default 16. Stock One UI sits around 12–15, and even +16 reads as noticeably calmer.
  • A native-looking settings screen — built from Samsung's own One UI components (the SESL libraries), so it looks like it belongs on the phone instead of like a stock Android mockup that fell in from another universe.
  • A live preview that's actually live — it captures the real status bar, hides it, and draws an adjusted version at the top of the screen that follows the slider in real time. It reads your display cutout, works out the stock insets, and shows stock / now / after in real dp so you know exactly what you're about to do before you commit.
  • A master switch — off means the module adds nothing and the status bar goes back to stock. On means padding. That's the entire toggle.
  • Haptics on the slider — the only way you can feel a 2 dp difference is with your thumb.
  • "Apply & restart System UI" — saves the value and restarts System UI through root so the change is live immediately. There's a "save only" button for the times you'd rather restart later.

It's scoped to com.android.systemui only. It doesn't poke at anything else.

status bar with added side padding

how it works

On One UI 8.x, the horizontal padding of the status bar icon containers is computed by the indicator garden inside SystemUI. There are three implementations, picked by your display cutout type:

Class Cutout
IndicatorGardenAlgorithmCenterCutout punch-hole
IndicatorGardenAlgorithmNoCutout no hole
IndicatorGardenAlgorithmSidelingCenterCutout side hole (yes, that's the actual name)

Each of them overrides calculateLeftPadding() / calculateRightPadding(), and Paddington hooks those concrete classes and adds your configured dp to whatever they return.

The padding value lives in the module's SharedPreferences. System UI runs as a completely different UID though, so it can't read those — the setting is exposed through a ContentProvider instead.

the part that was actually annoying

Hooking the base class IndicatorGardenAlgorithm would have been the clean move. It doesn't work. Virtual dispatch always resolves to the subclass override, so the base hook never fires, full stop. The fix is hooking all three concrete classes directly, which cost real hours. The whole story is in docs/DEBUGGING.md if you ever need to find your own hook target.

The other annoying bit was the live preview. The status bar you're trying to preview is not a nice static image — it has a cutout, the icons sit at different distances depending on the device, and the density is different on every phone. Reconstructing "what it would look like if you did this" well enough to be useful ended up being more code than the actual padding hook. Worth it though — watching the number change and the preview follow along is the entire point of the app.

running it

  1. Download the latest app-release.apk from the releases page.
  2. Enable Paddington in LSPosed Manager.
  3. Make sure System UI is ticked in the module scope.
  4. Restart System UI (or just reboot).
  5. Open the app, drag the slider, hit Apply & restart System UI.

Want to get rid of it? Disable the module in LSPosed Manager and restart System UI. No leftover hooks, no drama.

building it

You need a JDK 21 and an Android SDK. That's the easy part.

The slightly less easy part: the One UI design library is published to GitHub Packages, and GitHub Packages refuses to hand out artifacts without a token. So before the build works you need an app/github.properties file (gitignored, and please keep it that way):

ghUsername=your_github_username
ghAccessToken=your_token_with_read_packages_scope

Grab a token at https://github.com/settings/tokens/newread:packages is enough. Takes about a minute, and you only have to do it once. (If you'd rather not, the build also picks up GH_USERNAME / GH_ACCESS_TOKEN env vars, or ghUsername / ghAccessToken in your global ~/.gradle/gradle.properties.)

Then:

.\app\gradlew.bat :app:assembleRelease

The release APK lands in app\app\build\outputs\apk\release\app-release.apk, signed with paddington.keystore (repo root, password paddington, regenerated by CI if it's missing).

One note on versions: a v1.2.3 tag builds versionName 1.2.3 and versionCode 10203; without a tag CI falls back to 0.0.<run_number>. Push a v* tag and the workflow attaches the APK to a GitHub release for you.

If you hit a wall, docs/BUILDING.md has the details and the troubleshooting.

status

Works, on a Galaxy A56 (SM-A566B) running One UI 8.5 / Android 16. The indicator garden classes are version-specific, so if it doesn't work on your phone it's almost certainly your One UI version, not the code. And if System UI ever misbehaves, disable the module — it goes right back to stock.

MIT, see LICENSE.

About

LSPosed module: adds custom side padding to the status bar on Samsung One UI 8.5 / Android 16

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages