<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community:  ViksaaSkool </title>
    <description>The latest articles on DEV Community by  ViksaaSkool  (@viksaaskool).</description>
    <link>https://dev.to/viksaaskool</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F69260%2F47140c7e-38dd-4358-9d75-9b6c87754bf2.jpg</url>
      <title>DEV Community:  ViksaaSkool </title>
      <link>https://dev.to/viksaaskool</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/viksaaskool"/>
    <language>en</language>
    <item>
      <title>Fortran meets AI</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Sun, 15 Mar 2026 17:32:51 +0000</pubDate>
      <link>https://dev.to/viksaaskool/fortran-meets-ai-3oac</link>
      <guid>https://dev.to/viksaaskool/fortran-meets-ai-3oac</guid>
      <description>&lt;h2&gt;
  
  
  Story time
&lt;/h2&gt;

&lt;p&gt;My father studied at Faculty of Electrical Engineering at &lt;a href="https://ukim.edu.mk/en/" rel="noopener noreferrer"&gt;SS Cyril and Methodius University&lt;/a&gt; in Skopje in the late 70s. &lt;br&gt;
I studied at the same faculty and university 30-something years later and got my Master's degree at Faculty of Computer Science and Engineering. &lt;br&gt;
While back, during my studies I found one textbook from the courses he took, Fortran IV. Here's the photo of it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp8xik0ljbqlyfg46tms.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp8xik0ljbqlyfg46tms.jpg" alt="Fortran"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some of you reading this might know what Fortran is (programming language), but I presume almost none of you seen problems solved in the language or punch cards. Yes, punch cards. Back in the days, people used to code on punch cards and that was included in this course. Punch cards meant that every line of code in a program had to have its own card. So if your program had 1000 LOC, then you had 1000 cards. How that looked, more in this video: &lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/oaVwzYN6BP4"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Most interesting thing: there was an exam inside it, his exam from almost 50 years ago! Here it is (fyi, the language is Macedonian): &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbcuxktmc6he7i3rtb4w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbcuxktmc6he7i3rtb4w.jpg" alt="exam 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1tx7ppe0perzzsuvcxap.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1tx7ppe0perzzsuvcxap.jpg" alt="exam 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see they weren't solving important problems back in the day like, recommendation algorithm or even more important and harder to grasp, CSS. It's mostly useless math. &lt;br&gt;
Even though I've known about this exam for quite a while and wanted to solve it, never got to it. Until now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Today
&lt;/h2&gt;

&lt;p&gt;With everything that's happening in the field of computer science and  AI, writing code and solving problems is the easy part. But an exam 50 years ago in Fortran? Would that be a problem for today's best models? You've guessed it right - it won't. &lt;/p&gt;

&lt;p&gt;I've made a small showcase GitHub Page with the solutions to these 5 problems, called &lt;strong&gt;Fortran meets AI&lt;/strong&gt; you can visit &lt;a href="https://viksaaskool.github.io/Fortran-meets-AI/index.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykioqosrgo4tn2iz0ppc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykioqosrgo4tn2iz0ppc.png" alt="Fortran meets AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same problem is solved by Claude Code (Opus 4.6), Codex  5.4 (by OpenAI) and MinMax 2.5 &lt;a href="https://youtu.be/RDrfE9I8_hs" rel="noopener noreferrer"&gt;from China&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbabqr9yq1a4615rryfmc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbabqr9yq1a4615rryfmc.png" alt="codin examples"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Codex had no problem in reading, recognizing and solving the issues. The model was provided with the images, translated it to English and created two .svgs. It produced solutions in Fortran, Python and Kotlin. &lt;/li&gt;
&lt;li&gt;Cladue Code had no issue to resolve this, provided the solutions for the problems in Fortran, Python and Kotlin.&lt;/li&gt;
&lt;li&gt;MinMax 2.5 the free version provided by OpenCode's OpenZen (which I've used) cannot read images, so I used the .svgs that Codex created. Had no issues &lt;/li&gt;
&lt;li&gt;I've added Python compiler (it was the easiest) so solutions can be compared in terms of compile speed and simplicity. And with that you can clearly see that Codex gave "uncopilable" solution on the second problem (SyntaxError: '(' was never closed). The only model that did this, which, to be honest, I didn't expect. &lt;/li&gt;
&lt;li&gt;Even more surprising, Claude Code got the first task wrong, MiniMax did it most optimal, made mistake in Problem 2. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In details:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn5ih6zfka0y10k5cbna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn5ih6zfka0y10k5cbna.png" alt="results"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last, not least, Claude code was the only one to include the input card layout in the solution, for example: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtfk16j5h2f9fg07u7ql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtfk16j5h2f9fg07u7ql.png" alt="Claude code punch card"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Words of wisdom
&lt;/h2&gt;

&lt;p&gt;If you got to here by reading, you deserve a smart sounding sign off to this article. From this stand point programming and software engineering in the late 70s looked pretty bleak and like nothing that can guide our lives in such an important manner as today. It took new technologies and discoveries to place it as one of the guiding forces of current and future progress. To that note, maybe today's state of SWE will look as bleak and simplistic as Fortran in the 70s. Matter of fact, I'm sure of that and that day is coming rather sooner than later. &lt;/p&gt;

</description>
      <category>fortran</category>
      <category>ai</category>
    </item>
    <item>
      <title>AI, tech and society: educated fool’s predictions</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Wed, 21 Jan 2026 22:56:21 +0000</pubDate>
      <link>https://dev.to/viksaaskool/ai-tech-and-society-educated-fools-predictions-5f6n</link>
      <guid>https://dev.to/viksaaskool/ai-tech-and-society-educated-fools-predictions-5f6n</guid>
      <description>&lt;p&gt;&lt;em&gt;The original post was written in late 2023, edited and changed in the first months of 2024, but never published, because I was persuaded by some peers who had a glimpse into it that it was too dark and negative. Two years later, here it is — I published it as is (only with some small formatting changes). Now, with a bit of pride that I got most things right (in these two years), I plan on writing part two, with more predictions on how the changes might affect society and what the possible end results are (in more detail).&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpc60rugwajarrhc4tnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpc60rugwajarrhc4tnu.png" alt="the original timestamp" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I have a bachelor’s and master’s degree in computer science, specializing in intelligent information systems. I have 12 years of experience as a software engineer — I started with web development but quickly switched to the then shiny new(ish) thing: Android development. I’ve been at different points in the software engineering process, down in the trenches and outside, overlooking the deadline release battles. I’ve worked at startups, digital agencies, and product-based large companies — from “it doesn’t matter — let’s ship it” to “the name of this variable in your unit test is not intuitive enough.” I’ve worked on passion projects, blogging, published a somewhat popular Android library, done data science in Python, and tried to center a div in CSS. I consider myself a valuable addition to a software engineering team — knowledge, experience, creativity, and some bad jokes in stand-ups.&lt;/p&gt;

&lt;p&gt;I’m humble enough to know that I’m replaceable — as a software engineer or researcher, a very strong and genuine “will be missed,” but still replaceable. Looking in the eyes of the upcoming AI development automation, we, software engineers, will all be humbled and sooner or later come to the same realization.&lt;/p&gt;

&lt;p&gt;The post-pandemic tech market was booming; the abundance of job opportunities was overflowing the tech fountain of career perspectives. This resulted in inflated tech employment and the creation of a big cushion of the software engineer’s comfort, who has been able to indulge in conspicuous consumption more than ever. Everything started to shift with global political events, which were aided by the introduction of ChatGPT. Ever since that moment, there has been progress in tooling that erodes, bit by bit, the rock of software engineers’ responsibilities, narrowing down the job description.&lt;/p&gt;

&lt;p&gt;The aim of AI iterations is to reach a point where it can do everything a human would do, without emotions and imperfections. The end goal is to create a know-it-all entity, also referred to as artificial general intelligence (AGI).&lt;/p&gt;

&lt;p&gt;If you look into the software engineering corners of the internet, the theme playing out loud is “Will I be replaced by AI?” — and I’m going to try to answer that and make a prediction. Hopefully a good one.&lt;br&gt;
Drumroll, the answer is: yes. Let me elaborate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predictions
&lt;/h2&gt;

&lt;p&gt;My predictions are going to be centered around tech and how those changes will affect society. To be noted, there’s no branch of the economy that will not be affected in a substantial manner.&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;The changes will happen in waves of invention and adoption&lt;/strong&gt; – even if the invention moves exponentially the adoption will slow down the pace. How much, remains to be seen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;First wave.&lt;/strong&gt; We’re currently in the first wave, where LLMs are packaged in the form of tools that are good enough to aid the developer in the daily work. Some very repetitive parts of the engineering process are easily replaceable with the tools being available. Mainly, it’s just an addon to what developers already do, but helps with productivity and brings value to the shareholders. Jobs like translators, content writers, manual QAs can be rendered obsolete, but are not. The industry sees a shift and is reluctant for new investments into hiring people, rather than developing these tools, or waiting for these tools to be developed. Minor adaptations already have begun, but very few companies have official and firm stances. Data privacy is still not resolved, one of the many reasons why companies are hesitant to start applying the new tech on mass. This is where the people that say “you’re most likely not going to lose your job (because of AI)” are right. We have 1–2 years left from the first wave.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Second wave.&lt;/strong&gt; Tools like Devin and more to come (AutoDev from Microsoft?) become good enough to replace junior devs and do most of the work. Data privacy is resolved, and more companies start to embrace the “AI dev” tools. First AI Dev digital agencies appear – offering packages to companies for “subscribing” to their dedicated AI team of devs. Very few new openings are going to be posted, low demand, high supply. Layoffs are going to have their moment – each next round will be higher than the previous one. This won’t be happening just in tech, but also in most data-driven industries. The new tech is going to produce tools to replace other job descriptions, while it also eats itself – a truly poetic end. This is when you’d be really worried about your job if you still had one. Getting a job once you got laid off will be harder than ever, close to impossible. The economy shifts are going to be apparent and first “organic” software movements are going to appear. The push back from developers (and other workers that were laid off) is going to take some form. A lot of talent is going to be unemployed and that talent and experience, with the help of the very same AI that got them in that position, will be able to compete against the now very big companies. If there’s no legal intervention and most of the AI breakthroughs stay open, big tech is going to be under threat in terms of monopoly. Building complex systems will be easier than ever, an opportunity that a sizable chunk of the unemployed devs will take. I expect this wave to last 2025–2035.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Third wave.&lt;/strong&gt; This is going to be a period that is mostly adaptation and social amortization of the automation consequences. How societies are going to handle the second wave will determine what will happen in the third one and what pace AI adoption will have. Tech is going to be focused on displacing all other jobs that are now considered safe – manual labor jobs that need more context and require multiple models to cooperate. With advancements in robotics this will be achieved. Home robotic appliances for ironing shirts and folding clothes will be good enough that no human assistance will be needed. It’s unlikely, and I’d be very surprised, if by this time we achieve AGI, but some pretty good forms of it are going to be out there. I expect this period to be 2035 until a viable AGI is introduced.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2) &lt;strong&gt;NO, AI won’t “create more jobs than it’ll displace”.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The “new jobs” that are going to be created will be narrow, harder for novice developers to do and/or to be seen as eligible by companies. The price of labor will drop, and tech won’t be an attractive field to get into.&lt;/p&gt;

