<?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: Dougy Lee</title>
    <description>The latest articles on DEV Community by Dougy Lee (@dougylee).</description>
    <link>https://dev.to/dougylee</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%2F550320%2F2eac47fe-3a8f-415f-8de8-9b7876ddd968.png</url>
      <title>DEV Community: Dougy Lee</title>
      <link>https://dev.to/dougylee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dougylee"/>
    <language>en</language>
    <item>
      <title>[Android Dev] Add Google Maps Quick and Dirty</title>
      <dc:creator>Dougy Lee</dc:creator>
      <pubDate>Tue, 03 Aug 2021 00:05:54 +0000</pubDate>
      <link>https://dev.to/dougylee/android-dev-add-google-maps-quick-and-dirty-4kf9</link>
      <guid>https://dev.to/dougylee/android-dev-add-google-maps-quick-and-dirty-4kf9</guid>
      <description>&lt;p&gt;Sometimes we just want to add a Google Maps activity into a proof-of-concept or just a test project.&lt;/p&gt;

&lt;p&gt;We want &lt;strong&gt;less overhead&lt;/strong&gt; of making it well engineered.&lt;br&gt;
We just want to &lt;strong&gt;get it running&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Use the Preset
&lt;/h2&gt;

&lt;p&gt;The easiest way to get started on Google Maps is to use the preset Google Maps activity.&lt;/p&gt;

&lt;p&gt;This is a template that adds the code to insert a Google map video into your app.&lt;/p&gt;

&lt;p&gt;The code here is functional so you don't have to do too much to get it working.&lt;br&gt;
&lt;a href="https://developers.google.com/maps/documentation/android-sdk/get-api-key"&gt;The documentation&lt;/a&gt; is very easy to read and the steps are few.&lt;/p&gt;




&lt;h2&gt;
  
  
  Starting from nothing
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You'll need to set up &lt;a href="https://developers.google.com/maps/documentation/android-sdk/cloud-setup"&gt;Google Cloud console&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new project inside the Google Cloud console. &lt;a href="https://console.cloud.google.com/project/_/google/maps-apis/credentials"&gt;Enable the Google Maps platform credentials&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy and paste the API key into the metadata tag in the Android manifest.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="MAPS_API_KEY" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Google Maps template activity uses view binding which can be confusing for new users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The way we handle the API key is not very secure since we are directly adding it into our manifest file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
    </item>
    <item>
      <title>Beginner Exercises - Android Lists</title>
      <dc:creator>Dougy Lee</dc:creator>
      <pubDate>Thu, 08 Jul 2021 01:14:30 +0000</pubDate>
      <link>https://dev.to/dougylee/android-practice-recreating-layouts-from-popular-android-apps-5cpa</link>
      <guid>https://dev.to/dougylee/android-practice-recreating-layouts-from-popular-android-apps-5cpa</guid>
      <description>&lt;p&gt;Following on from my previous post about &lt;a href="https://dev.to/taresin/practice-them-skills-404g"&gt;practicing your Dev skills&lt;/a&gt;, Let's practice creating layouts with a RecyclerView.&lt;/p&gt;




&lt;h2&gt;
  
  
  A quick RecyclerView recap
&lt;/h2&gt;

&lt;p&gt;RecyclerViews are good at displaying your data as a scrollable list of items.&lt;/p&gt;

&lt;p&gt;However, there's a bunch of steps involved in displaying the data in these views which may seem daunting for someone new.&lt;/p&gt;

&lt;p&gt;The reason why it is more complicated is because they have used a way of writing code called the adapter pattern.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RecyclerViews are the view.&lt;/li&gt;
&lt;li&gt;Your feed the RecyclerView object called an adapter.&lt;/li&gt;
&lt;li&gt;Your feed the adapter a list of data that you want to display.&lt;/li&gt;
&lt;li&gt;You write code in this adapter to convert your data into a view.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are a lot of little magic tricks that the RecyclerView does such as showing and hiding view holders but I will not go into that detail here.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;I have picked a layout from the Play Store screenshots for three popular apps -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gmail Go&lt;/li&gt;
&lt;li&gt;WhatsApp and &lt;/li&gt;
&lt;li&gt;Tinder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qrHp11xr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vx7wunyx07koyp8bzkfx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qrHp11xr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vx7wunyx07koyp8bzkfx.png" alt="Screenshots of lists on Gmail, WhatsApp and Tinder apps"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many parts involved in building screens like these.&lt;/p&gt;

