<?xml version="1.0" encoding="UTF-8"?><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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>antonis.log()</title>
	<atom:link href="https://antonis.me/feed/" rel="self" type="application/rss+xml" />
	<link>https://antonis.me</link>
	<description>StdOut of a mobile software developer</description>
	<lastBuildDate>Wed, 05 May 2021 20:41:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='antonis.me' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://secure.gravatar.com/blavatar/39557b5dc201be6d250537d3e85bbf5a5d156d4d16decd9f703c4b16047ae12d?s=96&#038;d=https%3A%2F%2Fs0.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>antonis.log()</title>
		<link>https://antonis.me</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://antonis.me/osd.xml" title="antonis.log()" />
	<atom:link rel='hub' href='https://antonis.me/?pushpress=hub'/>
	<item>
		<title></title>
		<link>https://antonis.me/2021/05/05/untitled/</link>
					<comments>https://antonis.me/2021/05/05/untitled/#respond</comments>
		
		<dc:creator><![CDATA[Antonis Lilis]]></dc:creator>
		<pubDate>Wed, 05 May 2021 20:41:21 +0000</pubDate>
				<category><![CDATA[Ελληνικά]]></category>
		<guid isPermaLink="false">http://antonis.me/2021/05/05/untitled/</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="wp-block-jetpack-story wp-story aligncenter" data-id="wp-story-100055-1" data-settings="{&#34;slides&#34;:[{&#34;alt&#34;:&#34;&#34;,&#34;caption&#34;:&#34;&#34;,&#34;id&#34;:&#34;100053&#34;,&#34;link&#34;:&#34;https:\/\/antonis.files.wordpress.com\/2021\/05\/wp_story1620247280930_08294927216594630314.jpg&#34;,&#34;mime&#34;:&#34;image\/jpeg&#34;,&#34;type&#34;:&#34;image&#34;,&#34;url&#34;:&#34;https:\/\/antonis.files.wordpress.com\/2021\/05\/wp_story1620247280930_08294927216594630314.jpg&#34;},{&#34;alt&#34;:&#34;Drinks after\n~ 6 months&#34;,&#34;caption&#34;:&#34;&#34;,&#34;id&#34;:&#34;100054&#34;,&#34;link&#34;:&#34;https:\/\/antonis.files.wordpress.com\/2021\/05\/wp_story1620247281002_11392705286183639656.jpg&#34;,&#34;mime&#34;:&#34;image\/jpeg&#34;,&#34;type&#34;:&#34;image&#34;,&#34;url&#34;:&#34;https:\/\/antonis.files.wordpress.com\/2021\/05\/wp_story1620247281002_11392705286183639656.jpg&#34;}]}">
			<div class="wp-story-app">
				<div class="wp-story-display-contents" style="display: contents;">
					<a class="wp-story-container" href="https://antonis.me/2021/05/05/untitled/?wp-story-load-in-fullscreen=true&amp;wp-story-play-on-load=true" title="Play story in new tab">
						<div class="wp-story-meta">
							<div class="wp-story-icon">
								<img alt="Site icon" src="https://secure.gravatar.com/blavatar/39557b5dc201be6d250537d3e85bbf5a5d156d4d16decd9f703c4b16047ae12d?s=80" width="40" height="40">
							</div>
							<div>
								<div class="wp-story-title">
									
								</div>
							</div>
						</div>
						<div class="wp-story-wrapper">
							<div class="wp-story-slide" style="display: block;">
			<figure><img
				title=""
				alt=""
				class="wp-block-jetpack-story_image wp-story-image "
				src="https://antonis.me/wp-content/uploads/2021/05/wp_story1620247280930_08294927216594630314.jpg"
			/></figure>
		</div>
						</div>
						<div class="wp-story-overlay">
							<div class="wp-story-embed-icon-expand">
				<svg class="gridicon gridicons-fullscreen" role="img" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
					<g>
						<path d="M21 3v6h-2V6.41l-3.29 3.3-1.42-1.42L17.59 5H15V3zM3 3v6h2V6.41l3.29 3.3 1.42-1.42L6.41 5H9V3zm18 18v-6h-2v2.59l-3.29-3.29-1.41 1.41L17.59 19H15v2zM9 21v-2H6.41l3.29-3.29-1.41-1.42L5 17.59V15H3v6z"></path>
					</g>
				</svg>
			</div>
						</div>
						<div class="wp-story-pagination wp-story-pagination-bullets">
			<div class="wp-story-pagination-bullet " aria-label="Go to slide 1">
			<div class="wp-story-pagination-bullet-bar"></div>
		</div>
