I finally succeeded in releasing the Focus WTV Live app for Android TV. The biggest hurdle was getting through the Play store approval process. Rejections without any clue about what was going wrong. It doesn’t help that Google has disabled the Pre-launch report, running your new build on various hardware, surfacing problems you would otherwise never find out. I suspect Google has disabled pre-launch report in favor of AI payloads. 😉
So when you do encounter such a problem, without the pre-launch report combined with useless rejection feedback, you’re really in the dark. Well, I did figure it out after all, but it took lots of effort and adding crashlytics reporting which otherwise would not have been needed. It turned out to be a video player issue on low-end (read: crappy) hardware. Oh well, all’s well that ends well..
10 years ago, I cancelled my cable TV subscription and switched to internet streaming-only using the first Android TV device, Google’s Nexus Player. It was a great cost saver. I never watched live TV to begin with, as I always wanted to skip forward during ads. My new home was Netflix and having no ads was a breath of fresh air.
In the beginning, I would miss some Belgian content here and there, but by now, every major Belgian TV channel has a free app streaming live TV and on-demand content (with paid options to reduce ads or watch additional content).
My parents barely watch TV except for the news, so I suggested to make some savings and cancel their overpriced Telenet cable TV subscription. It turns out there’s only 1 problem: they like to watch the regional news channel WTV from time to time.
Streaming WTV to an Android TV device, what are the available options?
Android TV app: the Focus/WTV app is not available for Android TV.
Cast from phone: casting a stream from the Android app on your phone is not supported.
Cast from website: casting from the website is supported, but the stream hangs after a few seconds and refuses to resume.
Ideally, my parents can just use an app on the TV, it makes things less complicated.
So, what is the solution? Create a new app! 😉
A few years ago, I gave it a first try, but somehow did not succeed. Maybe I was trying to support login and on-demand content. Yesterday, I lowered the bar and thought just streaming live content would already be sufficient (it’s what my parents do now).
To my surprise, I quite quickly had a working proof of concept. I was still using the project I created a few years ago using an old flutter version. So I upgraded the flutter version and it no longer worked on my Nvidia Shield TV, but it still worked on the emulator. It does not render video anymore, only audio. I also tried out the latest flutter 3.29.2, and even though I do get image again, it’s all red. Long story short: don’t use impeller yet for hardware-acceleration sensitive stuff like video streaming.
I would show a screenshot, but there’s nothing to see but the live stream. 🙂
Maintenance update to stay compliant with Google Play store.
Although functionally, nothing changed, a lot has changed under the hood, so let me know if you experience any problems.
Rant
You may have noticed a lot of updates flying by last week. Over the past few months a ton of policy violations accumulated. I postponed updating the app since I am redeveloping the app from scratch and wanted to avoid going through the whole mess of getting the app compliant and approved, basically investing time in an app that will be deprecated soon.
However, I realized that rebuilding the app would take longer than expected (after all, it is an accumulation of work over 10 years) and that it would put too much pressure on me to deliver the app soon. If I didn’t take any action, the current app would have been removed from the app store last weekend, so I decided it is better to make the app compliant and provide continuity. It took me a whole week, each day putting in hours after work, to get the app approved.
As any developer will confirm, an app store approval can be a huge struggle. Even when you fix everything, your app still gets rejected. I noticed a bug in the review process in which they give feedback for an older version of the app. They claimed I repeatedly asked for permission even if the user granted permission. I fixed the bug, but they kept rejecting for the same reason. I filed an appeal asking for clarification, they responded the exact same thing (so appeal was basically useless). Some policy fixes need several days to be picked up and acknowledged by Play store. It only seemed to move forward after these policy fixes “trickled through”. I had so many fixes to do, from changing to app bundles, changing signing, upgrading to allowed versions of billing/analytics, upgrading android target, etc that it seems the review system choked on it..
The annoying thing was: I accidentically omitted a commit for some release but that’s when the review process got into the rejection loop. A few 1000 users were experiencing a crash and the fix was ready to release, but google would fail to accept it, even though it got accepted the day before! 🙄 These days, this has a snow ball effect: because they notice my app crashes more than its peers in the same category (Utilities), Google decides it should bury your app deeper in search results, lol.
Here’s the screenshot, for your entertainment:
So, the funny thing is they caused this problem themselves and even now when the bug is fixed, it will take some time until the average crash rate is low enough and Google reinstates my reputation.
Also, for anyone struggling with rejection with the notice “Your icon does not fill the entire icon space.”: you have to specify a 512×512 icon resource, just for TV, which does not have a transparent background. But be sure that the foreground stays within the allowed bounds! Life saver 😉
Anyway, that’s it for today. I know the current app is in a bit of broken state: the overlay is blocking input on certain screens, the service is being killed after some random time (google deployed a policy change end of 2023, before that no problem).
So rebuilding the app should fix all these things 🤞 AND make it easier to add new features. 🎉
After a nice long beta period of 4 months (I forgot about it 🫢), 0.2.11 has been promoted to production. Highlight is the eternal loading state bug fix. On the technical side, I migrated crashlytics from Sentry to Firebase. You can disable reporting in the settings.
Changes since 0.2.7:
0.2.11 - 2023-03-26
===================
* fix eternal loading state + various bugfixes
* disable mark all as read button during loading
* replaced SentryLog by Firebase crashlytics
* center implicit refresh indicator + bigger text
* bump min sdk to 21 (firebase dep -> multidex)
Just in case you wonder about the changes since 0.2.5:
0.2.7 - 2023-01-25 ================== * fix utf8 html decode for titles * fix padding on progress indicator
0.2.6 - 2023-01-22 ================== + added setting: open in external browser
CoinGeek News is a very simple app to read the CoinGeek news in a more structured way (i.e. chronologically). The goal is to add some features like favorites, filtering on metadata, etc. The app has been in open beta since June 2021, and I had the intention to release to production only when some more value had been added. However, since I’ve already been using myself for more than 2 years now, I guess it could be useful for some other people too..
The past few weeks, I’ve been cleaning up the app and making it Play store compliant (both technical and privacy wise) so today, I can finally publish to production. 🥳
Current features under development are favorites and post tags.
Changelog
0.2.5 - 2023-01-21
==================
* url launcher fix
0.2.4 - 2023-01-20
==================
* clear cache: ask confirmation
* try to fix elusive crash on startup
0.2.3 - 2023-01-19
==================
* mark all as read: ask confirmation
* improve settings section visuals
+ settings show database stats
0.2.2 - 2023-01-18
==================
* gdpr compliant
* flutter3 upgrade
The Coingeek news site is my favorite source for blockchain news. I discovered it a few years ago but didn’t really visit regularly back then. I read the occasional shared post on twitter or one that popped into my google now feed. If I didn’t have time right away to read an article that peaked my interest, I visited the site some time later to catch up. However, most of the time, it turns out I had a really hard time finding back that article. On the site there is nowhere a timeline with the latest articles in a chronological order. Also, not all articles get posted on social media, or even if they’re posted, I might not notice them (I don’t feel like reading crypto twitter every day 🙄). So although I like the coingeek website, for me it’s not very practical. But hey, no big deal, I hear you say? you can’t read everything..?
I agree, until last year 🙂 During Coingeek Conference days, there are so many exciting announcements, you don’t want to miss any article! So for the last conference in October 2020 I quickly mashed together a prototype app so I could follow the news. It’s a very basic app right now and it doesn’t do much, but since I use it almost every day, I thought someone else might find it already useful too..
app screenshot
I do have some ideas to enhance it: favoriting, search (online/offline), post preview, filter using tags, …
Soooo.. it’s been a while and although a lot of work was put into this new release, from an end-user point of view, this is merely just another “maintenance release”.
What happened?
You may know it is not easy to build apps that display stuff on top of everything, even if it is for a good reason. I tried to fix it, work around it, but I officially give up. Google is not bringing back the overlay permission. Nevertheless, using developer tools it is still possible, albeit totally user unfriendly. In theory, there is still another loop hole left, using accessibility features, but it’s only a matter of time before your app gets delisted.
Which segued nicely to the next cause of delay: the app got delisted because google does not like me linking to a donation page from the app. You would think removing this link is a small change. Android development is a moving target, so no, nothing is “simple”. 😉 Releasing a new version often requires updating other parts of the app because of google increasing the minimum android version constraint. In this case, there were so many changes (also in ads, support libs, etc), even for a little app, it was a nightmare. Anyway, after a few beta releases, it got sorted out.
In the meanwhile, I was trying to fix the overlay permission problem: my strategy ranged from asking nice to google, to implementing workarounds, to creating a companion app, to decompiling other apps.. Today, I decided I have to accept there is no acceptable solution and just provide technical documentation on how to give the permission using a developer tool which, by definition, is user unfriendly. It is a sad solution, but better than nothing! Apologies for taking 3 years to come to this conclusion. 🙂
The documentation link will show up as a QR code when you encounter the permission problem. You can also open it from within the app. Later on I hope to have an instruction video. Lastly, for rooted devices, you can simply press the button and it solves the problem magically. 😉
What’s next?
Over the years, I collected quite some feature request. More recently, it seems TCL has released some TV sets which do not properly redraw the clock. It seems to be a bug but I will see what I can do there. I provided a tweak flag in the settings to try out certain workarounds. Let the experimenting begin! 😉
v0.7.0 2021-01-29
=================
+ overlay permission: QR code to guide on how to grant the permission
+ overlay permission: on rooted devices you can now grant the permission with the simple press of a button
* preview color before accepting
* fix crash opening website on TV device that does not advertise itself as TV
* fix crash on some devices when moving/resizing the clock
* changing 12/24 hour format, notify state change no longer requires clockview recreation
* cleanup pref change code and prevent clockview NPE
* workaround pref: TCL devices
* admob upgrade
+ firebase analytics (can be disabled)
* bumped min SDK level to 17 (Jelly Bean 4.2.x)
* target android sdk 30