&lt;h2&gt;
  
  
  Social consequences of automation
&lt;/h2&gt;

&lt;p&gt;Society is built on norms and rules that make the system run. The massive introduction of AI will challenge most of the norms and all the rules that have built modern societies. The very basic rules of setting up the social hierarchy, climbing the social ladder, through actions of acquiring resources because of work, will be diminished or totally nullified. The stability of the system depends on how fast this change is going to happen and how it will be handled. &lt;/p&gt;

&lt;p&gt;Almost certainly we're going to see economic turbulence in the short run, followed by very probable social unrest and some dystopian form of new society as the end result. &lt;/p&gt;

&lt;p&gt;Most likely outcome will be frozen or very inert social mobility, two main classes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The "organic" oligarch/winners of AI revolution class. They'd be able to enjoy goods and services developed and produced by people, not because they are better, on the contrary because they can afford their costliness. Form of status signaling. Art, movies, food, barbers, designers - everything human made. &lt;/li&gt;
&lt;li&gt;The rest, the synthetic class. The consumers of the "free" products of AI - basic goods and services enough to live lives happy enough not to rebel or revolt and not good enough to afford the "organic" luxury. &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>tech</category>
    </item>
    <item>
      <title>(Idea + Sensors + Compose + Lottie)*AI Agents = Beautiful UI</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Tue, 06 Jan 2026 02:38:38 +0000</pubDate>
      <link>https://dev.to/viksaaskool/idea-sensors-compose-lottieai-agents-beautiful-ui-4293</link>
      <guid>https://dev.to/viksaaskool/idea-sensors-compose-lottieai-agents-beautiful-ui-4293</guid>
      <description>&lt;h2&gt;
  
  
  Idea
&lt;/h2&gt;

&lt;p&gt;In the AI era of software development, the doing part has become significantly cheaper — especially in terms of time. Complex ideas are now just a prompt away from becoming an MVP.&lt;/p&gt;

&lt;p&gt;This shift means that standing out is no longer about what you build, but how well you build it. Quality, polish, and thoughtful UX are what separate good products from forgettable ones.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk through a step-by-step guide to implementing a widely used UI widget: a steps counter component that visualizes a user’s daily activity as progress toward a goal (typically 10,000 steps).&lt;/p&gt;

&lt;p&gt;The component features an animated humanoid figure that mirrors the user’s activity — when the user walks, the figure walks; when the user is idle, the figure remains still. Color is used as a second signal: progress shifts from red (far from the goal) to green (close to completion).&lt;/p&gt;

&lt;p&gt;The goal is to demonstrate how small details and animation can turn a standard metric into a more engaging, human-centered experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0febic343z3n3cmdat6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0febic343z3n3cmdat6a.png" alt="Idea state 1" width="788" height="815"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqseqdjwky8i6fwhkojph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqseqdjwky8i6fwhkojph.png" alt="Idea state 2" width="800" height="833"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sensors
&lt;/h2&gt;

&lt;p&gt;The first thing that needs to be done is to create a mechanism that tracks movement. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it needs to be able to tell if the user is indoor or outdoor. &lt;/li&gt;
&lt;li&gt;if it's indoor it should rely on sensors - &lt;code&gt;Sensor.TYPE_LINEAR_ACCELERATION&lt;/code&gt; and &lt;code&gt;Sensor.TYPE_GYROSCOPE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;if it's outdoor it should rely &lt;code&gt;ActivityRecognitionResult&lt;/code&gt;, i.e. distinguish between &lt;code&gt;DetectedActivity.WALKING&lt;/code&gt;, &lt;code&gt;DetectedActivity.RUNNING&lt;/code&gt; and &lt;code&gt;DetectedActivity.ON_FOOT&lt;/code&gt; in &lt;code&gt;MotionTransitionReceiver&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For that I need to update the &lt;code&gt;AndroidManifest.xml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.ACCESS_FINE_LOCATION"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.ACCESS_COARSE_LOCATION"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;"android.permission.ACTIVITY_RECOGNITION"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;receiver&lt;/span&gt; &lt;span class="na"&gt;android:name=&lt;/span&gt;&lt;span class="s"&gt;".motion.transition.MotionTransitionReceiver"&lt;/span&gt;
            &lt;span class="na"&gt;android:exported=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, the more important part:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="c1"&gt;//how we request updates &lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;ComponentActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestActivityUpdates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ActivityRecognition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestActivityUpdates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nf"&gt;getMotionPendingIntent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addOnSuccessListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Timber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Periodic updates registered"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//simple way of deciding if the user is indoor or outdoor &lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isLikelyOutdoors&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;goodAccuracy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;accuracy&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;20f&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;hasAltitude&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hasAltitude&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;hasBearing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hasBearing&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;goodAccuracy&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasAltitude&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;hasBearing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two listeners (&lt;code&gt;OutdoorStateListener&lt;/code&gt; and &lt;code&gt;MotionBasedOnSensorListener&lt;/code&gt;) are defined so they can be passed around.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;MotionBasedOnSensorListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isMoving&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;OutdoorStateListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isOutdoor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;shouldRequestPermission&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;MotionBasedOnSensorDetector&lt;/code&gt; main idea is represented in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MotionBasedOnSensorDetector&lt;/span&gt; &lt;span class="nd"&gt;@Inject&lt;/span&gt; &lt;span class="k"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nd"&gt;@ApplicationContext&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;SensorEventListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;MotionBasedOnSensorListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_isMoving&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isMoving&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_isMoving&lt;/span&gt;