<div class="wp-story-pagination-bullet " aria-label="Go to slide 2">
			<div class="wp-story-pagination-bullet-bar"></div>
		</div>
		</div>
					</a>
				</div>
			</div>
		</div>]]></content:encoded>
					
					<wfw:commentRss>https://antonis.me/2021/05/05/untitled/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/b10724e9ae11db3a2af6f25db18cc1225f2dcd67f81dbf0982936adf00a346db?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">aNTwNHs</media:title>
		</media:content>
	</item>
		<item>
		<title>An introduction to Kotlin Coroutines for Android</title>
		<link>https://antonis.me/2020/03/21/an-introduction-to-kotlin-coroutines-for-android/</link>
					<comments>https://antonis.me/2020/03/21/an-introduction-to-kotlin-coroutines-for-android/#comments</comments>
		
		<dc:creator><![CDATA[Antonis Lilis]]></dc:creator>
		<pubDate>Sat, 21 Mar 2020 12:43:41 +0000</pubDate>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Ελληνικά]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[coroutines]]></category>
		<category><![CDATA[Kotlin]]></category>
		<guid isPermaLink="false">http://antonis.me/?p=99767</guid>

					<description><![CDATA[Coroutines that fascinated devs from its early beta have graduated the experimental phase and are now stable 🎓. Coroutines provide a way to write asynchronous code sequentially making multithreaded programming more debuggable and maintainable.]]></description>
										<content:encoded><![CDATA[
<p></p>



<figure class="wp-block-embed-speaker-deck alignwide wp-block-embed is-type-rich wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="embed-speakerdeck"><iframe id="talk_frame_498635" src="//speakerdeck.com/player/eec5e93dd9604862841694a08f814d47" width="1100" height="618" style="border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe></div>
</div><figcaption>Attached the slides of my presentation at <a href="http://gdgandroidathens.com">GDG Android Athens</a> <a href="https://www.meetup.com/GDG-Android-Athens/events/259046622/">February Meetup</a>.<br>A <a href="https://www.youtube.com/watch?v=nAREwU18OoE">video of the presentation (in Greek)</a> is also available.</figcaption></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://antonis.me/2020/03/21/an-introduction-to-kotlin-coroutines-for-android/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/b10724e9ae11db3a2af6f25db18cc1225f2dcd67f81dbf0982936adf00a346db?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">aNTwNHs</media:title>
		</media:content>
	</item>
		<item>
		<title>SMS Retriever API: Computing your app&#8217;s hash</title>
		<link>https://antonis.me/2019/01/31/sms-retriever-api-computing-your-apps-hash/</link>
					<comments>https://antonis.me/2019/01/31/sms-retriever-api-computing-your-apps-hash/#respond</comments>
		
		<dc:creator><![CDATA[Antonis Lilis]]></dc:creator>
		<pubDate>Thu, 31 Jan 2019 11:30:36 +0000</pubDate>
				<category><![CDATA[Ελληνικά]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Kotlin]]></category>
		<guid isPermaLink="false">http://antonis.me/?p=99752</guid>

					<description><![CDATA[You can find info on what the SMS Retriever API is here. Chances are that reaching this page means you already know that. For some reasons the hash generation process described in the docs did not work for me. Probably it&#8217;s a Mac only issue or the implementation of the sha256sum function I installed with &#8230; <a href="https://antonis.me/2019/01/31/sms-retriever-api-computing-your-apps-hash/" class="more-link">Continue reading <span class="screen-reader-text">SMS Retriever API: Computing your app&#8217;s&#160;hash</span> <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p>You can find info on what the SMS Retriever API is <a href="https://developers.google.com/identity/sms-retriever/overview">here</a>. Chances are that reaching this page means you already know that. For some reasons the <a href="https://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string">hash generation process described in the docs</a> did not work for me. Probably it&#8217;s a Mac only issue or the implementation of the sha256sum function I installed with coreutils.</p>



<p>What worked for me is getting the hash from within the App. A helper class for this is provided in <a href="https://github.com/googlesamples/android-credentials/blob/master/sms-verification/android/app/src/main/java/com/google/samples/smartlock/sms_verify/AppSignatureHelper.java">Google Samples project</a>.<br></p>



<p>A Kotlin snippet that does the same can be found bellow.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
fun getAppSignature(context: Context) = context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_SIGNATURES)
        .signatures.mapNotNull { hash(context.packageName, it.toCharsString()) }.firstOrNull()

private fun hash(packageName: String, signature: String) = try {
    val messageDigest = MessageDigest.getInstance(&quot;SHA-256&quot;)
    if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.KITKAT) {
        messageDigest.update(&quot;$packageName $signature&quot;.toByteArray(StandardCharsets.UTF_8))
    }
    var hashSignature = messageDigest.digest()
    hashSignature = Arrays.copyOfRange(hashSignature, 0, 9)
    var base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING or Base64.NO_WRAP)
    base64Hash = base64Hash.substring(0, 11)
    base64Hash
} catch (e: NoSuchAlgorithmException) {
    null
}
</pre></div>]]></content:encoded>
					
					<wfw:commentRss>https://antonis.me/2019/01/31/sms-retriever-api-computing-your-apps-hash/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/b10724e9ae11db3a2af6f25db18cc1225f2dcd67f81dbf0982936adf00a346db?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">aNTwNHs</media:title>
		</media:content>
	</item>
	</channel>
</rss>
