I just commented on the reddit post about this but I'll bring it in here too:
The app implementation is out of touch with modern Google Play privacy requirements and APIs.
I read through his code, starting with the Main Activity: https://github.com/M66B/FairEmail/blob/master/app/src/main/j...
1. He's using ancient APIs. All written in Java with Activities instead of Kotlin with a single Activity and many Fragments. There are some fragments but it's definitely an old writing style
2. He's using Tasks for multithreading/event handling
3. Using Handlers & runnables is a terrible idea and intrinsically fragile
4. The way he's handling synchro (persistent foreground service) is _explicitly something Google is targeting for battery issues_
5. This code is entirely unmaintainable. He's got a 3k line service file here: https://github.com/M66B/FairEmail/blob/maser/app/src/main/ja..., nested deeply with multiple different handlers running.
I'm not even going to discuss the fact that he has Logging statements peppered throughout the code etc.
This app looks like a 5+ year old code base, not something persistently maintained.
He also does not appear to use any modern Android APIs that Google requires, despite declaring the following restricted permissions:
1. READ_CONTACTS
2. READ_EXTERNAL_STORAGE
In fact I see him explicitly calling deprecated methods that Google has declared off limits: Line 474 of https://github.com/M66B/FairEmail/blob/master/app/src/main/j... `requestPermissions` is an illegal call, which he has documented as throwing an exception that he can't figure out.
That's absolutely a smoking gun and potentially the reason Google would ban him. ActivityResultLauncher is required for permissions grants.
My summary of this is: This is what bitrot looks like and what happens when you don't manage app scope to handle tech debt. It got too big to maintain.
The app implementation is out of touch with modern Google Play privacy requirements and APIs.
I read through his code, starting with the Main Activity: https://github.com/M66B/FairEmail/blob/master/app/src/main/j...
1. He's using ancient APIs. All written in Java with Activities instead of Kotlin with a single Activity and many Fragments. There are some fragments but it's definitely an old writing style
2. He's using Tasks for multithreading/event handling
3. Using Handlers & runnables is a terrible idea and intrinsically fragile
4. The way he's handling synchro (persistent foreground service) is _explicitly something Google is targeting for battery issues_
5. This code is entirely unmaintainable. He's got a 3k line service file here: https://github.com/M66B/FairEmail/blob/maser/app/src/main/ja..., nested deeply with multiple different handlers running.
I'm not even going to discuss the fact that he has Logging statements peppered throughout the code etc.
This app looks like a 5+ year old code base, not something persistently maintained.
He also does not appear to use any modern Android APIs that Google requires, despite declaring the following restricted permissions:
1. READ_CONTACTS 2. READ_EXTERNAL_STORAGE
In fact I see him explicitly calling deprecated methods that Google has declared off limits: Line 474 of https://github.com/M66B/FairEmail/blob/master/app/src/main/j... `requestPermissions` is an illegal call, which he has documented as throwing an exception that he can't figure out.
That's absolutely a smoking gun and potentially the reason Google would ban him. ActivityResultLauncher is required for permissions grants.
My summary of this is: This is what bitrot looks like and what happens when you don't manage app scope to handle tech debt. It got too big to maintain.