&lt;span class="c1"&gt;//...&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onSensorChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;SensorEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;magnitude&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;now&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;moving&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sensor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Sensor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TYPE_LINEAR_ACCELERATION&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;magnitude&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;thresholdAccel&lt;/span&gt;
            &lt;span class="nc"&gt;Sensor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TYPE_GYROSCOPE&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;magnitude&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;thresholdGyro&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moving&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;lastMovementTime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;
            &lt;span class="n"&gt;_isMoving&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lastMovementTime&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;// 1.2s without movement&lt;/span&gt;
                &lt;span class="n"&gt;_isMoving&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While &lt;code&gt;OutdoorStateMonitor&lt;/code&gt; is implementation of &lt;code&gt;OutdoorStateListener&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OutdoorStateMonitor&lt;/span&gt; &lt;span class="nd"&gt;@Inject&lt;/span&gt; &lt;span class="k"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nd"&gt;@ApplicationContext&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OutdoorStateListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="c1"&gt;//...&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;callback&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;object&lt;/span&gt; &lt;span class="err"&gt;: &lt;/span&gt;&lt;span class="nc"&gt;LocationCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onLocationResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;LocationResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastLocation&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;

            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isOutdoor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isLikelyOutdoors&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lastIsOutdoor&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;isOutdoor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;lastIsOutdoor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isOutdoor&lt;/span&gt;
                &lt;span class="nc"&gt;Timber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OutdoorStateMonitor | isOutdoor = $isOutdoor, acc=${location.accuracy}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debugToast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"isOutdoor = $isOutdoor, acc=${location.accuracy}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;_isOutdoor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isOutdoor&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As stated in the AndroidManifest.xml, there's a MotionTransitionReceiver that is defined as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MotionTransitionReceiver&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;BroadcastReceiver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onReceive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ActivityRecognitionResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;ActivityRecognitionResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extractResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;activity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mostProbableActivity&lt;/span&gt;
                &lt;span class="nc"&gt;Timber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Periodic update = ${activity.type.toActivityName()} confidence=${activity.confidence}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debugToast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"onReceive() | event = ${activity.type.toActivityName()}, confidence=${activity.confidence}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;moving&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;DetectedActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WALKING&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt;
                        &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;DetectedActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RUNNING&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt;
                        &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;DetectedActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ON_FOOT&lt;/span&gt;

                &lt;span class="nc"&gt;MotionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setMoving&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moving&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This forms the basic simple, heuristic for the detection of movement that needs to be managed into a ViewModel that, then in UDF fashion communicates with the UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="nd"&gt;@HiltViewModel&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StepsViewModel&lt;/span&gt; &lt;span class="nd"&gt;@Inject&lt;/span&gt; &lt;span class="k"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;outdoorStateListener&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OutdoorStateListener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;motionBasedOnSensorListener&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MotionBasedOnSensorListener&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IStepsViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_shouldStartMotionTransition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;shouldStartMotionTransition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_shouldStartMotionTransition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asStateFlow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_isMoving&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isMoving&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_isMoving&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asStateFlow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;//...&lt;/span&gt;

&lt;span class="nf"&gt;init&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;collectShouldRequestPermission&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;outdoorStateListener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;collectOutdoorStateChange&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;collectOutdoorStateChange&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;viewModelScope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;outdoorStateListener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isOutdoor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;isOutdoor&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="nc"&gt;Timber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"collectOutdoorStateChange() |  isOutdoor = $isOutdoor"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isOutdoor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;_shouldStartMotionTransition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
                &lt;span class="n"&gt;motionBasedOnSensorListener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="nf"&gt;collectMotionTransitionState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;_shouldStartMotionTransition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
                &lt;span class="n"&gt;motionBasedOnSensorListener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="nf"&gt;collectMotionBasedOnSensor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//...&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compose + Lottie
&lt;/h2&gt;

&lt;p&gt;Second, compose component needs to be created. A circle that needs with lottie animation in the center. &lt;br&gt;
The easy part - drawing the animation. The hard part making the lottie animation tintable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;CircularFillWithLottie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;modifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;progressPercentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fillColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LightGray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;strokeWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Dp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;animationDuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;animationEasing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Easing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastOutSlowInEasing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;lottieRes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;isMoving&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;//...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//and then the most important component: &lt;/span&gt;

&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;TintableLottie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nd"&gt;@RawRes&lt;/span&gt; &lt;span class="n"&gt;lottieRes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fillColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LottieConstants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IterateForever&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;composition&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;rememberLottieComposition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;LottieCompositionSpec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RawRes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lottieRes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;lottieAnimState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;animateLottieCompositionAsState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;composition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;isPlaying&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;iterations&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;fillProperty&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rememberLottieDynamicProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;property&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LottieProperty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;COLOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fillColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toArgb&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;keyPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;arrayOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"**"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;strokeProperty&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rememberLottieDynamicProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;property&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LottieProperty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;STROKE_COLOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fillColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toArgb&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;keyPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;arrayOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"**"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;filterProperty&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rememberLottieDynamicProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;property&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LottieProperty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;COLOR_FILTER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SimpleColorFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fillColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toArgb&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="n"&gt;keyPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;arrayOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"**"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;properties&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rememberLottieDynamicProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;fillProperty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;strokeProperty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;filterProperty&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;dynamicProps&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fillColor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;properties&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;LottieAnimation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;composition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;lottieAnimState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;dynamicProperties&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dynamicProps&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: the lottie animation was found on &lt;a href="https://lottiefiles.com/" rel="noopener noreferrer"&gt;lottiefiles.com&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;To make things come together, one separate component, &lt;code&gt;MotionDetector&lt;/code&gt; needs to be implemented with the sole purpose of fetching the motion data and passing it into the UI. That's done in this manner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;
&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;MotionDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;stepsViewModel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IStepsViewModel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hiltViewModel&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StepsViewModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;onMovementChange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Unit&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;activity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocalActivity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;shouldStart&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;stepsViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shouldStartMotionTransition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collectAsState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;shouldRequestPermission&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;stepsViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shouldRequestPermission&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collectAsState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isMoving&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;stepsViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isMoving&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collectAsState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;onMovementChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isMoving&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;activity&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nc"&gt;ComponentActivity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;permissions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;arrayOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;Manifest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ACTIVITY_RECOGNITION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;Manifest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ACCESS_FINE_LOCATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;launcher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rememberLauncherForActivityResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;contract&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ActivityResultContracts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RequestMultiplePermissions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;allGranted&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allGranted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestActivityUpdates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shouldRequestPermission&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;stepsViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onPermissionGranted&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;Toast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;makeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Permissions denied"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Toast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LENGTH_SHORT&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;allGranted&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;ContextCompat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkSelfPermission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;PackageManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PERMISSION_GRANTED&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nc"&gt;LaunchedEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shouldStart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shouldStart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allGranted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestActivityUpdates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;launcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeActivityUpdates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nc"&gt;LaunchedEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shouldRequestPermission&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shouldRequestPermission&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;launcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nc"&gt;DisposableEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;onDispose&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeActivityUpdates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then the final component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;StepsContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stepsViewModel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;IStepsViewModel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hiltViewModel&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StepsViewModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;isMoving&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;remember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;mutableStateOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;progressPercentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;remember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;mutableIntStateOf&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;//this needs to be real value from health api&lt;/span&gt;

    &lt;span class="nc"&gt;MotionDetector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stepsViewModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;isMoving&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;innerPadding&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;innerPadding&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;contentAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;CircularFillWithLottie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;progressPercentage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;progressPercentage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;fillColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;progressPercentage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toProgressColor&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LightGray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;strokeWidth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;lottieRes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walker_man&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;isMoving&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isMoving&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AI Agents
&lt;/h2&gt;

&lt;p&gt;Needles to say yo can achieve this using any of the most popular coding tools. My choice was ChatGPT, but I bet you'd get equally good results with any other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6wh9mgkg26npzh5m1bq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6wh9mgkg26npzh5m1bq.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/ViksaaSkool/StepsComponent/issues/1" rel="noopener noreferrer"&gt;video here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole code is in &lt;a href="https://github.com/ViksaaSkool/StepsComponent" rel="noopener noreferrer"&gt;this repo&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>android</category>
      <category>compose</category>
      <category>ai</category>
      <category>ui</category>
    </item>
    <item>
      <title>The Onboarding</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Tue, 01 Feb 2022 00:40:52 +0000</pubDate>
      <link>https://dev.to/viksaaskool/the-onboarding-2i1h</link>
      <guid>https://dev.to/viksaaskool/the-onboarding-2i1h</guid>
      <description>&lt;p&gt;A blog post I've been brewing for a while now. &lt;br&gt;
The last half/two-thirds of 2021 in the company I work for, I've been an integral part of the onboаrding process of new hires- some filling void due to people leaving the team, some due to company growth. As an engineer it's natural to form some (strong?) opinions about a process you're observing, let alone being part of. I tried to keep it short and be as straight to the point as possible. So, here it goes:&lt;/p&gt;

&lt;h3&gt;
  
  
  If you're doing the onboаrding.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Arguably the task a developer hates most - writing documentation.  Close second: reading documentation. &lt;br&gt;