&lt;p&gt;So for the exercise I will focus on building the RecyclerView and maybe add some of the smaller UI elements like the title bar and the floating action button for fun afterwards.&lt;/p&gt;

&lt;p&gt;The engineer's that work for these companies spend a lot of time adding features to the screens. Even If we simply copied all the functionality from the screens, we would not get very far in a session of practice time.&lt;/p&gt;

&lt;p&gt;The key skills that I want to practice today are creating the layouts and displaying them onto a RecyclerView.&lt;/p&gt;

&lt;p&gt;We will call the session finished when we have the layouts displaying on the screen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Assessing the Work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Data Model&lt;/li&gt;
&lt;li&gt;Layout(s)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's analyze each of the designs.&lt;/p&gt;

&lt;p&gt;It's helpful to think about the data that we are going to receive.&lt;/p&gt;

&lt;p&gt;Sometimes at work, you'll have a data model defined for you by a back end service that you’re calling data from.&lt;/p&gt;

&lt;p&gt;Other times, you’ll have to define your own.&lt;/p&gt;

&lt;p&gt;For this exercise we will need to define our own since we are just using some dummy data to display onto the screen.&lt;/p&gt;




&lt;h3&gt;
  
  
  WhatsApp
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--18BmGDQN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dyz3hiefza4o2d89l4l7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--18BmGDQN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dyz3hiefza4o2d89l4l7.png" alt="WhatsApp layout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This design is the easiest out of the three since the layouts for each chat item are all the same.&lt;/p&gt;

&lt;h4&gt;
  
  
  Data
&lt;/h4&gt;

&lt;p&gt;We only need one data object type to represent the “chat”.&lt;/p&gt;

&lt;p&gt;Attributes for this chat object that we need to display:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat image&lt;/li&gt;
&lt;li&gt;Chat title&lt;/li&gt;
&lt;li&gt;Chat subtitle&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Unread messages count&lt;/li&gt;
&lt;li&gt;Is sent and read flag &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To simplify our dummy data we will Represent I'll timestamp as a string and we will ignore the typing status.&lt;/p&gt;

&lt;h4&gt;
  
  
  Layout
&lt;/h4&gt;

&lt;p&gt;The layout is pretty straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile image on the left&lt;/li&gt;
&lt;li&gt; text in the middle&lt;/li&gt;
&lt;li&gt; status indicators on the right&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Gmail
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_m5SW_48--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ickopl2952r9beh3y228.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_m5SW_48--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ickopl2952r9beh3y228.png" alt="Gmail Layout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Data
&lt;/h4&gt;

&lt;p&gt;Based on the design that we see, there seems to be two different sections:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The top part of the RecyclerView shows a bunch of email categories.&lt;/li&gt;
&lt;li&gt;The bottom part shows individual emails.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From this information, we can try to create objects for each of these concepts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; an email category object&lt;/li&gt;
&lt;li&gt; an email object&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we know what kind of objects that we need, let's list out all the things that we want to show onto the screen and add them as attributes of these objects.&lt;/p&gt;

&lt;p&gt;The category object needs to have these attributes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Icon&lt;/li&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Subtitle&lt;/li&gt;
&lt;li&gt;Tint colour&lt;/li&gt;
&lt;li&gt;Email count&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The email object need to have these attributes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Icon&lt;/li&gt;
&lt;li&gt;Sender&lt;/li&gt;
&lt;li&gt;Subject&lt;/li&gt;
&lt;li&gt;First line&lt;/li&gt;
&lt;li&gt;Time stamp&lt;/li&gt;
&lt;li&gt;Is calendar flag&lt;/li&gt;
&lt;li&gt;Is starred flag&lt;/li&gt;
&lt;li&gt;Has attachment flag&lt;/li&gt;
&lt;li&gt;Label&lt;/li&gt;
&lt;li&gt;Is Unread&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order to save time and not lose focus on my goal of practicing layouts, I am modeling things like the time stamp as hard coded strings Instead of normal timestamps which are usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A long integer for Unix time&lt;/li&gt;
&lt;li&gt;A formatted string in a common date and time format e.g. (“2001-07-04T12:08:56.235-0700”)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Layout
&lt;/h4&gt;

