Git Product home page Git Product logo

leon's Introduction

Hi there

My name is Sven (he/him). I'm an Android and mobile backend developer from Germany. I also like to dive into Web frontend development with for example Vue.js or Svelte from time to time.

I started to write software when I still went to school. I learned and used various programming languages and environments since then. My first computer was an Amiga 500 but I also got in touch with the C64 at friends.


I believe that crafting code which is elegant, beautiful, efficient, robust, tested and modular while utilising modern languages, tools, standards and architectural patterns is the foundation of a great application thereby providing the best user experience.


I'm always eager to learn new technologies, programming languages, frameworks, architectural patterns etc. which make the life of a software engineer more pleasant and help in writing better code :)

I either work from home which is located in the beautiful Westerwald or in Cologne. 1

Contact me on LinkedIn or via mail.

1: Almost entirely from home during the COVID-19 pandemic

leon's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

leon's Issues

Twitter to Nitter converter

Add a sanitizer which converts Twitter to Nitter links. Nitter is an alternative, privacy focused interface for Twitter. However as there can be various Nitter instances, the sanitizer should probably provide a configuration screen where an instance can be specified.

Recursion

@svenjacobs Could we get an option for Léon to keep running over the URL until no more change? Rerunning seems redundant. E.g., I just got this link via Google Alert in my GMail:

https://www.google.com/url?q=https://www.google.com/url?rct%3Dj%26sa%3Dt%26url%3Dhttps://www.inferse.com/268929/prime-day-2022-phone-deals-all-the-best-amazon-prime-early-access-phone-deals-bgr/%26ct%3Dga%26cd%3DCAEYACoUMTA3NzY4NTE0MDEwNTAyODc4MzMyHDMxNGQyNzdmOTRjOGU5MDE6Y29tOmVuOlVTOlI%26usg%3DAOvVaw0ib2-8ukc8GkNkCxTAEkb6&source=gmail&ust=1665828403544000&usg=AOvVaw0R6tQNh7vvWCHGibWcIz_k

↓ which Léon makes ↓

https://www.google.com/url?rct=j&sa=t&url=https://www.inferse.com/268929/prime-day-2022-phone-deals-all-the-best-amazon-prime-early-access-phone-deals-bgr/&ct=ga&cd=CAEYACoUMTA3NzY4NTE0MDEwNTAyODc4MzMyHDMxNGQyNzdmOTRjOGU5MDE6Y29tOmVuOlVTOlI&usg=AOvVaw0ib2-8ukc8GkNkCxTAEkb6

↓ which, when rerun through Léon, finally ends up @ ↓

https://www.inferse.com/268929/prime-day-2022-phone-deals-all-the-best-amazon-prime-early-access-phone-deals-bgr/

Please try to add support for Flipkart URL's

Clean Instagram `igshid` param

Instagram adds the igshid tracking parameter to links, I.e.

https://www.instagram.com/p/Ceeg-VgI4yF/?igshid=YmMyMTA2M2Y=

Could Léon support cleaning these too?

Add ?fbclid=

Hi!
Awesome idea for an app.

I tested a link that contained a tracker that started with ?fbclid=, and it was not recognised.

Cheers!

Option to auto copy to clipboard

It would be a nice option if the app could immediately copy to clipboard and close again instantly, going back to the app that was shared from. That way it would closely mimmick a "copy link" that you would otherwise might use directly from the source app.
Afaik its possible to differentiate "app open" from app drawer and from content share, so that the app is still reachable if you open it directly.

Sanitizer for Search Engine Links

Remove further unnecessary parameters from URL

Minimum feature request:

Please implement a solution to make Leon able remove unnecessary parameters from URLs, like

  • empty values
  • various session ids (this might also be a privacy feature!) like jsessionid, sessionid, ...

Exampel URL:

https://www.buch24.de/shopdirekt.cgi?sessionid=1650808921-319962258&id=13241297&p=3&sid=&static=0&nav=

Real necessary:

https://www.buch24.de/shopdirekt.cgi?id=13241297&p=3&static=0

Maximum feature request:

In addition to min. feature request, enable the user to add own parameter names to be wiped out.

Why?

Keep URL short and empower the user to remove unwanted stuff.

Tnx in advance,
Enkidu

GeoRiot tracking

@svenjacobs GeoRiot uses a similar, but not identical scheme, to #42. So 1 might run into

  • https://target.georiot.com/Proxy.ashx?tsid=8429&GR_URL=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0B3Q23BT4%3Ftag%3Dhawk-future-20%26linkCode%3Dogi%26th%3D1%26psc%3D1%26ascsubtag%3Dcbq-us-custom-tracking-20

