<?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>Forem: Wajahat Karim 🇵🇰</title>
    <description>The latest articles on Forem by Wajahat Karim 🇵🇰 (@wajahatkarim).</description>
    <link>https://forem.com/wajahatkarim</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%2F106012%2F8614cc50-bc5d-43d2-89b5-ae1fbe54a523.png</url>
      <title>Forem: Wajahat Karim 🇵🇰</title>
      <link>https://forem.com/wajahatkarim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/wajahatkarim"/>
    <language>en</language>
    <item>
      <title>How to Build a HIPAA Compliant Telehealth App for Android (Zocdoc Clone)</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Thu, 11 Feb 2021 00:00:43 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/how-to-build-a-hipaa-compliant-telehealth-app-for-android-zocdoc-clone-2b7d</link>
      <guid>https://forem.com/wajahatkarim/how-to-build-a-hipaa-compliant-telehealth-app-for-android-zocdoc-clone-2b7d</guid>
      <description>&lt;p&gt;A major result of the Covid-19 pandemic has been &lt;a href="https://www.cometchat.com/blog/telehealth-trends"&gt;the rapid widespread adoption of telehealth technologies&lt;/a&gt;. Usage of apps like &lt;a href="https://www.zocdoc.com/"&gt;Zocdoc&lt;/a&gt; have grown dramatically, and have allowed patients to connect with their doctors virtually through text chat and audio/video calls. The demand for these and similar services has skyrocketed, with no indication it will slow down, even after the pandemic is over.&lt;/p&gt;

&lt;p&gt;As an indie Android developer, advanced chat features like read receipts or push notifications in your healthcare app can be tricky and therefore time-consuming to implement which is why I look to &lt;a href="https://cometchat.com/"&gt;CometChat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;CometChat is a flexible developer tool that bridges the gap between what users expect (a complete chat experience) and the technical requirements we get as Android developers. In this tutorial, we will build a simple clone UI of Zocdoc app with some functionality through which patients and doctors can communicate directly using the open-source &lt;a href="https://github.com/cometchat-pro/android-java-chat-ui-kit"&gt;CometChat Java Chat UI Kit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/ZocDoc_AppDemo.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nBt_PgaH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://ik.imagekit.io/z23yf8euyq/ZocDoc_AppDemo.gif" alt="Demo of the ZocDoc like app from this tutorial"&gt;&lt;/a&gt;Demo of the ZocDoc like app from this tutorial&lt;/p&gt;

&lt;p&gt;As you can see in the above GIF demo, on the left side, patient logs in and on the right side, doctor logs in. Patient searches the doctors, and initiate a chat with one. On the right side, doctor receives the message from patient and answers her back.&lt;/p&gt;

&lt;p&gt;I encourage you to follow along but if you’re keen to read the source code, you can find it on &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wajahatkarim3"&gt;
        wajahatkarim3
      &lt;/a&gt; / &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone"&gt;
        ZocDoc-Clone
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simple UI clone of ZocDoc app
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;ZocDoc UI clone is an Android Demo app (using &lt;strong&gt;CometChat Pro&lt;/strong&gt; and &lt;strong&gt;Java Chat UI Kit&lt;/strong&gt;) for a fully functional messaging app between the doctors and patients.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/wajahatkarim3/ZocDoc-Clone/main/#"&gt;&lt;img src="https://camo.githubusercontent.com/803cfd881d33f5c17da4f61eb3001db46f277c82e6cb7221f17f9114d00225bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506c6174666f726d2d416e64726f69642d627269676874677265656e2e737667" alt="Platform"&gt;&lt;/a&gt;      &lt;a href="https://raw.githubusercontent.com/wajahatkarim3/ZocDoc-Clone/main/#"&gt;&lt;img src="https://camo.githubusercontent.com/a0badf48d0fa1fbb30da1579cf476967e2f9c637006fb12193c607dcdb326f80/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c616e67756167652d4b6f746c696e2d79656c6c6f77677265656e2e737667" alt="Platform"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Demo&lt;/h2&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/main/screenshots/ZocDoc_AppDemo.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vzm1J0vM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/wajahatkarim3/ZocDoc-Clone/raw/main/screenshots/ZocDoc_AppDemo.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Technology&lt;/h2&gt;
&lt;p&gt;This demo uses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prodocs.cometchat.com/docs/welcome" rel="nofollow"&gt;CometChat Pro Android SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prodocs.cometchat.com/docs/android-ui-kit" rel="nofollow"&gt;Java Chat UI Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Android and Kotlin&lt;/li&gt;
&lt;li&gt;Material Components by Google&lt;/li&gt;
&lt;li&gt;Coil for Image Loading&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Installation&lt;/h2&gt;
&lt;p&gt;Simply Clone the project from this repository and open in Android Studio
Build the Demo App and it will be ready to Run&lt;/p&gt;
&lt;h2&gt;
Run the Sample App&lt;/h2&gt;
&lt;p&gt;To run the demo follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://cometchat.com/pro?utm_source=github&amp;amp;utm_medium=wajahatkarim3-zocdoc-clone-readme" rel="nofollow"&gt;Head to CometChat Pro and create an account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;From the &lt;a href="https://app.cometchat.com/?utm_source=github&amp;amp;utm_medium=wajahatkarim3-zocdoc-clone-readme" rel="nofollow"&gt;dashboard&lt;/a&gt;, create a new app called "ZocDoc Clone"&lt;/li&gt;
&lt;li&gt;Once created, Go to the &lt;strong&gt;API &amp;amp; Keys&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Update &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/main/app/src/main/res/values/keys.xml"&gt;keys.xml&lt;/a&gt; with your newly-created &lt;code&gt;appID&lt;/code&gt;, &lt;code&gt;apiKey&lt;/code&gt;, and &lt;code&gt;region&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run the app and create two users for doctor and patient.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Questions about running the demo? &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/issues"&gt;Open an issue&lt;/a&gt;. We're here to…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wajahatkarim3/ZocDoc-Clone"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;To help you know what to expect, in this tutorial we will discuss about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A basic UI clone of Zocdoc app with themes and colors&lt;/li&gt;
&lt;li&gt;User authentication with Firebase and connecting it to CometChat&lt;/li&gt;
&lt;li&gt;Patients can view a list of doctors and their profiles.&lt;/li&gt;
&lt;li&gt;Patients can make a chat with any doctor through their profile&lt;/li&gt;
&lt;li&gt;Doctors can see all the existing patients conversations&lt;/li&gt;
&lt;li&gt;Doctors cannot initiate a chat with any patient directly.&lt;/li&gt;
&lt;li&gt;Integration of chat and conversations screen with features like read receipts, unread messages etc.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Building Zocdoc UI
&lt;/h1&gt;

&lt;p&gt;The first step is to develop the basic user interface flow of the app in a way that it looks like Zocdoc app. Since this article is focused on CometChat UI Kit, so I have already created the Zocdoc clone UI. This basic app provides some screens such as Home, Doctors Search, Doctor Profile, Chat, Conversations, Login, Signup etc. It should be noted that I have not implemented any appointment bookings, calendar, or more advanced features found in the original Zocdoc app. Rather, this is a starting point for you to follow along and see how CometChat is integrated in any existing app to add chat functionality. The code is uploaded to a branch called &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/tree/start-here"&gt;start-here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Assuming you are comfortable with Git you can run this command to download the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone -b start-here https://github.com/wajahatkarim3/ZocDoc-Clone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once downloaded, open this project in Android Studio and run this in any emulator or Android device. I am using Android Studio 4.1.2 stable version, but the app should run on any version from 3.2 or later.&lt;/p&gt;

&lt;p&gt;Once your app is ready, you can see that the app has dummy data on all screens. This code includes different &lt;code&gt;Activity&lt;/code&gt;, &lt;code&gt;Fragment&lt;/code&gt;, &lt;code&gt;RecyclerView&lt;/code&gt;, adapter classes, XML layout files, and resources etc.&lt;/p&gt;

&lt;p&gt;Let’s get into some basic overview of the code. The app utilizes Material Components to create the white-yellow color theme of the app. You can see the different styles like Theme, Toolbar, Text etc. in the &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/res/values/themes.xml"&gt;themes.xml&lt;/a&gt; file. The app comes with two flows:&lt;/p&gt;


&lt;h1&gt;
  
  
  Patients
&lt;/h1&gt;

&lt;p&gt;On the app launch, the &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/java/com/wajahatkarim3/zocdoc/screens/SplashActivity.kt"&gt;splash screen&lt;/a&gt; checks if the current logged in user is doctor or patient. If its patient, it shows the patient flow defined in the &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/java/com/wajahatkarim3/zocdoc/screens/MainActivity.kt"&gt;MainActivity.kt&lt;/a&gt; file. This shows the tab screens such as Search, Appointments, Recommendations, Medical Team, and Profile. Each of these are in separate Fragment files with basic UI and dummy data. Almost all the click listeners and events are preset in method &lt;code&gt;setupViews()&lt;/code&gt; in every &lt;code&gt;Fragment&lt;/code&gt; or &lt;code&gt;Activity&lt;/code&gt; class.&lt;/p&gt;