&lt;p&gt;There are two different types of layouts used in this RecyclerView:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One layout for displaying an email category&lt;/li&gt;
&lt;li&gt;One layout for displaying an email item &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The two layouts look very similar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They both have some kind of icon on the left as a visual cue for the user&lt;/li&gt;
&lt;li&gt;They have some text in the middle&lt;/li&gt;
&lt;li&gt;They have tags and buttons on the right&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though they look very similar, I wouldn't use the same layout for both of them.&lt;/p&gt;

&lt;p&gt;I would opt to keep the layouts separate since these are conceptually distinct.&lt;/p&gt;

&lt;p&gt;In this way, if we wanted to change the look and feel for one of them, we do not have to change or test the other.&lt;/p&gt;

&lt;p&gt;When building the RecyclerView to handle two different types of layouts we can make use of the getViewType() function of the RecyclerView adapter.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tinder
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fZrfHuVX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z3dzdhuxk467qmbmo6z4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fZrfHuVX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z3dzdhuxk467qmbmo6z4.jpg" alt="Tinder Layout"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Data
&lt;/h4&gt;

&lt;p&gt;Just like the Gmail app, the Tinder app has two sections in this screenshot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New matches&lt;/li&gt;
&lt;li&gt;Messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can model this using these classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A profile class

&lt;ul&gt;
&lt;li&gt;Image&lt;/li&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;A message class

&lt;ul&gt;
&lt;li&gt;Profile&lt;/li&gt;
&lt;li&gt;Last Message &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The way we serve this up to the adapter is to create a list of profiles to represent the new matches.&lt;/p&gt;

&lt;p&gt;We will also provide a list of message objects to the adapter to display the message section &lt;/p&gt;

&lt;h4&gt;
  
  
  Layout
&lt;/h4&gt;

&lt;p&gt;In this design, we can break down the RecyclerView into different types of rows: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Section header&lt;/li&gt;
&lt;li&gt;New matches horizontal gallery&lt;/li&gt;
&lt;li&gt;Message row&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just like the Gmail app, we will need to use multiple layouts for each of the different row types.&lt;/p&gt;

&lt;p&gt;We will build the horizontal gallery as a nested RecyclerView.&lt;/p&gt;




</description>
      <category>android</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Practice Your Dev Skills</title>
      <dc:creator>Dougy Lee</dc:creator>
      <pubDate>Mon, 05 Jul 2021 22:38:59 +0000</pubDate>
      <link>https://dev.to/dougylee/practice-them-skills-404g</link>
      <guid>https://dev.to/dougylee/practice-them-skills-404g</guid>
      <description>&lt;h2&gt;
  
  
  Practice Them Skills
&lt;/h2&gt;

&lt;p&gt;The saying "practice makes perfect" goes no further than the truth.&lt;/p&gt;

&lt;p&gt;Skills are honed by spending hours of practice so that you get better in your craft.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Soccer players do drills.&lt;br&gt;
Musicians play scales.&lt;br&gt;
Coders copy and paste…&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Forgetting to Practice
&lt;/h2&gt;

&lt;p&gt;Sometimes as a developer you forget that you actually do have to put in the hours.&lt;/p&gt;

&lt;p&gt;It's really tempting to simply knuckle down and keep forging ahead on work or your pet project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a nice dashboard&lt;/li&gt;
&lt;li&gt;Optimize your splash page to load up faster &lt;/li&gt;
&lt;li&gt;Add Lottie animations&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these activities are not bad.&lt;br&gt;
In fact, they are really good for exposing yourself to new problems all the time.&lt;/p&gt;

&lt;p&gt;These tasks train you for encountering the unknown and you gain very good skills from doing these as well.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Researching quickly&lt;/li&gt;
&lt;li&gt;Googl-ing the right things&lt;/li&gt;
&lt;li&gt;Integrating it with your existing environment&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Work is NOT Practice!
&lt;/h2&gt;

&lt;p&gt;However, there are some things we can get better at by doing things more.&lt;/p&gt;