which, of course, should just be

  • https://smile.amazon.com/dp/B0B3Q23BT4 (when the smile option is on)

So just the url-decoded value of parameter GR_URL is required. Then the 2nd pass from #79 would clean/fix the Amazon URL properly.

(Minor Issue) Crash when clicking license button in settings

Leon crashes immediately when I press the license button
Logs from logcat (not sure if they are directly relevant):

FATAL EXCEPTION: main
Process: com.svenjacobs.app.leon, PID: 15058
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/compose/material/MaterialTheme;
	at r3.i.b(Unknown Source:6)
	at r3.e.c(SourceFile:2)
	at w4.a$a.Q(SourceFile:78)
	at m0.a.a(SourceFile:50)
	at m0.a.Q(Unknown Source:8)
	at d0.d1.R(SourceFile:147)
	at m0.a.R(SourceFile:58)
	at j1.t.R(SourceFile:59)
	at m0.a.R(SourceFile:58)
	at f0.m.y(SourceFile:23)
	at b0.a.l0(SourceFile:43)
	at f0.h.O(SourceFile:129)
	at f0.h.K(Unknown Source:13)
	at f0.h0.t(SourceFile:18)
	at f0.z1.a(SourceFile:45)
	at f0.h$b.a(SourceFile:10)
	at f0.h$b.a(SourceFile:10)
	at f0.h0.s(Unknown Source:12)
	at j1.q.c(SourceFile:110)
	at j1.q$b.g0(SourceFile:130)
	at d0.f1.V(SourceFile:812)
	at j1.z.f(SourceFile:38)
	at j1.r$a.f(SourceFile:9)
	at l1.z$b$a.y(SourceFile:103)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.w(SourceFile:117)
	at l1.n.t0(SourceFile:127)
	at j1.i0$a.d(SourceFile:33)
	at l1.z$b$b.y(SourceFile:20)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.z0(SourceFile:61)
	at l1.z$b.t0(SourceFile:41)
	at j1.i0$a.d(SourceFile:33)
	at t.g.b(SourceFile:46)
	at t.h$b.V(SourceFile:25)
	at j1.z.f(SourceFile:38)
	at l1.z$b$a.y(SourceFile:103)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.w(SourceFile:117)
	at l1.n.t0(SourceFile:127)
	at j1.i0$a.h(SourceFile:53)
	at v0.g0$a.V(SourceFile:18)
	at j1.z.f(SourceFile:38)
	at l1.t.t0(SourceFile:45)
	at j1.i0$a.f(SourceFile:75)
	at t.p$a.V(SourceFile:11)
	at j1.z.f(SourceFile:38)
	at l1.t.t0(SourceFile:45)
	at j1.i0$a.d(SourceFile:33)
	at l1.z$b$b.y(SourceFile:20)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.z0(SourceFile:61)
	at l1.z$b.t0(SourceFile:41)
	at j1.i0$a.d(SourceFile:33)
	at t.g.b(SourceFile:46)
	at t.h$b.V(SourceFile:25)
	at j1.z.f(SourceFile:38)
	at l1.z$b$a.y(SourceFile:103)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.w(SourceFile:117)
	at l1.n.t0(SourceFile:127)
	at j1.i0$a.h(SourceFile:53)
	at v0.k$a.V(SourceFile:18)
	at j1.z.f(SourceFile:38)
	at l1.t.t0(SourceFile:45)
	at j1.i0$a.d(SourceFile:33)
	at l1.z$b$b.y(SourceFile:20)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.z0(SourceFile:61)
	at l1.z$b.t0(SourceFile:41)
	at j1.i0$a.d(SourceFile:33)
	at t.g.b(SourceFile:46)
	at t.h$c.V(SourceFile:48)
	at j1.z.f(SourceFile:38)
	at l1.z$b$a.y(SourceFile:103)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.w(SourceFile:117)
	at l1.n.t0(SourceFile:127)
	at j1.i0$a.d(SourceFile:33)
	at l1.z$b$b.y(SourceFile:20)
	at o0.h$a.a(SourceFile:64)
	at o0.w$c.y(SourceFile:7)
	at b0.a.l0(SourceFile:43)
	at o0.w.c(SourceFile:75)
	at l1.x0.a(Unknown Source:12)
	at l1.z$b.z0(SourceFile:61)
	at l1.v.N(SourceFile:27)
	at l1.e0.l(SourceFile:197)
	at l1.e0.h(SourceFile:63)
	at androidx.compose.ui.platform.AndroidComposeView.c(SourceFile:14)
	at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(SourceFile:22)
	at android.view.View.draw(View.java:23194)
	at android.view.View.updateDisplayListIfDirty(View.java:22066)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5214)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5186)
	at android.view.View.updateDisplayListIfDirty(View.java:22021)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5214)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5186)
	at android.view.View.updateDisplayListIfDirty(View.java:22021)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5214)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5186)
	at android.view.View.updateDisplayListIfDirty(View.java:22021)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5214)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5186)
	at android.view.View.updateDisplayListIfDirty(View.java:22021)
	at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:588)
	at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:594)
	at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:667)
	at android.view.ViewRootImpl.draw(ViewRootImpl.java:4264)
	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4048)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3321)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2201)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9000)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:996)
	at android.view.Choreographer.doCallbacks(Choreographer.java:794)
	at android.view.Choreographer.doFrame(Choreographer.java:729)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:981)
	at android.os.Handler.handleCallback(Handler.java:883)
	at android.os.Handler.dispatchMessage(Handler.java:100)
	at android.os.Looper.loop(Looper.java:237)
	at android.app.ActivityThread.main(ActivityThread.java:7948)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