In terms of value when it comes to onboarding people and returning back to, usually, very complex parts of the code - documentation is the crown jewels. Needless to say, if you/your company/your team don't document most the code, write code guidelines and diagrams in dedicated wiki and document custom processes in the development pipeline - you're not going to get far. &lt;br&gt;
Robust organizations and sturdy developers do the hard things - they write and read documentation. Be one of them, lead the new hires by example. &lt;br&gt;
Provide the documentation to the new hires and give them some time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkwe0wag4jl3dhdp5nti.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkwe0wag4jl3dhdp5nti.gif" alt="document" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pair up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one maybe seem like a costly point in the short term, but it'll pay dividend in the long run. As I've said, having documentation and reading resources is essential, but having a real flesh-and-bone person, a colleague, walking a new hire trough the code base and processes, contributes to a seemingly onboarding and it cannot be (shouldn't be) substituted. &lt;br&gt;
Make sure new hires have a go to person in the team, they can turn to in need in the first N months. Make sessions in which most competent person for a certain subject, part of the code base or process will onboard the new hire. That way you're making new personal bonds, while the knowledge transfer begins. Spread the sessions out as much as reasonably possible. &lt;br&gt;
During the onboarding, if this is possible in your organization, make the new hires work alongside most experienced engineers in the team.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb0vwbz39cie4wo98rn2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb0vwbz39cie4wo98rn2.gif" alt="pair up" width="500" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Track adaptation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one falls to management - have an adaptation measurement on how well the new hires are fitting in. This one is important in order to recognize the early signs if something is getting out of hand or is not working out. The adaptation measurement can be anything that makes most sense to your organization - if you don't have one it can and will be yielded out by the onboarding process for you. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The week of the first successful PR.
&lt;/li&gt;
&lt;li&gt;The time spent on the first feature. &lt;/li&gt;
&lt;li&gt;The complexity (story points?) of the bugs solved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever makes most sense for you. Address problems as soon as they arise, don't assume, ask questions and make an effort to build rapport.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3bgpjxxg7yr4vp86hoi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3bgpjxxg7yr4vp86hoi.gif" alt="adaptation" width="479" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  If you're being onboarded.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Do your homework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There always are going to be things in the field of your expertise, favorite technology, SDK/API that you don't know by heart. Even when you think you're on top of your game, tools, methods, libraries change - you can't feel on top every time - all the time, nobody does (not true, I know couple of people, but for the sake of the argument let's pretend). That being said, what you can, and should do when you're entering a new company is to do your homework - make sure you have as much domain knowledge as possible. &lt;br&gt;
I work as an Android engineer, that develops apps that mostly revolve around Bluetooth, so if I get to onboard you - it will be handy if you know that part of the SDK/API. Even if you see that we have "our own way of doing things" in the onboarding process, it cannot be different than what the SDK/API intends to achieve. &lt;br&gt;
If you don't have experience in a domain or part of the SDK, make sure you learn as much as possible, especially, before you make your first PR. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijio6vv9pbsj4chbyz7y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijio6vv9pbsj4chbyz7y.gif" alt="homework" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Proactive sweet spot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one is hard to measure, but it comes with experience. If you are the beginning of your career it doesn't really matter, because you'll probably going to go on one or another extreme of the "I'm going to figure this one out on my own" - "Let's ask Bob or Lisa about this indentation" spectrum. Probably both, sometimes in the same company. Make sure when you ask questions you exhausted all the resources the Internet(s) have to offer. Double-check the dumbest possibilities, you might have overlooked something obvious. Be humble. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p3y34a6wqd4jhe4v27b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p3y34a6wqd4jhe4v27b.gif" alt="proactive" width="400" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Get to know colleagues&lt;/strong&gt;   &lt;/p&gt;

&lt;p&gt;Coding comes first, at the end of the day is just a job, BUT, you're going to spend most of the day at work - make sure to be as pleasant as it can be. &lt;br&gt;
Be engaging and get to know your new colleagues, try to fit in - share your experiences and get involved as much as you feel comfortable to do so. &lt;br&gt;
In my personal experience, the best, most engaging work the team that I've been part of has done is after get-togethers, team buildings and after work hangouts. Events nowadays and probably in the (near) future are going to be mostly remote, but we can give our best and make the most out of it.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5pehxi60a7a64dihk8a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5pehxi60a7a64dihk8a.gif" alt="fun" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>onboarding</category>
      <category>efficiency</category>
      <category>development</category>
    </item>
    <item>
      <title>The pandemic and hypochondria == dontgogleit.com</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Wed, 23 Sep 2020 08:21:41 +0000</pubDate>
      <link>https://dev.to/viksaaskool/the-pandemic-and-hypochondria-dontgogleit-com-514c</link>
      <guid>https://dev.to/viksaaskool/the-pandemic-and-hypochondria-dontgogleit-com-514c</guid>
      <description>&lt;p&gt;So. Let's start with that title. &lt;/p&gt;

&lt;p&gt;The pandemic a.k.a covid-19, coronavirus, rona, it's been all over the news, all kinds of timelines, everywhere, you read/hear details that you might not want to, a term we can all relate to. &lt;/p&gt;

&lt;p&gt;Hypochondria or the new term - health anxiety - some of you might not be on board with this one and still clicked the post, out of curiosity, maybe. Are you overly aware of your body sensations? Do you check your symptoms and it's pretty easy to construct conspiracy theory about what terminal illness they're sign of? &lt;br&gt;
I do. &lt;/p&gt;

&lt;p&gt;To me and I presume to most other people with health anxiety, this means almost constant stress and decreased ability to concentrate and work (code). One thing I've known for a while is that the golden rule in these situations is NOT TO GOOGLE your symptoms, that doesn't mean that you should disregard your health, but if you have any suspicions, you should contact/visit medical professional instead of Dr.Google. In the absence of fully functioning health care system (especially if you live in the second or third world or your country is hard hit from the pandemic), this is not really possible (or considered risky).  &lt;/p&gt;

&lt;p&gt;And that's how we come to the third part of the title. I wanted to create a top notch, latest UI/UX implemented web page that ease the effects of this mix of health anxiety and pandemic mayhem. And that's how &lt;a href="https://www.dontgogleit.com/" rel="noopener noreferrer"&gt;dontgogleit.com&lt;/a&gt; was born. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa7pls3320r7nmtqvotcp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa7pls3320r7nmtqvotcp.png" alt="preview" width="735" height="416"&gt;&lt;/a&gt;&lt;br&gt;
                    &lt;em&gt;yes, cat gifs!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's very intuitive and easy to use. You can even change themes and share the page on your social media portals! &lt;/p&gt;

&lt;p&gt;Note: the domain with two o's would have costed me the same as &lt;a href="https://bit.ly/3kzOXLA" rel="noopener noreferrer"&gt;buying this beauty&lt;/a&gt;, so I opted out and bought the cheaper version (of the domain).&lt;/p&gt;

</description>
      <category>joke</category>
      <category>coding</category>
      <category>pandemic</category>
      <category>covid19</category>
    </item>
    <item>
      <title>Google play woes and the Android dev community</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Tue, 26 May 2020 08:39:00 +0000</pubDate>
      <link>https://dev.to/viksaaskool/google-play-woes-and-the-android-dev-community-59fc</link>
      <guid>https://dev.to/viksaaskool/google-play-woes-and-the-android-dev-community-59fc</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best part about being a developer to me is the ability to create something from nothing (and share it with the world). &lt;br&gt;
Mobile development has been (and still is?) one of the most interesting roads you can take having this thought in mind, which is why I've been working as an Android mobile developer for the past 7 years. In that time, like everything in nature, a lot of things have changed, evolved for the better or dead-ended somewhere on the mount improbable. &lt;/p&gt;

&lt;p&gt;One thing that also evolved trough time, understandably so, are the &lt;a href="https://play.google.com/about/privacy-security-deception/" rel="noopener noreferrer"&gt;Google Play Console Policies&lt;/a&gt;. Sarting off as very inviting and accommodating to becoming very strict, and yet in other parts very vague and open to interpretation. &lt;br&gt;
With the app quantity growth, stricter rules are somewhat a guarantee for app quality a perspective I fully comprehend. Google has decided to enforce this by, in worst case scenario, terminating your developer account (and you as a developer) for good from their app publishing platform. Fair enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observations/Opinions/Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I may be naive, but I think the vast majority of the developers would rather respect the rules than try to hack em if they know that the punishment for that behaviour is a career change. To top that, from a devs perspective, the main problem regarding publishing apps to Google Play Console is the automated system deciding on your app/account termination (as I said,  worst case scenario) and the low probability of being able to contact human being with clarification on why's there a problem with your app submission (and be given a chance to correct it). &lt;/p&gt;