&lt;p&gt;For an app developer, it's really easy to just think “Oh, I've done this once before so I have got it down pat.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7OnPwJhe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5kii4zn7u7vuqgfnt7d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7OnPwJhe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5kii4zn7u7vuqgfnt7d.jpg" alt="Mind Blown Meme Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes it's when we figure out some solution for a problem and end up copying and pasting that bit of code in other sections of our code...&lt;/p&gt;

&lt;p&gt;We might try to be smarter by creating a function that embodies this code so that we don't have to write it multiple times...&lt;/p&gt;

&lt;p&gt;The end result is that we have only written this code from scratch once.&lt;br&gt;
This is great for a work stand point. Your company doesn't want to pay 3x or 4x engineers to each solve the same problem.&lt;br&gt;
However, as an individual, if you got to do that solution at work, chances are, you only get to do it once.&lt;/p&gt;

&lt;p&gt;Your only chance to do the same thing again is if you move companies, or another team/ code-base.&lt;/p&gt;




&lt;h2&gt;
  
  
  DRY is the Enemy of Repetitive Practice
&lt;/h2&gt;

&lt;p&gt;In our line of work, we rarely see the same problem multiple times. &lt;br&gt;
If we try to apply the DRY principle (Don’t Repeat Yourself), where we minimize the number of times we have to write the same code, we do not get a lot of practice time into our skills.&lt;/p&gt;

&lt;p&gt;If we were basing our practice solely on work, then we get a lot of breadth in the problems that we solve but not a lot of depth in our learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dougy Practice Time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;I want to create a blog where you can follow along in my attempt to spend time practicing my craft of Android development.&lt;/p&gt;

&lt;h3&gt;
  
  
  What do I get from all this practice?
&lt;/h3&gt;

&lt;p&gt;What I hope to see in a week or a month of active practice is a better handling of the tools that I have (particularly Android Studio) as well as being smoother in writing solutions to common problems.&lt;/p&gt;

&lt;h4&gt;
  
  
  Estimation
&lt;/h4&gt;

&lt;p&gt;As a byproduct of this exercise, I am hoping to be better able to estimate tasks.&lt;br&gt;
This will be great for work -&lt;br&gt;
Scrum masters are always wanting estimates on particular tasks.&lt;br&gt;
This will be great for me -&lt;br&gt;
I will have a better measure of my skills &lt;br&gt;
As an example, I would like to see the time for me to create a layout reduce from say 20 minutes to 10.&lt;/p&gt;

&lt;h4&gt;
  
  
  Achievement
&lt;/h4&gt;

&lt;p&gt;The more that I practice, the more mastery I have…&lt;/p&gt;

&lt;p&gt;The more Mastery I have, the more flow time I will be in…&lt;/p&gt;

&lt;p&gt;And my hypothesis is that the more time I spend in flow, the more feeling of achievement I will get.&lt;/p&gt;

&lt;p&gt;There's a great sense of satisfaction in computer game speedrunners achieving their personal bests.&lt;br&gt;
Why should something like cutting time in creating a complex layout quickly be any different?&lt;/p&gt;

&lt;h4&gt;
  
  
  Value Creation
&lt;/h4&gt;

&lt;p&gt;A core tenet of business is that you create value for your customer.&lt;br&gt;
Customers pay you because you bring value to them.&lt;br&gt;
They are MORE happy when you bring MORE value.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Practice your coding skills by solving the same problem from scratch a few times.&lt;br&gt;
I would like to track my progress here and see what I gain out of getting more efficient at Android development.&lt;br&gt;
I will post the little tips and tricks I find here as I come across them.&lt;/p&gt;




&lt;p&gt;This is a Dev.to repost from a blog that I'm kickstarting while I learn how to write online: &lt;a href="http://blog.androiddougy.com"&gt;Android Dougy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've only just started my blogging journey and I'd love your feedback on what kinds of posts you'd like to see.&lt;/p&gt;

&lt;p&gt;Whether it's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resources I went through&lt;/li&gt;
&lt;li&gt;Tool showcase&lt;/li&gt;
&lt;li&gt;Development best practices&lt;/li&gt;
&lt;li&gt;Exercises&lt;/li&gt;
&lt;li&gt;[Insert your own idea]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know in the comments below!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>watercooler</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Learning Blog: Android Navigation Components</title>
      <dc:creator>Dougy Lee</dc:creator>
      <pubDate>Wed, 03 Feb 2021 18:57:10 +0000</pubDate>
      <link>https://dev.to/dougylee/learning-blog-android-navigation-components-38g</link>
      <guid>https://dev.to/dougylee/learning-blog-android-navigation-components-38g</guid>
      <description>&lt;p&gt;Practicing Android components by creating a sample app.&lt;/p&gt;