Caused by: java.lang.ClassNotFoundException: androidx.compose.material.MaterialTheme
	... 152 more

Android 10 - Samsung A10 (One UI 2.0)
Leon 1.2.0 (Fdroid)

Add domain based rules

First of all, thanks for this project! Found this from F-droid circles and loved the idea❣️

What do you think about adding domain specific rules to clean URLs like these:

https://www.amazon.com/BEAST-40oz-Black-Tumbler-Stainless/dp/B08GTPXJBL/?_encoding=UTF8&smid=AHFMMW9O1FG2X&pf_rd_p=d11c243d-9bba-498d-bb87-2e184199c856&pd_rd_wg=zP7f5&pf_rd_r=43Z35PH2XY62GBS2WZ7J&pd_rd_w=2b5Rj&pd_rd_r=7cd0fb38-2890-4adc-b51e-b12056bd09ec

https://www.amazon.com/BEAST-40oz-Black-Tumbler-Stainless/dp/B08GTPXJBL/

May be the rule can be:
www.amazon.com/(.*)/dp/([0-9A-Z]+)/* -> www.amazon.com/$1/dp/$2/

Great app and clean code! Thank you!!

Sanitize TikTok URLs

I think Leon should have a sanitizer for TikTok URLs.

I'm pretty busy, myself, but if I find time, what's the most tricky part of adding a sanitizer? What's the best way to resolve it?

Read URL from clipboard

Minimum feature request:

Please implement a solution to make Leon able to read URL from clipboard.
(Only exact URL is stored in clipboard.)

Maximum feature request:

In addition to min. feature request, make Leon able to filter out URL from clipboard text.
(Text containing an URL is stored in clipboard.)

Why?

In apps such like Telegram messenger you are often not able to share a link with an external app. You are only able to copy URL to clipboard.

Tnx in advance,
Enkidu

Add Custom Rules

Hi,
Would be possible to add custom rules,
because sometimes the app doesn't clean residual paramter of the url like the one after a "?"

Add CONTRIBUTING.md and/or comments

Currently there is no information as to how to setup a development environment for this, nor any description in the source on how things work or how settings affect anything. For example in app/src/main/java/com/svenjacobs/app/leon/domain/model/Sanitizer.kt on how the Regex has to be constructed to pull the required information, or what isDefault or uid are used for.

Since this is a rather new and small app this could help bring in developers just starting with Android development.

Youtu.be domain+url rewriter

https://youtu.be/video-id should be transformed into https://www.youtube.com/watch?v=video-id. These youtu.be links comes from the share function.

Thanks for the app!

GMail URL Sanitizing

GMail uses a similar, but not identical scheme, to #42. E.g., when referring to the link where I teased this, GMail gives

  • https://www.google.com/url?q=https://github.com/svenjacobs/leon/issues/42%23issuecomment-1210538025&source=gmail&ust=1660217174516000&usg=AOvVaw119iz1vaWzoobZdqN7SaeH

which should be

  • https://github.com/svenjacobs/leon/issues/42#issuecomment-1210538025

So just the url-decoded value of parameter q? This would work great in conjunction w/ #55.

AliExpress

AliExpress has a lot of tracking parameters ok the URL.

https://m.de.aliexpress.com/item/32948511896.html?ug_edm_item_id=32948511896&pdp_npi=2%40dis%21EUR%21%E2%82%AC%2024%2C58%21%E2%82%AC%2014%2C50%21%21%21%21%21%402102fea916677108936606992d1f0c%2112000027801501608%21edm&edm_click_module=item_detail&tracelog=rowan&rowan_id1=aeug_edm_24677_1_de_DE_2022-11-05&rowan_msg_id=8681biz_pay_after_purchase%3A0%3A0_572584174%248a93ce02da764ff48f65112ca837f7df&ck=in_edm_other&gatewayAdapt=gloPc2deuMsite

But it needs only

https://m.de.aliexpress.com/item/32948511896.html

Click on Licenses crashes the app

If you click on Licenses in the settings, the app crashes.
This happens both whole the app is opened during a share intent and if you open it standalone

Happens on Android 13, Leon Version 1.2.0

NewEgg

Similar to #18's Amazon example, when 1 has

  • https://www.newegg.com/black-acer-nitro-5-an515-57-59f7-gaming/p/N82E16834360174?Item=N82E16834360174

all 1 needs is

  • https://www.newegg.com/p/N82E16834360174

Title of the TopAppBar is blocked

Describe the bug

Dear developer!
In the process of using, I found a bug in layout / display. As shown in the figure below, on the main page, texts of the TopAppBar is blocked. This may be an adaptation problem. I suspect it is because display and font size are set to large (mainly due to display size).
Because of some problems with my eyesight, I often use the largest font and display.
103165857-dbaf8580-4857-11eb-9e22-120ae1901389

App version is 0.5.0, my mobile phone is Google Pixel 2, and the screen resolution setting is 1920* 1080. And my font size and display size are the largest ! ! ! Also, my Android system version is 10.0.
The above is a description of the problem. The overall experience of the software is good. You can see that the design is very attentive. Thank you very much for the efforts of the developers all the time. I hope to receive a reply. Thank you so much!!

Expected behavior

I hope that the title is not blocked.

Steps to reproduce the behavior:

1.use the largest font and display in the display setting
2.open this app for the first time
3.this error could be seen

Screenshot

copy

Environment

  1. Version of leon: 0.5.0
  2. Device : Google Pixel 2,
  3. OS version : Android 10.0

Can this be registered as a browser?

Is it possible to make the URL cleaner the target for default browser in Android?

It would be nice to have an this as my default browser (I'm not expecting actual browser behavior) so that it can strip all the tracking junk and then I can copy the URL to the browser myself.

Rethink sanitizer architecture

Currently sanitizers are purely based on regular expressions and can only remove parts from a URL. However feature requests have shown that this concept is not flexible enough since sanitizers could also for example extract parts from, rewrite or decode URLs.

The current sanitizers are stored in a SQLite database on the device. The idea was to have some kind of form in a future version of Leon where users can add their own sanitizers / rules. However this concept does not work with more flexible sanitizers. Prospectively sanitizers will not be stored in a database. But sanitizers could provide their own UI. For instance there could be a CustomParametersSanitizer which provides a UI for specifying own URL parameters to be removed. How these parameters are stored is implementation detail of the sanitizer. It could be shared preferences or SQLite.

The question remains what should be shown on the result screen where currently the number of removed parameters are shown? Since future sanitizers must not necessarily remove parameters, different metrics must be displayed?

LinkSynergy tracking

@svenjacobs LinkSynergy uses a similar, but not identical scheme, to #42. So 1 might run into

  • https://click.linksynergy.com/link?id=kXQk6%2AivFEQ&offerid=1123623.20516002704&type=15&murl=https%3A%2F%2Fwww.newegg.com%2Fp%2F23B-001E-003S3%3Fitem%3D9SIAGREJ3S5851&u1=cbq-us-custom-tracking

which, of course, should just be

  • https://www.newegg.com/p/23B-001E-003S3 (whenever #83 gets implemented)

So just the url-decoded value of parameter murl is required. Then the 2nd pass from #79 would clean the NewEgg URL properly.

YouTube exit links

@svenjacobs YouTube uses a similar, but not identical scheme, to #42. E.g., on Google's own About page to About Google, YT gives

  • https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa1JoZzZUczlhMWJCaTBoc1lqa3ZtX2Rpd0ZPUXxBQ3Jtc0tsYVhpenF1czV5VjlwZm5pemZGdm4zNHVXSldEUlR6dHNhZzI0UkFvLXo0cEVyUk0yaHR5LVhGWEFCLVdzdmlZWGU3eUY5ZWdUZTBUbEw3MVg4UDZCRzdkXzdaaGczT25Ka3Q5bjUzTmxWVHF3Tll6MA&q=http%3A%2F%2Fwww.google.com%2Fabout%2F&html_redirect=1

which, of course, should just be

  • http://www.google.com/about/

(Oops, Google forgot httpS?! 🤣 I digress.…)

So just the url-decoded value of parameter q? This would work great in conjunction w/ #55.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.