&lt;p&gt;It seems that in this system the collateral damage are the developers that unintentionally have broken some of the rules. &lt;br&gt;
This setting makes it especially hard for novice developers to publish "show off"/"practice" apps - not having enough experience (even though you can get banned for totally development unrelated reasons), chances are that you might miss something. &lt;br&gt;
Seasoned Android dev enthusiasts may also be &lt;a href="https://bit.ly/2ZeAFbQ" rel="noopener noreferrer"&gt;holding off app publishing&lt;/a&gt;, regardless if they do this as "side gig" or as a main source of income, a mistake that can result with account termination looks too costly.&lt;br&gt;
Lastly, if there's no balance, this will put (&lt;a href="https://bit.ly/2MxrA7n" rel="noopener noreferrer"&gt;puts?&lt;/a&gt;) strain on start ups to pursuit and channelize creative new ideas as an Android app, where this being an end product of the goal to tighten the leash on deceptive agents trying to exploit the users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.tenor.com%2Fimages%2Fa2cc972618f789bf8d7b3cb46a35b135%2Ftenor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.tenor.com%2Fimages%2Fa2cc972618f789bf8d7b3cb46a35b135%2Ftenor.gif" alt="app submission review"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Research&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/androidDev/" rel="noopener noreferrer"&gt;r/androiddev&lt;/a&gt; on reddit with 143K subscribers is the main go-to place for the global Android community- covering all topics of the android dev lifecycle - from libraries, code, snippets, discussions and self-promotions to Google Play app/account problems (suspension/termination) related posts. I've been active member ever since I've started developing Android and just by daily scrolling through it seems that lately, especially in the last year[*] the amount of these Google Play related ("termination/suspension") posts have risen in numbers. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;I want to analyze the relationship between the Google Play Console policies and its changes and the Android developer community. Do that in straightforward fashion: gather the data, put hypothesis in mind to the test, explore the data and see where it'll take me.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using python and &lt;a href="https://api.pushshift.io" rel="noopener noreferrer"&gt;pushshift.io API&lt;/a&gt; I've gathered 10K r/androiddev posts per year in the 2015 to 2019 time interval and created a data set (which is public and you can &lt;a href="https://www.kaggle.com/viktorarsovski/randroiddev-data-20152019" rel="noopener noreferrer"&gt;access it on kaggle&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn4xp5n2xhzb96o468s4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn4xp5n2xhzb96o468s4v.png" alt="data_set"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Data analysis:&lt;br&gt;
⋅ filter out and create sub-sets with Google Play Related ("termination/suspension") posts - they usually contain at least one of the following words/phrases in this list: &lt;code&gt;["google play account", "suspension", "suspended", "terminated","termination", "ban", "banned", "app removed"]&lt;/code&gt;&lt;br&gt;
⋅ normalize and structure data so data visualizations can be done &lt;br&gt;
⋅ inspect the amount and popularity (&lt;a href="https://bit.ly/2X1LP2o" rel="noopener noreferrer"&gt;karma&lt;/a&gt;) of these kind of posts (submissions)&lt;br&gt;
⋅ check out the monthly post dispersion on per year basis &lt;br&gt;
⋅ weigh-in Google play policy changes dates &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hypothesis: &lt;br&gt;
⋅ Google Play Related ("termination/suspension") posts are on the rise &lt;br&gt;
⋅ Google Play Related ("termination/suspension") posts flock right after some Google Play Policy change happens&lt;br&gt;
⋅ Google Play Related ("termination/suspension") posts are at the top of the posts when sorted by karma&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first place I went and the first question I wanted to answer is- are the Google Play Related ("termination/suspension") posts on the rise? &lt;br&gt;
The answer: yes.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxadwc44tel2jukdnxom3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxadwc44tel2jukdnxom3.png" alt="per year"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data shows a decline in these kind of submissions on r/androiddev with the lowest point being 2017 with around 60 and then it start rising to 175 in 2019. With the basic premise proven right, just in terms of quantity I wanted to explore the relationship between &lt;a href="https://bit.ly/2XrWUZs" rel="noopener noreferrer"&gt;Google Play Developer Policy Center updates&lt;/a&gt; and r/androiddev submission number fluctuations. &lt;/p&gt;

&lt;p&gt;Here is the total amount of updates per year:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdx5urde550etbnt8iggb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdx5urde550etbnt8iggb.png" alt="Google play updates"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As it can be easily concluded there's no clear link between the number of updates with the spike or number of Google Play "termination/suspension" submissions on r/androiddev - 2017 had 6 changes but least number of subbmisions to the subreddit. What can be further explored is to cross-reference the months when the updates have happened and the number of posts. Here's that dispersion, in which should be noted - the months on x-axis marked in red rectangle have Google Play Developer Policy Center updates (&lt;a href="https://bit.ly/2XrWUZs" rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F85nod0jwzlpol0nyy4ku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F85nod0jwzlpol0nyy4ku.png" alt="2015"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fstj6tngvxafzo23bx7sa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fstj6tngvxafzo23bx7sa.png" alt="2016"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8d54eb2fv4kqp6hxxla0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8d54eb2fv4kqp6hxxla0.png" alt="2017"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdexk15zn18x432tr67jv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdexk15zn18x432tr67jv.png" alt="2018"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frybcpe1u5qfc04wypj2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frybcpe1u5qfc04wypj2h.png" alt="2019"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's noticeable that more posts happen in a month with a policy change or the following period. To determine this further, the nature of the update must be inspected - which changes, theoretically yield more termination/suspension submissions and are they related. For example, in 2017 it can be observed that the biggest spike in submissions is in August. One possible route to pursue is to determine if the submissions are, let's say related to gambling apps, given the policy changes: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3r57df6ewkq3tdhs7wx6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3r57df6ewkq3tdhs7wx6.png" alt="august"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, this will not be point of interest in this research as it requires more resources and time, but is not excluded as a possibility for part 2? &lt;/p&gt;

&lt;p&gt;Another engaging matter of the research is to see how the community reacts to these submissions and how it values them - that can be seen trough karma (difference between upvotes and downvotes). Firstly, we get ambiguous results when the total karma is weighted against the karma that Google Play Related ("termination/suspension") posts got:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6tq7repzd2gzq3u5sa1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6tq7repzd2gzq3u5sa1c.png" alt="karma_total"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The picture is very different when top 10 submissions sorted by karma are matched against top 10 Google Play Related submissions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffdcca9ow9putpsk1nolz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffdcca9ow9putpsk1nolz.png" alt="karma_top"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As it can be seen, in 2019 the karma the community &lt;em&gt;"gave"&lt;/em&gt; to the top 10 posts is only twice as much as the karma given to Google Play related posts. On the other hand, the karma given to these kind of posts is also increasing. &lt;/p&gt;

&lt;p&gt;And finally, the percentage of Google Play related submissions in top 10 posts for the given year: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp98rwunlpctxviyfg6s7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp98rwunlpctxviyfg6s7.png" alt="play_posts_top"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To put it simply, one out of the top 10 submissions on r/androiddev in 2018 and 2019 has some relation to app termination or suspension. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discussion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal of this article is not to justify breaking of the polices or point fingers, rather than determine the status of the relationship between developers and their app publishing platform. The research is more centered on numbers rather than letters, meaning, the context of the submissions is not part of this research, something that can steer the conclusion in different direction. &lt;/p&gt;