&lt;p&gt;Following the developer guides &lt;a href="https://developer.android.com/guide/navigation"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>android</category>
    </item>
    <item>
      <title>Learning Blog: Kotlin Flows</title>
      <dc:creator>Dougy Lee</dc:creator>
      <pubDate>Wed, 03 Feb 2021 00:45:14 +0000</pubDate>
      <link>https://dev.to/dougylee/learning-blog-kotlin-flows-5foc</link>
      <guid>https://dev.to/dougylee/learning-blog-kotlin-flows-5foc</guid>
      <description>&lt;p&gt;Tutorial: &lt;a href="https://www.raywenderlich.com/9799571-kotlin-flow-for-android-getting-started"&gt;Ray Wenderlich&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  About
&lt;/h1&gt;

&lt;p&gt;Kotlin Flows are a Kotlin implementation of Reactive Stream.&lt;br&gt;
It is quite powerful and has the potential to remove the need for RxJava for Android projects.&lt;/p&gt;

</description>
      <category>android</category>
    </item>
    <item>
      <title>Learning Blog: Linear Regression</title>
      <dc:creator>Dougy Lee</dc:creator>
      <pubDate>Mon, 18 Jan 2021 04:41:41 +0000</pubDate>
      <link>https://dev.to/dougylee/coursera-machine-learning-course-notes-23p4</link>
      <guid>https://dev.to/dougylee/coursera-machine-learning-course-notes-23p4</guid>
      <description>&lt;p&gt;Follow my Machine Learning progress: &lt;a href="https://mm.tt/1769172662?t=88ixFVZWbc"&gt;Link here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Coursera Link: &lt;a href="https://www.coursera.org/learn/machine-learning/home/welcome"&gt;Coursera&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Preface:
&lt;/h2&gt;

&lt;p&gt;I tried this course 6 years ago and found it very difficult because I couldn't get my head around the math.&lt;br&gt;
I am determined to try it again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I found it very helpful to write out the equations in long form on a piece of paper and reduce it into a vector notation&lt;/li&gt;
&lt;li&gt;I also found it helpful to do the partial derivative with the expanded version to get to the result that was presented by Andrew Ng&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Milestones:
&lt;/h2&gt;

&lt;p&gt;[x] Viewed coursework&lt;br&gt;
[x] Install octave&lt;br&gt;
[x] Finish assignment&lt;/p&gt;

</description>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Learning Android: Adaptive Icons</title>
      <dc:creator>Dougy Lee</dc:creator>
      <pubDate>Sun, 17 Jan 2021 22:44:41 +0000</pubDate>
      <link>https://dev.to/dougylee/android-adaptive-icons-1l2a</link>
      <guid>https://dev.to/dougylee/android-adaptive-icons-1l2a</guid>
      <description>&lt;p&gt;Adaptive icons were introduced in Android 8 (Oreo | API 26) to add a bit of design flair to your launcher icons.&lt;/p&gt;

&lt;p&gt;The feature allows the user's OEM to determine a mask to apply onto your launcher icon (e.g. cut a square icon, squircle icon)&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Points:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Foreground/Background layers: 108 x 108 dp&lt;/li&gt;
&lt;li&gt;Only works with API 26+

&lt;ul&gt;
&lt;li&gt;Move your adaptive icon file to res/mipmap/anydpi-26&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Icons for earlier versions use 48 x 48 dp icons&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Android Manifest&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;application
    …
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    …&amp;gt;
&amp;lt;/application&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;res/mipmap/anydpi-26&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;
    &amp;lt;background android:drawable="@drawable/ic_launcher_background" /&amp;gt;
    &amp;lt;foreground android:drawable="@drawable/ic_launcher_foreground" /&amp;gt;
&amp;lt;/adaptive-icon&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive"&gt;Android Developer Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stylingandroid.com/adaptive-icons/"&gt;Styling Android Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
    </item>
  </channel>
</rss>
