<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>android &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/android/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Mon, 06 Apr 2026 14:28:44 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>android &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Android now stops you sharing your location in photos]]></title>
		<link>https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/</link>
					<comments>https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 13 Apr 2026 11:34:48 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[geotagging]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=70143</guid>

					<description><![CDATA[My wife and I run OpenBenches. It&#039;s a niche little site which lets people share photos of memorial benches and their locations. Most modern phones embed a geolocation within the photo&#039;s metadata, so we use that information to put the photos on a map.  Google&#039;s Android has now broken that.  On the web, we used to use:  &#60;input type=&#34;file&#34; accept=&#34;image/jpeg&#34;&#62;   That opened the phone&#039;s photo picker…]]></description>
										<content:encoded><![CDATA[<p>My wife and I run <a href="https://openbenches.org">OpenBenches</a>. It's a niche little site which lets people share photos of memorial benches and their locations. Most modern phones embed a geolocation within the photo's metadata, so we use that information to put the photos on a map.</p>

<p>Google's Android has now broken that.</p>

<p>On the web, we used to use:</p>

<pre><code class="language-html">&lt;input type="file" accept="image/jpeg"&gt;
</code></pre>

<p>That opened the phone's photo picker and let the use upload a geotagged photo. But a while ago Google deliberately broke that.</p>

<p>Instead, we were <a href="https://issuetracker.google.com/issues/243294058#comment27">encourage to use the <em>file</em> picker</a>:</p>

<pre><code class="language-html">&lt;input type="file"&gt;
</code></pre>

<p>That opened the default file manager. This had the unfortunate side-effect of allowing the user to upload <em>any</em> file, rather than just photos. But it did allow the EXIF metadata through unmolested.  <a href="https://issuetracker.google.com/issues/428397711">Then Google broke that as well</a>.</p>

<p>Using a "Progressive Web App" doesn't work either.</p>

<p>So, can users transfer their photos via Bluetooth or QuickShare? No. <a href="https://issuetracker.google.com/issues/485307531">That's now broken as well</a>.</p>

<p>You can't even directly share via email without the location being stripped away.</p>

<p>Literally the <em>only</em> way to get a photo with geolocation intact is to plug in a USB cable, copy the photo to your computer, and then upload it via a desktop web browser?</p>

<h2 id="why"><a href="https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/#why">Why?!?!?</a></h2>

<p><del>Because Google run an anticompetitive monopoly on their dominant mobile operating system.</del></p>

<p>Privacy.</p>

<p>There's a worry that users don't know they're taking photos with geolocation enabled. If you post a cute picture of your kid / jewellery / pint then there's a risk that a ne’er-do-well could find your exact location.</p>

<p>Most social media services are sensible and strip the location automatically. If you try to send a geotagged photo to Facebook / Mastodon / BlueSky / WhatsApp / etc, they default to <em>not</em> showing the location. You can add it in manually if you want, but anyone downloading your photo won't see the geotag.</p>

<p>And, you know, I get it. Google doesn't want the headline "Stalkers found me, kidnapped my baby, and stole my wedding ring - how a little known Android feature puts you in danger!"</p>

<p>But it is just so <em>tiresome</em> that Google never consults their community. There was no advance notice of this change that I could find. Just a bunch of frustrated users in my inbox blaming me for breaking something.</p>

<p>I don't know what the answer is. Perhaps a pop up saying "This website wants to see the location of your photos. Yes / No / Always / Never"? People get tired of constant prompts and the wording will never be clear enough for most users.</p>

<p>It looks like the only option available will be to develop a native Android app (and an iOS one?!) with all the cost, effort, and admin that entails. Android apps have <a href="https://developer.android.com/training/data-storage/shared/media#location-media-captured">a special permission for accessing geolocation in images</a>.</p>

<p>If anyone has a <em>working</em> way to let Android web-browsers access the full geolocation EXIF metadata of photos uploaded on the web, please drop a comment in the box.</p>

<p>In the meantime, please leave a +1 on <a href="https://github.com/whatwg/html/issues/11724#issuecomment-4192228562">this HTML Spec comment</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70143&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/feed/</wfw:commentRss>
			<slash:comments>21</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Gadget Review: Epomaker TH87 ISO Mechanical Keyboard ★★★★⯪]]></title>
		<link>https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/</link>
					<comments>https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 11 Feb 2026 12:34:46 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[review]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=67546</guid>

					<description><![CDATA[If I&#039;m being brutally honest, I never really got the appeal of mechanical keyboards. There was always someone in the office who made a godawful racket hammering on their keyboard and then waxed lyrical about the merits of various switches. I&#039;d mostly just dismissed them as cranks. I&#039;m in love with my old Microsoft 4000 ergonomic keyboard. What use could I have a mechanical keyboard festooned with …]]></description>
										<content:encoded><![CDATA[<p>If I'm being brutally honest, I never really <em>got</em> the appeal of mechanical keyboards. There was always someone in the office who made a godawful racket hammering on their keyboard and then waxed lyrical about the merits of various switches. I'd mostly just dismissed them as cranks. I'm in love with my old <a href="https://shkspr.mobi/blog/2021/10/buying-obsolete-keyboards-microsoft-4000/">Microsoft 4000 ergonomic keyboard</a>. What use could I have a mechanical keyboard festooned with lights?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/keyboard.webp" alt="A brightly multicoloured mess of a keyboard with a USB cable and keytool on it." width="2040" height="891" class="aligncenter size-full wp-image-67568">

<p>The good folks at <a href="https://epomaker.com/">Epomaker</a> want me to see the error of my ways and have sent me a couple of devices to review. Today I'm trying out the <a href="https://epomaker.com/products/epomaker-th87">TH87</a> and it is surprisingly lovely!</p>

<h2 id="blinken-lights"><a href="https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/#blinken-lights">Blinken lights!</a></h2>

<p>Here's a quick video showing some of the effects.</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-67546-2" width="620" height="349" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/th87-new.mp4?_=2"><a href="https://shkspr.mobi/blog/wp-content/uploads/2026/02/th87-new.mp4">https://shkspr.mobi/blog/wp-content/uploads/2026/02/th87-new.mp4</a></video></div><p></p>

<p>Is this <em>necessary</em>? No! But it is jolly good fun. Probably a bit distracting - especially if you're in a dark space or a crowded office - but rather pleasing nevertheless. Switching between the effects means remembering the correct key combo - there's no way to do it programatically, you just have to cycle through them all.</p>

<h2 id="linux-compatibility"><a href="https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/#linux-compatibility">Linux Compatibility</a></h2>

<p>The TH87 comes with a USB-C to A cable. Personally, I'd've preferred straight C-C, but this does the job. Flick the switch at the back to USB mode, plug it in, and Linux instantly detected it. No drivers to configure.</p>

<p>Rather cheekily, <code>lsusb</code> shows it as <code>05ac:0250 Apple, Inc. Aluminium Keyboard (ISO)</code> - there's another switch for changing between Mac and PC mode. That doesn't change how the keyboard presents itself; just the keycodes it sends.</p>

<p>Oddly, there was this warning in <code>dmesg</code>:</p>

<p><code>apple 0003:05AC:0250.0010: Fn key not found (Apple Wireless Keyboard clone?), disabling Fn key handling</code></p>

<p>However, the function keys worked and I was able to control screen brightness etc using <kbd>Fn</kbd> and the <kbd>F1-12</kbd> keys.</p>

<p>There's also a Bluetooth option. Again, Linux use was a breeze - although you'll have to remember what the pairing combo is and which device it is paired to.</p>

<p>There's also a 2.4GHz option. Hidden under one of the feet is a little USB-A receiver. Again, pairing is simple - just plug it in and flick the switch.</p>

<p>As expected, it also plays well with Android. The Bluetooth connection worked as did USB-OTG. Of course, quite <em>why</em> you'd want a giant heavy keyboard paired to your tiny phone is an exercise left to the reader.</p>

<h2 id="clunk-click-every-trip"><a href="https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/#clunk-click-every-trip">Clunk Click Every Trip</a></h2>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/EPOMAKER_TH87_ISO_UK_9.webp" alt="A keyboard with a UK layout and lots of colourful lights." width="1131" height="444" class="aligncenter size-full wp-image-67566">

<p>So let's talk about noise. This keyboard is noisier than some of my other typing surfaces, but not aggressively so. Apparently it is "pre-lubricated" and has some noise suppression. The travel on the switches is excellent, they aren't stiff, and the whole contraption is sturdy.</p>

<p>It was easy to remove the caps with the enclosed tool. I didn't bother trying to extract a switch because I'm afraid of buggering it up.</p>

<h2 id="other-things"><a href="https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/#other-things">Other Things</a></h2>

<p>Battery life is excellent - as you'd expect from a 10,000 mAh unit. It recommends charging by attaching to a computer and warns a regular charger might damage it. But, frankly, it seemed to cope just fine.</p>

<p>There's no software for customising the colours or functionality. Apparently lots of mechanical keyboards run an Open Source firmware - but this appears to be proprietary.  There is some question about whether Epomaker comply with the GPL when it comes to the <a href="https://docs.qmk.fm/license_violations">QMK source</a>. They appear to have <a href="https://github.com/Epomaker?tab=repositories">some source code available</a> but it is hard to tell whether it exists for this specific model. I've contacted them for clarification.</p>

<p>There's a <em>lot</em> of technobabble on the website. Apparently it uses "5-Layer Sound Optimizing Design with PORON Sandwich Foam, IXPE Switch Pad, Sound Enhancement Pad, EPDM Switch Socket Pad, and Silicone Bottom". I've no ideas what it means, but it appears important to some people.</p>

<p>There's no number-pad, which is a bit of a shame. However the keyboard has a proper UK layout and is reasonably compact. Although at 1Kg it is almost as heavy as my laptop!</p>

<h2 id="cost"><a href="https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/#cost">Cost</a></h2>

<p>I have no internal benchmark for something like this. It's around <a href="https://s.click.aliexpress.com/e/_c2RJxZJd">£60 from AliExpress</a> or <a href="https://amzn.to/4qaSRMf">£80 on Amazon UK</a> depending on whether you have pleased The Algorithm. That seems pretty reasonable for a hefty keyboard with lots of customisability.</p>

<p>If you want ALL THE LIGHTS and value the ability to hot-swap various keys and switches, I think this is a nifty bit of kit.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=67546&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/02/gadget-review-epomaker-th87-iso-mechanical-keyboard/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2026/02/th87-new.mp4" length="38193797" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: Chimoney Android App and KYCaid]]></title>
		<link>https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/</link>
					<comments>https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 14 Jan 2026 12:34:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[WebMonetization]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=64849</guid>

					<description><![CDATA[Chimoney is a new &#34;multi-currency wallet&#34; provider. Based out of Canada, it allows users to send money to and from a variety of currencies. It also supports the new Interledger protocol for WebMonetization.  It is, as far as I can tell, unregulated by any financial institution. Nevertheless, it performs a &#34;Know Your Customer&#34; (KYC) check on all new account in order to prevent fraud.  To do this,…]]></description>
										<content:encoded><![CDATA[<p><a href="https://chimoney.app/">Chimoney</a> is a new "multi-currency wallet" provider. Based out of Canada, it allows users to send money to and from a variety of currencies. It also supports the new Interledger protocol for <a href="https://shkspr.mobi/blog/2025/08/security-flaws-in-the-webmonetization-site/">WebMonetization</a>.</p>

<p>It is, as far as I can tell, unregulated by any financial institution. Nevertheless, it performs a "Know Your Customer" (KYC) check on all new account in order to prevent fraud.  To do this, it uses the Ukranian <a href="https://kycaid.com/">KYCaid</a> platform.</p>

<p>So far, so standard. But there's a small problem with how they both integrate.</p>

<p>I installed Chimoney's Android app and attempted to go through KYCaid's verification process. For some reason it hit me with this error message.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/error.webp" alt="Screenshot. An error occurred and an email address." width="504" class="aligncenter size-full wp-image-64856">

<p>Well, I'd better click that email and report the problem.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/email-protected.webp" alt="Screenshot. The email is protected, but clickable." width="504" height="240" class="aligncenter size-full wp-image-64855">

<p>Oh, that's odd. What happens if I click the protected link?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/Cloudflare.webp" alt="Screenshot. Cloudflare's email protection screen." width="504" height="625" class="aligncenter size-full wp-image-64854">

<p>Huh! I guess I've been taken to Cloudflare's website. What happens if I click on the links on their page?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/discord.webp" alt="Screenshot. Invitation to join Cloudflare's Discord." width="504" height="606" class="aligncenter size-full wp-image-64853">

<p>Looks like I can now visit any site on the web. If Cloudflare has a link to it, I can go there. For example, GitHub.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/github.webp" alt="Screenshot. GitHub page still within the Chimoney app." width="504" height="499" class="aligncenter size-full wp-image-64852">

<h2 id="why-is-this-a-problem"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#why-is-this-a-problem">Why is this a problem?</a></h2>

<blockquote><p><a href="https://mas.owasp.org/MASTG/knowledge/android/MASVS-PLATFORM/MASTG-KNOW-0018/">MASTG-KNOW-0018: WebViews</a></p>

<p>One of the most important things to do when testing WebViews is to make sure that only trusted content can be loaded in it. Any newly loaded page could be potentially malicious, try to exploit any WebView bindings or try to phish the user. <strong>Unless you're developing a browser app, usually you'd like to restrict the pages being loaded to the domain of your app.</strong> A good practice is to prevent the user from even having the chance to input any URLs inside WebViews (which is the default on Android) nor navigate outside the trusted domains. Even when navigating on trusted domains there's still the risk that the user might encounter and click on other links to untrustworthy content</p>

<p><small>Emphasis added</small></p></blockquote>

<p>A company's app is its sacred space. It shouldn't let anyone penetrate its inner sanctum because it has no control over what that 3rd party shows its customers.</p>

<p>There's nothing stopping an external service displaying a message like "To continue, please transfer 0.1 Bitcon to …"</p>

<p>(Of course, if your KYC provider - or their CDN - decides to turn evil then you probably have bigger problems!)</p>

<p>There are some other problems. It has long been known that <a href="https://discussions.apple.com/thread/7918307?sortBy=rank">people can use in-app browsers to circumvent restrictions</a>.  Some in-app browsers have <a href="https://medium.com/%40youssefhussein212103168/exploiting-insecure-android-webview-with-setallowuniversalaccessfromfileurls-c7f4f7a8db9c">insecure configurations which can be used for exploits</a>.  These sorts of "accidentally open" browsers <a href="https://matan-h.com/google-has-a-secret-browser-hidden-inside-the-settings/">are often considered to be a security vulnerability</a>.</p>

<h2 id="the-fix"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#the-fix">The Fix</a></h2>

<p>Ideally, an Android app like this wouldn't use a web view. It should use a KYC provider's API rather than giving them wholesale control of the user experience.</p>

<p>But, suppose you do need a webview. What's the recommendation?</p>

<p>Boring old <a href="https://blog.oversecured.com/Android-security-checklist-webview/#insufficient-url-validation">URl validation</a> using <a href="https://developer.android.com/reference/android/webkit/WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView,%20android.webkit.WebResourceRequest)">Android's <code>shouldOverrideUrlLoading()</code> method</a>.</p>

<p>Essentially, your app restricts what can be seen in the webview and rejects anything else.</p>

<h2 id="risk"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#risk">Risk</a></h2>

<p>Look, this is pretty low risk. A user would have to take several deliberate steps to find themselves in a place of danger.</p>

<p>Ultimately, it is "<a href="https://wiki.c2.com/?CodeSmell">Code Smell</a>" - part of the app is giving off a noxious whiff. That's something you cannot afford to have on a money transfer app. If this simple security fix wasn't implemented, what other horrors are lurking in the source code?</p>

<h2 id="contacting-the-company"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#contacting-the-company">Contacting the company</a></h2>

<p>There was no <a href="https://securitytxt.org/">security.txt</a> contact - nor anything on their website about reporting security bugs. I reached out to the CEO by email, but didn't hear back.</p>

<p>In desperation, I went on to Discord and asked in their support channel for help.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/send-an-email.webp" alt="Screenshot. Someone advising me on who to email." width="504" class="aligncenter size-full wp-image-64857">

<p>Unfortunately, that email address didn't exist.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/email-chimoney.webp" alt="Bounce message." width="504" class="aligncenter size-full wp-image-64851">

<p>I also tried contacting KYCaid, but they seemed unable or unwilling to help - and redirected me back to Chimoney.</p>

<p>As it has been over two month since I sent them video of this bug, I'm performing a responsible disclosure to make people aware of the problem.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64849&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Is it possible to allow sideloading *and* keep users safe?]]></title>
		<link>https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/</link>
					<comments>https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 30 Aug 2025 11:34:55 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[scam]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=63058</guid>

					<description><![CDATA[In which I attempt to be pragmatic.  Are you allowed to run whatever computer program you want on the hardware you own? This is a question where freedom, practicality, and reality all collide into a mess.  Google has recently announced that Android users will only be able to install apps which have been digitally signed by developers who have registered their name and other legal details with…]]></description>
										<content:encoded><![CDATA[<p>In which I <em>attempt</em> to be pragmatic.</p>

<p>Are you allowed to run whatever computer program you want on the hardware you own? This is a question where freedom, practicality, and reality all collide into a mess.</p>

<p>Google has recently announced that Android users will only be able to install apps which have been digitally signed by developers who have registered their name and other legal details with Google.  To many people, this signals the death of "sideloading" - the ability to install apps which don't originate on the official store<sup id="fnref:sideload"><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#fn:sideload" class="footnote-ref" title="Post by @Gargron@mastodon.social View on Mastodon" role="doc-noteref">0</a></sup>.</p>

<script data-allowed-prefixes="https://mastodon.social/" async="" src="https://mastodon.social/embed.js"></script>

<p>I'm a fully paid-up member of the Cory Doctorow fanclub. Back in 2011, he gave a speech called "<a href="https://boingboing.net/2012/08/23/civilwar.html">The Coming War on General Computation</a>". In it, he rails against the idea that our computers could become traitorous; serving the needs of someone other than their owner.  Do we want to live in a future where our computers refuse to obey our commands? No! Neither law nor technology should conspire to reduce our freedom to compute.</p>

<p>There are, I think, two small cracks in that argument.</p>

<p>The first is that a user has no right to run anyone else's code, if the code owner doesn't want to make it available to them.  Consider a bank which has an app. When customers are scammed, the bank is often liable. The bank wants to reduce its liability so it says "<a href="https://shkspr.mobi/blog/2023/05/the-limits-of-general-purpose-computation/">you can't run our app on a rooted phone</a>".</p>

<p>Is that fair? Probably not. Rooting allows a user to fully control and customise their device. But rooting also allows malware to intercept communications, send commands, and perform unwanted actions. I think the bank has the right to say "your machine is too risky - we don't want our code to run on it."</p>

<p>The same is true of video games with strong "anti-cheat" protection. It is disruptive to other players - and to the business model - if untrustworthy clients can disrupt the game. Again, it probably isn't <em>fair</em> to ban users who run on permissive software, but it is a <em>rational</em> choice by the manufacturer. And, yet again, I think software authors probably should be able to restrict things which cause them harm.</p>

<p>So, from their point of view it is pragmatic to insist that their software can only be loaded from a trustworthy location.</p>

<p>But that's not the only thing Google is proposing. Let's look at <a href="https://android-developers.googleblog.com/2025/08/elevating-android-security.html">their announcement</a>:</p>

<blockquote><p>We’ve seen how malicious actors hide behind anonymity to harm users by impersonating developers and using their brand image to create convincing fake apps. The scale of this threat is significant: our recent analysis found <strong>over 50 times more malware</strong> from internet-sideloaded sources than on apps available through Google Play.</p></blockquote>

<p>Back in the early days of Android, you could just install any app and it would run, no questions asked. That was a touchingly naïve approach to security - extremely easy to use but left users vulnerable.</p>

<p>A few years later, Android changed to show user the permissions an app was requesting. Here's a genuine screenshot from <a href="https://shkspr.mobi/blog/2013/04/what-can-android-learn-from-symbians-security-model/">an app which I tried to sideload in 2013</a>:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/04/Legit-App-Permissions.png" alt="A terrifying list of permissions." width="480" height="800" class="aligncenter size-full wp-image-28202">

<p>No rational user would install a purported battery app with that scary list of permissions, right? Wrong!</p>

<p>We know that <a href="https://www.nngroup.com/articles/how-little-do-users-read/">users don't read</a> and they especially <a href="https://discovery.ucl.ac.uk/id/eprint/1389027/1/KrolWarnings-CameraReady.pdf">don't read security warnings</a>.</p>

<p>There is no UI tweak you can do to prevent users bypassing these scary warnings. There is no amount of education you can provide to reliably make people stop and think.</p>

<p>Here's the story of <a href="https://www.bbc.co.uk/news/business-64981507">a bank literally telling a man he was being scammed</a> and he <em>still</em> proceeded to transfer funds to a fraudster.</p>

<blockquote><p>It emerged that, in this case, Lloyds had done a really good job of not only spotting the potential fraud but alerting James to it. The bank blocked a number of transactions, it spoke to James on the phone to warn him and even called him into a branch to speak to him face-to-face.</p></blockquote>

<p>Here's another one where <a href="https://www.bbc.co.uk/news/uk-england-leeds-67208755">a victim deliberately lied to their bank</a> even after acknowledging that they had been told it was a scam.</p>

<p>Android now requires you to deliberately turn on the ability to side-load. It will give you prompts and warnings, force you to take specific actions, give you pop-ups and all sorts of confirmation steps.</p>

<p>And people still click on.</p>

<p>Let's go back to Google announcement. This change isn't being rolled out worldwide immediately. They say:</p>

<blockquote><p>This change will start in a few select countries specifically impacted by these forms of fraudulent app scams, often from repeat perpetrators.</p>

<p>…</p>

<p>September 2026: These requirements go into effect in Brazil, Indonesia, Singapore, and Thailand. At this point, any app installed on a certified Android device in these regions must be registered by a verified developer.</p></blockquote>

<p>The police in Singapore have a page <a href="https://www.police.gov.sg/Media-Hub/News/2024/20241106_advisory_on_the_prevalence_of_malware_scams_affecting_android_users">warning about the prevalence of these scams</a>. They describe how victims are tricked or coerced into turning off all their phone's security features.</p>

<p>Similarly, there are estimates that <a href="https://www.gasa.org/post/1-in-3-brazilians-targeted-by-scammers-in-2024-state-of-scam-report">Brazil lost US$54 <strong>billion</strong> to scams in 2024</a> (albeit not all through apps).</p>

<p>There are <a href="https://www.reddit.com/r/indonesia/comments/1mjpnlo/optimisasi_apk_pemerintah_yg_kyk_kontol_enables/?tl=en">anecdotal reports from Indonesia</a> which show how easily people fall for these fake apps.</p>

<p>Thailand is also <a href="https://web.archive.org/web/20230121052244/https://www.bangkokpost.com/tech/2487659/phone-users-warned-over-malicious-apps">under an ongoing onslaught of malicious apps</a> with some apps raking in <a href="https://thethaiger.com/hot-news/crime/thai-police-crackdown-on-app-scam-seizing-nearly-1-million-baht">huge amounts of money</a>.</p>

<p>It is absolutely rational that government, police, and civic society groups want to find ways to stop these scams.</p>

<p>Google is afraid that if Android's reputation is tarnished as the "Scam OS" then users will move to more secure devices.</p>

<p>Financial institutions might stop providing functionality to Android devices as a way to protect their customers. Which would lead to those users seeking alternate phones.</p>

<p>Society as a whole wants to protect vulnerable people. We all bear the cost of dealing with criminal activity like this.</p>

<p>Given that sideloaded Android apps are clearly a <em>massive</em> vector for fraud, it obviously behoves Google to find a way to secure their platform as much as possible.</p>

<h2 id="and-yet"><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#and-yet">And Yet…</a></h2>

<p>This is quite obviously a bullshit powerplay by Google to ensnare the commons. Not content with closing down parts of the Android Open Source Project, stuffing more and more vital software behind its proprietary services, and freezing out small manufacturers - now it wants the name and shoe-size of every developer!</p>

<p>Fuck that!</p>

<p>I want to use my phone to run the code that I write. I want to run my friends' code. I want to play with cool open source projects by people in far-away lands.</p>

<p>I remember <a href="https://shkspr.mobi/blog/2015/11/the-day-google-deleted-me/">The Day Google Deleted Me</a> - we cannot have these lumbering monsters gatekeeping what we do on our machines.</p>

<p>Back in the days when I was a BlackBerry developer, <a href="https://shkspr.mobi/blog/2012/06/how-do-you-solve-a-problem-like-blackberry/#what-specific-things-could-the-research-in-motion-developer-relations-team-do-or-communicate-that-would-make-you-more-likely-to-develop-applications-for-the-blackberry-10-platform">we had to wait ages for RIM's code-signing server to become available</a>. I'm pretty sure the same problem affected Symbian - if Nokia was down that day, you couldn't release any code.</p>

<p>Going back to their statement:</p>

<blockquote><p>To be clear, developers will have the same freedom to distribute their apps directly to users through sideloading or to use any app store they prefer.</p></blockquote>

<p>This is a lie. I can only distribute a sideloaded app <strong>if Google doesn't nuke my account</strong>. If I piss off someone there, or they click the wrong button, or they change the requirements so I'm no longer eligible - my content disappears.</p>

<p>They promise that <a href="https://developer.android.com/developer-verification">Android will still be open to student and hobbyist developers</a> - but would you believe anything those monkey-punchers say?  Oh, and what a fricking insult to call a legion of Open Source developers "hobbyists"!</p>

<p>I hate it.</p>

<p>I also don't see how this is going to help. I guess if scammers all use the same ID, then it'll be easy for Android to super-nuke all the scam apps.</p>

<p>Perhaps when you install a sideloaded app you'll see "This app was made by John Smith - not a company. Here's his photo. Got any complaints?  Call his number."</p>

<p>But what's going to happen is that people will get their IDs stolen, or be induced to register as a developer and then sign some malware. They'll also be victims.</p>

<h2 id="so-whats-the-solution"><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#so-whats-the-solution">So What's The Solution?</a></h2>

<p>I've tried to be pragmatic, but there's something of a dilemma here.</p>

<ol start="0">
<li>Users should be free to run whatever code they like.</li>
<li>Vulnerable members of society should be protected from scams.</li>
</ol>

<p>Do we accept that a megacorporation should keep everyone safe at the expense of a few pesky nerds wanting to run some janky code?</p>

<p>Do we say that the right to run free software is more important than granny being protected from scammers?</p>

<p>Do we pour billions into educating users not to click "yes" to every prompt they see?</p>

<p>Do we try and build a super-secure Operating System which, somehow, gives users complete freedom without exposing them to risk?</p>

<p>Do we hope that Google won't suddenly start extorting developers, users, and society as a whole?</p>

<p>Do we chase down and punish everyone who releases a scam app?</p>

<p>Do we stick an AI on every phone to detect scam apps and refuse to run them if they're dodgy?</p>

<p>I don't know the answers to any of these questions and - if I'm honest - I don't like asking them.</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:sideload">
<blockquote class="mastodon-embed" data-embed-url="https://mastodon.social/@Gargron/115093185284473606/embed" style="background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;"> <a href="https://mastodon.social/@Gargron/115093185284473606" target="_blank" style="align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 79 75"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z" fill="currentColor"></path></svg> <div style="color: #787588; margin-top: 16px;">Post by @Gargron@mastodon.social</div> <div style="font-weight: 500;">View on Mastodon</div> </a> </blockquote>

<p><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#fnref:sideload" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=63058&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/feed/</wfw:commentRss>
			<slash:comments>33</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Quick Swap Data SIM Shortcut on Android]]></title>
		<link>https://shkspr.mobi/blog/2025/07/quick-swap-data-sim-shortcut-on-android/</link>
					<comments>https://shkspr.mobi/blog/2025/07/quick-swap-data-sim-shortcut-on-android/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 16 Jul 2025 11:34:16 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[HowTo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61942</guid>

					<description><![CDATA[I have a dual SIM Android phone. When I call or text, I get a choice of which SIM to use. But there&#039;s no quick way to swap which SIM is used for data.  There used to be a built-in settings tile on stock Android, and some manufacturers still have it, but Google&#039;s Pixels don&#039;t.  So here&#039;s how to make a (fairly) quick shortcut to swap between data SIMs.  First, get the brilliant open source Activity …]]></description>
										<content:encoded><![CDATA[<p>I have a dual SIM Android phone. When I call or text, I get a choice of which SIM to use. But there's no quick way to swap which SIM is used for data.</p>

<p>There used to be a built-in settings tile on stock Android, and some manufacturers still have it, but Google's Pixels don't.</p>

<p>So here's how to make a (fairly) quick shortcut to swap between data SIMs.</p>

<p>First, get the brilliant <a href="https://github.com/sdex/ActivityManager">open source Activity Manager app</a>. It exposes all of the internal activities available in your apps. This lets you create a deep-link shortcut into a specific part of an app.</p>

<p>In Activity Manager, find the Settings app and tap on it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/ActivityManager.webp" alt="List of apps." width="1008" height="757" class="aligncenter size-full wp-image-61955">

<p>Search or scroll down to "MobileNetworkListActivity".</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/Settings.webp" alt="List of settings activities." width="1008" height="756" class="aligncenter size-full wp-image-61954">

<p>Tap the vertical ellipse and then "Create Shortcut".</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/Shortcut.webp" alt="Popup showing a shortcut option." width="1008" height="755" class="aligncenter size-full wp-image-61953">

<p>That will place an icon on your home screen. Tapping the icon will take you directly to your SIM settings. At the bottom is the option to choose your data SIM. Tap it to change your data SIM.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/Switcher.webp" alt="Switcher allowing you to choose the data SIM." width="1008" height="1172" class="aligncenter size-full wp-image-61952">

<p>It isn't quite a one-tap solution, but the shortcut is a lot easier than remembering exactly which sub-menu you need to find.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=61942&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/07/quick-swap-data-sim-shortcut-on-android/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Contactless Payments with GrapheneOS]]></title>
		<link>https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/</link>
					<comments>https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 11:34:57 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[GrapheneOS]]></category>
		<category><![CDATA[nfc]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61636</guid>

					<description><![CDATA[Google&#039;s monopolistic stranglehold on Android results in poor experience for power-users, and artificially restricts choice for those who have older phones.  For example, Google Wallet is the de facto way to use NFC payments on Android. There&#039;s one problem though - it only works with Google&#039;s Android.  If you have the temerity to install a 3rd party Android OS - like the hyper-secure GrapheneOS - …]]></description>
										<content:encoded><![CDATA[<p>Google's monopolistic stranglehold on Android results in poor experience for power-users, and artificially restricts choice for those who have older phones.  For example, Google Wallet is the <i lang="la">de facto</i> way to use NFC payments on Android. There's one problem though - it only works with <em>Google's</em> Android.  If you have the temerity to install a 3rd party Android OS - like the hyper-secure <a href="https://grapheneos.org/">GrapheneOS</a> - you'll be locked out of it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/GPay-fs8.png" alt="This device can't be set up to pay contactless. Your device doesn't meet pay contactless security standards. It may be rooted or running uncertified software." width="504" class="aligncenter size-full wp-image-61637">

<p>First of all, Google is lying. It <em>does</em> meet security standards and it is <em>not</em> rooted.  I get that <a href="https://shkspr.mobi/blog/2023/05/the-limits-of-general-purpose-computation/">I have no right to run someone else's software in an environment they don't like</a>, but this is just misinformation.  3rd party OSes are often <em>more</em> secure that a stock OS which has been left to rot by an unresponsive manufacturer.</p>

<p>Anyway, here's how you can use contactless payments on Graphene.</p>

<h2 id="prerequisites"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#prerequisites">Prerequisites</a></h2>

<p>I'm going to tell you what I did. If you found another way, leave a comment or write your own blog post.</p>

<p>I'm using the latest version of Graphene (2025062000) with Play Services installed. The app is running in my main profile. None of the advanced app protection has been toggled for the app. NFC is on.</p>

<p>You will have to agree to <a href="https://www.curve.com/legal/privacy/">Curve's privacy policy</a>. And the privacy policy of your credit card. Look, if you're using Graphene, you're probably overly privacy sensitive. If you're concerned about The Man™ knowing that you used your card to buy a breakfast beer and then sharing that with 958 trusted partners, just use cash instead.</p>

<h2 id="install-curve"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#install-curve">Install Curve</a></h2>

<p><a href="https://www.curve.com/join#D4MK9ZKN">Here's a referral link to install Curve</a> - join and you get £10.  Or, you can <a href="https://play.google.com/store/apps/details?id=com.imaginecurve.curve.prd">install directly from the Play Store</a>.</p>

<p>You'll need to create an account and pass KYC / AML checks. <a href="https://www.fca.org.uk/consumers/fca-firm-checker/firm-10456-925447">Curve are regulated by the FCA</a> so you should feel safe giving your details to them.</p>

<h2 id="add-a-card"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#add-a-card">Add a card</a></h2>

<p>Curve is a <em>virtual</em> card provider. So add your existing Visa or MasterCard to the app (no Amex). When you spend on Curve, you're actually spending on the underlying card you've added. Curve promise cheaper foreign exchange fees and a few other perks. But what we're really interested in is NFC payments.</p>

<h2 id="set-up-curve-pay"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#set-up-curve-pay">Set up Curve Pay</a></h2>

<p>On your app's dashboard, you should see a banner saying "Curve Pay is good to go!". If not, head into your account and set it up there.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Good-to-go-fs8.png" alt="Curve dashboard." width="504" class="aligncenter size-full wp-image-61638">

<p>If it has all set up, you should see a welcome tutorial explaining how contactless works.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Good-To-Go-fs8.png" alt="Animation showing how to hold your phone to an NFC payment terminal." width="504" class="aligncenter size-full wp-image-61639">

<h2 id="set-your-default-wallet"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#set-your-default-wallet">Set your default wallet</a></h2>

<p>On your phone, go to Settings → Connected devices → Connection Preferences → NFC → Contactless Payments.</p>

<p>Or, search your settings for Pay.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Pay-Location-fs8.png" alt="Settings search page." width="504" class="aligncenter size-full wp-image-61640">

<p>Select your default wallet app - in this case, Curve.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Default-Wallet-App-fs8.png" alt="List of available wallet apps." width="504" class="aligncenter size-full wp-image-61641">

<h2 id="pay-for-something"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#pay-for-something">Pay for something</a></h2>

<p>You need to make sure NFC is turned on before you can use NFC payments. I know that sounds obvious, but I forgot to do it the first time and got very confused.</p>

<p>Go to a local shop, pick up something, hand it to the merchant, wave your phone over the payment terminal like you are a technowizard from the future.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Notification-fs8.png" alt="Notification showing I paid £3.95 for a sticky bun." width="504" class="aligncenter size-full wp-image-61642">

<p>Enjoy eating whatever you paid for!</p>

<h2 id="thats-it"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#thats-it">That's it!</a></h2>

<p>Once you're done, you can turn of NFC if you're paranoid.</p>

<p>Apparently, <a href="https://justfollow.me.uk/@sborrill/114761774161342879">Curve also works with Garmin Smart Watches</a> - but I don't have one to test out.</p>

<p>If you've found this blog post useful, I'd be grateful if you signed up with <a href="https://www.curve.com/join#D4MK9ZKN">my referral link for Curve</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=61636&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/feed/</wfw:commentRss>
			<slash:comments>23</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[ManyTag Colour eInk Badge SDK - Minimum Viable Example for Android]]></title>
		<link>https://shkspr.mobi/blog/2025/02/manytag-colour-eink-badge-sdk-minimum-viable-example-for-android/</link>
					<comments>https://shkspr.mobi/blog/2025/02/manytag-colour-eink-badge-sdk-minimum-viable-example-for-android/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 28 Feb 2025 12:34:30 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[eink]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Kotlin]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=58487</guid>

					<description><![CDATA[Last year, I reviewed a Four-Colour eInk Name Badge - the ManyTag HSN371. The hardware itself is perfectly fine, but the Android app isn&#039;t great. It is complicated, crash-prone, and not available in the app-store.  After some back-and-forth with the manufacturer, they agreed to send me their Android SDK and documentation. Sadly, the PDF they sent me was riddled with errors and the software…]]></description>
										<content:encoded><![CDATA[<p>Last year, I reviewed a <a href="https://shkspr.mobi/blog/2024/11/review-four-colour-eink-name-badge-hsn371-plus-linux-and-android-tips/">Four-Colour eInk Name Badge</a> - the ManyTag HSN371. The hardware itself is perfectly fine, but the Android app isn't great. It is complicated, crash-prone, and not available in the app-store.</p>

<p>After some back-and-forth with the manufacturer, they agreed to send me their Android SDK and documentation. Sadly, the PDF they sent me was riddled with errors and the software library is also a bit dodgy. So, with the help of <a href="https://hades.omg.lol/">Edward Toroshchyn</a> and a hefty amount of automated boiler-plate, I managed to get it working.</p>

<p>The <a href="https://codeberg.org/edent/eInk-SDK/">full code is open source</a>, but here's a quick walk-through of the important bits.</p>

<p>First, the AAR library needs to be imported into the project. Place it in <code>app/libs</code> and then include it in the Gradle build file:</p>

<pre><code class="language-java">dependencies {
    implementation(files("libs/badge_nfc_api-release.aar"))
}
</code></pre>

<p>The key to getting it working is in the Android permissions. It needs Bluetooth, NFC, and location. So the manifest has to contain:</p>

<pre><code class="language-xml">&lt;uses-permission android:name="android.permission.BLUETOOTH"/&gt;
&lt;uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/&gt;
&lt;uses-permission android:name="android.permission.BLUETOOTH_SCAN"/&gt;
&lt;uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/&gt;
&lt;uses-permission android:name="android.permission.NFC"/&gt;
&lt;uses-permission android:name="android.permission.NFC_TRANSACTION_EVENT"/&gt;
&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/&gt;
&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&gt;
</code></pre>

<p>The following imports are needed from the Android Archive library:</p>

<pre><code class="language-java">import cn.manytag.badge_nfc_api.manager.BadgeWriteManager
import cn.manytag.badge_nfc_api.manager.OnNFCReaderCallback
import cn.manytag.badge_nfc_api.manager.OnBluetoothCallBack
import cn.manytag.badge_nfc_api.manager.OnSendImageCallback
</code></pre>

<p>The library needs to be initialised with:</p>

<pre><code class="language-java">val state = BadgeWriteManager.getInstance().init(this)
</code></pre>

<p>When the phone reads the NFC tag, it gets a bunch of information:</p>

<pre><code class="language-java">BadgeWriteManager.getInstance().setOnNFCReaderCallback(object : OnNFCReaderCallback {
    override fun onReaderMessage(i: Int, tag: Tag) {
        if (i == 0) {
            BadgeWriteManager.getInstance().readNFC(tag)
        }
    }

    //  Get the data from the badge
    override fun onReaderType(tag: Tag, isodep: IsoDep, i: Int, type: String, size: String, color: String) {
        if (i == 0) {
            nfcData = """
                NFC Tag Detected!!!
                Tag: $tag
                IsoDep: $isodep
                Type: $type
                Size: $size
                Color: $color
            """.trimIndent()
            colorFromNFC = color
            tagObject = tag
            isoDepObject = isodep
            badgeType = type
            badgeSize = size
        }
    }
})
</code></pre>

<p>The <code>color</code> is most important right now. It says whether the badge is black and white, or black and white and red, or black and white and red and yellow.</p>

<p>After picking an image from the filesystem, it needs to be dithered into the correct colour format:</p>

<pre><code class="language-java">processedBitmap = originalBitmap?.let { bitmap -&gt;
    colorFromNFC?.let { color -&gt;
        BadgeWriteManager.getInstance().processImage(bitmap, color)
    }
}
</code></pre>

<p>Finally, the processed image needs to be converted to bytes and then sent to the badge via Bluetooth:</p>

<pre><code class="language-java">if (processedBitmap != null &amp;&amp; badgeType != null &amp;&amp; badgeSize != null &amp;&amp; colorFromNFC != null) {
    val imgData = BadgeWriteManager.getInstance().getImageData(processedBitmap!!, colorFromNFC!!)

    BadgeWriteManager.getInstance().sentImageResource(
        tagObject!!, isoDepObject!!, imgData, badgeType!!, badgeSize!!, colorFromNFC!!
    )
}
</code></pre>

<p>I realise this is a bit "<a href="https://knowyourmeme.com/memes/how-to-draw-an-owl">draw the rest of the owl</a>" but that should be enough to get you started on building an app which can communicate with these badges.</p>

<p>The app I've built isn't the prettiest in the world but at least it works. It scans a badge, gets its info, picks an image, dithers it, then sends it to the badge.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/02/badge-app-fs8.png" alt="Screenshot of an app." width="504" height="957" class="aligncenter size-full wp-image-58494">

<p>You can <a href="https://codeberg.org/edent/eInk-SDK/">play with the code on CodeBerg</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=58487&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/02/manytag-colour-eink-badge-sdk-minimum-viable-example-for-android/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Review: Pebblebee Clip Universal - and Android "Find My Device" Tracker ★★★⯪☆]]></title>
		<link>https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/</link>
					<comments>https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 11 Jan 2025 12:34:15 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ble]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[review]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=54516</guid>

					<description><![CDATA[Android is belatedly getting a Bluetooth tracker feature which doesn&#039;t rely on proprietary apps. Long-time readers will know that back in 2016 I reviewed both the Chipolo and the TinTag.  Both of those were adequate at finding things which were in range of your phone, but hopeless at finding lost items - because they required everyone to have a special app installed.  But now, under pressure from …]]></description>
										<content:encoded><![CDATA[<p>Android is belatedly getting a Bluetooth tracker feature which doesn't rely on proprietary apps. Long-time readers will know that back in 2016 I reviewed both the <a href="https://shkspr.mobi/blog/2016/11/review-chipolo-plus/">Chipolo</a> and the <a href="https://shkspr.mobi/blog/2016/06/tintag-unboxing-and-review/">TinTag</a>.  Both of those were adequate at finding things which were in range of your phone, but hopeless at finding lost items - because they required <em>everyone</em> to have a special app installed.</p>

<p>But now, under pressure from Apple's incredible Find My network, Google has started rolling out a similar service to modern Android phones. In <em>theory</em> it should be much better; Android has a higher market share than iOS in most parts of the world I'm interested in visiting. But Apple's monoculture means they can quickly roll out the network to a much higher range of devices than Google.</p>

<p>The Pebblebee "Universal" range works with both Apple and Android's networks. But, crucially, <em>not at the same time</em>. You can reset the device and swap it between your iPhone and Galaxy - but it won't connect to both networks simultaneously.</p>

<p>Hey, remember when Google and Apple collaborated so that Covid tracing apps were interoperable no matter the device? Good times, man! But, y'know, this is just for protecting property, not life. So we'll give them a pass…</p>

<p>This is what the Pebblebee Clip looks like.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblebee-box.jpg" alt="Small plastic disk with a small metal ring." width="1024" height="1024" class="aligncenter size-full wp-image-55182">

<p>It's a fairly unobtrusive small disk. Clip it to a thing with the included clip, hide it in the lining, glue it to a device. The logo is a clickable button which is used for <a href="https://help.pebblebee.com/article/hx8kcsewp0-get-started-with-your-pebblebee-for-android">pairing the device</a>, resetting, and checking the battery.</p>

<p>It also comes with a ridiculously short USB-C-to-C cable which can only be used for charging.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblebee-USB.jpg" alt="A USB-C cable that is only a couple of cm long." width="1024" height="768" class="aligncenter size-full wp-image-55184">

<p>Dump it and grab a longer cable from your big box of cables. Total e-Waste, shouldn't have been included.</p>

<p>When you tell the app to make the PebbleBee identify itself, you're rewarded with this display of loud beeps and disco lasers.</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-54516-4" width="620" height="349" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblesmall.mp4?_=4"><a href="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblesmall.mp4">https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblesmall.mp4</a></video></div><p></p>

<p>The lights are bright and the sound is piercing - especially considering its size. It fits neatly in a hand and is small enough to tuck away in a pocket.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblebee-lights.jpg" alt="The disk has a USB-C socket at the bottom and flashing lights on the side." width="1024" height="768" class="aligncenter size-full wp-image-55183">

<p>But what's it like to use?</p>

<h2 id="pros"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#pros">Pros</a></h2>

<ul>
<li>USB-C rechargable. No more faffing about trying to find a new battery. No e-Waste. No worrying if it'll last an entire trip. Shove it into to any USB power source and you're good to go.</li>
<li>Loud beeper. One of the main reasons I got this was that it (reportedly) has the loudest speaker on the market. I can't compare it to others but it is certainly good enough for hearing in a crowded train carriage.</li>
<li>Lights. The sides light up - handy for giving you a visual cue as to where it is.</li>
<li>Small, light, and includes a keyring connector.</li>
<li>You can <a href="https://blog.google/products/android/android-find-my-device/#:~:text=Share%20accessories">share trackers between accounts</a>. My wife and I each have a suitcase. We don't just want to know where our own bag is - we both want to know where <em>both</em> bags are.</li>
</ul>

<h2 id="cons"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#cons">Cons</a></h2>

<p>The downsides of the device are minimal - depending on your use case.</p>

<ul>
<li>Not waterproof. Certainly water resistant - but the USB-C socket is an ingress point for fluids.</li>
<li>No Ultra Wide Band. That means you don't get a precise direction when looking for something - just the distance. UWB isn't supported on Google's "Find My Device" network right now, so this isn't a great loss.</li>
<li>No wireless charging.</li>
<li>Cost. Even in bulk, with a discount, they were £25 each.</li>
</ul>

<h2 id="security"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#security">Security</a></h2>

<p>Anyone who finds your tracker can <a href="https://help.pebblebee.com/article/aroje5h88v-how-to-factory-reset-a-clip-or-card">factory reset it</a>. I can't help but feel there should be a way to prevent that. But, to be honest, if a thief has found your token they can just throw it away or destroy it.</p>

<p>Firmware updates aren't available in the Google Find My app. So you'll need to <a href="https://help.pebblebee.com/article/ako3p1yfzd-fmd-update">use Pebblebee's own app</a>.</p>

<p>The USB-C port is for power only. They don't show up as a device when connected to a computer.</p>

<h2 id="testing"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#testing">Testing</a></h2>

<p>I wasn't able to <a href="https://github.com/GrapheneOS/os-issue-tracker/issues/4079">connect to the PebbleBee using GrapheneOS</a> - one of the downsides of using a hyper-secure version of Android.</p>

<p>I used a separate phone, but couldn't get the device to pair. I kept getting this message:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/upgrade-fs8.png" alt="Error saying I need to upgrade my Android version." width="504" height="533" class="aligncenter size-full wp-image-55187">

<p>I had to go to Setting → Google → Devices → Scan for nearby devices. Only then could I add it to Find My Device.</p>

<p>The FMD service lets you share devices with another Google account. Perfect for families and loved ones! When I tried to use it, I got this error message on the GrapheneOS phone.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/not-available-fs8.png" alt="Error saying &quot;Device sharing is not available on this device&quot;." width="504" height="504" class="aligncenter size-full wp-image-55186">

<p>That's probably a GrapheneOS issue. But it is dissapointing these sorts of things aren't standardised and baked into the OS.</p>

<p>In terms of tracking - a bit crap. In Gatwick airport - a pretty busy destination - they stayed tracked for a bit after we dropped off our bags. But in less busy destinations, they never pinged the network.  They claim a 150m range which <em>ought</em> to several times better than an AirTag. But without a critical mass of Android users opted-in to the network, it is pointless.</p>

<h2 id="privacy"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#privacy">Privacy</a></h2>

<p>I'm a bit of a privacy nut. There's no doubt that these can be used to stalk people - but the Find My app is supposed to alert you if it detect a tag following you.</p>

<p>Is having Google and Apple know where all your stuff is a good thing? Well, probably not. But if it is a choice between seeing where a thief has taken my laptop bag and a multinational knowing what train I took, I guess I'm surprisingly OK with it.</p>

<p>Yes, it is a Devil's Bargain. Location is useful for surveillance (be it advertising or police) but it is also useful for personal security. It isn't nice living in a <a href="https://en.wikipedia.org/wiki/Panopticon">Panopticon</a> but it also isn't nice to lose your expensive possessions.</p>

<h2 id="verdict"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#verdict">Verdict</a></h2>

<p>From a tech point of view - they sort of work! BLE is now an established technology and is well supported on all modern phones. Google's "Find My" app is basic, but works at tracking your devices when they're near you. The device is loud, bright, and is quickly recharged.</p>

<p>If you have a phone that support it, they're a reasonable device. At £25 each, they are optimistically priced.  Especially given the coverage issues.</p>

<p>And that's the crux of the issue. As of yet, the network simply isn't as expansive as the Apple version.  Apple have the ability to push out a service to millions of users, Google don't. While there are more Android users (certainly in my part of the world) there isn't a mechanism to bootstrap this network.</p>

<p>Back in the day when Google was ambitious, they would have stuck sensors all around the country or ran a massive campaign encouraging people to get involved or launched a cool API or given out a million trackers as freebies. But Google is now a timid and cautious shadow of its former self. Everyone in tech half-expects the Find My Device network to join the <a href="https://killedbygoogle.com/">Google Graveyard</a> like so many other interesting projects.</p>

<p>So, for now, these are great if you're within a few hundred metres of them. And they're barely adequate under any other circumstances.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=54516&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblesmall.mp4" length="1081023" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[What's the best way to protect banking apps on Android?]]></title>
		<link>https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/</link>
					<comments>https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 29 Dec 2024 12:34:26 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[banking]]></category>
		<category><![CDATA[GrapheneOS]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=55137</guid>

					<description><![CDATA[Lots of people using banking apps on their Android phones.  They&#039;re a convenient way to check your balance, transfer money to people, and get alerts about fraudulent transactions. But, like anything related to money, they can be abused.  Nowadays, thieves are not only snatching phones, but forcing their owners to transfer money to the thieves. This is not an isolated incident.  How can you…]]></description>
										<content:encoded><![CDATA[<p>Lots of people using banking apps on their Android phones<sup id="fnref:smug"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fn:smug" class="footnote-ref" title="&quot;Not me,&quot; you say smugly. &quot;I am far superior to the sheeple. If I want to connect to my bank, I just SSH in to a bespoke firewalled box that runs a disposable Docker image which connect to TOR.&quot; You…" role="doc-noteref">0</a></sup>.  They're a convenient way to check your balance, transfer money to people, and get alerts about fraudulent transactions. But, like anything related to money, they can be abused.</p>

<p>Nowadays, thieves are not only snatching phones, but <a href="https://www.reddit.com/r/UKPersonalFinance/comments/12bl2rf/forced_to_transfer_money_to_muggers/">forcing their owners to transfer money to the thieves</a>. This is not an isolated incident<sup id="fnref:see"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fn:see" class="footnote-ref" title="See also Bank and phone lessons learned after a robbery and I was robbed and forced to transfer money from my banking app." role="doc-noteref">1</a></sup>.</p>

<p>How can you protect yourself from such a situation<sup id="fnref:state"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fn:state" class="footnote-ref" title="Here we're mostly concerned with street theft. If you are the target of state-sponsored violence, or the police are searching your phone, then you may have a different threat model. If you think that…" role="doc-noteref">2</a></sup>?</p>

<p>Broadly speaking, there are four ways to protect your sensitive apps.  Relying on the regular lockscreen, hiding the apps, using a Private Space, or placing the apps in different profile.  Let's look at the advantages and disadvantages of each approach.</p>

<h2 id="regular-lockscreen"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#regular-lockscreen">Regular Lockscreen</a></h2>

<p>Android's lockscreen controls are pretty good - <em>if</em> you turn them on.</p>

<p>Perhaps you have a super-long and complicated password. Maybe a 10 digit PIN that only you know. Biometrics like facial recognition and fingerprints are reasonably strong and fairly convenient.</p>

<p>But that relies on your phone being locked when it is snatched. If you're using your phone when it is taken from you, <a href="https://www.theverge.com/2024/5/15/24157068/android-15-ai-theft-detection-lock-privacy-security">the lockscreen <em>might</em> detect it and lock automatically</a>, but you need a modern device and to have specifically enabled the setting.</p>

<p>If a thief has shoulder-surfed your 4 digit PIN, that will be enough to let them enter your phone.</p>

<p>But here we are concerned with someone threatening you. Basically, if someone has a knife pointed at you, you're probably going to unlock the phone for them<sup id="fnref:palm"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fn:palm" class="footnote-ref" title="Yes, I know that your self-defence training is impressive, but handing over your unlocked phone is a lot preferable to getting punctured." role="doc-noteref">3</a></sup>. So, let's assume we want to protect our banking apps from someone who has access to your <em>unlocked</em> device.</p>

<h2 id="launcher-hiding"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#launcher-hiding">Launcher Hiding</a></h2>

<p>Some Android phones <a href="https://www.geeksforgeeks.org/how-to-hide-apps-on-an-android-phone/">let you hide apps</a>. When an attacker is scrolling through the list of installed apps, they won't be able to see any apps which are hidden.</p>

<p>This, I think, is a reasonable way to hide your banking apps. You can show the thug that there aren't any installed. That may or may not be enough to mollify them.  They might still nick your device, but you won't be forced to transfer your savings elsewhere.</p>

<p>This, of course, presents a problem for the regular user. How do <em>you</em> launch your apps if you can't find them?  Most launchers will let you type in the name of the app to find it - the app is merely hidden from the default list.</p>

<p>So an attacker would have to try typing "HSBC" or "Barclays" or "Chase" or a dozen different names until they find your app.  Will they be angry if you've lied to them?  Is that a risk you want to take?</p>

<p>Some launchers will let you change the name and icon of your sensitive apps. You can rename "Midland Bank" to "Calculator" and change its icon.  Not every launcher supports this sort of hiding though. It also places a cognitive load on you that you need to remember what you've hidden your apps as. Will you remember than Bank 1 is calendar and Bank 2 is Bumble?</p>

<h2 id="private-space"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#private-space">Private Space</a></h2>

<p>Android 15 has introduced the concept of a <a href="https://support.google.com/android/answer/15341885?hl=en">Private Space</a>. It is like a digital lock-box for your apps. If someone has your unlocked phone, they need to pass through authentication in order to use apps which are locked.</p>

<p>There are two main drawbacks with this approach.</p>

<p>Firstly, locked apps don't run in the background. That means you won't get alerts from them. If you rely on push notifications to tell you if someone is using your card fraudulently, this could be a problem.</p>

<p>Secondly, the Private Space shows up at the bottom of your app list like this:</p>

<p></p><div style="width: 230px;" class="wp-video"><video class="wp-video-shortcode" id="video-55137-6" width="230" height="512" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2024/12/private-space.mp4?_=6"><a href="https://shkspr.mobi/blog/wp-content/uploads/2024/12/private-space.mp4">https://shkspr.mobi/blog/wp-content/uploads/2024/12/private-space.mp4</a></video></div><p></p>

<p>So an attacker can easily see it and demand that you open it up.  You can set the Private Space to be hidden. But then you're in the same position as above - typing in "private space" will show it in your launcher.</p>

<h2 id="work-profile"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#work-profile">Work Profile</a></h2>

<p>Android has the concept of "<a href="https://support.google.com/work/android/answer/6191949?hl=en">Work Profiles</a>". They're designed to segregate your work apps and your personal apps. Your work admin can wipe your work profile without touching your personal stuff, and you can't copy confidential emails to your personal area. Nifty!</p>

<p>If you don't have work apps on your phone, you can use an app like <a href="https://f-droid.org/packages/net.typeblog.shelter/">Shelter</a> to make your own Work Profile.</p>

<p>You can stick your banking apps in the Work Profile and have them locked away from prying eyes.</p>

<p>The Work Profile button is more subtle than the Private Space.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/12/workprofile-fs8.png" alt="Work Profile in the quick settings bar." width="485" height="524" class="aligncenter size-full wp-image-55141">

<p>But it still has the disadvantage that, once locked, the apps are suspended and won't receive any alerts.</p>

<h2 id="secondary-profile"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#secondary-profile">Secondary Profile</a></h2>

<p>Finally, modern versions of Android support <a href="https://support.google.com/android/answer/2865483?hl=en">multiple profiles</a>. They're generally designed so that multiple people can use your device - but there's nothing stopping you from putting your banking apps in there.</p>

<p>The immediate advantages of multi-user profiles are:</p>

<ul>
<li>The profile can be protected by a separate password.</li>
<li>The profile switcher is generally more subtle than the Work Profile switcher or Private Space toggle.</li>
<li>Apps can run in the background while in a separate profile.</li>
</ul>

<p>The disadvantage is that, because it is a completely separate profile, you'll need to sign in again using your Google account in order to install apps from the Play store. If you use a password manager and MFA app, you may need to install them in both your main and secondary profile.</p>

<p>Because the apps can run in the background, there may be some (minor) impact on battery life - you're effectively running Google's Notifications Service twice.</p>

<p>If you are being held at knifepoint and a notification from your bank comes through - you may find it socially awkward to explain.</p>

<h2 id="which-is-right-for-me"><a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#which-is-right-for-me">Which is right for me?</a></h2>

<p>It is complicated. I think I can distil it down to the following:</p>

<ul>
<li>If you need alerts from your banking apps - put them in a secondary profile.</li>
<li>There are <a href="https://www.reddit.com/r/GooglePixel/comments/1g5v3b8/private_space_is_kinda_useless_what_do_you_use_it/lsmhz34/">some reports of banking apps not working in secondary profiles</a> - if yours don't work in a profile then hiding apps is your best defence.</li>
<li>If you're not using Work Mode and don't need alerts - put them in Work Mode.</li>
<li>If you're using Work Mode and don't need alerts - put them in a Private Space and set the space to be hidden.</li>
</ul>

<p>Remember, you can't fling <a href="https://utcc.utoronto.ca/~cks/space/blog/tech/SocialProblemsAndTechnicalDecisions">technical solutions at social problems</a> and expect them to solve everything.  In general, <a href="https://www.ons.gov.uk/peoplepopulationandcommunity/crimeandjustice/bulletins/crimeinenglandandwales/yearendingjune2024">crime in England and Wales is at its lowest level</a> but certain crimes, like phone theft, are on the rise. Despite all the technology thrown at the problem, people are still walking around holding machines worth hundreds of pounds. Each of those machines is a gateway to potentially thousands of pounds. Phones and banking apps are incredibly lucrative targets.</p>

<p>The aim of this exercise isn't to solve the problem of crime. It isn't even to make you a less attractive target. It is to allow you to hand over your phone safe in the knowledge that your banking apps are <em>somewhat</em> protected from miscreants while still being useful to you.</p>

<p>If you have any tips on how to keep banking apps hidden, please leave a comment.</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:smug">
<p>"Not me," you say smugly. "I am far superior to the sheeple. If I want to connect to my bank, I just SSH in to a bespoke firewalled box that runs a disposable Docker image which connect to TOR."  You continue, indifferent to the exasperated sighs of the waitress  "Of course, I only use GNU/Linux on my phones, have you heard of it? I don't even trust password managers! I have my own algorithm for generating passwords using dice. I have some nifty D20s if you wanna see them? Sure beats having a <strong>CR</strong>app on my phone! If I want to transfer someone money I generate a new seed phrase for my Bitcoin wallet and then… say, do you take crypto here?"  The waitress contemplates stabbing you with a fish-knife but, instead, politely replies "If you don't want to leave a tip, sir, that's OK." She makes the mistake of smiling, which you misinterpret as a flirtatious gesture. You torrented a whole bunch of books about social interactions with girls and yet, somehow, failed to understand any of them. You try negging her. That's bound to work. "Of course, you're probably the sort of girl who uses an iPhone or as I call them…" before you can chuckle about normies running iDrones the waitress has turned and walked away. Bitch. Still, at least you don't have any banking apps on your phone. That makes you better than most people.&nbsp;<a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fnref:smug" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:see">
<p>See also <a href="https://www.reddit.com/r/UKPersonalFinance/comments/11nmyyz/bank_and_phone_lessons_learned_after_a_robbery/">Bank and phone lessons learned after a robbery</a> and <a href="https://www.reddit.com/r/UKPersonalFinance/comments/1clqlxd/i_was_robbed_and_forced_to_transfer_money_from_my/">I was robbed and forced to transfer money from my banking app</a>.&nbsp;<a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fnref:see" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:state">
<p>Here we're mostly concerned with street theft. If you are the target of state-sponsored violence, or the police are searching your phone, then you may have a different threat model. If you think that your snarky posts on your three-subscriber Substack about "lamestream media" and "Micro$oft" make you a target for the CIA, please go outside and run around in the fresh air for a bit.&nbsp;<a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fnref:state" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:palm">
<p>Yes, I know that <a href="https://forums.somethingawful.com/showthread.php?threadid=3742916">your self-defence training is impressive</a>, but handing over your unlocked phone is a lot preferable to getting punctured.&nbsp;<a href="https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/#fnref:palm" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=55137&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/12/whats-the-best-way-to-protect-banking-apps-on-android/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2024/12/private-space.mp4" length="169206" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Is Android Unicode Yet?]]></title>
		<link>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/</link>
					<comments>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 07 Oct 2024 11:34:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=53054</guid>

					<description><![CDATA[Google&#039;s Android platform has dreadful support for Unicode. Even the most recent Android versions are missing out on languages, characters, and symbols which were added to Unicode in the last decade.  Back in 2013, Google created the &#34;Noto&#34; project. Its aim? To include &#34;all the world&#039;s languages&#34;. They wanted to banish &#34;tofu&#34; - the little white blocks □ which indicate a missing character - hence t…]]></description>
										<content:encoded><![CDATA[<p>Google's Android platform has dreadful support for Unicode. Even the most recent Android versions are missing out on languages, characters, and symbols which were added to Unicode in the last <em>decade</em>.</p>

<p>Back in 2013, Google created the "Noto" project. Its aim? <a href="https://www.npr.org/sections/codeswitch/2014/08/03/337168933/-no-tofu-doesn-t-equate-to-no-problem-for-google-universal-typeface">To include "all the world's languages"</a>. They wanted to banish "tofu" - the little white blocks □ which indicate a missing character - hence the name "No Tofu" / "Noto".</p>

<p>There was great flurry and excitement which has, thankfully, been sustained over the years. Noto continues to churn out regular updates to their fonts. Android began to use Noto but, for some unknown reason, it only rarely uses the latest versions. This means whole swathes of modern characters are missing from Android.</p>

<p>You can see <a href="https://cs.android.com/android/platform/superproject/main/+/main:external/noto-fonts/;bpv=1">all the fonts included in the Android Open Source Project</a>. If you want to download them all, run: <code>git clone https://android.googlesource.com/platform/external/noto-fonts</code></p>

<p>Open up the fonts in your favourite editor, and you'll see just how outdated they are.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/09/Noto-Symbols-fs8.png" alt="Fontforge showing the version is from 2013." width="1221" height="546" class="aligncenter size-full wp-image-53076">

<p>For example, Gujarati is stuck on 2013's version (1.03) despite <a href="https://github.com/notofonts/gujarati/releases">v2.106 being released in 2023</a></p>

<p>It's a similar story for the technical symbols block - Android is stuck on v1.09 despite <a href="https://github.com/notofonts/symbols/releases">a decade of advances</a>.</p>

<p>A few, like <a href="https://github.com/notofonts/hentaigana">Hentaigana</a> were only created recently - and so are on the latest version. But the majority are woefully outdated.</p>

<p>Perhaps that's just a lack of love for AOSP? Not at all. I downloaded <a href="https://developer.android.com/about/versions/15/download">the latest beta version of Android 15</a> and went through all the fonts it included.  They're exactly the same<sup id="fnref:hebrew"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fn:hebrew" class="footnote-ref" title="Well, OK. For some reason the Pixel has an extremely outdated version of Hebrew and a slightly newer version of Color Emoji Flags." role="doc-noteref">0</a></sup>.</p>

<h2 id="how-bad-is-it"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#how-bad-is-it">How bad is it?</a></h2>

<p>I decided to compare all the recently published Noto fonts and those available in AOSP.</p>

<p>I <a href="https://github.com/notofonts/notofonts.github.io">downloaded all the most recent Noto fonts from GitHub</a>. It does take some time for fonts to be tested on phones so, in the spirit of fairness, I grabbed the 2024-01-01 release.</p>

<p>Here's what I found.</p>

<p>Of the 224 non-Emoji fonts in Noto, AOSP only has about 140. About a third are simply missing.</p>

<p>Of the fonts included with Android 15, how many were updated within the last 2 years?  <strong>Ten</strong>.  Not a typo.</p>

<p>Despite a regular publishing cadence from another Google project, Android is ignoring the vast majority of updates.</p>

<p>This means Android is missing entire languages, has severely outdated fonts in others, and - most importantly - <a href="https://unicodepowersymbol.com/">doesn't include the Unicode Power Symbol</a>.</p>

<p>Noto is a great effort - but Android is failing to keep up.</p>

<h2 id="what-now"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#what-now">What now?</a></h2>

<p>I've <a href="https://issuetracker.google.com/issues/366415133">raised a bug on the AOSP bug tracker</a><sup id="fnref:die"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fn:die" class="footnote-ref" title="Which is where all bug reports submitted by the public go to die." role="doc-noteref">1</a></sup>. And I've published this ranty blog post. If you work for Google, or an Android manufacturer, please give the Android team a nudge and get them to update.</p>

<p>Ideally, Project Treble would allow for these fonts to be updated, so even older versions of Android could benefit from them.</p>

<h2 id="full-list-of-fonts-dates-and-versions"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#full-list-of-fonts-dates-and-versions">Full List of Fonts, Dates, and Versions</a></h2>

<p>I've generated this based on the 2024-01-01 release of Noto and the AOSP source code from 2024-09-13.  I've placed the dates next to each other for ease of comparrison. Empty cells means the font doesn't exist in that release.</p>

<p>I've tried to transcribe all the data accurately. Corrections very much welcome.</p>

<table><thead>
  <tr>
    <th></th>
    <th colspan="2">Noto</th>
    <th colspan="2">AOSP</th>
  </tr>
  <tr>
    <td>Font Name</td>
    <td>Version</td>
    <td>Date</td>
    <td>Date</td>
    <td>Version</td>
  </tr>
</thead>
<tbody>

  <tr>
    <td>Noto Fangsong KSS Rotated Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Fangsong KSS Vertical Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Kufi Arabic Regular</td>
    <td>2.108</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Looped Thai Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Music Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Naskh Arabic Regular</td>
    <td>2.018</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.08</td>
  </tr>
  <tr>
    <td>Noto Naskh Arabic UI Regular</td>
    <td>2.014</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.08</td>
  </tr>
  <tr>
    <td>Noto Nastaliq Urdu Regular</td>
    <td>3.009</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Rashi Hebrew Regular</td>
    <td>1.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Regular</td>
    <td>2.013</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Adlam Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2019</td>
    <td>3</td>
  </tr>
  <tr>
    <td>Noto Sans Adlam Unjoined Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Anatolian Hieroglyphs Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Arabic Regular</td>
    <td>2.012</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Armenian Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.005</td>
  </tr>
  <tr>
    <td>Noto Sans Avestan Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Balinese Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Bamum Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Bassa Vah Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Batak Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Bengali Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Bengali UI Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Bhaiksuki Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Brahmi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Buginese Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Buhid Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Canadian Aboriginal Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Carian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Caucasian Albanian Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Chakma Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Cham Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Cherokee Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2016</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Chorasmian Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Coptic Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Cuneiform Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Cypriot Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Cypro Minoan Regular</td>
    <td>1.503</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Deseret Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Devanagari Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Devanagari UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Duployan Regular</td>
    <td>3.001</td>
    <td>2019</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Egyptian Hieroglyphs Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Elbasan Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Elymaic Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ethiopic Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Georgian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Glagolitic Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Gothic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Grantha Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2020</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Gujarati Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Gujarati UI Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Gunjala Gondi Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Gurmukhi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Gurmukhi UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Hanifi Rohingya Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Hanunoo Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Hatran Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Hebrew Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2024</td>
    <td>3.001</td>
  </tr>
  <tr>
    <td>Noto Sans Imperial Aramaic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Indic Siyaq Numbers Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Inscriptional Pahlavi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Inscriptional Parthian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Javanese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Kaithi Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Kannada Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Kannada UI Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.003</td>
  </tr>
  <tr>
    <td>Noto Sans Kawi Regular</td>
    <td>1</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Kayah Li Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Kharoshthi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Khmer Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2016</td>
    <td>1.901</td>
  </tr>
  <tr>
    <td>Noto Sans Khojki Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Khudawadi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Lao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Lao Looped Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Lepcha Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Limbu Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Linear A Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Linear B Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Lisu Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Lycian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Lydian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Mahajani Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Malayalam Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Malayalam UI Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.103</td>
  </tr>
  <tr>
    <td>Noto Sans Mandaic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Manichaean Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Marchen Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Masaram Gondi Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Math Regular</td>
    <td>2.539</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Mayan Numerals Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Medefaidrin Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td>2020</td>
    <td>1.001</td>
  </tr>
  <tr>
    <td>Noto Sans Meetei Mayek Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Mende Kikakui Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Meroitic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Miao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Modi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2018</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Mongolian Regular</td>
    <td>3.001</td>
    <td>2023</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Mono Regular</td>
    <td>2.014</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Mro Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Multani Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Myanmar Regular</td>
    <td>2.107</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans NKo Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans NKo Unjoined Regular</td>
    <td>2.004</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nabataean Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nag Mundari Regular</td>
    <td>1</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nandinagari Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans New Tai Lue Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Newa Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nushu Regular</td>
    <td>1.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ogham Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Ol Chiki Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Old Hungarian Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Italic Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Old North Arabian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Permic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Persian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Old Sogdian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old South Arabian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Old Turkic Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Oriya Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2015</td>
    <td>1.01</td>
  </tr>
  <tr>
    <td>Noto Sans Osage Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Osmanya Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Pahawh Hmong Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Palmyrene Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Pau Cin Hau Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Phags-Pa Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans PhagsPa Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Phoenician Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Psalter Pahlavi Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Rejang Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Runic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Samaritan Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Saurashtra Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Sharada Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Shavian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Siddham Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans SignWriting Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Sinhala Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Sinhala UI Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Sogdian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Sora Sompeng Regular</td>
    <td>2.101</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Soyombo Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2019</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Sundanese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Syloti Nagri Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Symbols Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.09</td>
  </tr>
  <tr>
    <td>Noto Sans Symbols 2 Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Regular</td>
    <td>3</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Eastern Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Western Regular</td>
    <td>3</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tagalog Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Tagbanwa Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Le Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Tham Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Viet Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Takri Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2020</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.003</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil Supplement Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tangsa Regular</td>
    <td>1.506</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Telugu Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.004</td>
  </tr>
  <tr>
    <td>Noto Sans Telugu UI Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.004</td>
  </tr>
  <tr>
    <td>Noto Sans Test Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Thaana Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Thai Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Thai Looped Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh APT Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Adrar Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Agraw Imazighen Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Ahaggar Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Air Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Azawagh Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Ghat Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Hawad Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Rhissa Ixa Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh SIL Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Tawellemmet Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tirhuta Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ugaritic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Vai Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Vithkuqi Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Wancho Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Warang Citi Regular</td>
    <td>3.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Yi Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Zanabazar Square Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Regular</td>
    <td>2.013</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.07</td>
  </tr>
  <tr>
    <td>Noto Serif Ahom Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Armenian Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.005</td>
  </tr>
  <tr>
    <td>Noto Serif Balinese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Bengali Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Devanagari Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Display Regular</td>
    <td>2.009</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Dives Akuru Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Dogra Regular</td>
    <td>1.007</td>
    <td>2022</td>
    <td>2019</td>
    <td>1.004</td>
  </tr>
  <tr>
    <td>Noto Serif Ethiopic Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Georgian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Grantha Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Gujarati Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Gurmukhi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Hebrew Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2021</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Hentaigana ExtraLight Regular</td>
    <td></td>
    <td></td>
    <td>2023</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Serif Kannada Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Khitan Small Script Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Khmer Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Khojki Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Lao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Makasar Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Malayalam Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Myanmar Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif NP Hmong Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td>2020</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Serif Old Uyghur Regular</td>
    <td>1.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Oriya Regular</td>
    <td>1.051</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Ottoman Siyaq Regular</td>
    <td>1.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Sinhala Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Tamil Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Tangut Regular</td>
    <td>2.169</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Telugu Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Test Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Thai Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2016</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Tibetan Regular</td>
    <td>2.103</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Toto Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Vithkuqi Regular</td>
    <td>1.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Yezidi Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td>2020</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Traditional Nushu Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
</tbody></table>

<h2 id="code"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#code">Code</a></h2>

<p>This Python code will get all the TTF fonts in a directory, and its sub-directories, and then print a Markdown table of name, version, and copyright date.</p>

<pre><code class="language-python">import os
import glob

filelist = glob.glob('**/*.ttf', recursive=True)

for file in sorted(filelist):
        filename = os.fsdecode(file)
        if filename.endswith(".ttf"):
                font = ttLib.TTFont(filename)
                ttf_name      = font["name"].getDebugName(1)
                ttf_style     = font["name"].getDebugName(2)
                ttf_version   = font["name"].getDebugName(5).split()[1].split(";")[0]
                ttf_copyright = font["name"].getDebugName(0).split()[1].split("-")[-1]
                print ( f"| {ttf_name} {ttf_style} | {ttf_version} | {ttf_copyright} |")
</code></pre>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:hebrew">
<p>Well, OK. For some reason the Pixel has an extremely outdated version of Hebrew and a slightly newer version of Color Emoji Flags.&nbsp;<a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fnref:hebrew" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:die">
<p>Which is where all bug reports submitted by the public go to die.&nbsp;<a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fnref:die" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=53054&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Disable JavaScript on Specific Sites using Firefox for Android and uBlock Origin]]></title>
		<link>https://shkspr.mobi/blog/2024/07/disable-javascript-on-specific-sites-using-firefox-for-android-and-ublock-origin/</link>
					<comments>https://shkspr.mobi/blog/2024/07/disable-javascript-on-specific-sites-using-firefox-for-android-and-ublock-origin/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 10 Jul 2024 11:34:11 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[AdBlocking]]></category>
		<category><![CDATA[adverts]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[uBlock]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51058</guid>

					<description><![CDATA[Sometimes, you want to stop scripts running only on specific domains. The best way to do that, I think, is with uBlock Origin - a free and fast ad-blocker.  On the desktop version, it&#039;s simple to block scripts. Click the plugin icon, then click the disable scripts button.    But on mobile it&#039;s a little more complicated. Here&#039;s how to do it on the Android version of Firefox.  Install Firefox. Then …]]></description>
										<content:encoded><![CDATA[<p>Sometimes, you want to stop scripts running only on specific domains. The best way to do that, I think, is with <a href="https://ublockorigin.com/">uBlock Origin</a> - a free and fast ad-blocker.</p>

<p>On the desktop version, it's simple to block scripts. Click the plugin icon, then click the disable scripts button.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/FF-desktop-fs8.png" alt="Desktop version of uBlock. There's a button to disable JS on a site." width="600" height="480" class="aligncenter size-full wp-image-51068">

<p>But on mobile it's a little more complicated. Here's how to do it on the Android version of Firefox.</p>

<p>Install <a href="https://play.google.com/store/apps/details?id=org.mozilla.firefox">Firefox</a>. Then open it and install the <a href="https://addons.mozilla.org/en-US/android/addon/ublock-origin/">uBlock Origin extension for Android</a>.</p>

<p>In Firefox, press the <code>⋮</code> button and press "Settings":</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/1-Settings-fs8.png" alt="The settings menu." width="1008" height="684" class="aligncenter size-full wp-image-51073">

<p>Press "Extensions":
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/2-Extensions-fs8.png" alt="The word &quot;Extensions&quot; is highlighted." width="1008" height="756" class="aligncenter size-full wp-image-51072"></p>

<p>In the list of Extensions is uBlock. Guess what? Press it!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/3-uBlock-fs8.png" alt="uBlock is highlighted." width="1008" height="505" class="aligncenter size-full wp-image-51071">

<p>Press "Settings"
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/4-uBlock-Settings-fs8.png" alt="The settings menu item is highlighted." width="1008" height="756" class="aligncenter size-full wp-image-51070"></p>

<p>Finally! You come to a page with lots of complex options. I recommend putting your device in landscape mode. Along the top, scroll to "My Rules":</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/5-My-Rules-fs8.png" alt="The my rules sub-page." width="1040" height="376" class="aligncenter size-full wp-image-51069">

<p>The "<a href="https://github.com/gorhill/uBlock/wiki/Dashboard:-My-rules">My Rules</a>" allows you great power over your uBlock.</p>

<p>To block all JavaScript on example.com, type in this line:</p>

<p><code>no-scripting: example.com true</code></p>

<p>Then hit the save button.</p>

<p>You have now disabled JS from running on that specific site. Enjoy!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=51058&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/07/disable-javascript-on-specific-sites-using-firefox-for-android-and-ublock-origin/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Software I Miss from Earlier Versions of Android]]></title>
		<link>https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/</link>
					<comments>https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 22 Apr 2024 11:34:21 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=50194</guid>

					<description><![CDATA[My love of Android waxes and wanes according to how much the software feels like it is fighting me.  On a good day, I can flash the OS and install whatever apps I want. On a bad day, I can&#039;t remove bloatware and I&#039;m forbidden from changing the internals.  I started using the latest Google version of Android on their Pixel 8 Pro. I say &#34;their&#34; because it never really felt like the device was mine. …]]></description>
										<content:encoded><![CDATA[<p>My love of Android waxes and wanes according to how much the software feels like it is fighting me.  On a good day, I can flash the OS and install whatever apps I want. On a bad day, I can't remove bloatware and I'm forbidden from changing the internals.</p>

<p>I started using the latest Google version of Android on their Pixel 8 Pro. I say "their" because it never really felt like the device was mine. Google kept popping up and asking me to do things which were clearly in their interest; not mine. There was very little way to remove Google's features. I was beholden to them.  Forget that noise! I flashed GrapheneOS and regained <em>some</em> control.</p>

<p>But there are still some things missing from the modern Android experience. Things which I'm sure <em>used</em> to exist on earlier versions, but have since been scrapped or severely restricted.</p>

<p>Here's what they stole from us.</p>

<h2 id="customised-fonts"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#customised-fonts">Customised Fonts</a></h2>

<p>I can't remember which version of Android I first had which let me change the font to Comic Sans. But that ability doesn't exist any more - not without rooting your phone and severely monkeying with its internals.</p>

<p>Google's Noto font is, sadly, abandonware. Aside from new Emoji, Google show no interest in putting a modern font stack into Android.  So we're left with a fairly dull and incomplete corporate font.</p>

<h2 id="button-swapping"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#button-swapping">Button Swapping</a></h2>

<p>Android originally had the back button on the right of the screen. Then, in Google's infinite wisdom, it was swapped to the left. Why? Fuck your muscle-memory, I guess?</p>

<p>Nevertheless, Android used to let you swap the order of the on-screen keys. This is not a particularly challenging software requirement - yet seems beyond modern Android.</p>

<h2 id="call-recording"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#call-recording">Call Recording</a></h2>

<p>Google is indecisive on whether call recording should be allowed. It is legal in most parts of the world, and used to be well supported by Android.</p>

<p>Nowadays you have to flash a ROM to get this basic functionality back.</p>

<h2 id="sip-built-in"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#sip-built-in">SIP Built-in.</a></h2>

<p>You used to be able to add <a href="https://shkspr.mobi/blog/2020/07/adding-sip-calls-to-android-for-free/">VoIP / SIP calls to Android for free!</a>  But the latest version doesn't let you do that any more.</p>

<h1 id="custom-ringtones-and-vibration-patterns"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#custom-ringtones-and-vibration-patterns">Custom Ringtones and Vibration Patterns</a></h1>

<p>I'm sure that I used to be able to set a different vibration pattern for different sorts of alerts. But I can't find that functionality anywhere these days. Same for different alert tones for different people.</p>

<h1 id="task-switcher-clear-all-button"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#task-switcher-clear-all-button">Task switcher clear-all button</a></h1>

<p>If I want to close all my open apps, I have to go to task switcher then scroll <em>all</em> the way across. It was handy when there was a "close all" button at the bottom of the screen.</p>

<h1 id="data-sim-switcher"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#data-sim-switcher">Data SIM switcher</a></h1>

<p>I have multiple SIMs. They can both receive calls and texts, but only one can be used for data. There used to be a button I could press to flip between the two. Now I have to go into the settings, and fiddle with a bunch of options. Annoying!</p>

<h2 id="and-the-rest"><a href="https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/#and-the-rest">And the rest</a></h2>

<p>What software do you miss the most from old versions of Android?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=50194&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/04/software-i-miss-from-earlier-versions-of-android/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Hardware I miss from my old Android phones]]></title>
		<link>https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/</link>
					<comments>https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 15 Apr 2024 11:34:05 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[phone]]></category>
		<category><![CDATA[technology]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=50148</guid>

					<description><![CDATA[I&#039;ve been using Android since before it was released in the UK. When I was working at Vodafone, I got a pre-release HTC device with an early version of Android on it. I&#039;ve been pretty much in the Android ecosystem ever since.  Recently, I treated myself to an upgrade - a Pixel 8 Pro. The biggest, fastest, fattest, AI-stuffed Android phone yet. It&#039;s pretty good! The camera is excellent, the…]]></description>
										<content:encoded><![CDATA[<p>I've been using Android since <em>before</em> it was released in the UK. When I was working at Vodafone, <a href="https://twitter.com/edent/status/1595459781">I got a pre-release HTC device</a> with an early version of Android on it. I've been pretty much in the Android ecosystem ever since.</p>

<p>Recently, I treated myself to an upgrade - a Pixel 8 Pro. The biggest, fastest, fattest, AI-stuffed Android phone yet. It's pretty good! The camera is excellent, the heat-sensor is crap<sup id="fnref:🌡"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#fn:🌡" class="footnote-ref" title="This is not an exaggeration. It is the most pointless piece of hardware I've ever seen on a device. And I once had an experimental Nokia with a receiver for DVB-H." role="doc-noteref">0</a></sup>, the battery is gorgeous, the weight is annoying.  Google's software was too needy, so <a href="https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/">I replaced it with GrapheneOS</a>.</p>

<p>But, as much as I like the device, there are some hardware things which I think would improve it.  No, I'm not talking about a headphone jack! I'm talking about <em>useful</em> things<sup id="fnref:🎧"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#fn:🎧" class="footnote-ref" title="Fight me!" role="doc-noteref">1</a></sup>.</p>

<h2 id="more-precise-input"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#more-precise-input">More precise input</a></h2>

<p>The early Androids - and most BlackBerrys - had either a rollerball or touch pad just below the screen.</p>

<p><a href="https://twitter.com/edent/status/693736427314659328/photo/1"><img src="https://shkspr.mobi/blog/wp-content/uploads/2024/04/rollerball.webp" alt="Photo of an Android device with a rollerball just above the USB port." width="1024" height="768" class="aligncenter size-full wp-image-50179"></a></p>

<p>It made it <em>so</em> much easier to do precise selection. Yeah yeah, I know you can slide along the spacebar to move a cursor, but it just <em>isn't</em> the same.</p>

<p>I get that a rollerball gunks up pretty quickly - but a touchpad or <a href="https://www.mobiletechreview.com/phones/HTC-Aria.htm">optical joystick</a> would be lovely. Perhaps it could go on the...</p>

<h2 id="rear-finger-print-sensor"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#rear-finger-print-sensor">Rear finger-print sensor</a></h2>

<p>The technology behind the in-screen fingerprint sensor is magical. It works brilliantly. But I rather liked my One Plus 5T's <em>rear</em> sensor. It didn't blast my face with light, and I found it more natural to use when picking up the phone.</p>

<p>But, even better, the rear sensor acted as an <em>input!</em> When I stroked down on it, the notification shade appeared. Stroking up dismissed it.  I'd love to have a rear-input like that again.  I'd like <em>more</em> inputs in general!</p>

<h2 id="physical-buttons"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#physical-buttons">Physical Buttons</a></h2>

<p>In the future, <a href="https://eandt.theiet.org/2024/03/05/new-road-safety-rules-will-see-car-makers-ditch-touchscreen-icons-physical-buttons">cars will be ditching touchscreens in favour of physical buttons</a>. Perhaps Android will do the same?</p>

<p>This is the HTC Dream - the <em>original</em> Android. And it is <em>perfection</em>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/04/HTC-Dream-G1.jpg" alt="The HTC Dream G1 - it has a pop up screen which reveals a keyboard, a trackball, and several physical buttons. " width="540" height="590" class="aligncenter size-full wp-image-50180">

<p>Wouldn't it be nice to have physical buttons for home and back, rather than trying to remember what swipe actions to take?  OK, perhaps a modern phone doesn't need this many buttons - but there are still some things where switches are useful. For example...</p>

<h2 id="silence-slider"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#silence-slider">Silence Slider</a></h2>

<p>Both the iPhone and several Android devices have a dedicated "silence" switch.</p>

<p><a href="https://beebom.com/oneplus-5t-star-wars-edition-launched/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2024/04/oneplus-5t-alert-slider.webp" alt="White Android phone with red slider switch." width="640" height="448" class="aligncenter size-full wp-image-50181"></a></p>

<p>It was <em>so</em> handy. There's a comfort about being able to reach into your pocket while sat and the theatre and <em>know</em> that your phone is on silent. No unlocking and fiddling with on-screen menus. One flick and you're good.</p>

<p>But, with most modern Android, you have to peer at the screen to know what's going on. I kinda miss...</p>

<h2 id="status-led-for-power-and-messages"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#status-led-for-power-and-messages">Status LED for power and messages</a></h2>

<p>Back in the day, <em>every</em> Android phone had a multi-colour LED. It would show red when your battery needed charging. It would pulse when being charged. It would flash green if you had an SMS. With a glance you knew what your phone was doing.</p>

<p>AMOLED hasn't really lived up to its promise. There's no single-pixel flashing away on screen to let me know if I have a message. Instead, I have to pick up my phone to get the entire screen to activate. What a waste of battery life!</p>

<h2 id="nfc-on-the-top"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#nfc-on-the-top">NFC on the top.</a></h2>

<p>My new phone has NFC right in the middle of the back of the phone. That's a bit awkward for placing on a tap-to-pay terminal on the bus.  My previous phone had the NFC right at the top.</p>

<p>It is doubly annoying for me as <a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/">I wear an NFC ring</a>. And the damn thing keeps triggering my phone!</p>

<p>I realise this is an <em>extremely</em> niche problem!</p>

<h2 id="keyboard"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#keyboard">Keyboard</a></h2>

<p>The last Android phone I had with a keyboard <a href="https://shkspr.mobi/blog/2011/12/review-motorola-pro-plus/">was a complete disaster</a>. Maybe I'm kidding myself that a full tactile QWERTY experience is necessary?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2011/12/Motorola-Pro-Plus-Unboxing.jpg" alt="Phone with a keyboard at the bottom." width="600" height="514" class="aligncenter size-full wp-image-27663">

<p>But look how pretty!</p>

<h2 id="infrared-camera"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#infrared-camera">Infrared Camera</a></h2>

<p>Remember how I said the thermal sensor was shite? I've reviewed a couple of <a href="https://shkspr.mobi/blog/2023/06/review-infiray-thermal-usb-c-camera-for-android/">Thermal cameras for Android</a>.</p>

<p>They're expensive - but certainly useful. Both for finding hotspots in your home <em>and</em> for seeing who is sweaty.  OK, it isn't the <em>most</em> compelling bit of hardware. But if you're going to put a sensor on a phone, at least make it useful!</p>

<h2 id="3d-screens-and-haptic-screens"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#3d-screens-and-haptic-screens">3D Screens and Haptic Screens</a></h2>

<p>Years ago, I tried <a href="https://twitter.com/edent/status/37432553434521600">an LG phone with a 3D screen</a>. No glasses! It used the same sort of technology as the Nintendo 3DS.</p>

<p>OK, it wasn't the highest resolution and you had to sit at a precise angle. But it was interesting tech!</p>

<p>Similarly, I once played with <a href="https://shkspr.mobi/blog/2012/05/senseg-feelable-touchscreen-video/">the Senseg haptic screen</a>.  It used weird electrostatic tech to make the texture of the screen change. It is almost impossible to describe and, if I didn't have this video, I might believe I dreamed it.</p>

<iframe title="Senseg's touchable screen tech demo" width="620" height="349" src="https://www.youtube.com/embed/pxKjIGbe1qQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>There are <a href="https://www.techradar.com/reviews/blackview-max-1-projector-smartphone">phones with built in laser projectors</a> which, while fun, aren't that compelling to me.</p>

<h2 id="what-else-is-missing"><a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#what-else-is-missing">What else is missing?</a></h2>

<p>What do you remember from the early Androids that you think is missing now?  Which crazy innovations need to make a comeback? Which Shenzhen-special already has all these features?</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:🌡">
<p>This is not an exaggeration. It is the most pointless piece of hardware I've ever seen on a device. And I once had an experimental Nokia with a receiver for <a href="http://www.dvb-h.org/">DVB-H</a>.&nbsp;<a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#fnref:🌡" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:🎧">
<p>Fight me!&nbsp;<a href="https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/#fnref:🎧" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=50148&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/04/hardware-i-miss-from-my-old-android-phones/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Inconsistency is a feature, not a bug]]></title>
		<link>https://shkspr.mobi/blog/2024/04/inconsistency-is-a-feature-not-a-bug/</link>
					<comments>https://shkspr.mobi/blog/2024/04/inconsistency-is-a-feature-not-a-bug/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 05 Apr 2024 11:34:18 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[ux]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=50083</guid>

					<description><![CDATA[Some of my best friends are designers. But I think we can all agree that - however well-meaning - they can be a little obsessive.  Whether it is fretting over tiny details, or trying to align to a grid which doesn&#039;t exist, or spending time removing useful affordances in the name of æsthetics - they always find a way to make something prettier at the expense of usability.  Google used to have some …]]></description>
										<content:encoded><![CDATA[<p>Some of my best friends are designers. But I think we can all agree that - however well-meaning - they can be a <em>little</em> obsessive.  Whether it is <a href="https://shkspr.mobi/blog/2013/01/are-designers-crazy/">fretting over tiny details</a>, or trying to <a href="https://shkspr.mobi/blog/2018/11/the-myth-of-the-pixel-perfect-grid/">align to a grid which doesn't exist</a>, or spending time <a href="https://shkspr.mobi/blog/2021/06/whatever-happened-to-ui-affordances/">removing useful affordances in the name of æsthetics</a> - they always find a way to make something prettier at the expense of usability.</p>

<p>Google used to have some beautiful logos for its apps. Each had a distinct shape, style, and colour.  Then, someone decided that they all needed a consistent visual language.  And <a href="https://techcrunch.com/2020/10/06/googles-new-logos-are-bad/?guccounter=1">this mess was born</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/Google-Workspace-Icons-bad.webp" alt="Row of Google's old icons followed by their new variants. " width="1024" height="435" class="aligncenter size-full wp-image-50097">

<p><em>*sigh*</em> I get it. I really do. Brand is a thing. Users often use visual heuristics to identify similar groups. Having each team go wild on an icon design doesn't always reflect the professionalism and consistency that you want to project.  The logos aren't <em>awful</em> - but I find them a little boring. Not the worst sin in the world. Though that's only half the problem.</p>

<p>In Google's Android, they've decided that - for consistency - all icons must be firmly encased in a white circle. It makes everything look clean, consistent, friendly, and...</p>

<p><a href="https://www.reddit.com/r/mildlyinfuriating/comments/jksggh/i_cant_identify_the_google_apps_at_a_single/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/What-Google-Sees-fs8.png" alt="Google's icons in white circles. Underneath is a row of indistinguishable multi-coloured squares." width="1024" height="687" class="aligncenter size-full wp-image-50098"></a></p>

<p>...oh.</p>

<p>I apologise for getting old. My visual acuity isn't what it once was. When I'm staring at my phone, with its screen caked in fingerprint grease, on a juddering bus, after a long day at work, all I want is a <em>quick</em> way to identify the app I want to use.</p>

<p>Like most people, my brain has evolved to take mental shortcuts. It looks for a distinct shape and colour to identify things. I simply can't do that with modern Android's adaptive icons. They all look like white circles with a splodge of colour in the middle.</p>

<p>A few years ago, I wrote about <a href="https://shkspr.mobi/blog/2018/11/annoyed-by-androids-circular-icons-heres-how-to-fix-them/">fixing Android's circular icons</a>. Sadly, I don't have the skill to produce my own icon pack. But using the open source <a href="https://codeberg.org/kaanelloed/Iconeration/">Iconeration</a> I was able to manually set my icons to be <em>beautifully</em> inconsistent.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/icons.webp" alt="Homescreen filled with multicoloured icons of various shapes." width="504" height="807" class="aligncenter size-full wp-image-50099">

<p>With a glance, I can immediately see which is which. Do I care that they're not all aligned perfectly? Nope!</p>

<p>I've got a high-resolution screen, I want high-resolution artwork. Look at that Firefox icon! It is <em>gorgeous!</em>  It isn't a pale, flat, blob - it has texture and uniqueness.</p>

<p>Phones used to be wild and unique - now they're all boring black rectangles. User Interfaces used to reflect the aspirations of their designers - now they're just a bland corporate mediocrity.</p>

<p>I hope, one day soon, the fashion pendulum will swing back and interfaces can become interesting again.  Until that day, I'll use <a href="https://codeberg.org/kaanelloed/Iconeration/">Iconeration</a> to make my phone easier and more delightful <em>for me.</em></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=50083&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/04/inconsistency-is-a-feature-not-a-bug/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Solved! "Access Point Name settings are not available for this user"]]></title>
		<link>https://shkspr.mobi/blog/2024/03/solved-access-point-name-settings-are-not-available-for-this-user/</link>
					<comments>https://shkspr.mobi/blog/2024/03/solved-access-point-name-settings-are-not-available-for-this-user/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 22 Mar 2024 12:34:31 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[gsm]]></category>
		<category><![CDATA[mobile]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49943</guid>

					<description><![CDATA[Android&#039;s user-hostile interface never fails to disappoint!  I was struggling to get a new eSIM working. I could make and receive calls / texts, but data just wasn&#039;t connecting. I tried rebooting, flipping to aeroplane mode, changing bearer, manually selecting the network. Nothing!  Then, I remembered my ancient GSM knowledge. All mobile networks need an APN - Access Point Name - in order to…]]></description>
										<content:encoded><![CDATA[<p>Android's user-hostile interface never fails to disappoint!  I was struggling to get a new eSIM working. I could make and receive calls / texts, but data just wasn't connecting. I tried rebooting, flipping to aeroplane mode, changing bearer, manually selecting the network. Nothing!</p>

<p>Then, I remembered my ancient GSM knowledge. All mobile networks need an APN - Access Point Name - in order to connect to data services.  Tucked at the bottom of the SIM settings screen is the "Access point names" option.  I tapped on it, and got this unfriendly error message:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/APN-fs8.png" alt="Access Point Name settings are not available for this user." width="1008" height="824" class="aligncenter size-full wp-image-49945">

<p>THIS IS A LIE!  What it <em>really</em> means is that the phone doesn't have an APN listed for this specific SIM.</p>

<p>If you click on the + button in the top corner, you'll get to a screen where you can add your APN details manually. You'll need to get these from your mobile operator.  But that's not quite all! In order to save the APN, you need to tap the ⋮ button and select "Save":</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/my-APN-fs8.png" alt="Edit access points, with a save option at the top." width="1008" height="730" class="aligncenter size-full wp-image-49944">

<p>But that's not all! Once you return to the APN settings page, you will need to tap the APN to activate it.</p>

<p>Once I did that, my eSIM happily connected to data services.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49943&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/03/solved-access-point-name-settings-are-not-available-for-this-user/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Notes on installing GrapheneOS on a Pixel 8 Pro - some bugs & oddities]]></title>
		<link>https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/</link>
					<comments>https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 13 Mar 2024 12:34:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[GrapheneOS]]></category>
		<category><![CDATA[LineageOS]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49860</guid>

					<description><![CDATA[These are notes to myself - and anyone else who finds them useful.  Before starting, I booted the Google OS to install the latest firmware and an eSIM. After a few days of enduring Google&#039;s naggy software, I was ready to commit to installing something better.  I tried using the Web Installer. It managed to flash some of the partitions and then failed with:  Failed to execute &#039;claimInterface&#039; on…]]></description>
										<content:encoded><![CDATA[<p>These are notes to myself - and anyone else who finds them useful.</p>

<p>Before starting, I booted the Google OS to install the latest firmware and an eSIM. After a few days of enduring Google's naggy software, I was ready to commit to installing something better.</p>

<p>I tried using <a href="https://grapheneos.org/install/web">the Web Installer</a>. It managed to flash <em>some</em> of the partitions and then failed with:</p>

<p><code>Failed to execute 'claimInterface' on 'USBDevice'</code></p>

<p>So I used the <a href="https://grapheneos.org/install/cli">CLI instructions</a> which were comprehensive. Worth re-reading them a few times to make sure you understand what needs doing. I (foolishly) assumed my fastboot didn't need updating. Tsk!</p>

<p>And then... it just worked!</p>

<p>Well, almost. The device saw the previously installed eSIM, but wouldn't connect to its network. I manually removed it, reloaded it. Still nothing.  So I manually chose the network and that seemed to fix it. No idea if that's a problem with the network, the eSIM, or something else.</p>

<h2 id="bugs"><a href="https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/#bugs">Bugs</a></h2>

<p>As soon as I booted, my network provider sent me a text. I opened up the default messaging app and saw this error:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/messaging-fs8.png" alt="This app was built for an older version of Android. It might not work properly and doesn't include the latest security and privacy protections. Check for an update or contact the app's developer." width="1008" height="588" class="aligncenter size-full wp-image-49880"></p>

<p>This is <a href="https://discuss.grapheneos.org/d/8249-why-does-the-default-sms-app-warn-it-was-built-for-an-older-version-of-android/4">a known problem</a> but it makes for a crappy user-experience. There's no way to update the app in Graphene - you need to manually install your preferred SMS app.</p>

<p>In similar UX fails, I tried to add the clock widget to my home screen. This is what I saw.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/Clock-fs8.png" alt="Hard to see graphics." width="1008" height="1851" class="aligncenter size-full wp-image-49881"></p>

<p>If you peer carefully, you'll see an analogue <em>and</em> digital clock. I hadn't switched to dark mode or anything like that - this is the default experience.</p>

<p>I wanted to see how long I could go before installing Google Play Services. The answer was... five minutes. I tried to log in to my password manager using a WebAuthN token and it wouldn't work. The default Vanadium browser can't handle them.  Again, this is a known problem - but it does slightly undermine the attraction of Graphene. I'm privacy conscious and want as little Google in my life as possible. I'm security conscious and want to use MFA everywhere. Pick one.</p>

<p>Partway through the day, I got this internal error:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/Unable-fs8.png" alt="Pop up saying it was unable to fetch a list of apps." width="1008" height="840" class="aligncenter size-full wp-image-49882">

<p>I was happily browsing the web with no connectivity issues. So I'm not sure what caused that.</p>

<p>It's annoying that Graphene doesn't support LineageOS's bottom-button changes. I have a decade of muscle-memory saying back is on the right. There's no way to change it, so I've swapped to gesture navigation.</p>

<p>The icon size on the stock launcher are far too small. On a massive screen like the 8 Pro they are tiny. So I've installed <a href="https://github.com/NeoApplications/Neo-Launcher">NeoLauncher</a> which is a lot more customisable.</p>

<p>The only other (non-essential) thing missing is the ability to use Cast to screen share a device. There's a button in the UI, but it does nothing.</p>

<p>Setting up a work-profile required a little bit of a work-around, but seems to have worked. Hurrah for forum threads detailing the various tricks you need.</p>

<p>A software update <a href="https://grapheneos.org/releases#2024031100">allowed DisplayPort via USB-C</a>.  I plugged the 8 Pro into my USB-C hub, it detected the ethernet, keyboard, mouse, and display - graphics came through fine. Although there's <a href="https://mastodon.social/@Edent/112084893031982717">no way to rotate an external screen</a> - so you're stuck with landscape orientation.  My HDMI adapters showed as detected via a little icon - but no video came out.</p>

<p>The Graphene camera's interface isn't as good as GCam and it is missing a bunch of options. Installing the stock Pixel camera worked - and there are lots of hacky derivatives.</p>

<p>Other than that, it has been pretty good so far. My banking apps work, call recording works, 5G and Bluetooth works, eSIM and regular SIM works. There have been a few odd things where apps have complained that they can't work and then suddenly sprang to life - but that might just be Android.</p>

<p>The only big thing Graphene is missing is Google Pay / Wallet. It is <em>so</em> convenient using tap to pay - but getting rid of the rest of the incessant Google bloat is worth the sacrifice.</p>

<p>Overall, I'm happy with the decision to nuke the original Google software. I know they say they'll support the device for 7 years - but I literally have no reason to trust them. Maybe I'm being naïve trusting a group of random hackers to produce a more secure OS - but I'd rather that than further entanglement with an organisation which has repeatedly shown contempt for its customers and users.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49860&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[TfL are blocking rooted devices from accessing maps - how to fix]]></title>
		<link>https://shkspr.mobi/blog/2023/12/tfl-are-blocking-rooted-devices-from-accessing-maps-how-to-fix/</link>
					<comments>https://shkspr.mobi/blog/2023/12/tfl-are-blocking-rooted-devices-from-accessing-maps-how-to-fix/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 07 Dec 2023 12:34:06 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=48587</guid>

					<description><![CDATA[TfL Go is a handy app. It gives you real-time access to the timetables and delays of London&#039;s tube and bus network. That&#039;s all you can do with it. You can&#039;t buy tickets, store a photocard, or anything like that.  Which was why I was annoyed when this popped up in-app one day:    I emailed them asking why they were doing this. The reply I got back was underwhelming:  Thank you for contacting us…]]></description>
										<content:encoded><![CDATA[<p><a href="https://tfl.gov.uk/maps_/tfl-go">TfL Go</a> is a handy app. It gives you real-time access to the timetables and delays of London's tube and bus network. That's all you can do with it. You can't buy tickets, store a photocard, or anything like that.</p>

<p>Which was why I was annoyed when this popped up in-app one day:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/12/error-fs8.png" alt="Error. TfL Go is only supported on unmodified version of Android." width="1080" height="648" class="aligncenter size-full wp-image-48751">

<p>I emailed them asking why they were doing this. The reply I got back was underwhelming:</p>

<blockquote><p>Thank you for contacting us about your access to the TfL Go App.
The app is only compatible with normal iOS and Android software. 
Any jailbreaks or modifications to software will prevent you from using the app.</p></blockquote>

<p>If this was a hyper-secure banking app then <a href="https://shkspr.mobi/blog/2023/05/the-limits-of-general-purpose-computation/">I would accept that limitation of General Purpose Computation</a>. But it's literally just a mapping app.</p>

<h2 id="how-to-fix"><a href="https://shkspr.mobi/blog/2023/12/tfl-are-blocking-rooted-devices-from-accessing-maps-how-to-fix/#how-to-fix">How To Fix</a></h2>

<p>Version 1.43 seems to be the latest version which works without ROM detection.</p>

<p><strong>Warning!</strong> Installing apps from 3rd party app stores can expose you to malware. Think carefully before you do this.  If you want to make sure the APK you've downloaded in genuine, do the following:</p>

<ul>
<li>Download <a href="https://apkpure.com/tfl-go-live-tube-bus-rail/uk.gov.tfl.gotfl/download/1.43.0">version 1.43 of APK</a> and save it somewhere.</li>
<li>Install the APK on your device.</li>
<li><em>Immediately</em> go to the Play store and update it to the latest version.</li>
<li>If it can't be updated:

<ul>
<li>The cryptographic signatures won't match. This usually means the APK has been compromised.</li>
<li>You should uninstall the untrustworthy app and, if paranoid, factory reset your phone.</li>
</ul></li>
<li>If it can be updated:

<ul>
<li>the APK is genuine. Uninstall the update and reinstall the APK.</li>
</ul></li>
<li>In the Play Store, untick "Enable auto-update". You won't get an incompatible version installed. <br><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/12/enable-auto-fs8.png" alt="Screenshot of the Google Play store. The &quot;Enable Auto-Update&quot; option is unticked." width="1080" height="793" class="aligncenter size-full wp-image-48750"></li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=48587&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/12/tfl-are-blocking-rooted-devices-from-accessing-maps-how-to-fix/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Should Android's Dark Mode Invert Contact Photos?]]></title>
		<link>https://shkspr.mobi/blog/2023/10/should-androids-dark-mode-invert-contact-photos/</link>
					<comments>https://shkspr.mobi/blog/2023/10/should-androids-dark-mode-invert-contact-photos/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 12 Oct 2023 11:34:39 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[AOSP]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[DarkMode]]></category>
		<category><![CDATA[LineageOS]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=47423</guid>

					<description><![CDATA[I don&#039;t know if this is a bug, or just the way the world works now.  Several of the people who live in my phone use artistic black and white headshots. They look very cool. But my Android phone shows their image with inverted colours - so they look like pure shite.  Here&#039;s what my very real human girlfriend looks like when I ring her to go for brunch:   Come the evening, my phone switches to Dark …]]></description>
										<content:encoded><![CDATA[<p>I don't know if this is a bug, or just the way the world works now.</p>

<p>Several of the people who live in my phone use artistic black and white headshots. They look very cool. But my Android phone shows their image with inverted colours - so they look like pure shite.</p>

<p>Here's what my very real human girlfriend looks like when I ring her to go for brunch:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/Normal-MM-fs8.png" alt="Screenshot of the Android contacts app. A black and white photo of Marylin Monroe is featured." width="540" height="674" class="aligncenter size-full wp-image-47428"></p>

<p>Come the evening, my phone switches to Dark Mode™ - so this is what she looks like when I ring her for a late-night booty call:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/Inverted-MM-fs8.png" alt="Monochrome photo of Marylin Monroe. The colours have been inverted and it looks rubbish." width="540" height="674" class="aligncenter size-full wp-image-47427"></p>

<p>What's causing this? And is it expected behaviour?</p>

<p>I'm running <code>com.android.contacts</code> version 1.7.34 which <a href="https://android.googlesource.com/platform/packages/apps/Contacts/+/refs/heads/master/AndroidManifest.xml">appears to be the latest version</a> of the AOSP contacts app. It's bundled with LineageOS.</p>

<h2 id="demo"><a href="https://shkspr.mobi/blog/2023/10/should-androids-dark-mode-invert-contact-photos/#demo">Demo</a></h2>

<p>If you're not lucky enough to be dating Marylin Monroe, here's a demo image for you to try:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/monochrometest.jpg" alt="A white square with the words &quot;monochrome test&quot; printed in black text." width="274" height="274" class="aligncenter size-full wp-image-47425">

<h2 id="is-this-expected-behaviour"><a href="https://shkspr.mobi/blog/2023/10/should-androids-dark-mode-invert-contact-photos/#is-this-expected-behaviour">Is this expected behaviour?</a></h2>

<p>Based on some quick tests, it appears that the contacts app will invert some monochrome images when it thinks there's "too much" bright white in the image.</p>

<p>Interestingly, the contacts list doesn't invert avatars when in Dark Mode.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/Contacts-list-view-fs8.png" alt="Screenshot of Android's contacts list. A black background - but the photo of Marylin is normal." width="606" height="336" class="aligncenter size-full wp-image-47429">

<p>And... I don't know if I want this to happen.  I guess that most people who use Dark Mode want to avoid blinding bright white light searing into their precious eyeballs. But, presumably, they don't want the photos of their friends inverted into a weird artefact-ridden mess?</p>

<p>So, before I get lost in Google's Kafka-esque bug reporting process - do <em>you</em> think this is expected or desirable behaviour?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=47423&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/should-androids-dark-mode-invert-contact-photos/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How to Find the Meaning of Lineage Android's Status Bar Icons]]></title>
		<link>https://shkspr.mobi/blog/2023/10/how-to-find-the-meaning-of-lineage-androids-status-bar-icons/</link>
					<comments>https://shkspr.mobi/blog/2023/10/how-to-find-the-meaning-of-lineage-androids-status-bar-icons/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 07 Oct 2023 11:34:21 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[LineageOS]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=47361</guid>

					<description><![CDATA[It&#039;s always a bit concerning when a new icon suddenly appears at the top of your phone&#039;s screen.  Without any warning, my ageing OnePlus 5T - which now runs LineageOS - started showing this:    I know that, from right to left, it is showing me my battery percentage, WiFi strength, and that I&#039;m using work mode. But what&#039;s the weird circle?  ZOOM! ENHANCE!    Well, that&#039;s not much help, is it! …]]></description>
										<content:encoded><![CDATA[<p>It's always a bit concerning when a new icon suddenly appears at the top of your phone's screen.  Without any warning, my ageing OnePlus 5T - <a href="https://shkspr.mobi/blog/2023/02/what-doesnt-work-in-lineageos-20/">which now runs LineageOS</a> - started showing this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/09/Small-Icons-fs8.png" alt="Three Android icons. A circle, a square, and a triangle." width="154" height="24" class="aligncenter size-full wp-image-47364">

<p>I know that, from right to left, it is showing me my battery percentage, WiFi strength, and that I'm using work mode. But what's the weird circle?</p>

<p>ZOOM! ENHANCE!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/09/Large-Icons-fs8.png" alt="Zoomed in icons, they're still a bit indistinct." width="616" height="96" class="aligncenter size-full wp-image-47363">

<p>Well, that's not much help, is it!</p>

<p>Buried in the <a href="https://source.android.com/docs/automotive/hmi/status_bar">Android <em>Automotive</em> documentation</a> is some information on how to "Customize Status Bar System Icons". It helpfully says:</p>

<blockquote><p>Most resources for items displayed in the Status bar are provided in the following directory:
<code>/platform/frameworks/base/packages/SystemUI/res/drawable</code></p></blockquote>

<p>OK! That gives us something to work on.</p>

<p>Let's pop along to <a href="https://github.com/LineageOS/android_frameworks_base/tree/lineage-20.0/packages/SystemUI/res/drawable">Lineage's GitHub repo to look in that directory</a>.  There are 650 icons in there (!) so I <a href="https://download-directory.github.io/">downloaded them all</a> (!!).</p>

<p>Of course, Google can't do anything standardised like use SVG. It uses its own magical Android Vector Drawable format. You can <a href="https://vd.floo.app/">individually convert the files to SVG online</a> or in bulk <a href="https://github.com/seanghay/vector-drawable-svg">on the command line</a>.</p>

<p>After a bit of flicking through, I found this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/09/ic_statusbar_firewall-fs8.png" alt="A large icon that sort of looks a bit like a globe with a line through it." width="240" height="240" class="aligncenter size-full wp-image-47362">

<p>Which is from <code>ic_statusbar_firewall.xml</code></p>

<p>This is a fairly new icon, <a href="https://review.lineageos.org/c/LineageOS/android_frameworks_base/+/350286">introduced in March 2023</a>. It appears in the status bar when an app tries to access the network but "allow network access" is turned off.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=47361&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/how-to-find-the-meaning-of-lineage-androids-status-bar-icons/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Wanted! A USB-C OTG single button keyboard]]></title>
		<link>https://shkspr.mobi/blog/2023/10/wanted-a-usb-c-otg-single-button-keyboard/</link>
					<comments>https://shkspr.mobi/blog/2023/10/wanted-a-usb-c-otg-single-button-keyboard/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 05 Oct 2023 11:34:58 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[OTG]]></category>
		<category><![CDATA[usb-c]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=47348</guid>

					<description><![CDATA[I&#039;m writing this post in the hope someone will rip off my idea and start selling it on Ali Express.  Many years ago, I got a &#34;Pressy&#34;. It was a little dongle which fitted into your phone&#039;s headphone jack. It had a single button on the top. It came with an app so when you tapped the button the app would do something. For example, tap once to open email, double-tap to switch to flight mode, etc.    …]]></description>
										<content:encoded><![CDATA[<p>I'm writing this post in the hope someone will rip off my idea and start selling it on Ali Express.</p>

<p>Many years ago, I got a "<a href="https://androidcommunity.com/pressy-turns-any-headphone-jack-into-a-button-full-of-shortcuts-20130829/">Pressy</a>". It was a little dongle which fitted into your phone's headphone jack. It had a single button on the top. It came with an app so when you tapped the button the app would do <em>something</em>. For example, tap once to open email, double-tap to switch to flight mode, etc.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/09/pressy.jpg" alt="Little gadget the same shape as a headphone connector. There is a flat black button on the end." width="512" height="341" class="aligncenter size-full wp-image-47350">

<p>Most modern phones eschew headphone ports. They let water in, are fragile, and a cheap DAC produces worse sound quality than Bluetooth<sup id="fnref:fight"><a href="https://shkspr.mobi/blog/2023/10/wanted-a-usb-c-otg-single-button-keyboard/#fn:fight" class="footnote-ref" title="Fight me." role="doc-noteref">0</a></sup>.</p>

<p>So would it be possible to have a USB-C component which does something similar?</p>

<p>Technically, yes!</p>

<ul>
<li>There are <a href="https://amzn.to/3RDLlMC">USB-C keyboard which plug directly into phones</a>.</li>
<li>For a couple of quid, you can get <a href="https://s.click.aliexpress.com/e/_Dl12GCf">mini keyboards with a custom amount of keys</a></li>
<li>I can find a <a href="https://www.ebay.co.uk/itm/314277203979">single button PTT USB-C device</a> albeit with a ridiculously long cable.</li>
<li>The <a href="https://www.yubico.com/gb/product/yubikey-5c-nano/">Yubikey 5C nano</a> has the right form factor and comes with a (pre-programmed) single button.</li>
</ul>

<p>I don't have the skills to solder one of these devices myself. So, who makes one?</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:fight">
<p>Fight me.&nbsp;<a href="https://shkspr.mobi/blog/2023/10/wanted-a-usb-c-otg-single-button-keyboard/#fnref:fight" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=47348&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/wanted-a-usb-c-otg-single-button-keyboard/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