&lt;p&gt;What numbers show is that this is valid point for discussion and apparently is something developers experience and want to talk about. Further research should have a goal of determining the rightfulness of these submissions, as well as their resolution - something that looks like it might be hard to measure in automated fashion.     &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Let's finish off on a bright note: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top 5 posts of r/androiddev per year&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;2015: &lt;a href="http://imgur.com/Fke2VEZ" rel="noopener noreferrer"&gt;1 (karma: 615)&lt;/a&gt;, &lt;a href="http://i.imgur.com/4AfRoJO.png" rel="noopener noreferrer"&gt;2 (karma: 466)&lt;/a&gt;, &lt;a href="http://www.reddit.com/r/androiddev/comments/300f6b/why_gplay_is_flawed_as_fuck_how_i_got_24k/" rel="noopener noreferrer"&gt;3 (karma: 416)&lt;/a&gt;, &lt;a href="http://imgur.com/IMPLLmS" rel="noopener noreferrer"&gt;4 (karma: 408)&lt;/a&gt;, &lt;a href="https://i.imgur.com/jsVvVET.png" rel="noopener noreferrer"&gt;5 (karma: 355)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2016: &lt;a href="https://www.reddit.com/r/androiddev/comments/570gco/facebook_stole_my_160000_for_those_who_use/" rel="noopener noreferrer"&gt;1 (karma: 1152)&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/4tm8i6/were_on_the_android_engineering_team_and_built/" rel="noopener noreferrer"&gt;2 (karma: 604)&lt;/a&gt;, &lt;a href="http://amilliondownloads.com/appgratis-2000-unincentivized-installs/" rel="noopener noreferrer"&gt;3 (karma: 534)&lt;/a&gt;, &lt;a href="http://imgur.com/H5YD24W" rel="noopener noreferrer"&gt;4 (karma: 522)&lt;/a&gt;, &lt;a href="https://codelabs.developers.google.com/" rel="noopener noreferrer"&gt;5 (karma: 463)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2017: &lt;a href="https://gfycat.com/VigorousPleasedHuman" rel="noopener noreferrer"&gt;1 (karma: 1146)&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/6bqlds/kotlin_is_officially_supported_on_android/" rel="noopener noreferrer"&gt;2 (karma: 1028)&lt;/a&gt;, &lt;a href="https://i.imgur.com/nQRdRR2.png" rel="noopener noreferrer"&gt;3 (karma: 990)&lt;/a&gt;, &lt;a href="https://i.redd.it/3cpsm85n6xnz.gif" rel="noopener noreferrer"&gt;4 (karma: 661)&lt;/a&gt;, &lt;a href="https://i.redd.it/lhiu0vx2c0uz.png" rel="noopener noreferrer"&gt;5 (karma: 660)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2018: &lt;a href="https://v.redd.it/rq3argkri3411" rel="noopener noreferrer"&gt;1 (karma: 824)&lt;/a&gt;, &lt;a href="https://i.redd.it/853haw907y311.jpg" rel="noopener noreferrer"&gt;2 (karma: 783)&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/96kpsf/more_issues_with_google_play_suspended_for_hate/" rel="noopener noreferrer"&gt;3 (karma: 692)&lt;/a&gt;, &lt;a href="https://i.redd.it/uqgchujdz4q01.jpg" rel="noopener noreferrer"&gt;4 (karma: 532)&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/8i73ic/its_official_google_officially_recommends_single/" rel="noopener noreferrer"&gt;5 (karma: 509)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019: &lt;a href="https://i.redd.it/lvuh305jie331.jpg" rel="noopener noreferrer"&gt;1 (karma: 705)&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/androiddev/comments/b2ztr0/google_terminated_our_startups_developer_account/" rel="noopener noreferrer"&gt;2 (karma: 655)&lt;/a&gt;, &lt;a href="https://i.redd.it/kx3uuzk66zd31.png" rel="noopener noreferrer"&gt;3 (karma: 544)&lt;/a&gt;, &lt;a href="https://i.redd.it/malxwvn1jt731.png" rel="noopener noreferrer"&gt;4 (karma: 536)&lt;/a&gt;, &lt;a href="https://i.redd.it/z1fb2ezlc9m21.png" rel="noopener noreferrer"&gt;5 (karma: 531)&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*As of &lt;a href="https://www.reddit.com/r/androiddev/comments/gj7xr4/mod_announcements_updated_rules/" rel="noopener noreferrer"&gt;May-14-2020&lt;/a&gt;, these posts are not allowed on r/androiddev&lt;/p&gt;

</description>
      <category>dataanalytics</category>
      <category>androiddev</category>
      <category>googleplay</category>
      <category>android</category>
    </item>
    <item>
      <title>Data gathering with python. An Example, get the tweets (part 2)</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Fri, 10 Apr 2020 12:08:53 +0000</pubDate>
      <link>https://dev.to/viksaaskool/data-gathering-with-python-an-example-get-the-tweets-part-2-1a76</link>
      <guid>https://dev.to/viksaaskool/data-gathering-with-python-an-example-get-the-tweets-part-2-1a76</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/viksaaskool/data-gathering-with-python-an-example-part-1-kic"&gt;previous post&lt;/a&gt;, the part one I've displayed how to automate part of the data gathering process where you know most of the constrains and you need to cut down the manual work of data entry. Namely, my challenge was that I wanted to get tweets from English (most resources for data analysis - sorry other languages 😩) speaking stand up comedians in predefined period.&lt;br&gt;
I've managed to produce &lt;code&gt;.csv&lt;/code&gt; file with name of the stand up comedian and respective twitter handle. Everything I need to gather(scrape) their tweets. &lt;/p&gt;

&lt;p&gt;There's few ways one can achieve this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Use Twitter API and preferred python library (there are a couple of good ones). &lt;br&gt;
PRO: you're using the API - you know what data you'll get regardless of the UI/structural changes&lt;br&gt;
CON(?): limited amount of options for free usage, that needs to be approved - there's a process where you need to apply and get the API Key as a result of a request for use processed successfully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;a href="https://pypi.org/project/GetOldTweets3/" rel="noopener noreferrer"&gt;GetOldTweets3&lt;/a&gt; (and variations of it)&lt;br&gt;
PRO: easy to use for very little amount of data &lt;br&gt;
CON: google "Too Many Requests"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use nasty library (&lt;a href="https://github.com/lschmelzeisen/nasty" rel="noopener noreferrer"&gt;NASTY Advanced Search Tweet Yielder&lt;/a&gt;).&lt;br&gt;
PRO: Easy to use, flexible&lt;br&gt;
CON: I haven't came across one&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since I've tried all the approaches, I'll present you with the colab in which the one I think works the best: nasty&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The result is &lt;code&gt;.csv&lt;/code&gt; file with the format (it's &lt;a href="https://github.com/lschmelzeisen/nasty/blob/69e68f47521fb6eb19d0c917b030072a32cef997/nasty/tweet/tweet.py#L45" rel="noopener noreferrer"&gt;this&lt;/a&gt; printed in rows):&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;After this the data needs to be cleaned, normalized and purified in order to be used for various purposes like sentiment analysis, topic modeling, labeling and so on.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
      <category>twitter</category>
      <category>python</category>
      <category>nasty</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Learn Python in 90 seconds!</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Wed, 08 Apr 2020 13:02:28 +0000</pubDate>
      <link>https://dev.to/viksaaskool/learn-python-in-90-seconds-4o1i</link>
      <guid>https://dev.to/viksaaskool/learn-python-in-90-seconds-4o1i</guid>
      <description>&lt;p&gt;It's quarantine days and everybody is doing something useful. I'm no different than the super cool people out there: I made the best tutorial for learning python on the Internet(s). The best part? It takes you 90 seconds to complete and after it you'll be fluent in python!&lt;/p&gt;

&lt;p&gt;Intrigued? Let's go then: &lt;a href="https://www.pythonin90sec.com/" rel="noopener noreferrer"&gt;pythonin90sec.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, it's a joke. Till next time. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn7ymil5olcq5f745g72s.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn7ymil5olcq5f745g72s.gif" alt="speaking python" width="272" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>joke</category>
    </item>
    <item>
      <title>Data gathering with python. An Example (part 1)</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Thu, 02 Apr 2020 09:09:47 +0000</pubDate>
      <link>https://dev.to/viksaaskool/data-gathering-with-python-an-example-part-1-kic</link>
      <guid>https://dev.to/viksaaskool/data-gathering-with-python-an-example-part-1-kic</guid>
      <description>&lt;p&gt;Big data, data science, machine learning, AI, deep learning, python - to a marketing person catchy selling point, to a mathematician interesting real life implementation of the language of nature, to a software engineer tools to solving real life problems (and help people become even lazier). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbit.ly%2F3dJUlJt" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbit.ly%2F3dJUlJt" alt="buzz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't be taken off by the poetic start of this post, there will be code.&lt;/p&gt;

&lt;p&gt;Myself and as I presume, many software engineers nowadays, want to get into data science, comprehend enough of the underlying processes and math so I/we can properly implement algorithms and approaches to data sets and utilize them in form of useful applications. &lt;br&gt;
Where do you start when you try to get into data science (in my case: &lt;a href="https://bit.ly/2yp2suW" rel="noopener noreferrer"&gt;NLP(Natural language processing)&lt;/a&gt;)?&lt;/p&gt;