&lt;p&gt;The patient can search doctors with Care type, insurance, and location (&lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/java/com/wajahatkarim3/zocdoc/screens/SearchFragment.kt"&gt;SearchFragment.kt&lt;/a&gt;). Since this app is only focuses on the chat part, so all the data shown in the app is random regardless of which type you choose. Once you press the Find button, then it shows the list of doctors (&lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/java/com/wajahatkarim3/zocdoc/screens/DoctorsSearchActivity.kt"&gt;DoctorsSearchActivity.kt&lt;/a&gt;) with available time slots. On selecting any, it shows the doctor details such as biography, available slots, address, and reviews. This screen (&lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/java/com/wajahatkarim3/zocdoc/screens/DoctorDetailsActivity.kt"&gt;DoctorDetailsActivity.kt&lt;/a&gt;) also includes a button Chat with Doctor through which a patient can chat with doctor. This button will only be visible when user is logged in. At this time, this button opens an empty screen. In this tutorial, we will implement the functionality and see how CometChat works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/Patients_flow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YbiKU1R8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/Patients_flow.png" alt="Screens of Patients app"&gt;&lt;/a&gt;Screens of Patients app&lt;/p&gt;


&lt;h1&gt;
  
  
  Doctors
&lt;/h1&gt;

&lt;p&gt;The doctors app flow is almost similar. Except, it shows three tabs - Search, &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/java/com/wajahatkarim3/zocdoc/screens/ConversationsFragment.kt"&gt;Conversations&lt;/a&gt;, and &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/start-here/app/src/main/java/com/wajahatkarim3/zocdoc/screens/ProfileFragment.kt"&gt;Profile&lt;/a&gt;. The profile and search has same UI and functionality as in the patients. The only difference is the Conversations screen, where a doctor can see list of all the patients who have talked to this doctor. Since the doctor cannot initiate chat with any patient directly, so this screen will only show the conversations which has been started by patients themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/doctors_flow.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1hVLq3OE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/doctors_flow.png" alt="Screens of Doctors app"&gt;&lt;/a&gt;Screens of Doctors app&lt;/p&gt;

&lt;p&gt;Here are some other things to know about the app code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kotlin&lt;/strong&gt; : The code is written in Kotlin language and it doesn’t utilize any kind of architecture like MVVM in order to make things easier to understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ViewBinding&lt;/strong&gt; : To bridge the gap between XML and Kotlin, app utilizes View Binding feature. But since, CometChat SDK uses the Data Binding, that’s why you will find both &lt;a href="https://developer.android.com/topic/libraries/view-binding"&gt;ViewBinding&lt;/a&gt; and &lt;a href="https://developer.android.com/topic/libraries/data-binding"&gt;DataBinding&lt;/a&gt; enabled in the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adapters&lt;/strong&gt; : I have not created any Adapter classes for RecyclerView. I have used a third-party library &lt;a href="https://github.com/gurleensethi/LiteUtilities"&gt;Lite Utilities&lt;/a&gt; which gives the adapters for RecyclerView in a short and simple way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Loading&lt;/strong&gt; : For the image loading such as doctor’s profile picture, I have used &lt;a href="https://github.com/coil-kt/coil"&gt;Coil library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Components&lt;/strong&gt; : For the star rating of doctors, I have used &lt;a href="https://github.com/Jamshid-M/ExactRatingBar"&gt;ExactRatingBar&lt;/a&gt; library. The bio section of doctors is in the Markdown, so I have used &lt;a href="https://github.com/noties/Markwon"&gt;Markwon&lt;/a&gt; library.&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  Setting up CometChat
&lt;/h1&gt;

&lt;p&gt;Once we have our app’s UI ready, its time to integrate the actual chat functionality. We will do this through CometChat SDK. First, you need to create your CometChat application with a unique identifier. We will later specify this identifier in our Kotlin code when connecting to CometChat.&lt;/p&gt;

&lt;p&gt;Create an account on &lt;a href="https://www.cometchat.com/pro"&gt;CometChat Pro&lt;/a&gt; if you don’t have one already. and head to the &lt;a href="https://app.cometchat.com/apps"&gt;Dashboard&lt;/a&gt; where you will see all your apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_dashboard.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--36n5v0z7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_dashboard.png" alt="CometChat Dashboard"&gt;&lt;/a&gt;CometChat Dashboard&lt;/p&gt;

&lt;p&gt;Click on Add New App and fill the information in the modal shown. Since this app is healthcare, so you should select &lt;strong&gt;US (HIPPA COMPLIANT)&lt;/strong&gt; for region. But, it needs an approval and may take several days for verification, so for the sake of this tutorial I am selecting US for region, Kotlin (Android) in Technology and &lt;strong&gt;Healthcare&lt;/strong&gt; in the Use Case fields.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_compliant_hipaa.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l6ECjydr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_compliant_hipaa.png" alt="CometChat Add New App Modal"&gt;&lt;/a&gt;CometChat Add New App Modal&lt;/p&gt;

&lt;p&gt;You will be redirect to the app page to Quick Start section with some documentation about integrating CometChat SDK. Select API &amp;amp; Auth Keys from the left panel and you will see secrets like &lt;code&gt;App ID&lt;/code&gt;, &lt;code&gt;Auth Key&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_auth_keys.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kq9-7Q1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_auth_keys.png" alt="CometChat Auth Keys"&gt;&lt;/a&gt;CometChat Auth Keys&lt;/p&gt;

&lt;p&gt;Create a new XML file keys.xml in the res/values directory of the app code and paste your App ID, Auth Key, and Region like the code below.&lt;/p&gt;


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



&lt;p&gt;Now, we have secrets keys in our code. Its time to add CometChat dependencies in the app. Start by adding the maven lines (line # 25-28) from the below snippet in the project’s root level build.gradle file:&lt;/p&gt;


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


&lt;p&gt;Now open the app’s build.gradle file and add the following dependencies in the dependencies section.&lt;/p&gt;


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


&lt;p&gt;It should be noted that we will use Firebase for authentication purpose in this app. Now, finally you will need to add the &lt;code&gt;uikit&lt;/code&gt; module (line # 7 in above gist) in your code.&lt;/p&gt;

&lt;p&gt;First, head to this link and click on the purple Java Chat UI Kit button as shown in the image below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_java_ui_kit.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zq11ioQn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_java_ui_kit.png" alt="Donwloading Java Chat UI Kit"&gt;&lt;/a&gt;Donwloading Java Chat UI Kit&lt;/p&gt;

&lt;p&gt;This will download a zip file. Extract that to any directory. Now, go to Android Studio project, and right click on &lt;strong&gt;app → New → Module&lt;/strong&gt; and select &lt;strong&gt;Import Gradle Project&lt;/strong&gt; option from the list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_add_module.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zWt6elU1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_add_module.png" alt="Importing Java Chat UI Kit module in app"&gt;&lt;/a&gt;Importing Java Chat UI Kit module in app&lt;/p&gt;

&lt;p&gt;Now, choose your extracted folder directory. Set the name of module exactly &lt;code&gt;uikit&lt;/code&gt; and click &lt;strong&gt;Finish&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/android_module_add.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FjSanyWW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/android_module_add.png" alt="Importing uikit module in app"&gt;&lt;/a&gt;Importing uikit module in app&lt;/p&gt;

&lt;p&gt;Now sync the project and you’re ready to play with &lt;code&gt;CometChat SDK&lt;/code&gt; into the app.&lt;/p&gt;




&lt;h1&gt;
  
  
  Initializing CometChat in the app
&lt;/h1&gt;

&lt;p&gt;Once all the CometChat dependencies are resolved in the app, first thing we have to do is initialize it. Open the &lt;code&gt;ZocdocApp.kt&lt;/code&gt; file and add the &lt;code&gt;initCometChat()&lt;/code&gt; method after the &lt;code&gt;initEmoji()&lt;/code&gt; line in &lt;code&gt;onCreate()&lt;/code&gt;. This method’s definition will be like the code below:&lt;/p&gt;


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


&lt;p&gt;Note that how the App ID and region are being fetched from the &lt;code&gt;keys.xml&lt;/code&gt; file in resources. Also, I have only logged the messages in &lt;code&gt;onSuccess()&lt;/code&gt; and &lt;code&gt;onError()&lt;/code&gt; callback methods of &lt;code&gt;CometChat.init()&lt;/code&gt;. But in the production, you will have to add the proper alert mechanism if the CometChat fails to initialize.&lt;/p&gt;




&lt;h1&gt;
  
  
  Adding User Authentication in App
&lt;/h1&gt;

&lt;p&gt;With the app UI ready and CometChat SDK setup, let’s add user authentication in the app. CometChat does not handle authentication or authorization itself, but it makes it seamless for you to tie CometChat to your existing users’ database or authentications services such as &lt;a href="http://auth0.com/"&gt;Auth0&lt;/a&gt; or &lt;a href="https://firebase.google.com/docs/auth/android/"&gt;Firebase&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since adding the Firebase authentication is beyond the scope of this article, so I will not discuss it here. But, you need to integrate Firebase in your app with the usual &lt;code&gt;google-services.json&lt;/code&gt; file and dependency. We will use the password-based authentication from Firebase, so you can get the details about it on &lt;a href="https://firebase.google.com/docs/auth/android/password-auth"&gt;their documentation on this link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signup Functionality
&lt;/h2&gt;

&lt;p&gt;Once Firebase Auth is integrated and password-based method is enabled, we will add our Sign up flow in the &lt;code&gt;SignupActivity.kt&lt;/code&gt; class. Open the file, and you will see that there’s a &lt;code&gt;OnClickListener&lt;/code&gt; set for the &lt;code&gt;btnSignup&lt;/code&gt; in the &lt;code&gt;setupViews()&lt;/code&gt; method. It already has the form input validation and it opens the Patient’s home or Doctor’s home screen randomly like the code below.&lt;/p&gt;


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


&lt;p&gt;Now, we will change this code to add Firebase Authentication first. Add this code after the form validation below:&lt;/p&gt;


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


&lt;p&gt;You can see that once user is created successfully on Firebase, we have the object of that. Now, we will add this Firebase user into CometChat’s Users database. Copy the following &lt;code&gt;createAndLoginCometUser&lt;/code&gt; method and paste in your code.&lt;/p&gt;


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


&lt;p&gt;On line 3, I have assigned the &lt;code&gt;uid&lt;/code&gt; from method parameter to the CometChat’s user ID. This uid is actually the ID from the Firebase created user. This is to make sure that both users on Firebase and CometChat are in sync and same. The purpose of Firebase here is the security and allow users to actually login/logout etc from the app. Also, CometChat is not used for purpose of putting users’ database in it. Its only a separate platform to integrate chat features in your app. And this user ID plays the role of connecting Firebase users’ database to the CometChat database.&lt;/p&gt;

&lt;p&gt;On line 7, you can see that I have added the &lt;code&gt;isDoctor&lt;/code&gt; value in a &lt;code&gt;Meta&lt;/code&gt; object. CometChat’s User table is minimal and includes basic fields like avatar, name, UID etc. If you want to add extra information, like if user is doctor or patient in this case, then you need to put in a &lt;code&gt;Meta&lt;/code&gt; object. The &lt;code&gt;Meta&lt;/code&gt; is a JSON Object and can have unlimited key-value pairs.&lt;/p&gt;

&lt;p&gt;On line 10, I am calling the &lt;code&gt;CometChat.createUser()&lt;/code&gt; method with the CometChat User object and Auth Key from resources. Once the user creation is successful, I am manually logging in the through the &lt;code&gt;CometChat.login()&lt;/code&gt; method. You can show Login screen here and ask the user to login herself, but I chose it by directly logging in and showing home screen. Once the login is successful, I am using the old code of showing either patient or doctor home screen as it was originally here.&lt;/p&gt;

&lt;p&gt;On line 17, note that I have removed the old &lt;code&gt;Random.nextBoolean()&lt;/code&gt; value and replaced it with extracting meta data from logged in user to see if it is a doctor or patient.&lt;/p&gt;

&lt;p&gt;Now, call this in your &lt;code&gt;setupViews()&lt;/code&gt; method where Firebase user creation is successful like this:&lt;/p&gt;


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


&lt;p&gt;On line 7, I have called this method &lt;code&gt;createAndLoginCometUser&lt;/code&gt; and passed the data of Firebase user like &lt;code&gt;uid&lt;/code&gt;, name etc to the CometChat user.&lt;/p&gt;




&lt;h2&gt;
  
  
  Login Functionality
&lt;/h2&gt;

&lt;p&gt;That’s how a signup functionality is created. We can use the similar approach for the login. The app will first perform the login on Firebase, and then once its successful then it will get the the Firebase User ID and perform the CometChat login with that ID.&lt;/p&gt;

&lt;p&gt;Open the &lt;code&gt;LoginActivity.kt&lt;/code&gt; file, remove the lines 61 to 77 and put this code in &lt;code&gt;loginUser()&lt;/code&gt; method after the form validation.&lt;/p&gt;


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


&lt;p&gt;On Line 2, you can see I am calling Firebase’s &lt;code&gt;signInWithEmailAndPassword()&lt;/code&gt; method. Once its successful, then on line 6 I am performing &lt;code&gt;CometChat.login()&lt;/code&gt; method to fetch the CometChat user info. And then there’s a simple doctor check and home screen is launched accordingly. This is similar to how it was done in &lt;code&gt;SignupActivity.kt&lt;/code&gt; class.&lt;/p&gt;

&lt;p&gt;Now, open the &lt;code&gt;SplashActivity.kt&lt;/code&gt; file, and replace &lt;code&gt;isDoctor&lt;/code&gt;’s value with this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;val isDoctor = CometChat.getLoggedInUser() != null &amp;amp;&amp;amp; CometChat.getLoggedInUser().metadata.getBoolean("isDoctor")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sign out Functionality
&lt;/h2&gt;

&lt;p&gt;After the splash, its time to put the sign out functionality. Open the &lt;code&gt;ProfileFragment.kt&lt;/code&gt; file and delete the code from the &lt;code&gt;btnSignout&lt;/code&gt;’s &lt;code&gt;OnClickListener&lt;/code&gt; and replace it with the following code.&lt;/p&gt;


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



&lt;p&gt;You can see that there’s nothing fancy here. Its a simple &lt;code&gt;CometChat.logout()&lt;/code&gt; method call. Now, run the application. Go the profile tab, click on signup and create a user. You will see that you will automatically logged in. And now, in your profile tab, you will see Logout button. You can now login and register perfectly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Starting a Chat with Doctor
&lt;/h1&gt;

&lt;p&gt;With the patient/doctor authentication in place, its time to actually make chat functionality between patient and doctor. As per the app requirements, doctors cannot initiate chat with patient directly. So, its the patient who will make the chat connection. The way this will work is patient will search the doctors for any care type she is looking for. The app will show the list of doctors available for that care type and in the provided location. Patient chooses any doctor by tapping on it, this will show the doctor details screen. In this screen, patient will click on Chat with Doctor button and this will initialize the chat between patient and doctor.&lt;/p&gt;

&lt;p&gt;Open the &lt;code&gt;DoctorDetailsActivity.kt&lt;/code&gt; file. In the &lt;code&gt;setupViews()&lt;/code&gt; method, you can see the listener of &lt;code&gt;btnChat&lt;/code&gt; button. This button is opening the &lt;code&gt;ChatActivity.kt&lt;/code&gt; screen and passes the selected doctor’s data model through &lt;code&gt;Intent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, open the &lt;code&gt;ChatActivity.kt&lt;/code&gt; file. You will see a method &lt;code&gt;initChat()&lt;/code&gt; which checks if the received doctor is not null and then there’s nothing. This is where we are going to add out chat functionality.&lt;/p&gt;

&lt;p&gt;From the documentation of Java Chat UI Kit module, we can see that this kit provides us three ways to integrate chat into our apps namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unified&lt;/strong&gt; - This is quickest solution to start a whole chat flow and it is also customizable as per your colors etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Screens&lt;/strong&gt; - This provides some screens in form of Android &lt;code&gt;Fragment&lt;/code&gt; classes to integrate into your apps UI. Some screens are &lt;code&gt;CometChatUserListScreen&lt;/code&gt;, &lt;code&gt;CometChatConversationListScreen&lt;/code&gt;, &lt;code&gt;MessageListScreen&lt;/code&gt; etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Components&lt;/strong&gt; - This is even more portable and customizable to integrate into your app. These are standalone UI components to be used in your XML layouts and view classes such as &lt;code&gt;Avatar&lt;/code&gt;, &lt;code&gt;CometChatUserList&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_ui_components.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aKxBJMYy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_ui_components.png" alt="UI Components of Java Chat UI Kit"&gt;&lt;/a&gt;UI Components of Java Chat UI Kit&lt;/p&gt;

&lt;p&gt;The portability of CometChat’s Java Chat UI Kit makes chat feature a very easy and enjoyable experience for developers. And you can easily customize the colors, and other features through &lt;code&gt;UIKitSettings&lt;/code&gt; class.&lt;/p&gt;

&lt;p&gt;To add the chat in out &lt;code&gt;ChatActivity.kt&lt;/code&gt;, I am going to use the &lt;code&gt;CometChatMessageScreen&lt;/code&gt; fragment and replace the &lt;code&gt;chatFrame&lt;/code&gt; from layout with this fragment. All I have to do is create an instance of this fragment and provide some configuration values. You can see this in the below code which I have added in the &lt;code&gt;initChat()&lt;/code&gt; method of &lt;code&gt;ChatActivity.kt&lt;/code&gt; class.&lt;/p&gt;


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


&lt;p&gt;On line 4, I am checking if the patient is logged in or not. On line 6, I am fetching the full data of the selected doctor through Doctor ID from CometChat users database. Once that’s done, then I am creating object of &lt;code&gt;CometChatMessageScreen&lt;/code&gt; fragment on line 9. After that, I am providing data such as avatar, ID, name etc to the fragment object in lines 12 to 22. Finally, in lines 23-25, I am actually replacing &lt;code&gt;chatFrame&lt;/code&gt; with the &lt;code&gt;chatFragment&lt;/code&gt; object itself. This will load the chat UI with all the necessary connection between patient and doctor. And you can send messages, emojis etc.&lt;/p&gt;

&lt;p&gt;Within few minutes, you saw how easy it was to actually integrate chat functionality through CometChat SDK.&lt;/p&gt;




&lt;h1&gt;
  
  
  Adding list of Conversations
&lt;/h1&gt;

&lt;p&gt;Since doctor can’t directly initiate a chat with patient, so she can only see a list of existing conversations. These conversations are created by patients themselves first and then shows up in the doctor’s profile. For this, we will use the UI Component &lt;code&gt;CometChatConversationList&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;First, open the &lt;code&gt;fragment_conversations.xml&lt;/code&gt; file, and replace &lt;code&gt;androidx.recyclerview.widget.RecyclerView&lt;/code&gt; with &lt;code&gt;com.cometchat.pro.uikit.CometChatConversationList&lt;/code&gt; . Note that &lt;code&gt;CometChatConversationList&lt;/code&gt; is also a &lt;code&gt;RecyclerView&lt;/code&gt; element. So, all we are doing is changing the class name and rest is same in the layout.&lt;/p&gt;

&lt;p&gt;Now, open the &lt;code&gt;ConversationsFragment.kt&lt;/code&gt; file and in the &lt;code&gt;setLoggedInUI()&lt;/code&gt; method, there’s a comment saying “Load Conversations”. This is where we will load the conversations in our &lt;code&gt;CometChatConversationList&lt;/code&gt; &lt;code&gt;RecyclerView&lt;/code&gt; component. We have to put a fetch request through CometChat API and it will load the data into this &lt;code&gt;RecyclerView&lt;/code&gt; like this:&lt;/p&gt;


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


&lt;p&gt;One line 3, you can see I am creating a builder for &lt;code&gt;ConversationsRequest&lt;/code&gt;. I am setting limit to 50. This will fetch first 50 conversations. Then on line 8, I am fetching these conversations through &lt;code&gt;fetchNext()&lt;/code&gt; method. And in the &lt;code&gt;onSuccess()&lt;/code&gt;, I am setting the conversations list to my &lt;code&gt;CometChatConversationList&lt;/code&gt; &lt;code&gt;RecyclerView&lt;/code&gt; component. And that’s all. This will load all the patients’ conversations which this logged in doctor has made.&lt;/p&gt;

&lt;p&gt;This same thing is also integrated in the &lt;code&gt;MedicalTeamFragment.kt&lt;/code&gt; class, so that patient can see all the conversations of doctors she has interacted with.&lt;/p&gt;

&lt;p&gt;Also, note that I have used &lt;code&gt;CometChatConversationList&lt;/code&gt; just to show you how UI Components can be integrated into your apps. Ideally, you should use &lt;code&gt;CometChatConversationListScreen&lt;/code&gt; fragment instead of the component in our case. That comes with the support of shimmer loading, pagination, search and more polished interface. Here’s an image of difference between both.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_conversations_fragment.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4SxVyfDZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_conversations_fragment.png" alt="Difference between CometChatConversationList and CometChatConversationListScreen"&gt;&lt;/a&gt;Difference between CometChatConversationList and CometChatConversationListScreen&lt;/p&gt;

&lt;p&gt;One more thing to note here is the customization of the theming and features of CometChat settings. By default, CometChat gives you blue color for avatars, unread messages etc. But, if you want to customize it based on your own theme, then you can do so by calling &lt;code&gt;UIKitSettings.setColor()&lt;/code&gt; method. This method should be called before adding these components or screens in the UI. So, a good place for this would be call this method in your &lt;code&gt;Application&lt;/code&gt; class.&lt;/p&gt;

&lt;p&gt;For example, I have added this line in my &lt;code&gt;initComet()&lt;/code&gt; method in the &lt;code&gt;ZocdocApp.kt&lt;/code&gt; class.&lt;/p&gt;


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


&lt;p&gt;See line 20, and how I fetch the color through &lt;code&gt;getString()&lt;/code&gt; instead of &lt;code&gt;getColor()&lt;/code&gt; because CometChat &lt;code&gt;UIKitSettings&lt;/code&gt; class needs color in &lt;code&gt;String&lt;/code&gt; format. Here’s the difference between how it was before and after the customization setting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ik.imagekit.io/z23yf8euyq/cometchat_ui_kit_theme_settings.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1aQRlEMW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ik.imagekit.io/z23yf8euyq/tr:w-1500/cometchat_ui_kit_theme_settings.png" alt="The difference between default and customized UIKitSettings"&gt;&lt;/a&gt;The difference between default and customized UIKitSettings&lt;/p&gt;

&lt;p&gt;Also, UIKit Settings library is updated by developers weekly where each update includes support of a new feature set. So, it’s a good idea to keep updating the library regularly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion and Wrap up
&lt;/h1&gt;

&lt;p&gt;This brings us the whole chat functionality between doctor and patient as seen in the ZocDoc app through the CometChat Pro and Java Chat UI Kit module. In this tutorial, you built a simple UI clone of ZocDoc app with basic chat functionality between patient and doctor. You learned how easy it to use CometChat Pro and Java Chat UI Kit are and how powerful features like user authentication, chat messaging, conversations list etc. can be implemented with not so much effort in a very clean and optimized way. This allows you, as a developer, to focus on the business logic and things that matter most rather than spending time on technical difficulties and minor issues.&lt;/p&gt;

&lt;p&gt;I hope you found this tutorial helpful. Don’t forget to check &lt;a href="https://prodocs.cometchat.com/docs/welcome"&gt;the official documentation of CometChat Pro&lt;/a&gt; to explore further. Find the complete source code of ZocDoc clone app and this tutorial &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone"&gt;here on GitHub&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wajahatkarim3"&gt;
        wajahatkarim3
      &lt;/a&gt; / &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone"&gt;
        ZocDoc-Clone
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simple UI clone of ZocDoc app
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;ZocDoc UI clone is an Android Demo app (using &lt;strong&gt;CometChat Pro&lt;/strong&gt; and &lt;strong&gt;Java Chat UI Kit&lt;/strong&gt;) for a fully functional messaging app between the doctors and patients.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/wajahatkarim3/ZocDoc-Clone/main/#"&gt;&lt;img src="https://camo.githubusercontent.com/803cfd881d33f5c17da4f61eb3001db46f277c82e6cb7221f17f9114d00225bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506c6174666f726d2d416e64726f69642d627269676874677265656e2e737667" alt="Platform"&gt;&lt;/a&gt;      &lt;a href="https://raw.githubusercontent.com/wajahatkarim3/ZocDoc-Clone/main/#"&gt;&lt;img src="https://camo.githubusercontent.com/a0badf48d0fa1fbb30da1579cf476967e2f9c637006fb12193c607dcdb326f80/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c616e67756167652d4b6f746c696e2d79656c6c6f77677265656e2e737667" alt="Platform"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Demo&lt;/h2&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/main/screenshots/ZocDoc_AppDemo.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vzm1J0vM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/wajahatkarim3/ZocDoc-Clone/raw/main/screenshots/ZocDoc_AppDemo.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Technology&lt;/h2&gt;
&lt;p&gt;This demo uses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prodocs.cometchat.com/docs/welcome" rel="nofollow"&gt;CometChat Pro Android SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prodocs.cometchat.com/docs/android-ui-kit" rel="nofollow"&gt;Java Chat UI Kit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Android and Kotlin&lt;/li&gt;
&lt;li&gt;Material Components by Google&lt;/li&gt;
&lt;li&gt;Coil for Image Loading&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Installation&lt;/h2&gt;
&lt;p&gt;Simply Clone the project from this repository and open in Android Studio
Build the Demo App and it will be ready to Run&lt;/p&gt;
&lt;h2&gt;
Run the Sample App&lt;/h2&gt;
&lt;p&gt;To run the demo follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://cometchat.com/pro?utm_source=github&amp;amp;utm_medium=wajahatkarim3-zocdoc-clone-readme" rel="nofollow"&gt;Head to CometChat Pro and create an account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;From the &lt;a href="https://app.cometchat.com/?utm_source=github&amp;amp;utm_medium=wajahatkarim3-zocdoc-clone-readme" rel="nofollow"&gt;dashboard&lt;/a&gt;, create a new app called "ZocDoc Clone"&lt;/li&gt;
&lt;li&gt;Once created, Go to the &lt;strong&gt;API &amp;amp; Keys&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Update &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/blob/main/app/src/main/res/values/keys.xml"&gt;keys.xml&lt;/a&gt; with your newly-created &lt;code&gt;appID&lt;/code&gt;, &lt;code&gt;apiKey&lt;/code&gt;, and &lt;code&gt;region&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run the app and create two users for doctor and patient.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Questions about running the demo? &lt;a href="https://github.com/wajahatkarim3/ZocDoc-Clone/issues"&gt;Open an issue&lt;/a&gt;. We're here to…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wajahatkarim3/ZocDoc-Clone"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I have also written some more articles about CometChat, &lt;a href="https://wajahatkarim.com/tags/cometchat/"&gt;you can read those on my website&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>android</category>
      <category>programming</category>
      <category>mobile</category>
      <category>firebase</category>
    </item>
    <item>
      <title>Moving on From 2019 - A Tough Year in Review </title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Fri, 29 Jan 2021 12:22:55 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/moving-on-from-2019-a-tough-year-in-review-2ohk</link>
      <guid>https://forem.com/wajahatkarim/moving-on-from-2019-a-tough-year-in-review-2ohk</guid>
      <description>&lt;h3&gt;
  
  
  Brain Tumor, Baby, Public Speaking, Writing, Open Source, and Mountains!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BvWUcVoW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4hjujb53d9umjgk9hda9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BvWUcVoW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4hjujb53d9umjgk9hda9.jpeg" alt="Me, giving talk at GDG DevFest Karachi 2019 at IBA University"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello folks, it's that time of the year (or maybe a little late) where I am supposed to reflect on my past year and make some new year resolution goals. Since I couldn't write the year in review for the previous year 2019, so this article is going to about that. Next week, I will write the year in review of the year 2020, which has been a lot challenging for everyone around the globe due to Covid-19 pandemic.&lt;/p&gt;

&lt;p&gt;I created the outline of this review and planned it about a year ago back in January 2020. But its been in my drafts since then. I tried to write and complete it multiple times throughout the year but I couldn't. The biggest reason was that it was a year which I never expected and I hope I won't live that kind of time again in my life ever again. The only reason for this was that &lt;em&gt;my father was diagnosed with rapidly growing brain tumor&lt;/em&gt; in that year. Unfortunately he couldn't survive this and is no longer with us today. He passed away in that unlucky year of 2019.&lt;/p&gt;

&lt;p&gt;Every time I wanted to write this year in review, all the horrible memories and things I witnessed came back in my mind. And I just didn't want to put them in words. But now I want to write 2020 year-in-review, so I think I need to have to write 2019 review before 2020. I will try very hard to be optimistic and see how it goes. You can &lt;a href="https://wajahatkarim.com/2019/02/reflections-on-2018---my-year-in-review/"&gt;read my 2018 year in review here&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/hackernoon/reflections-on-2018-my-year-in-review-e88f45ee4211" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h5Y6qhWh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/96/96/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/hackernoon/reflections-on-2018-my-year-in-review-e88f45ee4211" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;📆 Reflections on 2018 — My Year In Review | by Wajahat Karim | HackerNoon.com | Medium&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Mar 3, 2019&lt;/time&gt; ・ 22 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h1&gt;
  
  
  Happiness Fades as Year Starts
&lt;/h1&gt;

&lt;p&gt;The year started with a big news. My first baby was born on 1st January 2019. What an amazing coincidence. Right? Those days were truly beautiful and amazing. A baby in the house redefines the whole atmosphere. There comes this strange energy in the environment, in people, and in things. Everyone smiles more, laughs more and enjoys more. Everyone starts feeling young or even childish most of the time. And that's what I wanted to see a lot. Happy faces all around.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FCYW3aad--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g7xk9t6wzac5l4q2iefx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FCYW3aad--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g7xk9t6wzac5l4q2iefx.jpg" alt="Picture of hand of our little bundle of joy :)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have learned a number of things about human nature and parenting. The babies are truly wonderful creatures. I am still unable to understand how babies actually learn so much things and what are they observing all the time. What is going on in their tiny little minds. Whatever scientific explanation is there, but to me it's simply fascinating.&lt;/p&gt;

&lt;p&gt;I would love to talk about it and my words will never end. So I have dedicated a separate space of my words to him on Medium in form of &lt;strong&gt;Developer Dad&lt;/strong&gt; publication. You can check it on &lt;a href="https://medium.com/developerdad"&gt;this link&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/developerdad/im-developer-and-a-dad-too-e32723777f35" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh849yBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/56/56/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/developerdad/im-developer-and-a-dad-too-e32723777f35" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I’m a Developer and a Dad too.. When coding and parenting come face to… | by Wajahat Karim | Developer Dad | Jan, 2021 | Medium&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Jan 3, 2021&lt;/time&gt; ・ 2 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;p&gt;But with these beautiful memories and days passing by, there was my father losing smile, strength, health, and specifically memory. He was forgetting names of people, things, paths, routines and more. He started seeing things which weren't actually there. He started talking about past as its present. He started telling things which didn't make sense. This made us worried. I mean really worried.&lt;/p&gt;

&lt;p&gt;At first, we were confused about it. But since my father - or as I called him "Abu" - had a little history of schizophrenia. So we actually miscalculated it as symptoms of that. We never imagined that this would be the tumor eating the brain from inside. With ongoing consultations with our current doctor, memory loss was a side effect of some medication which had been changed in previous weeks. We thought that this is matter of few days until body accept new medication and then it will be fine again. Like a very gentle and humble person as he was before.&lt;/p&gt;

&lt;p&gt;It was that night. That very unfortunate night. There was an ongoing Pakistan Super League (PSL) championship's final cricket at that time in my city. Our home is very close to the cricket stadium. Almost all roads surrounding stadium were closed for security purposes. The city was filled with lights, flags, and there was celebration vibe in the air everywhere.&lt;/p&gt;

&lt;p&gt;But here my Abu was vomiting over and over again. We were on the way to hospital through those closed roads. Police understood the situation after seeing my father in the passenger seat in a very bad condition and let us pass through the road barriers. After about 20 minutes ride, we reached hospital emergency at around 11:00 pm in night.&lt;/p&gt;

&lt;p&gt;After going through some tests and medical procedure whole night, I got a response from doctor saying &lt;em&gt;"I'm sorry to tell you that your father has rapidly growing brain tumor. Its already spread about 80% of the brain. We have to operate it as soon as possible. Let me know your decision quick so I can make arrangements."&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wait. Just hold on. Are you really saying that this is tumor? Like the cancer? Couldn't this be food poisoning as he is vomiting? Or maybe it's just dizziness. Just tell me something which I can believe. I cannot accept this. Or maybe I do not want to accept this... again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Again?&lt;/p&gt;

&lt;p&gt;When I was 17 years old and full of life, my mother passed away suddenly. That was the first time I actually saw someone without life. That was first time I actually saw a grave. That was first time I actually saw how a funeral is done. And after that, there was this whole strange vacuum in my heart which couldn't filled with anything.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Life without mother becomes a lot harder than it actually is. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And now, here I am in a situation where I have to accept something which I have never imagined or expected. And I don't know even anything about it.&lt;/p&gt;

&lt;p&gt;Brain tumor.&lt;/p&gt;

&lt;p&gt;What's that supposed to mean? What it's supposed to do? Eat brain? What will happen once this reaches from 80% to 100%? What happens to body if there's no brain? What about the feelings my Abu had? What about the conversations we used to have? What about his smile? Or his big soft hand which we siblings used to put on our head when we felt sad, or we were stuck in some problem, or we just wanted to feel an ounce of peace from the noise of this world.&lt;/p&gt;

&lt;p&gt;A lot of questions were coming in my mind. But there were no answers. Instead more questions - especially from doctors. &lt;em&gt;"Should we go ahead with surgery and remove tumor?"&lt;/em&gt;. Our answer was "We don't know". How are we actually supposed to know? Do a Master's degree on Neurology? Or watch some YouTube videos about it? Or read some random articles on medical websites or Wikipedia?&lt;/p&gt;

&lt;p&gt;Days were passing by. Abu's health was becoming worse. And we all were stuck on one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Surgery or No Surgery.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;Pressure from doctors and hospital is increasing. Questions are increasing. Confusions are increasing. Stress is increasing. But Abu's health state is decreasing. He doesn't recognize us anymore. The grill around bed feels like a trap cage to him. He is wondering where he is. Why he is there? He even doesn't know what ICU or a hospital is.&lt;/p&gt;

&lt;p&gt;And it seemed like a lifetime to answer one question. That answer was.&lt;/p&gt;

&lt;p&gt;NO.&lt;/p&gt;

&lt;p&gt;A big NO.&lt;/p&gt;

&lt;p&gt;NO. We don't want to do the surgery.&lt;/p&gt;

&lt;p&gt;Period.&lt;/p&gt;

&lt;p&gt;Here. We said it. Was it that hard? I don't know. I only know that it took me about 2 years to put these words from mind to a screen. How do I feel about it? I dare you don't take that path. Pretty please!!!!&lt;/p&gt;

&lt;p&gt;We didn't go for surgery. Probably, it was too late to do surgery at that time. Even after surgery there weren't great chances for recovery. And Abu didn't have the stamina to fight and do Chemotherapy.&lt;/p&gt;

&lt;p&gt;I am no expert in medical or tumor etc. But believe me when I say this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Chemotherapy is the most brutal and horrible kind of treatment there is. I salute and admire all the people's courage who have gone through Chemotherapy. And I have great respect for the survivors. Those are real-life heroes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My father wasn't that kind of hero though. But he was still our hero. Going through different options, we decided to keep him at home. And take care of him ourselves.&lt;/p&gt;

&lt;p&gt;Day by day.&lt;/p&gt;

&lt;p&gt;Night by night.&lt;/p&gt;

&lt;p&gt;Medicine by medicine.&lt;/p&gt;

&lt;p&gt;Tear by tear.&lt;/p&gt;

&lt;p&gt;Word by word.&lt;/p&gt;

&lt;p&gt;Those 6 months of 2019 were THE most challenging and depressing months of my life. I was supposed to enjoy the new baby and his silly moves. But rather I was crying silently sitting beside my father losing battle to tumor. A stupid brain tumor. How dare it, huh.&lt;/p&gt;

&lt;p&gt;Every week Abu was losing something. One day we realize he can't stand up anymore. Next, we realize he can't even sit now.&lt;/p&gt;

&lt;p&gt;Over the weeks, his condition was becoming worse and worse. His legs stopped responding. He lost hearing completely. Pin drop silence. He lost his sight. What a sad day it was. There was a very tensed silence in house all day. It was like no one wanted to believe it. Whatever condition his health was in - at least he was able to see his children. It didn't matter if he recognized us or not. But it was more than hope for us that he can see us. And he feels that we are there for him and support him.&lt;/p&gt;

&lt;p&gt;But now he can't.&lt;/p&gt;

&lt;p&gt;He was in semi-coma about 6 months. Everything was a big challenge we were unprepared for. We never imagined this kind of stuff. The coma was very painful for Abu and probably more painful for us. We couldn't see him in that pain. And we probably can never understand what Abu was going through.&lt;/p&gt;

&lt;p&gt;My mother died suddenly out of nowhere one day. It was shocking. So with that context, there was this one strange thing. No one mentioned it anytime but there was this feeling that one day Abu won't wake up. We sort of knew and were kinda waiting for that day. We wanted Abu's pain to end and go away. Probably this was only way. And we assumed that we are ready.&lt;/p&gt;

&lt;p&gt;So let me ask you a question. &lt;strong&gt;"Can anyone be ever ready for this? Are 6 months enough to be ready? Enough to say good-bye to father and won't see him ever again?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I don't know the answer. No one knows. I only know that I assumed it would be easier to face Abu's demise. But one and half years later, I still haven't been able to accept his death and wish that he was alive.&lt;/p&gt;

&lt;p&gt;Yes, he was in Coma. He was in great pain. He didn't recognize us. He had no memory. He couldn't stand. Sit. Talk. Hear. Smile. Laugh. Cry. Scream.&lt;/p&gt;

&lt;p&gt;But...&lt;/p&gt;

&lt;p&gt;He was alive.&lt;/p&gt;

&lt;p&gt;That one word. Alive. It mattered a lot. It gave us a hope. It gave me courage that whenever I feel sad, I just have to put his big soft hand on my face. And everything will be fine. All the problems will go away. There will only be peace and happiness. That tiny moment, which felt more than years. That moment gave me power to fight anything in this world. Even this stupid brain tumor.&lt;/p&gt;

&lt;p&gt;But now I don't have that hand.&lt;/p&gt;

&lt;p&gt;Don't have that hope.&lt;/p&gt;

&lt;p&gt;Don't have that power.&lt;/p&gt;

&lt;p&gt;Don't have our beloved Abu anymore.&lt;/p&gt;

&lt;p&gt;July 2019. My father passes away. I won't forget the last days I spent with him. I would like to extend huge gratitude to people who helped us in this tough time including my sisters, my Aunty who is like my mother, my wife, my uncles and many more people. Thank you everyone for helping us through our most painful and sad time of life.&lt;/p&gt;




&lt;p&gt;There goes half of 2019 year. I am without my super hopeful big soft hand with another bigger vacuum inside my heart. Now, I am trying to pick up the pieces I left before to resume my life.&lt;/p&gt;

&lt;h1&gt;
  
  
  Becoming GDE? - No, Not Now.
&lt;/h1&gt;

&lt;p&gt;Originally, I had planned to apply for becoming a Google Developers Expert (GDE) in March 2019. Google approached me multiple times throughout my tough time as my nomination for becoming a GDE was about to get processed. But I wasn't in the shape to do interviews etc. Google folks understood my situation and allowed me to take time. So I couldn't become GDE in 2019. That happened in Feb 2020. You can read more about it here.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://android.jlelse.eu/becoming-a-google-dev-expert-gde-in-android-63e03943c219" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh849yBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/56/56/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://android.jlelse.eu/becoming-a-google-dev-expert-gde-in-android-63e03943c219" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Becoming a Google Dev Expert (GDE) in Android | by Wajahat Karim | AndroidPub&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Feb 26, 2020&lt;/time&gt; ・ 9 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        android.jlelse.eu
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h1&gt;
  
  
  Coding + Community = Happiness
&lt;/h1&gt;

&lt;p&gt;It was a tough year. The few months I had from the whole year, I was getting back to my usual life. My job which was going good and Contour Software / Trapeze Group supported me a lot throughout this whole medical episode. I am very grateful for them.&lt;br&gt;
Besides job, I managed to do some community work as well. This included my talks, open source contributions and some articles I wrote.&lt;/p&gt;
&lt;h2&gt;
  
  
  Talks
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--maNhnRMq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kqj1mjduy099wti2k5qt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--maNhnRMq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kqj1mjduy099wti2k5qt.jpg" alt="Me, giving a  talk at DSC SZABIST Chapter Launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the naming day of my first and only baby, I was invited by &lt;a href="https://www.facebook.com/ApcPakistan1/"&gt;Android Pakistan Community&lt;/a&gt; to give a motivational and short talk. I talked about overall programming experience, and shared how my open source contributions led me to become a better programmer and what role Kotlin language has played in my career. It was well received one. I was very happy that day as when I returned home after talk, we named our baby along with all the close family members.&lt;/p&gt;

&lt;p&gt;And then I got caught up with my medical situation at home. I got back on speaking in October. Then it was a series of talks - one after one - at &lt;a href="https://www.facebook.com/events/2257554364573613"&gt;IO Extended Hyderabad&lt;/a&gt;, &lt;a href="https://www.facebook.com/events/970308253360196/"&gt;IO Extended Karachi&lt;/a&gt;, &lt;a href="https://www.facebook.com/Developer-Student-Club-Hyderabad-Chapter-100189978001670"&gt;DSC SZABIST Hyderabad Launch&lt;/a&gt;, Pakistan's 1st DSC Summit, &lt;a href="https://www.facebook.com/events/2339906106275053/"&gt;GDG DevFest Karachi&lt;/a&gt;, &lt;a href="https://wajahatkarim.com/speaking/2019/12/why-your-startup-needs-android-app/"&gt;DSC PAF KEIT&lt;/a&gt;, &lt;a href="https://wajahatkarim.com/2019/12/flying-with-flutter-talk-live-coding-session/"&gt;DSC SMIU&lt;/a&gt;, and finally ending the year with last talk again organized by the &lt;a href="https://www.facebook.com/ApcPakistan1"&gt;Android Pakistan Community&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J-21yMt4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2p42b23mphw4sfrti1xx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J-21yMt4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2p42b23mphw4sfrti1xx.png" alt="My 2019 talks from Speaking page at my website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some of these talks are recorded and available at &lt;a href="https://www.youtube.com/c/wajahatkarim3"&gt;my YouTube channel&lt;/a&gt;. For example, here's the one where I share about becoming a GDE.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/-rrNy3vvmKw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can see my all talks - previous and upcoming - at my &lt;a href="https://wajahatkarim.com/speaking"&gt;Speaking page&lt;/a&gt; on my website.&lt;/p&gt;




&lt;h2&gt;
  
  
  Articles
&lt;/h2&gt;

&lt;p&gt;I must admit that after my baby, my writing has reduced a lot. I still try to find some time to write regularly and hope that this year I will do it more. I wrote 19 articles in 2019 which included &lt;a href="https://wajahatkarim.com/2019/02/reflections-on-2018---my-year-in-review/"&gt;Year in review 2018&lt;/a&gt;, an experience about &lt;a href="https://wajahatkarim.com/2019/02/inside-jtech-2019---juw-karachi/"&gt;JTech 2019 event&lt;/a&gt; I attended as judge, a tip about &lt;a href="https://wajahatkarim.com/2019/02/-is-your-android-studio-always-slow-heres-how-to-speed-up-immediately./"&gt;speeding up Android Studio&lt;/a&gt; which surprisingly became a very popular article, some articles about my talks like &lt;a href="https://wajahatkarim.com/speaking/2019/12/why-your-startup-needs-android-app/"&gt;this&lt;/a&gt; and &lt;a href="https://wajahatkarim.com/2019/12/flying-with-flutter-talk-live-coding-session/"&gt;this&lt;/a&gt;, and a series of &lt;a href="https://wajahatkarim.com/tags/cometchat/"&gt;articles about CometChat SDK&lt;/a&gt; to create chat apps in Kotlin.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://android.jlelse.eu/is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-326ef9238024" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh849yBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/56/56/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://android.jlelse.eu/is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-326ef9238024" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;⚡ Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately. | by Wajahat Karim | AndroidPub&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Apr 4, 2020&lt;/time&gt; ・ 5 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        android.jlelse.eu
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="https://android.jlelse.eu/revisited-a-guide-on-splash-screen-in-android-in-2020-bbcd4bb1ce42" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh849yBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/56/56/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://android.jlelse.eu/revisited-a-guide-on-splash-screen-in-android-in-2020-bbcd4bb1ce42" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🕐 Revisited — 📚 A Guide on Splash Screen in Android in 2020 | by Wajahat Karim | AndroidPub&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Mar 6, 2020&lt;/time&gt; ・ 7 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        android.jlelse.eu
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/codechai/flying-with-flutter-talk-live-coding-session-89f5e1835de6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh849yBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/56/56/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/codechai/flying-with-flutter-talk-live-coding-session-89f5e1835de6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🐦 Flying With Flutter — 🎤 Talk + 💻 Live Coding Session | by Wajahat Karim | CodeChai | Medium&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Mar 6, 2020&lt;/time&gt; ・ 4 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---rgG23TU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lbaxeqixv01r26msint5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---rgG23TU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lbaxeqixv01r26msint5.jpg" alt="The Hacktoberfest Swag I got in 2018 and 2019"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I couldn't do much open source contributions in the year 2019. But I managed to get time to do Hacktoberfest 2019. It was a really great experience as &lt;a href="https://android.jlelse.eu/the-beginners-guide-to-hacktoberfest-2019-winning-the-t-shirt-1a03b67e68"&gt;my article&lt;/a&gt; became the go-to guide for participating in Hacktoberfest and ranked on Google below the official Hacktoberfest website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A933-Apk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/89f9nt800dbu03yscud1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A933-Apk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/89f9nt800dbu03yscud1.png" alt="The search results for hacktoberfest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can read that article on &lt;a href="https://android.jlelse.eu/the-beginners-guide-to-hacktoberfest-2019-winning-the-t-shirt-1a03b67e68"&gt;this link&lt;/a&gt; here:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://android.jlelse.eu/the-beginners-guide-to-hacktoberfest-2019-winning-the-t-shirt-1a03b67e68" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh849yBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/56/56/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://android.jlelse.eu/the-beginners-guide-to-hacktoberfest-2019-winning-the-t-shirt-1a03b67e68" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Beginner’s Guide to Hacktoberfest 2020 &amp;amp; Winning the T-shirt | AndroidPub&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Oct 1, 2020&lt;/time&gt; ・ 6 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        android.jlelse.eu
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I also published another open source Android library called as &lt;strong&gt;Room Explorer&lt;/strong&gt; which allows developers to view their Room databases inside their Android apps with a single line of code. You can read about that in this article.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://android.jlelse.eu/exploring-android-room-database-with-room-explorer-4d760fdea9de" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh849yBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/56/56/1%2AM1ov625mKopx3PEOYAZRqA.png" alt="Wajahat Karim"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://android.jlelse.eu/exploring-android-room-database-with-room-explorer-4d760fdea9de" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🔍 Exploring Android Room Database with Room Explorer | by Wajahat Karim | AndroidPub&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ &lt;time&gt;Jan 14, 2020&lt;/time&gt; ・ 4 min read
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBvj_QRD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/medium_icon-90d5232a5da2369849f285fa499c8005e750a788fdbf34f5844d5f2201aae736.svg" alt="Medium Logo"&gt;
        android.jlelse.eu
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 

&lt;p&gt;And the library is available here.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wajahatkarim3"&gt;
        wajahatkarim3
      &lt;/a&gt; / &lt;a href="https://github.com/wajahatkarim3/RoomExplorer"&gt;
        RoomExplorer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔎 A quick and easy in-app database viewer and manager library for your Room databases. 
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;&lt;p&gt;&lt;a href="https://android.jlelse.eu/easyflipviewpager-the-flip-animations-for-your-viewpager-fd66b34f4703" rel="nofollow"&gt;&lt;img alt="Detail article about RoomExplorer" src="https://camo.githubusercontent.com/a2b276bf15cf21f554de3f8373aa2f74390bb25d8c4215ec16c32f3931fba563/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2546302539462539332538342532302d4e45572d7265642e737667"&gt;&lt;/a&gt; 
The article on why and how this library was created is now published. You can &lt;a href="https://android.jlelse.eu/exploring-android-room-database-with-room-explorer-4d760fdea9de" rel="nofollow"&gt;read it on this link here. →&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;h1&gt;
🔎 RoomExplorer&lt;/h1&gt;
&lt;p&gt;A quick and easy database viewer and manager library for your Room databases.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/56fb5bc93f98042cf1c890cd28559926076fc7117cbbbe3cc777a88f8b0832d1/68747470733a2f2f616e64726f69647765656b6c792e6e65742f6973737565732f69737375652d3430362f6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/56fb5bc93f98042cf1c890cd28559926076fc7117cbbbe3cc777a88f8b0832d1/68747470733a2f2f616e64726f69647765656b6c792e6e65742f6973737565732f69737375652d3430362f6261646765" alt=""&gt;&lt;/a&gt; &lt;a href="https://bintray.com/wajahatkarim3/RoomExplorer/com.wajahatkarim3.RoomExplorer/_latestVersion" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c2138d0332142a538082adffbc2d7e2851907bedf62a08bb24b604f0ca4e9011/68747470733a2f2f6170692e62696e747261792e636f6d2f7061636b616765732f77616a616861746b6172696d332f526f6f6d4578706c6f7265722f636f6d2e77616a616861746b6172696d332e526f6f6d4578706c6f7265722f696d616765732f646f776e6c6f61642e737667" alt="Download"&gt; &lt;/a&gt; &lt;a href="https://android-arsenal.com/api?level=15" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/b2c49f0389b0fced3237d8ac1a7203eddfe9f9be780b9e1217fe0296366222a9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492d31352532422d626c75652e7376673f7374796c653d666c6174" alt="API"&gt;&lt;/a&gt; &lt;a href="https://saythanks.io/to/wajahatkarim3" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/353dc0088027def780cf08f3597526351ed0e6f6199c9f8173d4941ca6f8d320/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5361792532305468616e6b732d212d3145414544422e737667" alt="Say Thanks!"&gt;&lt;/a&gt; &lt;a href="https://www.paypal.me/WajahatKarim/5" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3e9da998546c9c87d11ae58350de4fbecbde4cf8489099448940df494a0484d2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f242d646f6e6174652d6666363962342e7376673f6d61784167653d32353932303030267374796c653d666c6174" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
  Built with ❤︎ by
  &lt;a href="https://twitter.com/WajahatKarim" rel="nofollow"&gt;Wajahat Karim&lt;/a&gt; and
  &lt;a href="https://github.com/wajahatkarim3/RoomExplorer/graphs/contributors"&gt;
    contributors
  &lt;/a&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/wajahatkarim3/RoomExplorer/blob/master/Art/RoomExplorer_Demo.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ex5_-m59--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/wajahatkarim3/RoomExplorer/raw/master/Art/RoomExplorer_Demo.gif" width="280px"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;h1&gt;
✔️ Changelog&lt;/h1&gt;
&lt;p&gt;Changes exist in the &lt;a href="https://github.com/wajahatkarim3/RoomExplorer_Demo/releases"&gt;releases&lt;/a&gt; tab.&lt;/p&gt;
&lt;h1&gt;
🎯 Features&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;View all your tables data in tabular format&lt;/li&gt;
&lt;li&gt;Insert rows to your tables&lt;/li&gt;
&lt;li&gt;Update rows&lt;/li&gt;
&lt;li&gt;Delete rows&lt;/li&gt;
&lt;li&gt;Delete tables&lt;/li&gt;
&lt;li&gt;Drop tables&lt;/li&gt;
&lt;li&gt;Write your own custom queries and view the results. (Create statements, joins, etc)&lt;/li&gt;
&lt;li&gt;Change data in the tables and see how you application responds&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
💻 Installation&lt;/h1&gt;
&lt;p&gt;Add this in your app's &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight highlight-source-groovy js-code-highlight"&gt;
&lt;pre&gt;dependencies {
  implementation &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;com.wajahatkarim3:roomexplorer:0.0.2&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
}&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Or add RoomExplorer as a new dependency inside your pom.xml&lt;/p&gt;
&lt;div class="highlight highlight-text-xml js-code-highlight"&gt;
&lt;pre&gt;&amp;lt;&lt;span class="pl-ent"&gt;dependency&lt;/span&gt;&amp;amp;gt
  &amp;lt;&lt;span class="pl-ent"&gt;groupId&lt;/span&gt;&amp;gt;com.wajahatkarim3&amp;lt;/&lt;span class="pl-ent"&gt;groupId&lt;/span&gt;&amp;amp;gt
  &amp;lt;&lt;span class="pl-ent"&gt;artifactId&lt;/span&gt;&amp;gt;RoomExplorer&amp;lt;/&lt;span class="pl-ent"&gt;artifactId&lt;/span&gt;&amp;amp;gt
  &amp;lt;&lt;span class="pl-ent"&gt;version&lt;/span&gt;&amp;gt;0.0.2&amp;lt;/&lt;span class="pl-ent"&gt;version&lt;/span&gt;&amp;gt;
  &amp;lt;&lt;span class="pl-ent"&gt;type&lt;/span&gt;&amp;gt;pom&amp;lt;/&lt;span class="pl-ent"&gt;type&lt;/span&gt;&amp;gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wajahatkarim3/RoomExplorer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h1&gt;
  
  
  Moving to Mountains
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FMjqc1Wl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oq80sbubmdpnz3b7sc10.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FMjqc1Wl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oq80sbubmdpnz3b7sc10.jpg" alt="Somewhere in Ayubia, Pakistan"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In all of the stress, chaos, and hustling throughout the year, what I needed was an ounce of peace. I wanted to sleep on the green field surrounded by mountains and rivers. And it became real. Google was conducting Pakistan's 1st DSC Summit and that was in the capital city, Islamabad. I was invited as a speaker. I brought along my family to enjoy an amazing vacation surrounded by mountains, rivers, and snow.&lt;/p&gt;

&lt;p&gt;I had a fantastic time at DSC Summit, met some awesome people, and had a good experience doing panel discussion about Pakistan's state in IT Industry. Thank you Saad Hamid, Google, and other folks who organized such a great event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_ZBwGrhW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qhc7t1pbhzzk0r1u2blc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_ZBwGrhW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qhc7t1pbhzzk0r1u2blc.jpg" alt="Me (most left) participating in panel discussion at Pakistan DSC Summit 2019"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After DSC Summit, we traveled in Islamabad, Rawalpindi, Murree, and Ayubia to enjoy a ton of places. And I must say that a trip with a baby is whole another experience which I never had before. This trip proved to be so refreshing and rebooted all our energy. This was much needed relaxation which I was seeking for. In all this, I am hugely grateful for Mubashir Hassan for his lovely hospitality and wonderful dinner at Savor Foods.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sDO7wc70--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/he1vksrx25yissyozs0d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sDO7wc70--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/he1vksrx25yissyozs0d.jpg" alt="Somewhere in F-9 Park, Islamabad"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Swag
&lt;/h1&gt;

&lt;p&gt;As a developer, who doesn't like the free swag. In 2019 year, I did collected some awesome swags from different events, conferences, and also a special Kotlin Everywhere t-shirt from a dear friend Vikash Prithwani and Jetbrains stickers from Saad Pasta. Here are few pictures:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hbI_BXEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hmc7gped95cooclzstox.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hbI_BXEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hmc7gped95cooclzstox.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t7khLzRQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uzrb8svl30ebfse00pi7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t7khLzRQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uzrb8svl30ebfse00pi7.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OXYYKSvX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w7re3kiv78e44e0b3ak2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OXYYKSvX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w7re3kiv78e44e0b3ak2.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PgC60KaZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l3cbvk3aycayjpgymc6q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PgC60KaZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l3cbvk3aycayjpgymc6q.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7f6C6OOl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jklr1owii7y4ocjlmd14.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7f6C6OOl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jklr1owii7y4ocjlmd14.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Wrapping Up
&lt;/h1&gt;

&lt;p&gt;Finally, to wrap up the year, we had a blast first birthday of our son before the official 1st January date on 28th December. It went super amazing. Everyone in the family enjoyed it a lot. Interestingly, I had a talk on the very same day in morning. This was again organized by the Android Pakistan Community like the previous one at start of year when we were naming our baby.&lt;/p&gt;

&lt;p&gt;This year, I haven't added any books/movies in this review as I didn't get much time to do that. I will publish the 2020's year in review soon. Thank you for reading this and don't forget to &lt;a href="https://wajahatkarim.substack.com"&gt;subscribe to my newsletter&lt;/a&gt; where I tend to share interesting things about parenting, remote job, programming and more.&lt;/p&gt;




</description>
      <category>yearinreview</category>
      <category>android</category>
      <category>writing</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Level up your Android dev skills with DroidUp Newsletter</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Fri, 17 Jan 2020 11:03:18 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/level-up-your-android-dev-skills-with-droidup-newsletter-1lh</link>
      <guid>https://forem.com/wajahatkarim/level-up-your-android-dev-skills-with-droidup-newsletter-1lh</guid>
      <description>&lt;p&gt;👐 Hey folks!&lt;/p&gt;

&lt;p&gt;🔥 I am starting a newsletter called DroidUp. This is a newsletter for Android Developers to learn about the latest things, tips, and skills in Android development manually handcrafted and curated by me.&lt;/p&gt;

&lt;p&gt;🙏 I need your support in bringing an impact on the community through this newsletter. So, sign up now and get excited about the first issue.&lt;/p&gt;

&lt;p&gt;👉 Subscribe it on this link: &lt;a href="https://wajahatkarim.substack.com/"&gt;https://wajahatkarim.substack.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the meantime you subscribe, please share this with your friends and colleagues. It means the world to me. &lt;/p&gt;

</description>
      <category>newsletter</category>
      <category>showdev</category>
      <category>android</category>
      <category>email</category>
    </item>
    <item>
      <title>Add Push Notifications to Your Android Chat App Using Kotlin</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Sat, 23 Nov 2019 22:20:58 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/add-push-notifications-to-your-android-chat-app-using-kotlin-2c46</link>
      <guid>https://forem.com/wajahatkarim/add-push-notifications-to-your-android-chat-app-using-kotlin-2c46</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://wajahatkarim.com/2019/11/add-push-notifications-to-your-android-chat-app-using-kotlin/" rel="noopener noreferrer"&gt;wajahatkarim.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For any kind of chat apps, notifications are the driver behind whole chat concept. These notifications lets users know that a new message has been sent, and asks to respond to it. This seems like a micro-interaction from user experience perspective, but this tiny interactions makes the whole chat a real-time conversation. This allows users to do multitasking while talking with their friends just as people do in real in-person or call meetings.&lt;/p&gt;

&lt;p&gt;These notifications are called as Push Notifications in the language of Android / iOS development. In this article, you are going to learn on how to add push notifications in your Android chat apps in Kotlin using the simplicity or rather the beauty of CometChat Pro SDK.&lt;/p&gt;

&lt;p&gt;As you are going to integrate push notifications in the Android chat apps, you will need at least a simple chat app with basic functionality such as sending / receiving messages. This article will use the &lt;a href="https://github.com/wajahatkarim3/Chaty" rel="noopener noreferrer"&gt;Chaty sample app&lt;/a&gt; from &lt;a href="https://dev.to/wajahatkarim/build-a-one-on-one-android-chat-app-using-kotlin-1cf7-temp-slug-1268680"&gt;this article&lt;/a&gt; and integrate push notifications in it when user gets any new message from other users. If you want to develop the chat app first, you can follow that article first and come back to this later. Or you can directly start from the already built chat app to learn about Push Notifications using the &lt;a href="https://github.com/wajahatkarim3/Chaty/tree/push-notifications-start" rel="noopener noreferrer"&gt;push-notifications-start&lt;/a&gt; branch of Chaty app here.&lt;/p&gt;

&lt;p&gt;Here’s the final demo of the application you’re going to build in this article.&lt;/p&gt;

&lt;p&gt;&lt;a href="//raw.githubusercontent.com/wajahatkarim3/Chaty/push-notifications-finish/Screenshots/Push%20Notifications%20-%20Demo.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fwajahatkarim3%2FChaty%2Fpush-notifications-finish%2FScreenshots%2FPush%2520Notifications%2520-%2520Demo.gif" alt="Chaty Push Notifications - Demo"&gt;&lt;/a&gt;Chaty Push Notifications - Demo&lt;/p&gt;

&lt;p&gt;You can see in the demo GIF that Captain America (left) &amp;amp; Cyclops (right) are sending messages to each other and those messages are being delivered through push notifications of Android devices. Rather than just simply explaining the basic send/receive push notification, this article is going to explain some practical use-cases implemented in modern chat apps. These cases are listed below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User can receive notifications when app is in background or completely removed from the Recent Apps in Android device.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User can receive notifications while app is active and in foreground and either Contacts or Profile or any other chat conversation screen are open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User don’t receive notifications when the chat between sending user and receiving user is already open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User can mute or unmute any specific user’s notifications at anytime.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Chaty Code Overview
&lt;/h1&gt;

&lt;p&gt;Before getting started, if you have followed the Chaty article, then here’s a basic overview of the code and parts where you will be working in. And if you have your own chat app with your custom code, then you can skip this section.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;LoginActivity.kt&lt;/code&gt; manages the user login functionality. Once the user is successfully logged in, it opens the Contacts screen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ContactsActivity.kt&lt;/code&gt; represents the Contacts screen. It fetches all other users data from CometChat Pro and shows in the screen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ProfileActivity.kt&lt;/code&gt; displays the profile screen with the current logged in user’s name, email, avatar etc. This also manages the logout functionality of the user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ChatActivity.kt&lt;/code&gt; handles the chat session of the users. This is responsible for sending and receiving messages between the users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;ChatyApp.kt&lt;/code&gt; is the main Application class of the whole app and is responsible for initializing the CometChat SDK when the app launches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;strings.xml&lt;/code&gt; file contains the CometChat API key and App ID. You should update this with your own keys now before moving further with this article.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beside these classes, there are some model files for data holding and some Kotlin extensions to make utility methods easier to use.&lt;/p&gt;




&lt;h1&gt;
  
  
  Setting up Firebase Project
&lt;/h1&gt;

&lt;p&gt;There are many different APIs for sending push notifications in Android such &lt;a href="http://onesignal.com/" rel="noopener noreferrer"&gt;OneSignal&lt;/a&gt;, &lt;a href="http://onesignal.com/" rel="noopener noreferrer"&gt;Firebase Messaging Service (FCM)&lt;/a&gt; etc. This tutorial will show you on how to integrate Firebase Messaging Service (FCM) service in your chat apps in a very easy way.&lt;/p&gt;

&lt;p&gt;To integrate Firebase Messaging, you will need to create a project in Firebase Console. Go to &lt;a href="http://console.firebase.google.com/" rel="noopener noreferrer"&gt;Firebase Console&lt;/a&gt; and create a new account if you don’t have one. Once inside Firebase console, add a new project by clicking on the &lt;code&gt;+ Add project&lt;/code&gt; button. Set the name of the project to &lt;code&gt;MyChatApp&lt;/code&gt; or anything you like.&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569792894504_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569792894504_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the step 2, uncheck the &lt;code&gt;Enable Google Analytics for this project&lt;/code&gt; and click &lt;code&gt;Create Project&lt;/code&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569793176884_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569793176884_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, as your project becomes ready, you will be redirected the project overview page. Here. add add a new Android app by clicking on the android robot icon.&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569793345495_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569793345495_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be presented with a registration form now. Add the &lt;em&gt;Package Name&lt;/em&gt; of your app. For example, &lt;code&gt;com.cometchat.mychatapp&lt;/code&gt;. You can skip the App Name, &lt;em&gt;Debug Signing Certificate SHA-1&lt;/em&gt; here. Click on &lt;em&gt;Register App&lt;/em&gt; button.&lt;/p&gt;

&lt;p&gt;This will allow you to download the &lt;code&gt;google-services.json&lt;/code&gt; file. This file is the configuration to integrate your app and Firebase and use any Firebase services from your app. In your case, that service is going to Firebase Messaging Service. Click on the Download google-services.json button and save it in the &lt;code&gt;app&lt;/code&gt; directory of your app code.&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%2Fwww.gstatic.com%2Fmobilesdk%2F160426_mobilesdk%2Fimages%2Fandroid_studio_project_panel%402x.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%2Fwww.gstatic.com%2Fmobilesdk%2F160426_mobilesdk%2Fimages%2Fandroid_studio_project_panel%402x.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, in your project’s root &lt;code&gt;build.gradle&lt;/code&gt; file, copy this line (#12) in the &lt;code&gt;dependencies&lt;/code&gt; section like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.21'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.google.gms:google-services:4.3.2"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in your app’s &lt;code&gt;build.gradle&lt;/code&gt; file, add Google Services plugin (line #24), Firebase Messaging dependency (line #23), CometChat Push Notification extension (line #20 &amp;amp; #21) and change the &lt;code&gt;applicationId&lt;/code&gt; to the package name you added in the Firebase Console when creating the project (line #8). In this case, it was &lt;code&gt;com.comet.mychatapp&lt;/code&gt; like the code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.comet.mychatapp"
        minSdkVersion 21
        // ... 
    }
    // ...
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // ...

    // CometChat Push Notification Extension
    implementation "com.cometchat:pro-android-chat-sdk:1.8.+"
    implementation "com.cometchat:pro-ext-pn:1.0.+"

    // Firebase Messaging
    implementation "com.google.firebase:firebase-messaging:20.0.0"

    // ...
}
apply plugin: 'com.google.gms.google-services'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press &lt;em&gt;Sync Now&lt;/em&gt; button and this will be a successful build. Firebase is integrated in our app. Back to the Firebase Console, click the Next button and then continue to the console.&lt;/p&gt;

&lt;p&gt;Now, click on the small gear icon beside the &lt;code&gt;Overview&lt;/code&gt; button, and select &lt;code&gt;Project Settings&lt;/code&gt; button.&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569795726181_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569795726181_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the &lt;code&gt;Cloud Messaging&lt;/code&gt; tab and copy the &lt;code&gt;Server key&lt;/code&gt; to some temporary place. This will come handy in a moment.&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569796003084_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569796003084_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you are all set from the Firebase Console side. Let’s move to the CometChat dashboard now.&lt;/p&gt;




&lt;h1&gt;
  
  
  Enabling CometChat Push Notification Extension
&lt;/h1&gt;

&lt;p&gt;One of the great features of CometChat Pro is to provide you the &lt;strong&gt;Extensions&lt;/strong&gt;. These extensions let you add more functionality with the full control over it to enable/disable at anytime. So to integrate Firebase Messaging (FCM) push notifications feature into CometChat, you need to enable the &lt;a href="https://prodocs.cometchat.com/docs/push-notifications" rel="noopener noreferrer"&gt;Push Notification Extension&lt;/a&gt; from CometChat dashboard. Head to your &lt;a href="https://prodocs.cometchat.com/docs/push-notifications" rel="noopener noreferrer"&gt;CometChat dashboard&lt;/a&gt; and click on the &lt;code&gt;Extensions&lt;/code&gt; menu. Add &lt;code&gt;Push Notification&lt;/code&gt; from the extensions list.&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569796321067_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569796321067_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the extension is enabled, paste the copied FCM Server key it into the extension by clicking on &lt;strong&gt;Actions → Settings&lt;/strong&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569796597626_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569796597626_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, CometChat and Firebase are integrated with each other. This means that CometChat will be able to use FCM as the push notifications service. Let’s head into the coding now.&lt;/p&gt;




&lt;h1&gt;
  
  
  Add Firebase Messaging in Your App
&lt;/h1&gt;

&lt;p&gt;As you have configured Firebase and CometChat project and setup their integration, its time to actually utilize this integration to send/receive push notifications in your chat apps. First step is to create the &lt;code&gt;FirebaseMessagingService&lt;/code&gt; class. This class will manage the functionality when any push notification is triggered for your apps. This is where you will actually write code to create mobile notification with vibration, sound, etc. to show it to the user.&lt;/p&gt;

&lt;p&gt;Create a new class and name it &lt;code&gt;FcmListenerService&lt;/code&gt;. Now extend this from the &lt;code&gt;FirebaseMessagingService&lt;/code&gt; class, and override the following methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;onNewToken()&lt;/code&gt; - This is called when the device token gets generated. The device token change when app deletes the Instance ID, or app is restored on a new device, or the user uninstalls / re-installs the app, or the user deletes the app cache. This method will provide you the new device token. This token is used to send the push notifications to that specific device.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;onMessageReceived()&lt;/code&gt; - This is the actual method which is called when any push notification is received by the device. This is where you will perform your notification functionality like generating the actual device notification with the data like sender name, message, avatar image etc. and show it to the user.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class FcmListenerService : FirebaseMessagingService()
{
    override fun onNewToken(token: String) {
      super.onNewToken(token)
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
      Log.w("onMessageReceived", "Message Received from " + remoteMessage.from)

      PNExtension.getMessageFromJson(JSONObject(remoteMessage.data["message"]), object : CometChat.CallbackListener&amp;lt;BaseMessage&amp;gt;(){
          override fun onSuccess(baseMessage: BaseMessage?) {
              when(baseMessage)
              {
                  is TextMessage -&amp;gt; {
                      // Convert BaseMessage to TextMessage
                      var textMessage = baseMessage

                      // Send notification for this text message here

                  }
              }
          }

          override fun onError(exception: CometChatException?) {
              exception?.printStackTrace()
          }
      })
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once your class is ready, add it in the &lt;code&gt;AndroidManifest.xml&lt;/code&gt; file in the &lt;code&gt;&amp;lt;application&amp;gt;&lt;/code&gt; tag.&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;manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wajahatkarim3.chaty"&amp;gt;

    &amp;lt;application&amp;gt;

        &amp;lt;!-- Firebase Messaging --&amp;gt;
        &amp;lt;service
            android:name=".FcmListenerService"
            android:exported="false"&amp;gt;
            &amp;lt;intent-filter&amp;gt;
                &amp;lt;action android:name="com.google.firebase.MESSAGING_EVENT" /&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
        &amp;lt;/service&amp;gt;

    &amp;lt;/application&amp;gt;
&amp;lt;/manifest&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the traditional way, you have to get the device token in &lt;code&gt;onNewToken()&lt;/code&gt; method, and then send it to the server or any remotely available storage. And each time any user sends the message, you have to hit some remote service which dispatches notifications to the target devices. And then in the &lt;code&gt;onMessageReceived()&lt;/code&gt; method, you have to decode that message and extract data from it and show it to the user in form of any device notification.&lt;/p&gt;

&lt;p&gt;But, CometChat is doing everything on its own and removes the dependency of the remote connection. It allows you to decode Firebase’s &lt;code&gt;RemoteMessage&lt;/code&gt; through the &lt;code&gt;PNExtension.getMessageFromJson()&lt;/code&gt; method in a very simple code.&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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569829766647_image.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%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569829766647_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have all the boilerplate work in place. Let’s actually send / receive some messages.&lt;/p&gt;




&lt;h1&gt;
  
  
  Sending and receiving messages
&lt;/h1&gt;

&lt;p&gt;Firebase offers two ways to send messages to other devices.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sending messages to the device IDs (tokens)&lt;/li&gt;
&lt;li&gt;Sending messages to the topics.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since the device IDs / tokens are managed by CometChat and the app must not store any device ID (either own or some other user’s) due to security reasons, this article will use &lt;a href="https://firebase.google.com/docs/cloud-messaging/android/topic-messaging" rel="noopener noreferrer"&gt;the topics approach to send messages&lt;/a&gt;. The topics in the FCM allows you to send messages to all devices that subscribed to a particular topic. The basic idea is that each user subscribes to any topic when logged in, and unsubscribes from it when logging out the app. Other users will send messages to that topic, and all the users who are subscribed to it will receive the messages.&lt;/p&gt;

&lt;p&gt;To simply identify the topic of any user, you need to create the topic IDs with any pattern. This article will follow &lt;code&gt;CometChat App ID + USER + USER ID&lt;/code&gt; pattern. For example, a topic for the App ID with 12345 for the user 7689 will be &lt;code&gt;12345_user_7689&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, head to the &lt;code&gt;LoginActivity.kt&lt;/code&gt; file, and open the &lt;code&gt;performLogin()&lt;/code&gt; method. In the &lt;code&gt;onSuccess()&lt;/code&gt; callback of the &lt;code&gt;CometChat.login()&lt;/code&gt; method, user will subscribe to the the topic. You can subscribe to any topic with the &lt;code&gt;FirebaseMessaging.getInstance().subsrcibeToTopic()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Register for the user type notifications
val topicId = getString(R.string.comet_app_id) + "_" + CometChatConstants.RECEIVER_TYPE_USER + "_" + user.uid
FirebaseMessaging.getInstance().subscribeToTopic(topicId)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To unsubscribe from this topic at the logging out, go to the &lt;code&gt;ProfileActivity.kt&lt;/code&gt; file. In the the &lt;code&gt;onSuccess()&lt;/code&gt; callback of the &lt;code&gt;CometChat.logout()&lt;/code&gt;, add this code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Unsubscribe from the user notifications
val topicId = getString(R.string.comet_app_id) + "_" + CometChatConstants.RECEIVER_TYPE_USER + "_" + user.uid
FirebaseMessaging.getInstance().unsubscribeFromTopic(topicId)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voila. You’re all set. Now, when you send message to any other user, the &lt;code&gt;onMessageReceived()&lt;/code&gt; method will be called in receiving user’s app. Since we have only added the line in logs, you will see a message in Logcat panel in Android Studio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2019-09-30 06:44:55.457 5100-5271/com.comet.mychatapp W/onMessageReceived: Message Received from /topics/1234c23c123455_user_superhero1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can do anything as per your app requirements regarding notifications in this &lt;code&gt;onMessageReceived&lt;/code&gt; method. For the actual device notification, we will use a third-party library called as &lt;a href="https://github.com/Karn/notify" rel="noopener noreferrer"&gt;Notify available at Github&lt;/a&gt; to generate the notifications easily. Follow the instructions on the library’s Read Me page and add this code in the &lt;code&gt;onMessageReceived()&lt;/code&gt; in the &lt;code&gt;when&lt;/code&gt; block for &lt;code&gt;TextMessage&lt;/code&gt; to show the notification on device.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;when(baseMessage)
{
    is TextMessage -&amp;gt; {
        // Convert BaseMessage to TextMessage
        var textMessage = baseMessage

        // Send notification for this text message here
        val notificationId = 124952
        Notify
            .with(this@FcmListenerService)
            .content { // this: Payload.Content.Default
                title = textMessage.sender.name
                text = textMessage.text
            }
            .alerting("high_priority_notification") {
                channelImportance = Notify.IMPORTANCE_HIGH
            }
            .show(notificationId)

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

&lt;/div&gt;



&lt;p&gt;Now, when you send messages to any user, you will see a device notification like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="//paper-attachments.dropbox.com/s_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569834735313_Screenshot_1569834417.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_A5A6DACFC66FBAC46DB7218924BF83F9DB2BA1B6D57CDCC57D9717A408CB4383_1569834735313_Screenshot_1569834417.png" alt="Notification when app is in background"&gt;&lt;/a&gt;Notification when app is in background&lt;/p&gt;




&lt;h1&gt;
  
  
  Mute / Unmute Any User’s Notifications
&lt;/h1&gt;

&lt;p&gt;One important feature of any modern chat app is the ability to mute / unmute notifications from other specific users. CometChat or Firebase do not directly provide any method to do this, but you can do it very easily with using some basic logic in the app.&lt;/p&gt;

&lt;p&gt;In the Chaty app, we have added a popup menu in the Contacts screen where user can mute / unmute others users. When someone mutes any other user, the app stores the user’s ID with prefix &lt;code&gt;mute-&lt;/code&gt;, for e.g. &lt;code&gt;mute-123456&lt;/code&gt; in the &lt;code&gt;SharedPreferences&lt;/code&gt;. This lets the app know that user &lt;code&gt;123456&lt;/code&gt; is muted by the current logged in user. So, now in the &lt;code&gt;onMessageReceived()&lt;/code&gt; method, app checks if the sender’s ID is in the muted list, then it doesn’t generate notification at all like the code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;when(baseMessage)
{
    is TextMessage -&amp;gt; {
        // Convert BaseMessage to TextMessage
        var textMessage = baseMessage

        var prefs = PreferenceManager.getDefaultSharedPreferences(this@FcmListenerService)
        if ( prefs.getBoolean("mute-${textMessage.sender.uid}", false) )
        {
          // Don't send the notification as the contact is muted for notifications
        }
        else
        {
          // Send notification for this text message here
          val notificationId = 124952
          Notify
              .with(this@FcmListenerService)
              .content { // this: Payload.Content.Default
                  title = textMessage.sender.name
                  text = textMessage.text
              }
              .alerting("high_priority_notification") {
                  channelImportance = Notify.IMPORTANCE_HIGH
              }
              .show(notificationId)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, when you add &lt;code&gt;mute-USER_ID&lt;/code&gt; in the app’s &lt;code&gt;SharedPreferences&lt;/code&gt;, then app won’t show notifications of that specific user. You can see in the &lt;a href="https://github.com/wajahatkarim3/Chaty/blob/push-notifications-finish/app/src/main/java/com/wajahatkarim3/chaty/ContactsActivity.kt" rel="noopener noreferrer"&gt;&lt;code&gt;ContactsActivity&lt;/code&gt;&lt;/a&gt; in the final code at &lt;a href="https://github.com/wajahatkarim3/Chaty/tree/push-notifications-finish" rel="noopener noreferrer"&gt;push-notifications-finish&lt;/a&gt; branch of Chaty on Github how this small tactic is being used to mute / unmute users.&lt;/p&gt;




&lt;h1&gt;
  
  
  Showing Notifications in Specific Screens
&lt;/h1&gt;

&lt;p&gt;Now as mute functionality is working, there’s one other case where you can avoid to show notifications. For example, if the user is already chatting with other user, and that specific chat is already open, then it doesn’t make sense to send / receive notifications while in that screen. The Chaty app handles this in a very similar approach as mute / unmute functionality is doing. The app is storing &lt;code&gt;isChatOn&lt;/code&gt; and that user’s ID in the &lt;code&gt;SharedPreferences&lt;/code&gt; in the &lt;code&gt;chatUserId&lt;/code&gt;. And then in the &lt;code&gt;onMessageReceived()&lt;/code&gt; method in &lt;code&gt;FcmListenerService&lt;/code&gt; class, we are adding another check to see if the app should generate notification or not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;when(baseMessage)
{
    is TextMessage -&amp;gt; {
        // Convert BaseMessage to TextMessage
        var textMessage = baseMessage

        var prefs = PreferenceManager.getDefaultSharedPreferences(this@FcmListenerService)
        if ( prefs.getBoolean("mute-${textMessage.sender.uid}", false) 
          || (prefs.getBoolean("isChatOn", false) &amp;amp;&amp;amp; prefs.getString("chatUserId", "").equals(textMessage.sender.uid)) )
        {
          // Don't send the notification as the contact is muted for notifications
        }
        else
        {
          // Send notification for this text message here
          val notificationId = 124952
          Notify
              .with(this@FcmListenerService)
              .content { // this: Payload.Content.Default
                  title = textMessage.sender.name
                  text = textMessage.text
              }
              .alerting("high_priority_notification") {
                  channelImportance = Notify.IMPORTANCE_HIGH
              }
              .show(notificationId)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells the app that chat screen is already open of the sender user, so there’s no need to generate the device notification.&lt;/p&gt;

&lt;p&gt;You can do a lot of other stuff like generate popup notifications, showing unread messages count bubble etc. with this simple tactic. You can see how &lt;a href="https://github.com/wajahatkarim3/Chaty/blob/push-notifications-finish/app/src/main/java/com/wajahatkarim3/chaty/ChatActivity.kt.kt" rel="noopener noreferrer"&gt;&lt;code&gt;ChatActivity.kt&lt;/code&gt;&lt;/a&gt; is handling the &lt;code&gt;isChatOn&lt;/code&gt; and &lt;code&gt;chatUserId&lt;/code&gt; values in &lt;code&gt;SharedPreferences&lt;/code&gt; to allow this simple feature on the &lt;a href="https://github.com/wajahatkarim3/Chaty/tree/push-notifications-finish" rel="noopener noreferrer"&gt;push-notifications-finish&lt;/a&gt; branch of Chaty app on Github.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;You have now learned how to add push notifications feature to your Andorid apps in Kotlin using CometChat Pro and Firebase Messaging Service. You also learned about how to send / receive message notifications, mute / unmute specific users, and handling notifications for specific screens. You also learned about CometChat and how easy it is to build a custom chat app using its chat SDK. Congratulations on making it this far!&lt;/p&gt;

&lt;p&gt;Don’t forget to checkout &lt;a href="https://prodocs.cometchat.com/docs/android-quick-start" rel="noopener noreferrer"&gt;CometChat documentation&lt;/a&gt; for advanced features such as sending image and voice chat etc. And for the whole code of this tutorial, check &lt;code&gt;push-notification-finish&lt;/code&gt; branch of the &lt;a href="https://prodocs.cometchat.com/docs/android-quick-start" rel="noopener noreferrer"&gt;Chaty app on Github here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you liked this article, you can read my new articles below:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/wajahatkarim/-is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-4fi1"&gt;⚡ Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately.&lt;/a&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://link.medium.com/fKKVXLB8fZ" rel="noopener noreferrer"&gt;📆 Reflections on 2018 — My Year In Review&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk" rel="noopener noreferrer"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635" rel="noopener noreferrer"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/" rel="noopener noreferrer"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on blog and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending" rel="noopener noreferrer"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3" rel="noopener noreferrer"&gt;His libraries&lt;/a&gt; have about 2000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on &lt;a href="https://twitter.com/WajahatKarim" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; and &lt;a href="https://medium.com/@wajahatkarim3" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;

&lt;p&gt;Also, if you have any questions you’d like him to answer, contact him through his website at &lt;a href="http://wajahatkarim.com" rel="noopener noreferrer"&gt;wajahatkarim.com&lt;/a&gt; with DEAR WAJAHAT in the subject line.&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>firebase</category>
      <category>cometchat</category>
    </item>
    <item>
      <title>How is Flutter Different from Native, Web-view, and Other Cross-platform Frameworks</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Mon, 18 Nov 2019 13:20:58 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/how-is-flutter-different-from-native-web-view-and-other-cross-platform-frameworks-57je</link>
      <guid>https://forem.com/wajahatkarim/how-is-flutter-different-from-native-web-view-and-other-cross-platform-frameworks-57je</guid>
      <description>&lt;p&gt;&lt;strong&gt;Flutter&lt;/strong&gt; is an application development framework from Google for creating cross-platform mobile applications (in iOS and Android). As mentioned on the &lt;a href="https://flutter.dev/"&gt;official website&lt;/a&gt;, it aims to make the development as easy, quick, and productive as possible. Features such as Hot Reload, a vast widget catalog, very good performance, and a solid community contribute to meeting that objective and make &lt;a href="https://hub.packtpub.com/google-releases-flutter-1-9-at-gdd-google-developer-days-conference/"&gt;Flutter&lt;/a&gt; a pretty good mobile development framework.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This post is an excerpt from the book &lt;a href="https://www.packtpub.com/application-development/google-flutter-mobile-development-quick-start-guide?utm_source=wajahatkarim.comm&amp;amp;utm_medium=referral&amp;amp;utm_campaign=Outreach"&gt;Google Flutter Mobile Development Quick Start Guide by Packt Publishing&lt;/a&gt; written by Prajyot Mainkar, and Salvatore Giordano. This is a fast-paced guide to get you started with cross-platform mobile application development with Google Flutter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When speaking of mobile application development, there are many different approaches that we can find, but, in the end, everything comes down to either a native or a cross-platform approach. Let’s see how different approaches look and work when compared to Flutter. We will first take a look at the native platforms, and then, before looking at the cross-platform approach, we will take a look at the &lt;strong&gt;WebView&lt;/strong&gt; system, and finally we will see where &lt;a href="https://hub.packtpub.com/google-i-o-2019-flutter-ui-framework-now-extended-for-web-embedded-and-desktop/"&gt;Flutter&lt;/a&gt; fits into this mix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Native Platforms
&lt;/h2&gt;

&lt;p&gt;Native frameworks such as Android and iOS SDKs are rock solid. They are the most stable choice for mobile application development. They have lots of available apps that are deeply tested and have a large community and openly available tutorials. The following diagram displays the working of native mobile application development frameworks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--REcsrjSu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155634/image--000.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--REcsrjSu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155634/image--000.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can see in the preceding diagram, the &lt;strong&gt;app&lt;/strong&gt; in this framework talks directly to the system. This makes the native framework the most powerful choice in terms of functionality. However, it does have a drawback: you need to learn two different languages, Kotlin or Java for Android, Obj-C or Swift for iOS and the SDKs. These languages are used to write two different apps with the same functionalities. Every modification must be duplicated on both platforms, and the process might not be that smooth. It is not a good choice for a small team or for someone who needs speed in their development process.&lt;/p&gt;




&lt;h2&gt;
  
  
  WebView Platforms
&lt;/h2&gt;

&lt;p&gt;On the other hand, we have the cross-platform approach, which is famous for being productive. In this approach, we can get the application for both Android and iOS from a single code base, just like in Flutter. But every framework has some drawbacks.&lt;/p&gt;

&lt;p&gt;Cordova-, Ionic-, PhoneGap-, and WebView-based frameworks in general are goodexamples of cross-platform frameworks, and they are especially good solutions for frontend developers. But these lack in performance, and the app view in these approaches is composed by a WebView rendering HTML; this means that the app is basically a website.&lt;/p&gt;

&lt;p&gt;The following diagram shows how a WebView-based framework works:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QEWC2JVH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155634/image--001.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QEWC2JVH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155634/image--001.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The system uses a bridge to make the switch between JavaScript to the native system. This process will be too slow, depending on the features you need,which adds another drawback to this system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other Cross-Platform Approaches
&lt;/h2&gt;

&lt;p&gt;Let’s take an example of another cross-platform approach to see what could be the shortcomings of it. Xamarin is the Windows answer to cross-platform development, which in my opinion is not so convenient, especially in terms of productivity and compiling time.&lt;/p&gt;

&lt;p&gt;When looking at other platforms, React Native could be considered as one of the best cross-platform frameworks, but it heavily relies on OEM components.&lt;/p&gt;

&lt;p&gt;Let’s take a look at the workings of React Native:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IYMV67hf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155635/image--002.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IYMV67hf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155635/image--002.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React Native expands the bridge concept in the WebView systems, and uses it not only for services, but also to build widgets. This is really dangerous in terms of performance; for example, a component may be built hundreds of times during an animation, but due to the expanded concept of the bridge, this component may slow down to a great extent. This could also lead to other problems, especially on Android, which is the most fragmented operating system.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Read more at:&lt;/em&gt; &lt;a href="https://hub.packtpub.com/react-native-vs-xamarin-which-is-the-better-cross-platform-mobile-development-framework/"&gt;React Native VS Xamarin: Which is the better cross-platform mobile development framework?&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Flutter’s Approach to Mobile App Development
&lt;/h2&gt;

&lt;p&gt;In the previous sections, we took a look at different approaches to mobile application development. We have briefly seen how these approaches work and their drawbacks. Now let’s take a look at &lt;a href="https://hub.packtpub.com/flutter-gets-new-set-of-lint-rules-to-build-better-chrome-os-apps/"&gt;Flutter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Flutter performs much better in comparison to other solutions, because the application is compiled AOT (Ahead Of Time) instead of JIT (Just In Time) like the JavaScript solutions. It also eliminates the concept of the bridge and does not rely on the OEM platform. It does allow custom components to use all the pixels in the screen. What does this mean? It basically means that the app displays the same on every version of Android and iOS.&lt;/p&gt;

&lt;p&gt;We did take a look at the workings of other approaches, so let’s take a look at the workings of Flutter as well. You can see the way the Flutter framework works as shown in the following diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H9gZEMyn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155635/image--003.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H9gZEMyn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/wajahatkarimcom/image/upload/v1574155635/image--003.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can see the difference between other cross-platform approaches and &lt;a href="https://hub.packtpub.com/google-to-make-flutter-1-0-cross-platform-introduces-hummingbird-to-bring-flutter-apps-to-the-web/"&gt;Flutter&lt;/a&gt;. As stated before, Flutter eliminated the bridge and the OEM platform and uses &lt;strong&gt;Widgets Rendering&lt;/strong&gt; instead to work with the canvas and events. And it uses &lt;strong&gt;Platform Channels&lt;/strong&gt; to use the services. In addition, it is not difficult to use platform APIs with an asynchronous messaging system, which means if you need to use a specific Android or iOS feature, you can do it easily.&lt;/p&gt;

&lt;p&gt;Flutter also makes it possible to create plugins using channels that can be used by every new developer. So, to put it simply: code once, and use it everywhere!&lt;/p&gt;

&lt;p&gt;In this post we compared Flutter to existing mobile development frameworks – native, WebView, and cross-platform. To further understand the fundamentals of Flutter and to get started with cross-platform mobile app development, read &lt;a href="https://www.packtpub.com/in/application-development/google-flutter-mobile-development-quick-start-guide"&gt;Google Flutter Mobile Development Quick Start Guide&lt;/a&gt; by Packt Publishing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you liked this article, you can read my new articles below:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wajahatkarim.com/2019/07/build-a-one-on-one-android-chat-app-using-kotlin/?ref=devprofile"&gt;Build a One-on-One Android Chat App using Kotlin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wajahatkarim.com/2019/02/reflections-on-2018---my-year-in-review/?ref=devprofile"&gt;📆 Reflections on 2018 — My Year In Review&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on blog and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3"&gt;His libraries&lt;/a&gt; have about 2000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on &lt;a href="https://twitter.com/WajahatKarim"&gt;Twitter&lt;/a&gt; and &lt;a href="https://medium.com/@wajahatkarim3"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;

&lt;p&gt;Also, if you have any questions you’d like him to answer, contact him through his website at &lt;a href="http://wajahatkarim.com"&gt;wajahatkarim.com&lt;/a&gt; with DEAR WAJAHAT in the subject line.&lt;/p&gt;

</description>
      <category>android</category>
      <category>flutter</category>
      <category>react</category>
      <category>crossplatform</category>
    </item>
    <item>
      <title>How Do You Refactor Any Existing and Very Old Codebase? </title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Sun, 25 Aug 2019 08:18:10 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/how-do-you-refactor-any-existing-and-very-old-codebase-2oec</link>
      <guid>https://forem.com/wajahatkarim/how-do-you-refactor-any-existing-and-very-old-codebase-2oec</guid>
      <description>&lt;p&gt;So at work, I have been working on codebase which is almost 2 years old. It seems like its written by some students who were just started to learn Android development. Here's some quick facts about codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;No architecture like MVP, MVVM or anything. Each single Activity class does everything like UI work, data persistence, network calls, deep links integrations, business logic, and so on. This results in classes with 20,000 lines of code and makes code navigation a lot harder. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some Activity classes include code for 3-4 screens. Like layouts have 4-5 sub layouts and those are being shown/hidden according to the state of app. Again, each screens' logic, network calls, persistence etc goes into same activity class. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The code is in Java and uses lots of old libraries like Volley etc. I have recently shifted codebase to use AndroidX which itself was a big problem. There's no Material Components or anything close to Material Design. Sometimes it feels like the designer is more familiar with iOS. So design patterns, UI interactions are more like iOS way. So sometimes it becomes hard to create such in Android. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The app uses lots of flavors and dimensions to create white labeled app for each client using different server, databases, color schemes, and which features to enable etc. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we are scaling to more clients day by day. We want to refactor the codebase to Kotlin and preferably use some architecture atleast a little. We are currently removing network calls from all classes and shifting them to a repository class at start. &lt;/p&gt;

&lt;p&gt;How do we proceed with this? We would love to know your feedback. &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>architecture</category>
      <category>refactorit</category>
      <category>android</category>
    </item>
    <item>
      <title>Everything for Android Developers from Google IO 2019</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Wed, 15 May 2019 22:28:14 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/everything-for-android-developers-from-google-io-2019-5dle</link>
      <guid>https://forem.com/wajahatkarim/everything-for-android-developers-from-google-io-2019-5dle</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jP43bwnz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AeFhf9jLd9nrB1l_j7jb82Q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jP43bwnz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AeFhf9jLd9nrB1l_j7jb82Q.gif" alt=""&gt;&lt;/a&gt;Google IO 2019 Logo — Credits: Google&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href="https://wajahatkarim.com"&gt;https://wajahatkarim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Google IO is a a mega event and annual developers conference organized and hosted by Google at their California headquarters where they share the updates about their new products, hardware, software, platform, innovations etc.&lt;/p&gt;

&lt;p&gt;Android has grown into a very huge product for Google over the years. And each year Google IO event contains lots of new updates and feature announcements for Android. As an &lt;a href="https://wajahatkarim.com"&gt;Android developer working for almost a decade&lt;/a&gt;, 8 years to be precise, I have always wondered what its like to attend the event in person.&lt;/p&gt;

&lt;p&gt;There have always been lots of sessions about Android, Firebase, TensorFlow, Assistant, and what not each year. So every year, it becomes quite overwhelming and daunting task for me and maybe for other developers to search for the sessions of the interest i-e Android development for me.&lt;/p&gt;

&lt;p&gt;There are 175 sessions this year on almost all products of Google like Maps, Assistant, Nest, Android, Firebase and so on. I have &lt;a href="https://www.youtube.com/playlist?list=PLXMdwAjxNx7pGotQU8OXQWCSMLhFQz-YS"&gt;filtered 71 sessions which are directly about Android development&lt;/a&gt; and divided them in categories. There are some more which I have skipped as well. Here’s the list of all the sessions from Google IO 2019 by Google on YouTube.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLXMdwAjxNx7pGotQU8OXQWCSMLhFQz-YS"&gt;Google IO 2019 for Android Developers Youtube List&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an android developer, you can watch all these videos hassle-free. But it can take lots of time. So, I have further grouped these sessions so that you can watch the ones which absolutely interest you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#52ee"&gt;Keynotes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#45c5"&gt;Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#d2de"&gt;New in Android Q&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#8a7d"&gt;Android Development Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#f911"&gt;New APIs in Android Q&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#12d9"&gt;Android Coding Tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#fb59"&gt;Design and UI/UX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#07ae"&gt;Android in C++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#3c98"&gt;Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#4fe1"&gt;Firebase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#f400"&gt;Google Play&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#a432"&gt;Google Assistant, Android for Cars, and TV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#6e3f"&gt;Machine Learning and Augmented Reality&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/p/ac3b7ff41f4#9647"&gt;Android Game Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Keynotes
&lt;/h3&gt;

&lt;p&gt;The theme of IO 19 was user privacy, security and digital well-being. And you will learn all about how Google has worked on these things throughout all their products in this main keynote event from Google CEO Sundar Pichai.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lyRPyRKHO8M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;For Android developers, the major announcement from this keynote session is Android Q. There have been quite some changes in Android Q which need to be implemented by android developers for their apps to run on Android Q such as location permissions, dark theme, shared storage etc. You can get more developer specific update on this Developer Keynote session here.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/LoLqSbV1ELU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;These two Sessions are highly recommended and shouldn’t be skipped as these will give you big picture perspective of whole IO 19 event.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Android
&lt;/h3&gt;

&lt;p&gt;In this section, I will share the sessions which are directly about native android development and Android Studio. So let’s start from what’s new in Android. You will learn about new developer features such as Bubbles, Dark Theme, Share Sheet, Improvements in Notifications and types, Gesture Navigation, CameraX, Jetpack Compose and lots of other things.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/td3Kd7fOROw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  New in Android Q
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GcQu1Jt8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/720/0%2A3M61A2MYJPbVXu2_.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GcQu1Jt8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/720/0%2A3M61A2MYJPbVXu2_.jpg" alt=""&gt;&lt;/a&gt;Image Credits: &lt;a href="http://digitaltrends.com"&gt;Digital Trends&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an Android developer, if you want your apps to run smoothly on Android Q, you need to have a good understanding on the new features of Android Q. So you can learn all about those new features in this session with enough technical details.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/nWbW58RMteI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Now as you have become familiar with Android Q interface and new features, here are some more sessions to discuss those changes in more details.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/bFp2n5OxYEE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0uG_RKiDmQY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Y_8ZlUP2C5o"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/bTodlNvQGfY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;And finally some tips and tricks for managing your app’s user settings for digital well-being. This is highly recommended session.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8dH7gmpF5WQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Now as you have become more familiar with Android Q, let’s dive into some new features which might crash your apps or at least make your app weird on this new OS. So these sessions are going to fix your those problems.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/OCHEjeLC_UY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3EtBw5s9iRY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/L7zwfTwrDEs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Android Development Tools
&lt;/h3&gt;

&lt;p&gt;This year at Google IO 19, Android has officially become Kotlin first for developers. So we start with Kotlin and its 2 years journey on Android. This session discusses the progress made in Android support for Kotlin along with topics like annotations, framework APIs, IDE support for low-level bytecode optimizations in the D8/R8 compiler, and work on the Kotlin Foundation.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8rYLFD1ZfnM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--So6lnRjj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2APuq2NjWTGXw32f7W.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--So6lnRjj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2APuq2NjWTGXw32f7W.jpg" alt=""&gt;&lt;/a&gt;Android Studio&lt;/p&gt;

&lt;p&gt;Android Studio and tools have been a major concern as there has been lots of problems with android developers. This year, Google hasn’t introduced much new features or tools. Rather they have worked on fixing and improving these frustrating problems of developers. You can learn all about these in following sessions.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8rfvfojtRss"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/oWTG5g5rT4s"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/LFRCzsD7UhY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ihF-PwDfRZ4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Up3hyBSDAMA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  New APIs in Android Q
&lt;/h3&gt;

&lt;p&gt;Although Google’s major focus for whole year was on fixing existing problems and improvements in Android development tools, they still managed to launch some new things and APIs for android developers. You can learn about these in following sessions.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/29gLA90m6Gk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Qxj2eBmXLHg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/JFGq0asqSuA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/VsStyq4Lzxo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ZffMCJdA5Qc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/kuv8uK-5CLY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8uQEzv3upy8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FtwtC1Ic9ps"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/flhib2krW7U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Android Coding Tips
&lt;/h3&gt;

&lt;p&gt;Development and coding is all about learning new skills and improving existing skills. Along with introducing new frameworks and APIs for Android developers, Google has shared some advanced tips and tricks in the following sessions.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/PZBg5DIzNww"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1uLzSXWWfDg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BOHK_w09pVA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Ta5wBJsC39s"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sQC9-Rj2yLI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/VJi2vmaQe6w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zjWOMBdPbsI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Design and UI/UX
&lt;/h3&gt;

&lt;p&gt;Who doesn’t love Material design or a beautiful looking android app? Especially as Android Q has introduced global dark theme feature, so we should now learn a thing or two on how-to design dark themed material apps. Here are the sessions which will help us do this.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/IaT4wdWTwuo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9NDLR3COU7Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/f3Lm8iOr4mE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Android in C++
&lt;/h3&gt;

&lt;p&gt;And finally a shout-out to those developers who does Android development in C++. This session is for you awesome guys.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/L9GF_X-cq3E"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Iql8bcUD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AhuQhF7dkE-DTIucW.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Iql8bcUD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AhuQhF7dkE-DTIucW.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flutter
&lt;/h3&gt;

&lt;p&gt;Flutter is Google’s portable UI toolkit for building beautiful, native applications for mobile, web, and desktop from a single code-base. Until so far, Flutter has been very good cross-platform alternative to create apps for Android and iOS using same code, this year at Google I/O, they shared a demo for &lt;strong&gt;Flutter Web&lt;/strong&gt;. You might already know about this if you have watched the developer keynote session. So here are some more sessions from Google for Flutter.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/IyFZznAk69U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YSULAJf6R6M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/gvbq12bGqHI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/d_m5csmrf7I"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WKZJjdHB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A7G9jKaciQN4N6pUZ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WKZJjdHB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A7G9jKaciQN4N6pUZ.png" alt=""&gt;&lt;/a&gt;Firebase Logo&lt;/p&gt;

&lt;h3&gt;
  
  
  Firebase
&lt;/h3&gt;

&lt;p&gt;Since the &lt;a href="https://techcrunch.com/2014/10/21/google-acquires-firebase-to-help-developers-build-better-realtime-apps/"&gt;acquisition of Firebase 5 years ago&lt;/a&gt;, Firebase has grown into a fully mature platform for mobile and web apps. This year at Google IO, there were lots of sessions about Firebase, but I am going to share here only those sessions which are specific to android development.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/x8qTEMkZCPs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lW7DWV2jST0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BGCLPiR_0Lg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Bg1Kb-mMnAM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Gjx3CspYYeg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--emUrQqD3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1000/0%2A9BkJaejPxOP6MiM6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--emUrQqD3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1000/0%2A9BkJaejPxOP6MiM6.jpg" alt=""&gt;&lt;/a&gt;Google Play Logo&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Play
&lt;/h3&gt;

&lt;p&gt;Not only the development is important for android developers, they also need to learn about how to distribute those apps on Google Play store and how to get installs for their apps. In this section, I will share you the sessions from Google IO which will help android developers with their app growth, billing, and monetization.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/o_oUeciBknU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Nz_Ilg4BbKE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/WyIcJd55l1M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/rEuwVWpYBOY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RZSR4a1SBCY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/N4004Set4F8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yvzcqhTqmRU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KhZacVJc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A-_0ZcF9_ylh1Lp0v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KhZacVJc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2A-_0ZcF9_ylh1Lp0v.jpg" alt=""&gt;&lt;/a&gt;Google Gadgets&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Assistant, Android for Cars, and TV
&lt;/h3&gt;

&lt;p&gt;Now, beside the android phone, the Android OS is being deployed on many other places like embedded devices, cars, TVs etc. In this section, I will share you the sessions from Google IO about development for these other platforms.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/dpNrq_wiqGs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vQALSeGy9aY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/v3BKLMU-8Hg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/AHHERLwjUGo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Vo-UQDVykIs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4vkTWGUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AUsN77-jSFD_Ce1Fn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4vkTWGUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AUsN77-jSFD_Ce1Fn.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Machine Learning and Augmented Reality
&lt;/h3&gt;

&lt;p&gt;Machine Learning was a big part of this year’s Google IO. A lot was covered for machine learning. Here are the sessions of machine learning and augmented reality for Android developers from Google IO 2019.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/wpKJpeOy-68"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Jjm7MT6W0Dc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yQuUDX6r2Ic"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/2h-Wg5FDbtU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/QwHD36bhXZA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/pdRpCJ5acrA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BlM2T1beKbg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Android Game Development
&lt;/h3&gt;

&lt;p&gt;Finally, we are discussing the game development in Android. Here are the sessions from Google IO for android game developers.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Dt8zrnX4dQ0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/2Cf8RHEAPLM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3S0P6Sf0Mw4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/feb-Hl_Cl3g"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/twrHtWQmE_U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you liked this article, you can read my following new articles below:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/wajahatkarim/-is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-4fi1"&gt;⚡ Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on &lt;a href="https://wajahatkarim.com"&gt;his blog&lt;/a&gt;and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3"&gt;His libraries&lt;/a&gt; have about 3000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on Twitter and &lt;a href="https://medium.com/@wajahatkarim3"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;




</description>
      <category>google</category>
      <category>android</category>
      <category>firebase</category>
      <category>io19</category>
    </item>
    <item>
      <title>⚡Fixing ConstraintLayout &amp; Guideline AssertionError Exception in Android</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Thu, 21 Mar 2019 09:37:33 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/fixing-constraintlayout-guideline-assertionerror-exception-in-android-24ap</link>
      <guid>https://forem.com/wajahatkarim/fixing-constraintlayout-guideline-assertionerror-exception-in-android-24ap</guid>
      <description>&lt;h4&gt;
  
  
  A quick tip to fix AssertionError Exception when updating ConstraintLayout from 1.0.2 to later versions.
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is part of &lt;a href="https://medium.com/p/65c64e1dcb6" rel="noopener noreferrer"&gt;Today I Learned&lt;/a&gt; series and was originally posted at my &lt;a href="https://github.com/wajahatkarim3/Today-I-Learned/" rel="noopener noreferrer"&gt;TIL Github Repository&lt;/a&gt; and my website at &lt;a href="http://wajahatkarim.com" rel="noopener noreferrer"&gt;wajahatkarim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;These days, I am working on an android app with very old code base. So, as I am adding new functionality and fixing bugs, I am improving the code base with latest APIs. So, in that regard I added &lt;a href="https://developer.android.com/training/constraint-layout" rel="noopener noreferrer"&gt;Constraint Layout&lt;/a&gt; about 3 months ago. At that time, the latest version was 1.0.2. This helped me creating complex layouts in easy manner and allowed me utilize the flat view hierarchy to make things perform better.&lt;/p&gt;

&lt;p&gt;About yesterday, I had a task which involved showing/hiding multiple views at same time. I tried to use &lt;a href="https://developer.android.com/reference/android/support/constraint/Group" rel="noopener noreferrer"&gt;Groups of Constraint Layout&lt;/a&gt;, so I updated it to the next stable version, which was 1.1.3 .&lt;/p&gt;

&lt;p&gt;But as I launched the app, some screens with ConstraintLayout were working and in some the app crashed. When I checked the log, I got this.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AnFmmABYHe3KwaXm4Hw0yeg.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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AnFmmABYHe3KwaXm4Hw0yeg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The log simply doesn’t make any sense. The only sensible thing, which can help me fix this issue, I got out of this log is the line # 2 which shows the keyword Guideline . So, I had a gut feeling that this is somehow an issue of Guideline.&lt;/p&gt;




&lt;p&gt;Doing a simple Google search assures me that there are many other developers facing this same issue and no one has real clue of why this is happening and how it can be fixed.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://stackoverflow.com/questions/51594162/constraint-layout-issue-java-lang-assertionerror-top" rel="noopener noreferrer"&gt;threads&lt;/a&gt; &lt;a href="https://stackoverflow.com/questions/51247514/java-lang-assertionerror-left" rel="noopener noreferrer"&gt;on&lt;/a&gt; &lt;a href="https://stackoverflow.com/questions/50188620/constraint-layout-lib-update-from-1-0-2-to-1-1-0-got-error-guideline-getanchor" rel="noopener noreferrer"&gt;StackOverflow&lt;/a&gt; about this issue confirmed one thing that issue is related to the Guideline . There are even issues submitted at the &lt;a href="https://github.com/googlecodelabs/constraint-layout" rel="noopener noreferrer"&gt;Google Codelab’s Constraint Layout repository&lt;/a&gt; like &lt;a href="https://github.com/googlecodelabs/constraint-layout/issues/51" rel="noopener noreferrer"&gt;this&lt;/a&gt; and &lt;a href="https://github.com/googlecodelabs/constraint-layout/issues/53" rel="noopener noreferrer"&gt;this&lt;/a&gt;. Unfortunately, these issues are still open and there’s not a single comment yet, let alone the solution. The developers are left on their own to fix this issue.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AVfotlhR7yerfwKOQNAYzIw.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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AVfotlhR7yerfwKOQNAYzIw.png"&gt;&lt;/a&gt;Screenshot of &lt;a href="https://github.com/googlecodelabs/constraint-layout/issues/53" rel="noopener noreferrer"&gt;Issue # 53&lt;/a&gt; from &lt;a href="https://github.com/googlecodelabs/constraint-layout/" rel="noopener noreferrer"&gt;Constraint Layout at Github&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔥 Hot and ⌚️Quick Fix to This Frustrating Problem 😃
&lt;/h3&gt;

&lt;p&gt;There’s no specific solution to this problem. But there’s a reason why this happens. So, to fix this issue, we need to understand that reason and then we can solve this easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.android.com/reference/android/support/constraint/Guideline" rel="noopener noreferrer"&gt;A Guideline in ConstraintLayout&lt;/a&gt; is a virtual helper, which will not be visible in runtime on the device and will have a visibility of View.GONE . These are only used for layout and positioning purposes.&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%2Fcdn-images-1.medium.com%2Fmax%2F423%2F0%2AXMq9-dAZ9LzhOkXO.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%2Fcdn-images-1.medium.com%2Fmax%2F423%2F0%2AXMq9-dAZ9LzhOkXO.png"&gt;&lt;/a&gt;Two buttons are positioned with respect to a percentage vertical guideline&lt;/p&gt;

&lt;p&gt;According to the documentation from Google, a Guideline can be either horizontal or vertical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vertical Guidelines have a width of zero and the height of their &lt;a href="https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html" rel="noopener noreferrer"&gt;ConstraintLayout&lt;/a&gt; parent&lt;/li&gt;
&lt;li&gt;Horizontal Guidelines have a height of zero and the width of their &lt;a href="https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html" rel="noopener noreferrer"&gt;ConstraintLayout&lt;/a&gt; parent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main cause of this AssertionError exception is this very thing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You cannot constraint any other view vertically to any vertical guideline and same is with horizontal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What this means is that if we have a vertical guideline, then we cannot write code like this:&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A6qV6khrb_BzLiGzGQwMmDA.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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A6qV6khrb_BzLiGzGQwMmDA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check line 16 and 17. We have set the TextView top and bottom to Vertical guideline’s Top and Bottom. A vertical guideline’s height is the parent’s height and we cannot constraint any view to the vertical guideline’s top and bottom. Rather we should constraint to the left and right of the vertical guideline and top/bottom to the HORIZONTAL guideline. So, if we write something like app:layout_constraintLeft_toRightOf=”@+id/guideline” , then we won’t have this issue.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ The Solution — Finally 😃
&lt;/h3&gt;

&lt;p&gt;My project had like 15+ layout files which had ConstraintLayout . The log message doesn’t help much. So, first open all those layout files which have Guideline used.&lt;/p&gt;

&lt;p&gt;Now the layout which is causing this problem will show a red error circle on top-right side of the preview pane as shown in the image below.&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%2Fcdn-images-1.medium.com%2Fmax%2F492%2F1%2AX21oUN-7qUx9dp_HcMJmQA.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%2Fcdn-images-1.medium.com%2Fmax%2F492%2F1%2AX21oUN-7qUx9dp_HcMJmQA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you click on it, you will see the Message panel on bottom and this will tell TOP / BOTTOM for the vertical guidelines and LEFT / RIGHT for the horizontal guidelines. When you click on the Details button, you will see a dialog with the exact same exception message like the image below.&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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Am3rpoRLKnf1Fgt736-OkUA.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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Am3rpoRLKnf1Fgt736-OkUA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This red error circle and this dialog is a confirmation that you are in the layout file which is causing this exception and crashing the app. So, cross check the guideline and other views’ constraints and make sure that vertical guideline is constrained for left and right and horizontal guideline is constrained for top and bottom. That’s the only solution for this annoying problem.&lt;/p&gt;

&lt;p&gt;Once you do that, this red circle will disappear. And you can run your app without any problems and crashes now.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you liked this article, you can read my following new articles below:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/wajahatkarim/-is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-4fi1"&gt;⚡ Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk" rel="noopener noreferrer"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635" rel="noopener noreferrer"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/" rel="noopener noreferrer"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on &lt;a href="https://wajahatkarim.com" rel="noopener noreferrer"&gt;his blog&lt;/a&gt;and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending" rel="noopener noreferrer"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3" rel="noopener noreferrer"&gt;His libraries&lt;/a&gt; have about 3000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on Twitter and &lt;a href="https://medium.com/@wajahatkarim3" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;




</description>
      <category>androiddev</category>
      <category>android</category>
      <category>constraintlayout</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Launching Activities in Easier Way Using Kotlin Extensions</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Sun, 03 Mar 2019 20:29:42 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/launching-activities-in-easier-way-using-kotlin-extensions-121h</link>
      <guid>https://forem.com/wajahatkarim/launching-activities-in-easier-way-using-kotlin-extensions-121h</guid>
      <description>&lt;h4&gt;
  
  
  Kotlin Extensions for simpler, easier and fun way of launching Activities in Android
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qJKmslBr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/proxy/1%2A99YiKjwB2TliKVA-yGogNQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qJKmslBr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/proxy/1%2A99YiKjwB2TliKVA-yGogNQ.png" alt="Related image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href="https://wajahatkarim.com"&gt;https://wajahatkarim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Few days ago, I was reading &lt;a href="https://proandroiddev.com/how-reified-type-makes-kotlin-so-much-better-7ae539ed0304"&gt;this awesome article&lt;/a&gt; by &lt;a href="https://medium.com/u/5742b4fcf89e"&gt;Elye&lt;/a&gt; about a Kotlin keyword reified . Soon after reading the article, I started exploring it and I realized that we can simply lots of reusable tasks of Android development using reified and Kotlin extension methods. For example, launching Activities.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔲 Launching Activities — Traditional Way
&lt;/h3&gt;

&lt;p&gt;Launching activities in android apps is a common task and different developers use different approaches. Some use the traditional ways of creating Intent bundles and passing them in startActivity() methods along side the Intents.&lt;/p&gt;

&lt;p&gt;Let’s look at the typical traditional way of starting another activity&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NtM0SQSK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AOP2pPLfWAkBf4yz9Pk-3JQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NtM0SQSK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AOP2pPLfWAkBf4yz9Pk-3JQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, if we pass some arguments in it, this becomes more complex.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jeTLupd---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AAbOP2ToC0QBCm4fg3yzABw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jeTLupd---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AAbOP2ToC0QBCm4fg3yzABw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💥 Launching Activities —The Simpler, Easier, and Fun Way
&lt;/h3&gt;

&lt;p&gt;But, creating some Kotlin extension methods with using reifiedkeyword, we can make these a lot simpler and enjoyable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MCnNd1nh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ay76gedjcWjVmnlb7ntbRjQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MCnNd1nh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ay76gedjcWjVmnlb7ntbRjQ.png" alt=""&gt;&lt;/a&gt;GitHub Gist: &lt;a href="https://gist.github.com/wajahatkarim3/d3a728dbb20002dc54ac44bad40e4077"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/wajahatkarim3/d3a728dbb20002dc54ac44bad40e4077"&gt;https://gist.github.com/wajahatkarim3/d3a728dbb20002dc54ac44bad40e4077&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, after this, we can do same launching activity stuff (of previous examples) like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XGibs1Nx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/980/1%2A7J0f0hn4jd82kr36eQFu4Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XGibs1Nx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/980/1%2A7J0f0hn4jd82kr36eQFu4Q.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or we can pass arguments like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C5kJV91v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/946/1%2AD0nesrZqnmB6QrSaiaVcJQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C5kJV91v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/946/1%2AD0nesrZqnmB6QrSaiaVcJQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are all the cases which you can do with these extensions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hz0HjOXL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AYm9akomr7goLLVTBNqaFlw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hz0HjOXL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AYm9akomr7goLLVTBNqaFlw.png" alt=""&gt;&lt;/a&gt;Github Gist: &lt;a href="https://gist.github.com/wajahatkarim3/d3a728dbb20002dc54ac44bad40e4077"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/wajahatkarim3/d3a728dbb20002dc54ac44bad40e4077"&gt;https://gist.github.com/wajahatkarim3/d3a728dbb20002dc54ac44bad40e4077&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you liked this article, you can read my following new articles below:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/wajahatkarim/-is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-4fi1"&gt;⚡ Is Your Android Studio Always Slow? 🚀Here’s How to Speed Up Immediately.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/wajahatkarim/reflections-on-2018my-year-in-review-144"&gt;📆 Reflections on 2018 — My Year In Review&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on &lt;a href="https://wajahatkarim.com"&gt;his blog&lt;/a&gt;and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3"&gt;His libraries&lt;/a&gt; have about 3000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on &lt;a href="https://twitter.com/wajahatkarim"&gt;Twitter&lt;/a&gt; and &lt;a href="https://medium.com/@wajahatkarim3"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;




</description>
      <category>java</category>
      <category>android</category>
      <category>kotlin</category>
      <category>mobile</category>
    </item>
    <item>
      <title>✅ How to Free Up Useless Space on Firebase Hosting for Your Static Websites?</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Tue, 26 Feb 2019 21:59:57 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/how-to-free-up-useless-space-on-firebase-hosting-for-your-static-websites-1d0g</link>
      <guid>https://forem.com/wajahatkarim/how-to-free-up-useless-space-on-firebase-hosting-for-your-static-websites-1d0g</guid>
      <description>&lt;h4&gt;
  
  
  Learn how I managed to reduce my Hugo website’s storage size from 437.8 MB to 4.1 MB on Firebase Hosting.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zMYKluiI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Avx9XUt3e2WzuYhplRCUmWA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zMYKluiI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Avx9XUt3e2WzuYhplRCUmWA.png" alt=""&gt;&lt;/a&gt;Firebase Hosting Logo&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is part of &lt;a href="https://medium.com/p/65c64e1dcb6"&gt;Today I Learned&lt;/a&gt; series and was originally posted at my &lt;a href="https://github.com/wajahatkarim3/Today-I-Learned/"&gt;TIL Github Repository&lt;/a&gt; and my website at &lt;a href="http://wajahatkarim.com"&gt;wajahatkarim.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Last year in April 2018, I migrated &lt;a href="https://wajahatkarim.com"&gt;my website&lt;/a&gt; from &lt;a href="http://wordpress.org"&gt;Wordpress&lt;/a&gt;to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt;, a static website generator framework built-on Go language. I was paying $5 per month through &lt;a href="https://www.mochahost.com/"&gt;Mochahost&lt;/a&gt; for the hosting server space for Wordpress site. Migrating to the Hugo gave me a relief from that monthly payment, and its simplicity made the website management a lot easier and like breeze.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wajahatkarim.com"&gt;Checkout my website here!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hosted the new website on &lt;a href="https://firebase.google.com/products/hosting/"&gt;Firebase Hosting&lt;/a&gt; as their &lt;a href="https://firebase.google.com/pricing/"&gt;Free Spark Plan&lt;/a&gt; gave me a really generous storage space of 1 GB and bandwidth of 10 GB/month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OIZQ2C2X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AKfEdXWwsgtbtmHU2XM4Kfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OIZQ2C2X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AKfEdXWwsgtbtmHU2XM4Kfw.png" alt=""&gt;&lt;/a&gt;Pricing for Firebase Hosting —&lt;a href="https://firebase.google.com/pricing/"&gt; Source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have created my website mostly for showcasing and portfolio purposes, so I haven’t much expectations regarding high traffic etc. Also, Hugo is a static website generator, so 1 GB is more than enough to store like 10,000 blog posts with medium quality images. This was a great fit for my requirements and also this was helping me getting rid of that monthly payment to hosting server as well.&lt;/p&gt;

&lt;p&gt;After few days’ work, some google searches, and many cups of tea, I managed to create a simple website and somehow deployed it on Firebase hosting with connecting my SSL domain as well. I will write about the process in more details later in an in-depth article.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔥 The Problem — Firebase Hosting Storage Filling Up Quickly
&lt;/h3&gt;

&lt;p&gt;For 6–7 months, everything was great. The website was up and running. I kept adding new posts and pages whenever I could find time. And then one day (few days ago on Feb 13), I checked the Firebase console and was shocked to see the storage size of my website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gYS-dxi1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABgVqFjASeWkrls30YJx7Cg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gYS-dxi1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABgVqFjASeWkrls30YJx7Cg.png" alt=""&gt;&lt;/a&gt;&lt;a href="https://wajahatkarim.com"&gt;My Website&lt;/a&gt; Hosting Space on 13th February on Firebase Console&lt;/p&gt;

&lt;p&gt;I quickly checked the generated website files in my laptop and saw the size. It was about 30 MB. Now I was surprised that why this simple tiny static website with few HTML and CSS files taking about ~500 MB of space?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This was almost 50% of the free quota I was allowed on Firebase Hosting for my website.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The images on my website were hosted on Cloudinary, so there was no way that Firebase could have used the space in images. Until this point, I had realized that maybe my website was not all okay until now. It was my ignorance and carelessness to not check the usage and Firebase quota in all these months.&lt;/p&gt;

&lt;p&gt;The Dashboard tab however showed something interesting. It showed me all the deployments I have done and number of the files each deployment added.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4BWOxNfI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4pjBLt-eVNGon_ePw8jtxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4BWOxNfI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4pjBLt-eVNGon_ePw8jtxw.png" alt=""&gt;&lt;/a&gt;The Dashboard tab of &lt;a href="https://wajahatkarim.com"&gt;My Website&lt;/a&gt; on Firebase Hosting console&lt;/p&gt;

&lt;p&gt;The way Hugo works is that it converts all your markdown files into HTML and CSS files and creates a static website. Those files are stored in a directory called as Public by default, but you can change it as well. I was deploying this whole “Public” directory on Firebase Hosting and it was showing me the awesome website.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✔️ The Solution: Delete All Old Deployments
&lt;/h3&gt;

&lt;p&gt;After digging up some details about Firebase hosting and deployments, I found a very easy solution to this. All you have to do is delete the old deployments. That’s it. Don’t worry, these will not affect your website in any way. Here’s the simple GIF I recorded to show you how we can delete old deployments in Firebase hosting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A_fJyX-0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2APKfB4ajfjnJktXDdQuk3Mw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A_fJyX-0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2APKfB4ajfjnJktXDdQuk3Mw.gif" alt=""&gt;&lt;/a&gt;Deleting previous deployments on Firebase Hosting in console for &lt;a href="https://wajahatkarim.com"&gt;my website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had like 300 deployments. And each deployment added more than 100 files depending on the posts and content I added in that deployment. This kept increasing the overall storage of the Firebase hosting.&lt;/p&gt;

&lt;p&gt;If you delete all your deployments, except some latest ones, then you can dramatically reduce the size used by Firebase for your static websites. Here’s a comparison image of how my website’s storage size got reduced after this solution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kKq_U5RL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AqvwcKJZUmB4LbrxdilXMng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kKq_U5RL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AqvwcKJZUmB4LbrxdilXMng.png" alt=""&gt;&lt;/a&gt;&lt;a href="https://wajahatkarim.com"&gt;My website&lt;/a&gt;’s storage size before (Left) and after (Right)&lt;/p&gt;

&lt;p&gt;As you can see in the image above, after deleting all (about 300) the previous deployments, I managed to reduce the website’s storage from 437.8 MB to 4.1 MB. That’s really huge for me and my website. I hope this will help you in reducing your website’s storage space as well.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you liked this article, you can read my new article about my year in review of 2018 below:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/wajahatkarim/reflections-on-2018my-year-in-review-144"&gt;Reflections on 2018 — My Year In Review&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on blog and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3"&gt;His libraries&lt;/a&gt; have about 2000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on Twitter and &lt;a href="https://medium.com/@wajahatkarim3"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/WajahatKarim"&gt;Wajahat Karim (@WajahatKarim) | Twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, if you have any questions you’d like him to answer, contact him through his website at &lt;a href="http://wajahatkarim.com"&gt;wajahatkarim.com&lt;/a&gt; with DEAR WAJAHAT in the subject line.&lt;/p&gt;




</description>
      <category>hosting</category>
      <category>firebase</category>
      <category>hugo</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>⚡ Is Your Android Studio Always Slow? Here’s How to Speed Up Immediately.</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Thu, 21 Feb 2019 00:59:09 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/-is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-4fi1</link>
      <guid>https://forem.com/wajahatkarim/-is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-4fi1</guid>
      <description>&lt;h4&gt;
  
  
  A very quick and effective trick to boost Android Studio
&lt;/h4&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Originally posted on &lt;a href="https://android.jlelse.eu/is-your-android-studio-always-slow-heres-how-to-speed-up-immediately-326ef9238024" rel="noopener noreferrer"&gt;my Medium profile&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As an android developer, we get to spend a huge chunk of our time on &lt;a href="https://developer.android.com/studio/" rel="noopener noreferrer"&gt;&lt;strong&gt;Android Studio&lt;/strong&gt;&lt;/a&gt;, the Google’s official compiler for developing native Android apps. Over the years, it has evolved into a very powerful IDE with lots of features and functionalities. But there are still some problems, which hasn’t been fixed yet for a lots of developers due to various reasons such as Gradle build time, Android Studio speed etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfnhjhsfud8m48h4x3nx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfnhjhsfud8m48h4x3nx.png" width="700" height="74"&gt;&lt;/a&gt;Gradle —The Biggest Nightmare of Every Android Developer&lt;/p&gt;

&lt;p&gt;There have been &lt;a href="https://hackernoon.com/how-to-speed-up-your-slow-gradle-builds-5d9a9545f91a" rel="noopener noreferrer"&gt;many&lt;/a&gt; &lt;a href="https://hackernoon.com/speed-up-gradle-build-in-android-studio-80a5f74ac9ed" rel="noopener noreferrer"&gt;articles&lt;/a&gt; including &lt;a href="https://developer.android.com/studio/build/optimize-your-build" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; on how to speed up. Some works and some not. But this article is not about gradle build time. Rather this is about more common but frustrating problem: slow Android Studio. Let’s see how to speed it and make it faster in some very easy ways.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ Android Studio Requirements
&lt;/h3&gt;

&lt;p&gt;According to Android Studio’s official system requirements, it takes at minimum 3 GB RAM to run smoothly. Honestly, its a lot and I believe that is the biggest cause of being it too slow all the time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy18kpu672rsad7hludpb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy18kpu672rsad7hludpb.png" width="800" height="335"&gt;&lt;/a&gt;The Android Studio’s System Requirements from their &lt;a href="https://developer.android.com/studio/" rel="noopener noreferrer"&gt;Official Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The android developers are always &lt;a href="https://stackoverflow.com/questions/30817871/android-studio-is-slow-how-to-speed-up" rel="noopener noreferrer"&gt;complaining&lt;/a&gt; &lt;a href="https://stackoverflow.com/questions/51297025/why-does-android-studio-run-so-slow" rel="noopener noreferrer"&gt;about&lt;/a&gt; &lt;a href="https://www.quora.com/Why-is-Android-Studio-so-slow-and-complicated" rel="noopener noreferrer"&gt;the speed&lt;/a&gt; &lt;a href="https://www.reddit.com/r/androiddev/comments/7s1w23/android_studio_is_slow_compared_to_visual_studio/" rel="noopener noreferrer"&gt;of&lt;/a&gt; &lt;a href="https://www.reddit.com/r/androiddev/comments/a4voor/android_studio_very_slow/" rel="noopener noreferrer"&gt;Android Studio&lt;/a&gt; and how its slow ALL THE TIME. This makes overall development slow and frustrating. It affects productivity negatively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xejhnjkqlkyvq207m5j.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5xejhnjkqlkyvq207m5j.jpeg" width="799" height="765"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbo86giicbsutzl7ovcc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbo86giicbsutzl7ovcc.jpeg" width="712" height="712"&gt;&lt;/a&gt;Some Memes from DevRant (&lt;a href="https://devrant.com/search?term=android+studio" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://devrant.com/search?term=android+studio" rel="noopener noreferrer"&gt;https://devrant.com/search?term=android+studio&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;So enough chit chat. Let’s see how to make it a lot faster in a very easy way.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀Speeding Up Android Studio
&lt;/h3&gt;

&lt;p&gt;You might have read different tricks such as Offline Gradle, increasing memory in gradle.properties file, disabling Instant Run and so on. Let me show you a very easy way, shared by none other than &lt;a href="https://twitter.com/JakeWharton" rel="noopener noreferrer"&gt;&lt;strong&gt;Jake Wharton&lt;/strong&gt;&lt;/a&gt; on Reddit about a year &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zc061opek3gsexq3w9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6zc061opek3gsexq3w9e.png" width="800" height="204"&gt;&lt;/a&gt;A &lt;a href="https://www.reddit.com/r/androiddev/comments/7sxhig/android_studio_slower_when_using_kotlin/dt88pgn" rel="noopener noreferrer"&gt;comment from Jake Wharton&lt;/a&gt; on a &lt;a href="https://www.reddit.com/r/androiddev/comments/7sxhig/android_studio_slower_when_using_kotlin/" rel="noopener noreferrer"&gt;post on Reddit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, let me show you how to do this.&lt;/p&gt;

&lt;p&gt;First, click on File -&amp;gt; Settings -&amp;gt; Plugins to open dialog like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b7jewmco01pcls8w885.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b7jewmco01pcls8w885.png" width="800" height="450"&gt;&lt;/a&gt;The Plugins section in Settings in Android&lt;/p&gt;

&lt;p&gt;Now, disable or Check Off all the plugins which not usable for you. I have disabled following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Android APK Support&lt;/li&gt;
&lt;li&gt;Android Games&lt;/li&gt;
&lt;li&gt;Android NDK&lt;/li&gt;
&lt;li&gt;App Links Assistant&lt;/li&gt;
&lt;li&gt;Copyright&lt;/li&gt;
&lt;li&gt;Coverage&lt;/li&gt;
&lt;li&gt;CVS Integeration&lt;/li&gt;
&lt;li&gt;Editor Config&lt;/li&gt;
&lt;li&gt;Fabric for Android Studio&lt;/li&gt;
&lt;li&gt;Firebase (App Indexing, Services, Testing)&lt;/li&gt;
&lt;li&gt;Github&lt;/li&gt;
&lt;li&gt;Google (Cloud Tools Core, Cloud Tools for Android, Developer Samples, Login, Services)&lt;/li&gt;
&lt;li&gt;Markdown Support&lt;/li&gt;
&lt;li&gt;Mercurial integration&lt;/li&gt;
&lt;li&gt;hg4idea&lt;/li&gt;
&lt;li&gt;Settings repository&lt;/li&gt;
&lt;li&gt;Subversion integration&lt;/li&gt;
&lt;li&gt;Task management&lt;/li&gt;
&lt;li&gt;Test recorder&lt;/li&gt;
&lt;li&gt;TestNG-J&lt;/li&gt;
&lt;li&gt;YAML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, you dialog will be something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbu1jt2hjyfba5wyq1x7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbu1jt2hjyfba5wyq1x7.png" width="800" height="450"&gt;&lt;/a&gt;The Plugins section after disabling some plugins in Settings in Android&lt;/p&gt;

&lt;p&gt;Now, click Apply -&amp;gt; OK and restart Android Studio. You’ll feel the difference instantly I bet.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤔 What If I Need Any Plugin Later?
&lt;/h3&gt;

&lt;p&gt;For example, at some point your app needs Firebase App Links and you want to use the plugin. Then just enable it for a temporary time. Do your work. And then you can disable it again.&lt;/p&gt;

&lt;p&gt;I hope this will fix your problem and make your Android Studio faster and your app development faster. 😃 Happy App Coding&lt;/p&gt;

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




&lt;p&gt;&lt;strong&gt;If you liked this article, you can read my new article about my year in review of 2018 below:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/wajahatkarim/reflections-on-2018my-year-in-review-144"&gt;Reflections on 2018 — My Year In Review&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk" rel="noopener noreferrer"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635" rel="noopener noreferrer"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/" rel="noopener noreferrer"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on blog and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending" rel="noopener noreferrer"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3" rel="noopener noreferrer"&gt;His libraries&lt;/a&gt; have about 2000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on Twitter and &lt;a href="https://medium.com/@wajahatkarim3" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/WajahatKarim" rel="noopener noreferrer"&gt;Wajahat Karim (@WajahatKarim) | Twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, if you have any questions you’d like him to answer, contact him through his website at &lt;a href="http://wajahatkarim.com" rel="noopener noreferrer"&gt;wajahatkarim.com&lt;/a&gt; with DEAR WAJAHAT in the subject line.&lt;/p&gt;




</description>
      <category>android</category>
      <category>programming</category>
      <category>androidstudio</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Reflections on 2018 — My Year In Review</title>
      <dc:creator>Wajahat Karim 🇵🇰</dc:creator>
      <pubDate>Thu, 14 Feb 2019 18:54:15 +0000</pubDate>
      <link>https://forem.com/wajahatkarim/reflections-on-2018my-year-in-review-144</link>
      <guid>https://forem.com/wajahatkarim/reflections-on-2018my-year-in-review-144</guid>
      <description>&lt;h3&gt;
  
  
  Reflections on 2018 — My Year In Review
&lt;/h3&gt;

&lt;h4&gt;
  
  
  A Year of Open Source, Public Speaking, New Job, New House, and the Big NEWS!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dkEJBfMb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aa05QEsKt8cr-zGsl8Btxqw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dkEJBfMb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aa05QEsKt8cr-zGsl8Btxqw.jpeg" alt=""&gt;&lt;/a&gt;Me, giving a &lt;a href="https://dev.to/wajahatkarim/next-stop-flutter-6d1"&gt;talk about Flutter&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally posted on &lt;a href="https://hackernoon.com/reflections-on-2018-my-year-in-review-e88f45ee4211"&gt;my Medium profile&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2018 was a great year for me, both personally and professionally. Last year when I wrote &lt;a href="https://hackernoon.com/after-wasting-2017-year-successfully-now-looking-forward-to-waste-2018-again-8204b77ba74a"&gt;my first year in review&lt;/a&gt;, I didn’t know the real impact of these reflections and year-in-reviews. But it has helped me in fighting my self imposter syndrome, holding myself accountable (at least to my inner me), keeping a log for myself, and most importantly, seeing how I improve myself as a person and as a developer over the years.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/after-wasting-2017-year-successfully-now-looking-forward-to-waste-2018-again-8204b77ba74a"&gt;After Wasting 2017 Year Successfully, Now Looking Forward to Waste 2018 Again&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This time, I got very late in writing and publishing this review for so many reasons. (At the end you’ll know why I was late). But, I’m happy that at least I am doing it now, it’s still the ̶f̶i̶r̶s̶t̶, second month of 2019. And I believe it still counts. — &lt;em&gt;Note to self to be on time next year.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🤔 Who is &lt;a href="https://medium.com/u/de373fc05086"&gt;Wajahat Karim&lt;/a&gt;?
&lt;/h3&gt;

&lt;p&gt;From this year on, I am going to redefine to myself who I am each year. This will help me give the perspective on my evolution and self-improvement when I read my earlier reviews. So, let’s start now:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My name is Wajahat Karim. I am a 7+ years&lt;a href="https://wajahatkarim.com"&gt;experienced android developer&lt;/a&gt;, an active &lt;a href="https://github.com/wajahatkarim3"&gt;open source contributor&lt;/a&gt;, &lt;a href="https://medium.com/@wajahatkarim3"&gt;a blogger&lt;/a&gt;, &lt;a href="https://www.amazon.com/Wajahat-Karim/e/B00IQMGFU8/"&gt;a writer of two books&lt;/a&gt;, and a new &lt;a href="http://speakerdeck.com/wajahatkarim3"&gt;public speaker&lt;/a&gt;. I am doing a full-time job as Senior Android Developer at &lt;a href="http://contour-software.com/"&gt;&lt;strong&gt;Contour Software&lt;/strong&gt;&lt;/a&gt; by working remotely for &lt;a href="https://www.trapezegroup.com/"&gt;&lt;strong&gt;Trapeze Group&lt;/strong&gt;&lt;/a&gt; (Canada) on an enterprise level android app about maps and route finding.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  📆 Start of 2018
&lt;/h3&gt;

&lt;p&gt;So, last year after a good response on my first year in review, I promised myself to keep a track of all the happenings and progress of my whole year so that I can publish it in the next year in review. But, lazy me, I couldn’t collect everything. I was looking for some app other than the social media like Facebook, Instagram etc. to keep my progress private and digital. But I couldn’t find a good one. And then I kept this idea to create one and keep it all open source.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Year-In-Review"&gt;
        Year-In-Review
      &lt;/a&gt; / &lt;a href="https://github.com/Year-In-Review/YearInReview-Android"&gt;
        YearInReview-Android
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Android app for the Year-In-Review concept
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="instapaper_body md"&gt;
&lt;h1&gt;
YearInReview-Android&lt;/h1&gt;
&lt;p&gt;Android app for the Year-In-Review concept&lt;/p&gt;
&lt;p&gt;The basic idea is to create a colors of year concept in an interactive and engaging way.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Year-In-Review/YearInReview-Android"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;I know I know. It hasn’t much and I haven’t worked a lot on it. Life happened that’s why. But, I have full intention to work on it at some point and finish it. I’ll try to do it this year just to keep my year progress in order.&lt;/p&gt;




&lt;h3&gt;
  
  
  🏠 New House = New Lifestyle
&lt;/h3&gt;

&lt;p&gt;The starting of the my 2018 year wasn’t an ideal one. It was rather exhausting one. We recently (November 2017) moved to a new house, so it was a tough time to adjust to the new neighborhood, make new friends, memorize new travel plans and routes etc. On top of it, we had these huge loans and debts to repay to &lt;strong&gt;_all the people who helped us in our tough time with purchasing our dream house. (We love you all ❤️ and will always be grateful to you _&lt;/strong&gt;😊️&lt;strong&gt;&lt;em&gt;).&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We were on track of clearing debts month by month and sacrificing almost everything such as the pizzas, movies, shopping etc. Told you this was exhausting time. And then January passed and come 1st February. This exhausting starting became a &lt;strong&gt;“disaster starting”&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I got fired from my newly joined job out of blue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why? Because my employer was crazy. Or because I was stupid enough to join that company in the first place. Or because I was tired of fighting negative energy and dirty politics at my previous job. Or because I wanted to switch the job faster. The employer couldn’t achieve the projects they bid for and I was hired early. Way too early. And now I was a useless resource on payroll for them. So, they asked me nicely to go home and cleared all my dues. So, does asking nicely to go home without any prior notice counts as nice? I don’t think so.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;To That Employer:&lt;/strong&gt; It was not nice. It wasn’t even close to the nice. You shattered my life in an already tough time. I won’t be able to forget that horrible day and that humiliation you caused. At least you could have asked for an apology. Maybe that could have given me some relief.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I spent two months in that toxic workplace and it made me a lot depressed already. I was living like a dead man walking. I had already started looking for new job, but I wasn’t ready to leave before I get any new job to keep the income steady.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In order to appreciate the life and good things, you must experience the bad or even worse things first.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The only good thing in that company was a very good friend who gave me hope, positive energy, made my day laughable, spent good time, and gave best memories.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;To You —The Partner in Crime:&lt;/strong&gt; Although it was a short span we worked together and it was a very toxic place. I wish we could have met under better conditions and good workplace, where we could’ve taught and learned few things from each other and made great apps for Android and iOS. But let me say this: A very special and big &lt;strong&gt;THANK YOU FOR EVERYTHING&lt;/strong&gt; including those long lunch breaks and the unlimited teas we had together. Thank You&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  👻 Freelancing = Nightmare
&lt;/h3&gt;

&lt;p&gt;That’s a bold statement. I know. But, at least it’s been true for me for all these years. I know a lot of good people who are doing freelancing &amp;amp; service providing full-time and part-time, and they are earning good money working from home in their own flexible timings. I have tried it too many times on all platforms, with local and international clients. But, it’s not a thing for me. Period. I can’t do freelancing. And I won’t do freelancing. That’s confirmed from my side.&lt;/p&gt;

&lt;p&gt;I had already started looking for a new job. But until I get any new job, I had an ongoing freelancing project. I thought to finish it and get some money to keep the income steady. I had made a lot of commitments of clearing debts on time to the people who lend me their money. But now the game was all different. I had to arrange the money for household expenses, utility bills etc. Let alone to repay the debts. So, this freelancing project became a mean to survival for me.&lt;/p&gt;

&lt;p&gt;But when you are in tough time, usually everything becomes upside down. And that happened with me. This freelance project became a literal nightmare for me. It kept me up all nights. It diverted my focus and attention from the interviews. It basically ruined my life. And when I got payment, it was already too late. I told my friends and family about why I am unable to pay the debts. Most of them were very supportive and understanding and helped me get through it all without any more problems. But I was doing more like taking more debts from new people and repaying to the old people in order to extend my timelines.&lt;/p&gt;

&lt;p&gt;It got depressing actually. I was so tensed all the time that anyone could see it on my face. And on top of it, I had this horrible client, his unlimited calls, messages, non-stop pressure, unrealistic deadlines, and non-ending amount of changes and work. Yeah, you could argue that I wasn’t managing it better or something like that. Well, I told you. Freelancing is not for me. Period.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 Looking For Job = Depression
&lt;/h3&gt;

&lt;p&gt;Before that horrible job, I had almost worked for 4 years non-stop and I hadn’t updated my resume even. So, I basically forgot how to look for job and how to pass all these weird interviews and time-wasting hiring processes. I have learned so many things in all these years and have got better in Android development with about 100+ apps in my portfolio. It has come to a point that when I get any requirement to develop in android, chances are that I had already worked on something similar. So, my Bitbucket account had become a better and personalized StackOverflow, Github, Gists, or whatever resources you search for answers.&lt;/p&gt;

&lt;p&gt;Then I had this whole experience of open source, android libraries, and a good &lt;a href="https://github.com/wajahatkarim3"&gt;Github profile&lt;/a&gt;. Did you know that one of my open source library, &lt;a href="https://github.com/wajahatkarim3/EasyFlipView"&gt;&lt;strong&gt;EasyFlipView&lt;/strong&gt;&lt;/a&gt;, has been downloaded over 40,000 times by Android developers around the globe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3yyV_reJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AEHJQLyu-Oumq2TvQGLfrxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3yyV_reJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AEHJQLyu-Oumq2TvQGLfrxg.png" alt=""&gt;&lt;/a&gt;The 2-year statistics for &lt;a href="https://github.com/wajahatkarim3/EasyFlipView"&gt;EasyFlipView&lt;/a&gt; library&lt;/p&gt;

&lt;p&gt;And then, by grace of ALLAH, I am the co-author of two worldwide published books, &lt;a href="https://wajahatkarim.com/projects/learningandroidintents/"&gt;&lt;strong&gt;Learning Android Intents&lt;/strong&gt;&lt;/a&gt; (~300 pages) and &lt;a href="https://wajahatkarim.com/projects/masteringandroidgamedev/"&gt;&lt;strong&gt;Mastering Android Game Development with Untiy&lt;/strong&gt;&lt;/a&gt; (~400 pages) by &lt;a href="http://packtpub.com"&gt;Packt Pub&lt;/a&gt;. Thank you &lt;a href="https://medium.com/u/5672882418a5"&gt;Packt Publishing&lt;/a&gt; for the opportunities to be part of these awesome books.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3BLQnhVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AeELKH-9qIYTsTTho.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3BLQnhVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AeELKH-9qIYTsTTho.jpg" alt=""&gt;&lt;/a&gt;My life’s most proud and best achievement —&lt;a href="https://www.amazon.com/Wajahat-Karim/e/B00IQMGFU8/"&gt; my books&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I was under-impression that I have got all these good things, good profile, Github, books, portfolio etc. How hard it would be to get a job? Instead of me looking for job, there would be line of recruiters who would be looking for me. Silly me, right? But turned out that nobody cares about these things much. A*&lt;em&gt;ll they (recruiters) care about is what’s the definition of inheritance and what’s the difference between abstract classes and interfaces. Or if I can write Dijkstra algorithm on white board or not?&lt;/em&gt;* I gave about 40+ interviews in 2 months time. And it became so depressing and frustrating that I stopped believing in myself. My confident was all time low.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I was like: “Am I a developer really? What I’ve done all these years? Do these libraries I made are of my own or am I just a fake clown? Do I really deserve to be android developer or developer at all?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wrote about it in an other article and how I restored my self-confidence and got an amazing job.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/wajahatkarim" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIujHQgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nNN9VXHd--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/106012/f0459ec7-6db1-40bf-9f39-2c3582827c88.jpeg" alt="wajahatkarim image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/wajahatkarim/overestimating-the-underestimating-2nca" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Overestimating the “Underestimating”&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ Nov 16 '18 ・ 6 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#motivation&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#interview&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;What I learned was that apparently, it wasn’t just me. There are 1000s of good developers who are, how do I say it, &lt;strong&gt;collateral damage&lt;/strong&gt; of this whole broken hiring process. Where instead of looking skills in practice and action, recruiters look in the theory, GPA, so-called pure definitions, and what-nots. Recently, &lt;a href="https://github.com/sahat"&gt;a very active open source contributor&lt;/a&gt;shared &lt;a href="https://medium.com/@evnowandforever/f-you-i-quit-hiring-is-broken-bb8f3a48d324"&gt;his experience on medium about all his horrible encounters of bad recruiting&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💼 New (Remote) Job = Happiness
&lt;/h3&gt;

&lt;p&gt;So, after about 40+ interviews, countless written tests, online tests, unlimited questions, silly projects and tasks, sleepless nights, worried face, exhausted mind, awesome support of wife, family, &amp;amp; friends, and 2 months’ struggle, I got a wonderful job with great salary and perks, flexible timings, work-from-home ability and almost no-politics culture.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thank you &lt;a href="http://contour-software.com/"&gt;&lt;strong&gt;Contour Software&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://www.trapezegroup.com/"&gt;&lt;strong&gt;Trapeze Group&lt;/strong&gt;&lt;/a&gt; (Canada) for giving me the opportunity to work on such a large scaled project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gIiFvVYB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2ArFJL_RCjGyCYdvw2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gIiFvVYB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2ArFJL_RCjGyCYdvw2.jpg" alt=""&gt;&lt;/a&gt;My Workstation at Contour Software with the Onboarding Kit&lt;/p&gt;

&lt;p&gt;Before this job, my all jobs has been mostly about service providing and consumer-based apps. But at Contour Software, I have been fortunate enough to work on an enterprise-level app for Android and become a part of real team. We follow strict agile methodology here and being entirely new to agile and scrum, this has been a real crazy and challenging experience with a lots of new things I learned.&lt;/p&gt;

&lt;p&gt;I don’t know why I didn’t tried agile before, but now that I have grasped the concept and understood how it works. Now, I am following this for my personal projects (More on these later) as well. It’s like I am doing one-man scrum system. I have an article planned to write about it and what I have achieved so far.&lt;/p&gt;

&lt;p&gt;Since the job at Contour Software provides flexible timings and work from home ability, I started exploring this more. I started enjoying the freedom and this made my life a lot easier and to focus on personal, family and professional parts with more attention and confidence. Also, working remotely often mixes your work and home and blurs the separating line between, so this becomes a challenge as well. (I have planned an article on it as well about how to manage remote work and personal life this year).&lt;/p&gt;




&lt;h3&gt;
  
  
  👍 Open Source = Motivation
&lt;/h3&gt;

&lt;p&gt;My whole 2018 was everything about open source and contributing to it. I refer to myself as an &lt;strong&gt;“accidental open source contributor”&lt;/strong&gt; because honestly speaking, I got into open source accidentally. Sometimes, when you are scared of something and you are escaping from it, then in nervousness and fear you don’t really care which way to go and you are just running and running to whatever path you see first. That’s my story of getting into open source. I was escaping from freelancing and end up becoming an open source contributor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7KmCYFVv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/784/1%2AkFkAIxqTdCeXsXLsmA9MkQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7KmCYFVv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/784/1%2AkFkAIxqTdCeXsXLsmA9MkQ.png" alt=""&gt;&lt;/a&gt;My &lt;a href="https://github.com/wajahatkarim3?tab=overview&amp;amp;from=2018-12-01&amp;amp;to=2018-12-31"&gt;Open Source Contributions on Github&lt;/a&gt; for 2018&lt;/p&gt;

&lt;p&gt;I started creating open source projects and android libraries a lot. Beside job (remote), I was doing only this.&lt;/p&gt;

&lt;p&gt;No freelancing.&lt;/p&gt;

&lt;p&gt;No startups.&lt;/p&gt;

&lt;p&gt;No side projects.&lt;/p&gt;

&lt;p&gt;I was spending 3–4 hours a day creating new libraries, doing new experiments, fixing bugs, answering to the issues, and contributing to other projects like &lt;a href="https://github.com/mozilla-mobile"&gt;Mozilla Mobile&lt;/a&gt; etc. And to get more serious in Open Source, I participated in &lt;a href="https://twitter.com/hashtag/100DaysOfCode?src=hash"&gt;&lt;strong&gt;#100DaysOfCode&lt;/strong&gt; challenge on Twitter&lt;/a&gt;. It was tough to work each single day and contribute something, but it was rewarding, enjoyable, and a life experience. I shared my whole experience and what I got from it in this article here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://android.jlelse.eu/100-days-of-code-in-open-source-3ceb38474a89"&gt;100 Days Of Code in Open Source&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Spoiler Alert: I got 6 job offers from abroad, 4 freelance projects, and local/global recognition.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  👏 &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android"&gt;Medium Clap&lt;/a&gt; Android Library
&lt;/h4&gt;

&lt;p&gt;Inspired from &lt;a href="https://medium.com/u/aea1cff96976"&gt;Ohans Emmanuel&lt;/a&gt; and &lt;a href="https://medium.freecodecamp.org/how-i-re-built-the-medium-clap-effect-and-what-i-got-out-of-the-experiment-991672995fdf"&gt;his experiment on creating this beautiful Medium clap effect&lt;/a&gt;, I tried to create this effect in Android just to learn a few things about view animations. &lt;em&gt;(Thank you&lt;/em&gt; &lt;a href="https://medium.com/u/aea1cff96976"&gt;&lt;em&gt;Ohans Emmanuel&lt;/em&gt;&lt;/a&gt; &lt;em&gt;for your amazing article and inspiration)&lt;/em&gt; And in matter of few hours on an celebration holiday (it was the 2nd day of Eid-ul-Azha), I created a basic prototype. I thought of writing an article about how I created it, but later I changed my mind and focused on bundling this whole experiment in an open source Android library for re-usability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I1uDANfI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/253/0%2ArYwOGV_DIQ3ZKIwd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I1uDANfI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/253/0%2ArYwOGV_DIQ3ZKIwd.gif" alt=""&gt;&lt;/a&gt;The demo of &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android"&gt;MediumClap-Android&lt;/a&gt; library&lt;/p&gt;

&lt;p&gt;I came back to work after few days vacation, and polished this library, created demos, wrote an amazing Read Me, shared it on Twitter, Reddit, Facebook and voila. I thought of writing an article after few days, but lazy me, I still haven’t wrote about it. &lt;em&gt;Damn it Wajahat!.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wajahatkarim3"&gt;
        wajahatkarim3
      &lt;/a&gt; / &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android"&gt;
        MediumClap-Android
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      👏 The Medium's Clapping Effect developed in Android
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="instapaper_body md"&gt;
&lt;h1&gt;
👏 MediumClap-Android&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://bintray.com/wajahatkarim3/ClapFab/com.wajahatkarim3.clapfab/_latestVersion" rel="nofollow"&gt; &lt;img src="https://camo.githubusercontent.com/942f548510d1bef5701479f7268c1aab0d42c3d9/68747470733a2f2f6170692e62696e747261792e636f6d2f7061636b616765732f77616a616861746b6172696d332f436c61704661622f636f6d2e77616a616861746b6172696d332e636c61706661622f696d616765732f646f776e6c6f61642e737667" alt="Download"&gt; &lt;/a&gt; &lt;a href="https://appcenter.ms" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/900734f7aef546165201898a7876516e3ea92be0/68747470733a2f2f6275696c642e61707063656e7465722e6d732f76302e312f617070732f63376237616337622d333462372d346130642d383962332d3863333235636330343761372f6272616e636865732f6d61737465722f6261646765" alt="Build status"&gt;&lt;/a&gt; &lt;a href="https://androidweekly.net/issues/issue-317" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3cca23cdd4aeec4a72fdd5d5e858bf5b7cf63bc4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f416e64726f69642532305765656b6c792d2532333331372d626c75652e737667" alt=""&gt;&lt;/a&gt; &lt;a href="https://raw.githubusercontent.com/wajahatkarim3/MediumClap-Android/master/"&gt;&lt;img src="https://camo.githubusercontent.com/d4e0f63e9613ee474a7dfdc23c240b9795712c96/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e737667" alt=""&gt;&lt;/a&gt; &lt;a href="https://www.uplabs.com/posts/medium-clap-android" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/eeedc307295db17a729f82b254183772da8b00c4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6174657269616c55702d4d656469756d436c61702d79656c6c6f77677265656e2e737667" alt=""&gt;&lt;/a&gt; &lt;a href="https://android-arsenal.com/details/1/7031" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/d376ab6c286e8ee9a3a538479c794b1a408ee463/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f416e64726f6964253230417273656e616c2d4d656469756d253230436c6170253230427574746f6e2d677265656e2e7376673f7374796c653d666c6174" alt="Android Arsenal"&gt;&lt;/a&gt;
&lt;a href="https://www.producthunt.com/posts/medium-clap-button-in-android" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/77215ec49a35672e88e92b12f525674fe3e50b30/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f417661696c61626c652532304f6e2d50726f6475637448756e742d6f72616e67652e737667" alt=""&gt;&lt;/a&gt; &lt;a href="https://saythanks.io/to/wajahatkarim3" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/0c9f6dc1c6a604b58d3c56bc5d7624e44f7eee2b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5361792532305468616e6b732d212d3145414544422e737667" alt="Say Thanks!"&gt;&lt;/a&gt; &lt;a href="https://twitter.com/intent/tweet?text=Wow:&amp;amp;url=https%3A%2F%2Fgithub.com%2Fwajahatkarim3%2FMediumClap-Android" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/79b4b2757e566fc26001621939fd5aa6daa85e91/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f75726c2f68747470732f6769746875622e636f6d2f77616a616861746b6172696d332f4d656469756d436c61702d416e64726f69642e7376673f7374796c653d736f6369616c" alt="Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
  Built with ❤︎ by
  &lt;a href="https://twitter.com/WajahatKarim" rel="nofollow"&gt;Wajahat Karim&lt;/a&gt; and
  &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android/graphs/contributors"&gt;
    contributors
  &lt;/a&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;A Custom Floating Action Button (FAB) library like clapping effect on Medium&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/wajahatkarim3/MediumClap-Android/master/art/demo_2.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---YFinJVq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://raw.githubusercontent.com/wajahatkarim3/MediumClap-Android/master/art/demo_2.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
📄 How-To Article&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/publishing-your-android-kotlin-or-java-library-to-jcenter-from-android-studio-1b24977fe450" rel="nofollow"&gt;Publishing your Android, Kotlin or Java library to jCenter from Android Studio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
✔️ Changelog&lt;/h2&gt;
&lt;p&gt;Changes exist in the &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android/releases"&gt;releases&lt;/a&gt; tab.&lt;/p&gt;
&lt;h2&gt;
💻 Installation&lt;/h2&gt;
&lt;p&gt;Add this in your app's build.gradle file:&lt;/p&gt;
&lt;div class="highlight highlight-source-groovy"&gt;&lt;pre&gt;dependencies {
  implementation &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;com.wajahatkarim3.clapfab:clapfab:1.0.6&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or add ClapFab as a new dependency inside your pom.xml&lt;/p&gt;
&lt;div class="highlight highlight-text-xml"&gt;&lt;pre&gt;&amp;lt;&lt;span class="pl-ent"&gt;dependency&lt;/span&gt;&amp;amp;gt
  &amp;lt;&lt;span class="pl-ent"&gt;groupId&lt;/span&gt;&amp;gt;com.wajahatkarim3.clapfab&amp;lt;/&lt;span class="pl-ent"&gt;groupId&lt;/span&gt;&amp;amp;gt
  &amp;lt;&lt;span class="pl-ent"&gt;artifactId&lt;/span&gt;&amp;gt;clapfab&amp;lt;/&lt;span class="pl-ent"&gt;artifactId&lt;/span&gt;&amp;amp;gt
  &amp;lt;&lt;span class="pl-ent"&gt;version&lt;/span&gt;&amp;gt;1.0.6&amp;lt;/&lt;span class="pl-ent"&gt;version&lt;/span&gt;&amp;gt;
  &amp;lt;&lt;span class="pl-ent"&gt;type&lt;/span&gt;&amp;gt;pom&amp;lt;/&lt;span class="pl-ent"&gt;type&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span class="pl-ent"&gt;dependency&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
❔ Usage&lt;/h2&gt;
&lt;div class="highlight highlight-text-xml"&gt;
&lt;pre&gt;&amp;lt;&lt;span class="pl-ent"&gt;com&lt;/span&gt;.wajahatkarim3.clapfab.ClapFAB
        &lt;span class="pl-e"&gt;android&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;id&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;@+id/clapFAB&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        &lt;span class="pl-e"&gt;android&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;layout_width&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;wrap_content&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        &lt;span class="pl-e"&gt;android&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;layout_height&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;wrap_content&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        &lt;span class="pl-e"&gt;android&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;layout_marginBottom&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;8dp&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        &lt;span class="pl-e"&gt;android&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;layout_marginTop&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;8dp&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        &lt;span class="pl-e"&gt;app&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;cf_count_circle_color&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;@color/colorAccent&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
        &lt;span class="pl-e"&gt;app&lt;/span&gt;&lt;span class="pl-e"&gt;:&lt;/span&gt;&lt;span class="pl-e"&gt;cf_count_text_color&lt;/span&gt;=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;@color/white_color&lt;/span&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wajahatkarim3/MediumClap-Android"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I honestly don’t know what and how happened. But this library went crazy. It got featured in many newsletters. And then this became #1 on &lt;a href="https://github.com/trending/kotlin?since=daily"&gt;Github Trending in Kotlin language&lt;/a&gt; from 22nd June, 2018 to 24th June, 2018. That was like a dream come true for me.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aOddq5l3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AOvtfX9k-ox5rtxaF" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aOddq5l3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AOvtfX9k-ox5rtxaF" alt=""&gt;&lt;/a&gt;The &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android"&gt;MediumClap-Android&lt;/a&gt; became #1 on &lt;a href="https://github.com/trending/kotlin?since=daily"&gt;Github Trending in Kotlin&lt;/a&gt; language&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This whole experience of putting Medium Clap Android library on Github and seeing the feedback of other developers was the most beautiful thing I enjoyed in 2018.&lt;/strong&gt; This was more like a highlight of the whole year for me. This brought so much amazing opportunities for me (more on this later) and &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android#-achievements"&gt;got featured in many newsletters&lt;/a&gt; that I couldn’t even think of.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vc_2HwXV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AbyTbIPxQ6UYOyfbdJ8mZ7Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vc_2HwXV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AbyTbIPxQ6UYOyfbdJ8mZ7Q.png" alt=""&gt;&lt;/a&gt;The &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android#-achievements"&gt;Achievements of Medium Clap Android&lt;/a&gt; Library&lt;/p&gt;




&lt;h4&gt;
  
  
  ✔️ &lt;a href="https://github.com/wajahatkarim3/EasyValidation"&gt;Easy Validation&lt;/a&gt; Android Library
&lt;/h4&gt;

&lt;p&gt;Launched in mid-June 2018, this project is an ambiguous one for me. With the objective of providing an easy text and input validation method utilizing the power of Kotlin extensions, this library has about &lt;a href="https://wajahatkarim.gitbook.io/easyvalidation/including-in-your-project"&gt;6 different modules&lt;/a&gt; for different purposes. I have developed two modules yet and I am slowly working on others. Also, I am getting &lt;a href="https://github.com/wajahatkarim3/EasyValidation/issues/26"&gt;many&lt;/a&gt; &lt;a href="https://github.com/wajahatkarim3/EasyValidation/issues/24"&gt;contributions&lt;/a&gt; &lt;a href="https://github.com/wajahatkarim3/EasyValidation/issues/20"&gt;from other&lt;/a&gt; &lt;a href="https://github.com/wajahatkarim3/EasyValidation/issues/18"&gt;developers&lt;/a&gt; and this is getting more stabilized and polished.&lt;/p&gt;

&lt;p&gt;I wrote a detailed article on this library and how I created it as well. You can read that here, if you want or not. No pressure.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/wajahatkarim" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIujHQgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nNN9VXHd--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/106012/f0459ec7-6db1-40bf-9f39-2c3582827c88.jpeg" alt="wajahatkarim image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/wajahatkarim/quickly--easily-validating-your-text-with-easy-validation-18ah" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Quickly &amp;amp;amp; Easily Validating Your Text with Easy Validation&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ Oct 14 '18 ・ 4 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kotlin&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#library&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h4&gt;
  
  
  📖 &lt;a href="https://github.com/wajahatkarim3/EasyFlipViewPager"&gt;Easy Flip View Pager&lt;/a&gt; Android Library
&lt;/h4&gt;

&lt;p&gt;Another interesting library of me, I created this solely for myself for an Android app side project I am currently working on. This library allows android developers to create page/card flip animations for their ViewPager in their Android apps. Inspired from Star &lt;a href="https://www.uplabs.com/posts/onboarding-animation-expore"&gt;Liu’s Onboarding Bookstore animation (UpLabs)&lt;/a&gt;, I wanted to have this same animation effect in my android app. It took me a while, but I managed to create it. You can check a demo of this library in below image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d_Tl_BJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/336/0%2ANDyk5THxG5QoeFd1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d_Tl_BJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/336/0%2ANDyk5THxG5QoeFd1.gif" alt=""&gt;&lt;/a&gt;A book-flip demo of &lt;a href="https://github.com/wajahatkarim3/EasyFlipViewPager"&gt;EasyFlipViewPager Android&lt;/a&gt; Library&lt;/p&gt;

&lt;p&gt;In just 2 months time, this library has surpassed 300 starts on Github and more than 1000 downloads by Android developers for their apps. I also wrote an article about it on how and why I created this library. &lt;em&gt;Again you can read it, if you want or not. No pressure.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/wajahatkarim" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIujHQgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nNN9VXHd--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/106012/f0459ec7-6db1-40bf-9f39-2c3582827c88.jpeg" alt="wajahatkarim image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/wajahatkarim/easyflipviewpagerthe-flip-animations-for-your-viewpager-1o9n" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;EasyFlipViewPager — The Flip Animations For Your ViewPager&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ Dec 14 '18 ・ 9 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#developer&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h4&gt;
  
  
  💻 Hacktoberfest Challenge
&lt;/h4&gt;

&lt;p&gt;This was my first time that I participated in the &lt;a href="https://hacktoberfest.digitalocean.com/"&gt;&lt;strong&gt;Hacktoberfest Challenge&lt;/strong&gt;&lt;/a&gt; organized and sponsored by &lt;a href="http://github.com"&gt;Github&lt;/a&gt;, &lt;a href="https://www.digitalocean.com/"&gt;Digital Ocean&lt;/a&gt;, and &lt;a href="https://www.twilio.com/"&gt;Twilio&lt;/a&gt;. The objective of the challenge was to create at-least 5 pull requests on Github and earn a limited-edition T-shirt. I submitted 7 pull requests on Github in projects like &lt;a href="https://github.com/mozilla-mobile/android-components"&gt;Mozilla Components&lt;/a&gt;, &lt;a href="https://github.com/project-travel-mate/Travel-Mate"&gt;Travel Mate&lt;/a&gt;, and some of my own like &lt;a href="https://github.com/wajahatkarim3/MediumClap-Android"&gt;MediumClap&lt;/a&gt;, &lt;a href="https://github.com/wajahatkarim3/EasyValidation"&gt;EasyValidation&lt;/a&gt;etc. And yeah, I got the t-shirts and beautiful swag for it as well. &lt;em&gt;Thank you Github, Digital Ocean and Twilio.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g3Xd3uLh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/864/1%2AdIl2Z0NvVo1PGsf8VWsFOA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g3Xd3uLh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/864/1%2AdIl2Z0NvVo1PGsf8VWsFOA.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z4f56rxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-LbvmE-R72A6m6-ZQo69TA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z4f56rxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-LbvmE-R72A6m6-ZQo69TA.jpeg" alt=""&gt;&lt;/a&gt;The Hacktoberfest Challenge T-Shirt and Beautiful Stickers&lt;/p&gt;




&lt;p&gt;Overall, this is the summary of my open source activity in 2018 in one single tweet.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gQ3gO9T---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DvvQKaQX0AAHJp2.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--jmphF7mX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1038747270232068096/Ep6Nohft_normal.jpg" alt="Wajahat Karim profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Wajahat Karim
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @wajahatkarim
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B8bbACBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-99c56e7c338b4d5c17d78f658882ddf18b0bbde5b3f42f84e7964689e7e8fb15.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      A year of &lt;a href="https://twitter.com/hashtag/opensource"&gt;#opensource&lt;/a&gt;, &lt;a href="https://twitter.com/hashtag/AndroidDev"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/hashtag/Android"&gt;#Android&lt;/a&gt;Dev, &lt;a href="https://twitter.com/hashtag/writing"&gt;#writing&lt;/a&gt;, and &lt;a href="https://twitter.com/hashtag/public"&gt;#public&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/speaking"&gt;#speaking&lt;/a&gt;.&lt;br&gt;- 11 Open source &lt;a href="https://twitter.com/hashtag/Android"&gt;#Android&lt;/a&gt; libraries&lt;br&gt;- 9 demo projects for learning&lt;br&gt;- 4 open source projects&lt;br&gt;- Lots of pull requests to other projects&lt;br&gt;- &lt;a href="https://twitter.com/hashtag/TodayILearned"&gt;#TodayILearned&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/til"&gt;#til&lt;/a&gt; articles on &lt;a href="https://twitter.com/hashtag/github"&gt;#github&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="https://twitter.com/hashtag/HappyNewYear2019"&gt;&lt;/a&gt;&lt;a href="https://twitter.com/hashtag/HappyNewYear"&gt;#HappyNewYear&lt;/a&gt;2019 &lt;a href="https://twitter.com/hashtag/HappyNewYear"&gt;#HappyNewYear&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      10:53 AM - 31 Dec 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1079692092673310720" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1079692092673310720" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      3
      &lt;a href="https://twitter.com/intent/like?tweet_id=1079692092673310720" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      10
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;





&lt;h3&gt;
  
  
  🎤 Public Speaking = Community
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wRkcCJ0J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AUjRaP8BEyzvRHINj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wRkcCJ0J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AUjRaP8BEyzvRHINj.jpg" alt=""&gt;&lt;/a&gt;A collection of all shields, cards, stickers etc. of 2018 — I love that Google IO shield ❤&lt;/p&gt;

&lt;p&gt;In June 2018, I started getting into public speaking and local community contributions. Last time I did public speaking was back in 2012, so getting a chance and platform was a little difficult. As not many people knew about me locally. They might had seen my articles or Github projects, but they didn’t know me personally. So, I started cold-calling the local event and community organizers of events or tech meetups etc and asked them for letting me talk in their events about my experiences and learning.&lt;/p&gt;

&lt;p&gt;My work in open source and Github profile helped me validate my experience and the first chance I got was to become a judge in a project exhibition at &lt;a href="https://www.neduet.edu.pk/"&gt;&lt;em&gt;NED Karachi&lt;/em&gt;&lt;/a&gt;, one of the top university in Pakistan for engineering and computer sciences. Thanks to &lt;a href="https://medium.com/u/3e65873c331d"&gt;&lt;strong&gt;Anas Ayubi&lt;/strong&gt;&lt;/a&gt; for connecting me with &lt;strong&gt;Samrah Syed&lt;/strong&gt; and &lt;strong&gt;Syed Muhammad Hasnain&lt;/strong&gt; who invited me to become a judge at NED’s annual event &lt;a href="http://www.neditec.org.pk/"&gt;ITEC 2018&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iwGUsUiT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aurc-zPI4Y5bZsujtZGWwrg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iwGUsUiT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aurc-zPI4Y5bZsujtZGWwrg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--beIdsJ83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AnwDJvfWsVqePAp9blpGcxQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--beIdsJ83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AnwDJvfWsVqePAp9blpGcxQ.jpeg" alt=""&gt;&lt;/a&gt;The poster for introducing me as Judge for ITEC and a picture of mine on their stage&lt;/p&gt;

&lt;p&gt;It was my first time being an exhibition judge, and I witnessed a lot of interesting projects from humanoid talking robots to biological and agriculture technology solutions to mobile apps and games to data science experiments. One project I particularly liked was from a 14 year old young programmer who created 3D First Person Shooting (FPS) game with real-time multiplayer capability using &lt;a href="https://www.photonengine.com/en/pun"&gt;Photon engine&lt;/a&gt;. I was surprised how can a 14-year old can work on such advance tool-set to create a polished game.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I would like to give a big shout out to &lt;a href="https://medium.com/u/49f4e27ed6bc"&gt;&lt;strong&gt;Muhammad Khalid&lt;/strong&gt;&lt;/a&gt; for giving me wonderful company all day, wandering through the roads and parks of the university, a wonderful lunch at cafeteria followed by many cups of tea, and countless jokes and talks. Thank you buddy for making that day memorable.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;After this exhibition, I got a talk opportunity on an event I couldn’t even think of. It was &lt;em&gt;Google IO Extended 2018&lt;/em&gt; organized by &lt;a href="https://www.facebook.com/GDGKolachi/"&gt;&lt;strong&gt;Google Developers Group (GDG) Kolachi&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt; Once again, a big thanks to &lt;a href="https://medium.com/u/3e65873c331d"&gt;Anas Ayubi&lt;/a&gt; for connecting me to &lt;a href="https://medium.com/u/4142dad0ad21"&gt;Eric Bhatti,&lt;/a&gt; who offered me to talk about “What’s new in Android?” at Google IO Extended 2018. Thanks Eric for the talk.&lt;/p&gt;

&lt;p&gt;As an android developer, this was really huge for me. I was very nervous because this was my first public speaking talk in like 5 years and that too on such a huge platform. Eric made me comfortable and believed in me. Surprisingly, the circumstances became very strange that day. And I got hardly 3 hours of sleep that night. My talk was at 10:30 AM. With no sleep in night, I had to travel for 4-hours directly to the venue and give a talk. It was all a risky plan. And I wasn’t even sure if I can make it in the event on time or not. Once again, Eric was very supportive and cooperated. And I made it to the event and gave the talk. The topic was &lt;a href="https://speakerdeck.com/wajahatkarim3/whats-new-in-android"&gt;“What’s new in Android?”&lt;/a&gt;. You can check the slides on my &lt;a href="https://speakerdeck.com/wajahatkarim3"&gt;SpeakerDeck profile&lt;/a&gt; &lt;a href="https://speakerdeck.com/wajahatkarim3/whats-new-in-android"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The talk went very well. The hall was full. There were more people than the chairs, so a lot were standing and some were sitting on floor in empty spaces. It was one of the best experiences of 2018 and it restored my confidence in public speaking. I became so much motivated and excited that day. Later, I got so much good feedback from the audience and a lot of people approached me through social media, email etc. I made many new friends and connections after this talk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R5OhqHf---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/900/1%2AmHW1hCRIiQyILYJUbpZCGQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R5OhqHf---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/900/1%2AmHW1hCRIiQyILYJUbpZCGQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D99Cgle4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2APXrmvRbeo1HWlbRDYmQ4TA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D99Cgle4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2APXrmvRbeo1HWlbRDYmQ4TA.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nAuRo1ou--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/618/1%2AGObRGGWx-B2UIWJIO_Km-w.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nAuRo1ou--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/618/1%2AGObRGGWx-B2UIWJIO_Km-w.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sdTmOocs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A_WggmrvavwZHBNeoMd2x6A.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sdTmOocs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A_WggmrvavwZHBNeoMd2x6A.jpeg" alt=""&gt;&lt;/a&gt;Images Credits: The Shutter Freaks, &lt;a href="https://medium.com/u/fde64575f754"&gt;Hasan Ali,&lt;/a&gt; and &lt;a href="https://medium.com/u/f953de41d93f"&gt;Waleed Arshad&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;About 2 months later, I got an opportunity to talk about importance of open source and why students should do open source contributions at &lt;a href="https://www.saylaniwelfare.com/"&gt;&lt;strong&gt;Saylani Welfare Trust&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt; A big thanks to &lt;a href="https://medium.com/u/743c75d2d122"&gt;Muhammad Kamran&lt;/a&gt; and &lt;a href="https://medium.com/u/b74429cfd36c"&gt;Muhammad Ali Mughal&lt;/a&gt; for letting me share my open source experiences to their students at Saylani Welfare. It was truly an enjoyable experiences. &lt;em&gt;The topic was&lt;/em&gt; &lt;a href="https://speakerdeck.com/wajahatkarim3/importance-of-open-source-in-it"&gt;&lt;em&gt;“Importance of Open Source in IT World”&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Check the&lt;/em&gt; &lt;a href="https://speakerdeck.com/wajahatkarim3/importance-of-open-source-in-it"&gt;&lt;em&gt;slides on SpeakerDeck here&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I felt very blessed when a student from that talk approached me few weeks later to let me know that he has created his first open source library after getting inspiration from my talk. Amazing Work &lt;a href="https://medium.com/u/6bec047e0b50"&gt;Ishaq Hassan&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also, a shout out to &lt;a href="https://medium.com/u/8608bed73ea0"&gt;Aminullah Taj Muhammad&lt;/a&gt; and &lt;a href="https://medium.com/u/f59584824486"&gt;Shakeib Shaida&lt;/a&gt; for doing good work on open source contributions after getting inspirations from this talk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SMzeQ4iz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/437/1%2AFP5QsIgpudlaJbKHh3RrUw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SMzeQ4iz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/437/1%2AFP5QsIgpudlaJbKHh3RrUw.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z2SNNHm4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aicl0VTBrF3riMCXYTy2g_A.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z2SNNHm4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aicl0VTBrF3riMCXYTy2g_A.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mVnM_nPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/864/1%2A4LH5rTXAb25nKYFSMn92kw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mVnM_nPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/864/1%2A4LH5rTXAb25nKYFSMn92kw.jpeg" alt=""&gt;&lt;/a&gt;Some pictures from Saylani Welfare Talk — Image Credits: &lt;a href="https://medium.com/u/b74429cfd36c"&gt;Muhammad Ali Mughal&lt;/a&gt; and &lt;a href="https://medium.com/u/8608bed73ea0"&gt;Aminullah Taj Muhammad&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The third and last talk I gave in 2018 was about the Flutter in the Pakistan’s first Flutter Meetup. I wrote about this in more details on following link. You can find the &lt;a href="https://speakerdeck.com/wajahatkarim3/next-stop-flutter"&gt;slides (SpeakerDeck)&lt;/a&gt;, along with the &lt;a href="https://www.youtube.com/watch?v=GPtsV-u6Rd8"&gt;recording of the talk (YouTube)&lt;/a&gt; as well in that article.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/wajahatkarim" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIujHQgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nNN9VXHd--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/106012/f0459ec7-6db1-40bf-9f39-2c3582827c88.jpeg" alt="wajahatkarim image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/wajahatkarim/next-stop-flutter-6d1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Next Stop: Flutter&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ Nov 16 '18 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#flutter&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#xamarin&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;A big thanks to &lt;a href="https://medium.com/u/f953de41d93f"&gt;Waleed Arshad&lt;/a&gt; for giving me opportunity to talk in their meetup and share my experiences about Flutter and for taking that beautiful picture (current cover image of this article).&lt;/p&gt;




&lt;p&gt;Besides talks, something interesting happened in 2018 as well. No, this isn’t that BIG NEWS mentioned in the title of the article. I was presented with an opportunity to do a podcast about the state of Open Source in Pakistan and role of Hacktoberfest to promote open source contributions. This was my first podcast and it was an amazing experience. I enjoyed it so much that this year I will try to do more and explore this medium as well.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A very big thanks to &lt;a href="https://medium.com/u/743c75d2d122"&gt;Muhammad Kamran,&lt;/a&gt; &lt;a href="https://medium.com/u/338b8240b47a"&gt;Nawazish Ali,&lt;/a&gt; &lt;a href="https://medium.com/u/3763e8fee51e"&gt;Ahsan Ayaz&lt;/a&gt; and finally &lt;a href="https://medium.com/u/b518f5a7e171"&gt;Mohammad Ali Khan&lt;/a&gt; and &lt;a href="https://devcastpakistan.com/#/"&gt;&lt;strong&gt;DevCast Pakistan&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have shared this experience in more details in the following article.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/wajahatkarim" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIujHQgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nNN9VXHd--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/106012/f0459ec7-6db1-40bf-9f39-2c3582827c88.jpeg" alt="wajahatkarim image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/wajahatkarim/podcast--whats-open-source-and-whats-hacktoberfest-fm5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Podcast — What’s Open Source? And What’s Hacktoberfest?&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ Oct 23 '18 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#podcast&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#hacktoberfest&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  📝 Writing = Sharing Knowledge
&lt;/h3&gt;

&lt;p&gt;At the start of 2018, I set a target of publishing at least 48 articles (4 each month) as the new year resolution. I couldn’t make it. I have published 36 articles in 2018, mostly on &lt;a href="https://medium.com/@wajahatkarim3"&gt;Medium&lt;/a&gt;, but also on &lt;a href="http://wajahatkarim.com"&gt;my website&lt;/a&gt;, and &lt;a href="https://dev.to/wajahatkarim/"&gt;Dev.to profile&lt;/a&gt;. These articles helped me get about 10,000 to 15,000 views each month with an average read ratio of about 43%. I have &lt;a href="https://android.jlelse.eu/1000-followers-1000-words-1000-hopes-fbe01e7b62db"&gt;crossed 1000 followers on Medium&lt;/a&gt; as well, and currently I have about ~1300 followers. I am very proud of it, because at the start of 2018, I had merely 200 followers. So, that’s about 1100 followers in a year.&lt;/p&gt;

&lt;p&gt;Here are some of my most viewed and most read articles in no particular order.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/wajahatkarim/multiple-runtime-permissions-in-android-without-any-third-party-libraries-324l"&gt;Multiple Runtime Permissions in Android Without Any Third-Party Libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/wajahatkarim/executing-tiny-asynchronous-tasks-quickly-in-android-under-10-lines-3hne"&gt;Executing tiny asynchronous tasks quickly in Android under 10 lines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/publishing-your-android-kotlin-or-java-library-to-jcenter-from-android-studio-1b24977fe450"&gt;Publishing your Android, Kotlin or Java library to jCenter from Android Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.jlelse.eu/add-logs-without-using-code-bd49fe9202ca"&gt;Add Logs Without Using Code - AndroidPub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Along with writing articles, I also started a Medium publication for Flutter called as &lt;a href="https://medium.com/flutterpub"&gt;&lt;strong&gt;Flutter Pub&lt;/strong&gt;&lt;/a&gt; with &lt;a href="https://medium.com/u/1a952cf1f6b0"&gt;Danish Amjad&lt;/a&gt;. We are about to cross 5000 followers soon and have about 2000 daily visitors on average. We have published over 100 articles on Flutter with the help of about 30 writers around the world. You can learn more about it here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/flutterpub/welcome-to-flutter-pub-8480678ed212"&gt;Welcome to Flutter Pub&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ❓ Miscellaneous Things = Unknowns
&lt;/h3&gt;

&lt;p&gt;There were some events happened in 2018 in my life, which I couldn't categorize for this article.&lt;/p&gt;

&lt;h4&gt;
  
  
  🌐 New Website
&lt;/h4&gt;

&lt;p&gt;In 2018, I redesigned &lt;a href="https://wajahatkarim.com"&gt;&lt;strong&gt;my personal website&lt;/strong&gt;&lt;/a&gt; using &lt;a href="https://gohugo.io/"&gt;Hugo Framework&lt;/a&gt; and hosted it on Firebase after saying a farewell to Wordpress. I used &lt;a href="https://themes.gohugo.io/hugo-tranquilpeak-theme/"&gt;Tranquilpeak theme&lt;/a&gt; and integrated the Continuous Integration (CI) of Gitlab to add/update content easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a3hI4yXz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AnzIEADGoObFW7Ud5pgfYHQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a3hI4yXz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AnzIEADGoObFW7Ud5pgfYHQ.png" alt=""&gt;&lt;/a&gt;&lt;a href="https://wajahatkarim.com"&gt;My new website&lt;/a&gt; in Hugo Framework&lt;/p&gt;




&lt;h4&gt;
  
  
  💥 Google Developer Expert (GDE) in Android
&lt;/h4&gt;

&lt;p&gt;I believe you are thinking the same thing I’m thinking. Well, at Google IO 2018 Extended talk, I met with &lt;a href="https://twitter.com/samikiz"&gt;&lt;strong&gt;Sami Kizilbash&lt;/strong&gt;&lt;/a&gt; from Google through &lt;a href="https://medium.com/u/4142dad0ad21"&gt;Eric Bhatti&lt;/a&gt;. And he suggested me to apply for GDE Android from Pakistan. I went through the whole process with the help of &lt;a href="https://twitter.com/manikantan_k"&gt;&lt;strong&gt;Manikantan K&lt;/strong&gt;&lt;/a&gt;, but unfortunately I couldn’t make it. I had less than 1 year experience in Open Source contributions and article writing. So, they (Google) asked me to re-apply in March 2019 or later. So, I am very excited to applying again and see how it goes this time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thank you &lt;a href="https://medium.com/u/4142dad0ad21"&gt;Eric Bhatti,&lt;/a&gt; &lt;a href="https://medium.com/u/6ee481f953a7"&gt;Sami Kizilbash,&lt;/a&gt; &lt;a href="https://medium.com/u/fc673539f95b"&gt;Manikantan K,&lt;/a&gt; and &lt;a href="https://medium.com/u/991272e72e68"&gt;Google Developers&lt;/a&gt; for giving me a chance to apply for such a great opportunity.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  📱 Job Offer of Mobile Solutions Engineer at Facebook London
&lt;/h4&gt;

&lt;p&gt;Now this was totally unbelievable and shocking for me. I couldn’t even think of this that I would get an opportunity to work in Facebook London. It was an amazing experience throughout the process, but I had to decline the offer due to family constraints. I wrote an article about it here below.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/wajahatkarim" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIujHQgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nNN9VXHd--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/106012/f0459ec7-6db1-40bf-9f39-2c3582827c88.jpeg" alt="wajahatkarim image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/wajahatkarim/i-didnt-accept-job-offer-at-facebook-heres-why-558i" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I Didn’t Accept Job Offer at Facebook. Here’s Why.&lt;/h2&gt;
      &lt;h3&gt;Wajahat Karim ・ Oct 18 '18 ・ 6 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#facebook&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#lifelessons&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#lifeexperience&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#family&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  🎥 Entertainment — Movies, Seasons, Dramas
&lt;/h3&gt;

&lt;p&gt;Actually I haven’t tracked movies for the year. Maybe I will track this year if I could. I watched most movies with my wife varying from Fast &amp;amp; Furious series, Unbreakable, Split, Tag, Rush Hour series, 102 Not Out, Babys Day Out, Going in Style, Harry Potter series, Hitman, Inception, Legends of Guardians, Mowgli, Sanju, Searching, The Secret Life of Pets, Emoji, Wreck It Ralph, The Hunger Games series, and so so many more.&lt;/p&gt;

&lt;p&gt;Also, I watched Game of Thrones all seasons the 4th time with my wife (her 1st time) episode by episode. She loved it and enjoyed it so much. Now, we are waiting for the final season. Also, we watched Zara Yaad Kar and Baba Jani Pakistani serials as well.&lt;/p&gt;

&lt;p&gt;I also watched Silicon Valley all seasons again, Halt &amp;amp; Catch Fire all seasons, House of Cards final season, Breaking Bad all seasons, Better Call Saul season 1 and 2, Corporate season 1 and 2 as well, and Billions all seasons.&lt;/p&gt;




&lt;h3&gt;
  
  
  📚 Books Read
&lt;/h3&gt;

&lt;p&gt;In 2018, I managed to read 6 books: The Lean Startup, Zero to One, Hooked, The 7 Habits of Highly Effective People, The 8th Habbit, and Rich Dad Poor Dad.&lt;/p&gt;




&lt;h3&gt;
  
  
  💖 Life = The BIG NEWS!
&lt;/h3&gt;

&lt;p&gt;Finally, we’ve reached to the life section. So, let me share you the BIG NEWS I have mentioned at the start of the article.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Me and my wife has been blessed with a beautiful baby boy on 1st Janurary, 2019.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Technically, this is not in 2018, but I have added it in 2018 to make my whole year worth it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8OHvSa8S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AxJgmVYdLstQbYiVu" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8OHvSa8S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AxJgmVYdLstQbYiVu" alt=""&gt;&lt;/a&gt;Picture of hand of our little bundle of joy :)&lt;/p&gt;




&lt;p&gt;This sums the whole article. This was a quite long year-in-review. Let’s see how next year goes. I have some goals in my mind such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get at least 5000 followers on Medium&lt;/li&gt;
&lt;li&gt;Publish at least 50 articles on Medium&lt;/li&gt;
&lt;li&gt;Give 5-10 public speaking talks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope you liked the article. Let me know about your thoughts in the comments. I would love to know about your suggestions.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Wajahat Karim&lt;/strong&gt; is a graduate from &lt;a href="http://nust.edu.pk"&gt;NUST, Islamabad&lt;/a&gt;, an experienced mobile developer, an active open source contributor, and co-author of two books &lt;a href="https://www.amazon.com/Learning-Android-Intents-Muhammad-Usama/dp/1783289635"&gt;Learning Android Intents&lt;/a&gt; and &lt;a href="https://www.amazon.com/Mastering-Android-Game-Development-Unity/dp/1783550775/"&gt;Mastering Android Game Development with Unity&lt;/a&gt;. In his spare time, he likes to spend time with his family, do experiments on coding, loves to write about lots of things (mostly on blog and medium) and is passionate contributor to open source. In June 2018, one of his library became #1 on &lt;a href="https://github.com/trending"&gt;Github Trending&lt;/a&gt;. &lt;a href="http://github.com/wajahatkarim3"&gt;His libraries&lt;/a&gt; have about 2000 stars on Github and are being used in various apps by the developers all around the globe. Follow him on Twitter and &lt;a href="https://medium.com/@wajahatkarim3"&gt;Medium&lt;/a&gt; to get more updates about his work in Writing, Android and Open Source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/WajahatKarim"&gt;Wajahat Karim (@WajahatKarim) | Twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, if you have any questions you’d like him to answer, contact him through his website at &lt;a href="http://wajahatkarim.com"&gt;wajahatkarim.com&lt;/a&gt; with DEAR WAJAHAT in the subject line.&lt;/p&gt;




</description>
      <category>yearinreview</category>
      <category>opensource</category>
      <category>android</category>
      <category>career</category>
    </item>
  </channel>
</rss>