&lt;p&gt;The data.&lt;br&gt;
&lt;a href="https://i.giphy.com/media/25OBBnY9j1uiVDV4lJ/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/25OBBnY9j1uiVDV4lJ/giphy.gif" alt="obviously"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had this problem - I wanted to gather tweets form stand up comedians in order to do analysis. My weapon of choice: python and &lt;a href="https://bit.ly/2UTzI4O" rel="noopener noreferrer"&gt;colab&lt;/a&gt; (Google's version of Jupiter notebooks)&lt;/p&gt;

&lt;p&gt;Problems: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to find the comedians? &lt;/li&gt;
&lt;li&gt;How to find the comedians on twitter? &lt;/li&gt;
&lt;li&gt;How to gather the tweet data (in separate post, coming soon)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wikipedia - find list of all English speaking comedians &lt;/li&gt;
&lt;li&gt;Automated google search for twitter handles &lt;/li&gt;
&lt;li&gt;Use TwitterAPI - a bit restrictive lately (or try tо scrape?)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The code:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Resulting file: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Filazwxz5a51tsnyj1zbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Filazwxz5a51tsnyj1zbi.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now is up to step 3... &lt;br&gt;
Easier approach: use the TwitterAPI via some of the many python SDKs (note: for which you need to apply and wait for a decision if you're going to get API key) - can't search the past&lt;br&gt;
More challenging approach: &lt;a href="https://bit.ly/2UXJtPP" rel="noopener noreferrer"&gt;scrape&lt;/a&gt; twitter (brace yourself for "To Many Requests" issue), something that I'll cover in separate post in near future. &lt;/p&gt;

&lt;p&gt;[SPOILER ALERT]: use &lt;a href="https://github.com/lschmelzeisen/nasty" rel="noopener noreferrer"&gt;nasty&lt;/a&gt;! &lt;/p&gt;

</description>
      <category>googlesearch</category>
      <category>python</category>
      <category>toomanyrequests</category>
      <category>colab</category>
    </item>
    <item>
      <title>#10YearChallenge</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Fri, 18 Jan 2019 16:35:30 +0000</pubDate>
      <link>https://dev.to/viksaaskool/10yearchallenge-17o4</link>
      <guid>https://dev.to/viksaaskool/10yearchallenge-17o4</guid>
      <description>&lt;p&gt;&lt;strong&gt;2009&lt;/strong&gt; | wow I can code!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dZ7LU9DH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ves4841typ8kdjm432lg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dZ7LU9DH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ves4841typ8kdjm432lg.png" alt="one"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2019&lt;/strong&gt; | writing modular, maintainable code. using fancy language features, writing blog posts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FQIA98aM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/k5lj9x7mi33us3mfmxkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FQIA98aM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/k5lj9x7mi33us3mfmxkv.png" alt="two"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>c</category>
      <category>joke</category>
    </item>
    <item>
      <title>So, Kotlin, ha?</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Sun, 09 Dec 2018 23:08:23 +0000</pubDate>
      <link>https://dev.to/viksaaskool/so-kotlin-ha-3957</link>
      <guid>https://dev.to/viksaaskool/so-kotlin-ha-3957</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdeveloper.android.com%2Fimages%2Fkotlin%2Fcode-samples%2Fcode-sample-large.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdeveloper.android.com%2Fimages%2Fkotlin%2Fcode-samples%2Fcode-sample-large.svg" alt="kotlin" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This blog post (originally titled “Late for the Kotlin party”) has been in the file cabinet since spring and the “see the light of the optical cable” moment was postponed, because of, reasons. By now the original title has become outdated, but I kept most of the original structure and I think that the advices and notes in the post will work well for newcomers, so let it be.&lt;/p&gt;

&lt;p&gt;You’re an Android developer and you’ve been slacking off learning Kotlin, staying in the comfort zone, maintaining Java code project(s), recently started Android and Java was overwhelming enough, or whatever the reason is - and now you’re figuring out that you’re kinda late? Well &lt;a href="https://dev.to/viksaaskool/getting-back-on-the-horse-174p"&gt;I guess so was I&lt;/a&gt; . This blog post is result of my Kotlin learning woes that I've structured in form of "Kotlin notes”/”point board”.&lt;br&gt;
It is what it is, you have to do it if you want to stay relevant and even if your current position might not require that from you, things might change and you might end up in this position. Buckle up, I’ve made a crash transition course. There are a lot of layers to this, but it’ll get you started. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xsaq4kuv13fy9aqomlm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xsaq4kuv13fy9aqomlm.gif" alt="buckle up" width="480" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s start with the resources, there are way too much resources and I’ll try to keep as tidy as possible:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://kotlinlang.org/docs" rel="noopener noreferrer"&gt;Kotlinlang docs&lt;/a&gt; - I know this is not the advice to give in the age of “googling everything”, but try to memorize as much as possible – like you’re studying for exam, a lot of things will be new and they might not have context but with trying out stuff and looking at examples the pieces will fall together. You won’t be able to memorize everything and you’ll need to come back from time to time, but I’ve found this approach very helpful and having those “aha, so that’s what they’ve meant with that/so that’s how I use this-and-this-thing” moments
To be noted, also: &lt;a href="https://developer.android.com/kotlin/" rel="noopener noreferrer"&gt;official Android documentation&lt;/a&gt; – as it comes to examples that matter you. You’ll come here when troubles arise just to have reality check that you’re not that smart and that component you thought was intuitive and you knew how it worked does not quite resemble the reality. &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blogs – dev.to/medium posts from enthusiast from the industry are probably the best source where you can learn new stuff – they are usually targeted and are result of some difficulty that was overcame by someone patient enough to derivate the effort into tutorial/github project/”copy – paste code”.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.mindorks.com/" rel="noopener noreferrer"&gt;Mindorks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/" rel="noopener noreferrer"&gt;Jlelse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://proandroiddev.com/" rel="noopener noreferrer"&gt;Proandroiddev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Books – there are couple books, but the one that I think cuts it – is "&lt;a href="https://wp.me/P30RI3-bm" rel="noopener noreferrer"&gt;Kotlin for Android Developers - Learn Kotlin the easy way while developing an Android App&lt;/a&gt;" by Antonio Leiva and if you have the means I recommend you get your hands to it. Dependent on your level will be the level of how useful you’ll find it (ideally you’ll create the app along reading, or just read it and try to replicate some of the code and concepts into your own idea/s), still be open there are always chances to learn new stuff.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.reddit.com/r/androiddev" rel="noopener noreferrer"&gt;r/androiddev/&lt;/a&gt; - stay up-to-date everything including Kotlin – read it once or twice a week. Or daily, with the coffee mug. Great community that can also help with some issues and point out for you other learning resources. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you go trough the resources and get a bit knowledge on the matter you'd like to see examples and how the pros are doing it. &lt;a href="https://www.netguru.co/blog/10-android-apps-written-in-kotlin" rel="noopener noreferrer"&gt;This article&lt;/a&gt; points out 10 Android apps that are written in Kotlin and are open source on Github, I suggest you check them out a little bit latter, when you start coding in Kotlin and get stuck or look for ideas to solve something. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First thing you hear when Kotlin witness knocks on your door is that NullPointerException doesn’t exist anymore and your life will get easier. Yeah, you also need to learn a bunch of new stuff and there are A LOT of new stuff. I know, I know, like every good programming story starts, this one also starts with a lie - that it’ll take you just few days. Amm, no. It’s different from Java and no matter what they say, it takes time (effort) to get familiar with the new terms, paradigms and then to know when to apply{} them (needless to say, pun intended). Yes, you can read Kotlin code even if you never written one line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkxifbtv9zh1qmw4m7qe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkxifbtv9zh1qmw4m7qe.png" alt="Goodbye NullPointerException, everything will work perfectly now" width="363" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything starts with &lt;a href="https://is.gd/qhtNxY" rel="noopener noreferrer"&gt;Any&lt;/a&gt;. Here are the basics: &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;This doesn't look so bad right? Let's go with more complex subjects, remember those Utils classes you’ve been copy-pasting from project to project? Well, you don’t need to now, you can replace them with extensions for the most part or change the structure a bit. To be noted, some more interesting concepts like lambdas (that have been around), inline functions are introduced that will yield the wanted result - making modular, reusable code snippets and blocks, happen with less work. These concepts come along with a lot of baggage and there's a steep learning curve since some of the examples might look too abstract and then real life app usage might seem too complex and hard to understand. I'll just throw them out there, yet it'll take time and effort to be able to know and understand when to use them. Probably the easiest and most intuitive part of the code when you come across these concept is when you build your util classes or when you handle events and callbacks. Start from there and build from that. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Let’s dwell into something you’ll come across and use frequently – high-order functions that implement idiomatic patters – apply, let, also and run/with. The concept is introduced in the standard Kotlin library and they are meant to help the developer achieve more with writing less – a very rough, Java-resembling explanation of the functions is that they are “enhancement” of this. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;This table sums it all up and how time passes and you get experience, it’ll become more and more apparent:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohwu5hmw6rre6gv1wli4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohwu5hmw6rre6gv1wli4.png" alt="let apply it" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, making decisions is hard: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0fz6i4s2wti2o5zsfet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0fz6i4s2wti2o5zsfet.png" alt="decision making is hard" width="761" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On this subject, &lt;a href="https://is.gd/rZFwZD" rel="noopener noreferrer"&gt;here’s a great blog post&lt;/a&gt; that you should read.&lt;/p&gt;

&lt;p&gt;Another thing that's specific to Kotlin are Delegated properties, based on the delegation pattern, which by definition  is an object-oriented design pattern that allows object composition to achieve the same code reuse as inheritance. The explanation in Android terms can be simplified as value assignment to property under certain conditions.Delegates can be standard from Kotlin and custom, defined by the developer. In the following gist, more details: &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
  

&lt;p&gt;Regardless of the language, you should use generics and more importantly you need to know when and why to use them. By trying to make your code look fancy you might end up over-engineering the whole damn thing, but that's a general rule and subject out of the scope of this blog post. Some simple examples how generics are done in Kotlin:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;One new thing that has been out there for a while, but now with Kotlin is introduced in Android are Coroutines. The main purpose of Couroutines is to tak over the async/background-running parts of the app and make them smoother and nicer. That's in theory. There are few resources on this and even though rock star part of the community has already started using them, it might be too early for you to implement these in more serious project. &lt;a href="https://is.gd/M56xXH" rel="noopener noreferrer"&gt;Here are the basics&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You should take into account other subjects that are complex regardless of the language, but do have some specifics, like &lt;a href="https://is.gd/26dsPD" rel="noopener noreferrer"&gt;implementing patterns&lt;/a&gt; and when to use them. Architectures that are popular and have pretty detailed explanation and examples can be found here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://is.gd/ECjChQ" rel="noopener noreferrer"&gt;MVP (Vanilla MVP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://is.gd/iHAHqM" rel="noopener noreferrer"&gt;MVVM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;some people like &lt;a href="https://fueled.com/?p=23532" rel="noopener noreferrer"&gt;MVI&lt;/a&gt;, but I'd recommend you say no to MVI &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watch out when you implement Dagger. Things get funky and you need to use some of the things discussed in the gists above in order to make it work. The official coffee maker documentation is not very intuitive, so for more &lt;a href="https://is.gd/M5LPgd" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://is.gd/50dI0e" rel="noopener noreferrer"&gt;here&lt;/a&gt; (alternative: &lt;a href="https://is.gd/8cmmJM" rel="noopener noreferrer"&gt;Koin&lt;/a&gt;, with caution). &lt;/p&gt;

&lt;p&gt;Very popular Kotlin library that makes Android development easier - &lt;a href="https://github.com/Kotlin/anko" rel="noopener noreferrer"&gt;Anko&lt;/a&gt;. Suggestion - don't use it until you get grasp of things.&lt;/p&gt;

&lt;p&gt;Last, but not least - testing - a bit different, but that is such a broad subject that will probably be touched upon in some other blog post in the near future. &lt;/p&gt;

&lt;h2&gt;
  
  
  tl;dr -&amp;gt; How is Kotlin different from Java:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;New syntax, obviously - funky (and useful stuff)&lt;/li&gt;
&lt;li&gt;No NullpointerException (by default)&lt;/li&gt;
&lt;li&gt;String Literals &lt;/li&gt;
&lt;li&gt;Companion objects&lt;/li&gt;
&lt;li&gt;Delegates (lateinit, by lazy)&lt;/li&gt;
&lt;li&gt;Lambdas (are everywhere)&lt;/li&gt;
&lt;li&gt;let, apply, also, it, when, run - rough explanation: enhancements of "this."&lt;/li&gt;
&lt;li&gt;Overriding properties&lt;/li&gt;
&lt;li&gt;Data classes (no more getters and setters) &lt;/li&gt;
&lt;li&gt;Sealed Classes&lt;/li&gt;
&lt;li&gt;Inline classes&lt;/li&gt;
&lt;li&gt;Extensions (say goodbye to ___Utils.class)&lt;/li&gt;
&lt;li&gt;Inline functions&lt;/li&gt;
&lt;li&gt;Function types &lt;/li&gt;
&lt;li&gt;Functions with variable number of arguments (Varargs)&lt;/li&gt;
&lt;li&gt;Operator overloading&lt;/li&gt;
&lt;li&gt;Coroutines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To wrap it up on a Zen note, to self and whoever got to here by reading: you can’t use everything at once and you can’t know everything. Some things that are hot and all the cool kids are using them, are going to get extinct before you know it. Others are here to stay. In a sense everything in the industry is hype, things are fast changing (and evolving) and you should adopt to the changes fast. Only a fool can think that Kotlin is gonna disappear anytime soon, so all feelings aside, this is (and will be) the way to go when it comes to Android development.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod2hpdazoavlzssynzf0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod2hpdazoavlzssynzf0.gif" alt="good luck" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. This tutorial (in form of workshop) from &lt;a href="https://is.gd/mouA2b" rel="noopener noreferrer"&gt;Yelp's GitHub&lt;/a&gt; is just awesome!&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>notes</category>
    </item>
    <item>
      <title>Getting back on the horse</title>
      <dc:creator> ViksaaSkool </dc:creator>
      <pubDate>Tue, 28 Aug 2018 21:29:43 +0000</pubDate>
      <link>https://dev.to/viksaaskool/getting-back-on-the-horse-174p</link>
      <guid>https://dev.to/viksaaskool/getting-back-on-the-horse-174p</guid>
      <description>&lt;p&gt;We’re more than half way through 2018 and I’ve learned not to take things for granted. Very basic things like, walking and playing sports. Below, my left ankle &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnvvyekexdtjuggm16qa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnvvyekexdtjuggm16qa.png" alt="broken ankle" width="691" height="924"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was playing football (soccer) in early February and thought a tackle to save a goal would be smart thing to do – learnt the hard way, it wasn’t. At the moment of writing this blog post it’s been more than 6 months – doing daily activites feels like it never happened. I’ve started running, doing some light agility exercises and probably in 2 months I’ll be able to play football again (yeah, I have to get back on the field, otherwise I haven’t really beaten the injury have I?). For about 50 days I wasn’t able to walk and I was off work, I know – you code with your hands, the injury shouldn’t be a problem – well mentally it was really hard, after reading tons of horror stories about broken ankle, which the Internet is full of – I couldn’t concentrate. It was lightly reading some Kotlin related stuff, blogs, &lt;a href="https://is.gd/VSewCo" rel="noopener noreferrer"&gt;r/androiddev&lt;/a&gt; nothing too involved. Around 70 days with no coding.&lt;/p&gt;

&lt;p&gt;The one other thing that I took for granted and was kinda taken away from me with this injury was coding form and coding enthusiasm. &lt;/p&gt;

&lt;p&gt;The rule of thumb that I learned in physio sessions is that the time you’ll need to be walking normally again and do basic stuff with no problems equals the amount of time that you weren’t able to walk – I think this is somewhat applicable in the coding world. If you leave yourself away from IDEs for X amount of time you’ll need X amount of time to get back in the game. In my case 2 months of NO coding at all, really meant 2 months of hard work in the Android Studio and I still feel that I have some catching up to do. In this period, I’ve read &lt;a href="https://is.gd/895IRP" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt; that got me feeling uneasy about the situation. It’s a quality one, take the time to read it, plus there’s valuable comment section too. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4c673ciafku8e1jioww.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4c673ciafku8e1jioww.gif" alt="get back on the horse" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyways, that’s not what this blog post is about. This is about how to feel good about coding and some practical steps towards it.  Remember, coding (and IT in general) is a very rapidly moving field, just a little staling in keeping track of the industry pulse might have fierce consequences. So, here it is, if you ever find yourself in similar position for whatever reason, a short list of what nows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Everything has a price.&lt;/strong&gt; &lt;br&gt;
Getting back on the horse will take something away from you and your current state. Panic, so you can organize. Make your amendments. You’ll have to give something away – most likely it’ll be social life and sleep. Nothing can substitute the hours you put in to learn new stuff, no one can do it for you. You’ll have to do your all-nighters on your own. Patience and dedication is key. In my case I chose to give away sleep, social life (weekend fun, not all of it) and TV shows.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Work on your own project.&lt;/strong&gt; &lt;br&gt;
Detail out an idea you want to work on make a plan, possibly open a trello board. Make rough, but realistic deadlines for it. Make a realistic schedule when you can work on the tasks, but be demanding. You need to make up for lost time for whatever the reason is – push yourself. If you’re not experienced or a lot of time has passed – find a project on github/android examples go through it and try to replicate it (with as little copy-pasting as possible and when you do that make sure you understand what are you copy-pasting). Take time to grasp the things you don’t understand, if you get stuck ask somebody that has more experience, just don’t auto-pilot and go the extra mile. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Get involved, geek out&lt;/strong&gt;&lt;br&gt;
At work, be more demanding of yourself– take tasks that you haven’t worked on before, implement features that you’re not that familiar with. Write unit tests. Put yourself in calculated risks and take more responsibility. &lt;br&gt;
Get back into the community talks if you were away from that too. Most big tech hubs have weekly meetings for user groups, find one and join – people there are enthusiasts, sharing ideas, talking about problems helps. If that’s not an option, check out the Internets.&lt;/p&gt;

&lt;p&gt;These are harder that might look on the first glance and it cannot be stressed enough, you must get your head right – discipline and dedication. It sounds like cheap motivational talk, but you have to give a 110% and ride the hamster wheel until you feel comfortable again. Then you can tone it down a notch. &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
    </item>
  </channel>
</rss>
