CINXE.COM
ProAndroidDev
<!DOCTYPE html><html xmlns:cc="http://creativecommons.org/ns#"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=contain"><title>ProAndroidDev</title><link rel="canonical" href="https://proandroiddev.com"><link id="feedLink" rel="alternate" type="application/rss+xml" title="RSS" href="https://proandroiddev.com/feed"><meta name="robots" content="index,follow"><meta name="title" content="ProAndroidDev"><meta name="referrer" content="unsafe-url"><meta name="description" content="The latest posts from Android Professionals and Google Developer Experts."><meta name="theme-color" content="#000000"><meta property="og:title" content="ProAndroidDev"><meta property="twitter:title" content="ProAndroidDev"><meta property="og:url" content="https://proandroiddev.com/"><meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*XVtdl45m8YaYrPI4buJ5yQ.png"><meta property="fb:app_id" content="542599432471018"><meta property="og:description" content="The latest posts from Android Professionals and Google Developer Experts."><meta name="twitter:description" content="The latest posts from Android Professionals and Google Developer Experts."><meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*XVtdl45m8YaYrPI4buJ5yQ.png"><meta property="og:type" content="medium-com:collection"><meta name="twitter:card" content="summary_large_image"><meta property="medium-com:creator" content="https://proandroiddev.com/@g-fawson"><meta name="twitter:site" content="@proandroiddev"><meta property="og:site_name" content="ProAndroidDev"><meta name="twitter:app:name:iphone" content="Medium"><meta name="twitter:app:id:iphone" content="828256236"><meta name="twitter:app:url:iphone" content="medium://proandroiddev"><meta property="al:ios:app_name" content="Medium"><meta property="al:ios:app_store_id" content="828256236"><meta property="al:android:package" content="com.medium.reader"><meta property="al:android:app_name" content="Medium"><meta property="al:ios:url" content="medium://proandroiddev"><meta property="al:android:url" content="medium://proandroiddev"><meta property="al:web:url" content="https://proandroiddev.com/"><link rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" /><link rel="alternate" href="android-app://com.medium.reader/https/medium.com/proandroiddev" /><script type="application/ld+json">{"@context": "http://schema.org", "@graph": [{"@type": "WebSite", "url": "https:\/\/proandroiddev.com", "name": "ProAndroidDev", "alternateName": "The latest posts from Android Professionals and Google Developer Experts."},{"@type": "Organization", "url": "https:\/\/proandroiddev.com", "name": "ProAndroidDev"}]}</script><link rel="stylesheet" href="https://cdn-static-1.medium.com/_/fp/css/main-branding-base.tWIMt8r3Nl52PPi9OfgcVw.12.css"><script>!function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);</script><script>document.domain = document.domain;</script><script>if (window.top !== window.self) window.location = 'about:blank';var OB_startTime = new Date().getTime(); var OB_loadErrors = []; function _onerror(e) { OB_loadErrors.push(e) }; if (document.addEventListener) document.addEventListener("error", _onerror, true); else if (document.attachEvent) document.attachEvent("onerror", _onerror); function _asyncScript(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = u; f.parentNode.insertBefore(s, f);}function _asyncStyles(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("link"); s.rel = "stylesheet"; s.href = u; f.parentNode.insertBefore(s, f); return s}(new Image()).src = "/_/stat?event=pixel.load&origin=" + encodeURIComponent(location.origin);</script><script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; ga("create", "G-7JY7T788PK", "auto", {"allowLinker": true, "legacyCookieDomain": window.location.hostname});ga("send", "pageview");</script><script async src="https://www.google-analytics.com/analytics.js"></script><script>(function () {var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; document.write("<style>section.section-image--fullBleed.is-backgrounded {padding-top: " + Math.round(1.1 * height) + "px;}section.section-image--fullScreen.is-backgrounded, section.section-image--coverFade.is-backgrounded {min-height: " + height + "px; padding-top: " + Math.round(0.5 * height) + "px;}.u-height100vh {height: " + height + "px !important;}.u-height110vh {height: " + Math.round(1.1 * height) + "px !important;}.u-minHeight100vh {min-height: " + height + "px !important;}.u-maxHeight100vh {max-height: " + height + "px !important;}section.section-image--coverFade {height: " + height + "px;}.section-aspectRatioViewportPlaceholder, .section-aspectRatioViewportCropPlaceholder {max-height: " + height + "px;}.section-aspectRatioViewportBottomSpacer, .section-aspectRatioViewportBottomPlaceholder {max-height: " + Math.round(0.5 * height) + "px;}.zoomable:before {top: " + (-1 * height) + "px; left: " + (-1 * width) + "px; padding: " + height + "px " + width + "px;}</style>");})()</script><!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js"></script><![endif]--><link rel="icon" href="https://cdn-images-1.medium.com/fit/c/256/256/1*A8VytPZQhvUf_MG6hm_Dlw.png" class="js-favicon"><link rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/304/304/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/240/240/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/152/152/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/120/120/1*XVtdl45m8YaYrPI4buJ5yQ.png"><link rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg" color="#171717"></head><body itemscope class=" browser-ie os-windows v-unbound v-glyph v-glyph--m2-unbound-source-serif-pro is-noJs"><script>document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")</script><div class="site-main" id="container"><div class="butterBar butterBar--error"></div><div class="surface"><div id="prerendered" class="screenContent"><div class="metabar u-clearfix js-metabar"><div class="branch-journeys-top"></div><div class="js-metabarMiddle metabar-inner u-marginAuto u-maxWidth1032 u-flexCenter u-justifyContentSpaceBetween u-height65 u-xs-height56 u-paddingHorizontal20"><div class="metabar-block u-flex1 u-flexCenter"><div class="js-metabarLogoLeft"><a href="https://medium.com/" data-log-event="home" class="siteNav-logo u-fillBlack u-flex0 u-flexCenter u-paddingTop0"><span class="svgIcon svgIcon--wordmarkMedium svgIcon--120x26px u-flex"><svg class="svgIcon-use" width="120" height="26" ><path d="M29.57 1.404l.036-.008V1.12h-7.27l-6.75 15.979-6.75-15.98H1.003v.278l.035.008c1.327.302 2 .752 2 2.374v18.993c0 1.623-.676 2.073-2.003 2.374L1 25.153v.279h5.315v-.278l-.035-.008c-1.327-.302-2-.751-2-2.374V4.88l8.67 20.552h.492l8.924-21.125V23.24c-.114 1.282-.782 1.677-1.983 1.95l-.036.009v.275h9.259V25.2l-.036-.008c-1.203-.274-1.886-.67-2-1.95l-.006-19.464h.006c0-1.622.674-2.072 2-2.374zm4.23 12.582c.15-3.412 1.367-5.875 3.41-5.918.629.01 1.157.219 1.568.62.872.852 1.282 2.634 1.219 5.298h-6.198zm-.092.962h10.85v-.046c-.03-2.61-.78-4.64-2.228-6.033-1.25-1.204-3.103-1.867-5.048-1.867h-.043c-1.01 0-2.248.246-3.13.693a7.316 7.316 0 00-2.623 2.086c-1.185 1.479-1.903 3.477-2.078 5.724a13.717 13.717 0 00-.04.755c-.004.195-.005.39-.001.587.117 5.087 2.846 9.153 7.692 9.153 4.254 0 6.73-3.132 7.348-7.336l-.312-.11c-1.085 2.259-3.034 3.628-5.252 3.461-3.028-.228-5.347-3.32-5.137-7.066m23.122 6.893c-.356.85-1.099 1.319-2.094 1.319-.995 0-1.905-.689-2.552-1.939-.694-1.342-1.06-3.24-1.06-5.487 0-4.678 1.445-7.704 3.68-7.704.937 0 1.674.468 2.026 1.284v12.527zm7.198 3.335c-1.327-.316-2-.787-2-2.492V0l-8.062 2.392v.293l.05-.004c1.111-.09 1.866.064 2.304.472.343.32.51.809.51 1.498v3.11C56.033 7.25 55.088 7 53.94 7c-2.326 0-4.453.987-5.986 2.779-1.599 1.867-2.444 4.42-2.444 7.38 0 5.287 2.584 8.84 6.43 8.84 2.25 0 4.06-1.242 4.888-3.336v2.811h7.233v-.29l-.035-.008zM70.94 3.085c0-1.65-1.236-2.896-2.875-2.896-1.632 0-2.908 1.272-2.908 2.896 0 1.624 1.278 2.896 2.908 2.896 1.64 0 2.875-1.245 2.875-2.896zm1.903 22.092c-1.327-.316-2-.787-2-2.492h-.006V7.055l-7.234 2.092v.284l.043.004c1.566.14 1.994.683 1.994 2.525v13.515h7.24v-.29l-.037-.008zm18.536 0c-1.327-.316-2-.787-2-2.492V7.055L82.49 9.078v.285l.04.004c1.28.136 1.65.71 1.65 2.56v9.88c-.426.85-1.227 1.356-2.196 1.39-1.573 0-2.439-1.07-2.439-3.012V7.055l-7.234 2.092v.284l.044.004c1.565.14 1.994.683 1.994 2.525v8.362a9.443 9.443 0 00.15 1.741l.13.57C75.243 24.845 76.848 26 79.362 26c2.129 0 3.996-1.328 4.818-3.405v2.885h7.233v-.291l-.034-.012zm28.102.298v-.291l-.035-.009c-1.44-.334-2.001-.964-2.001-2.248V12.295C117.445 8.98 115.597 7 112.5 7c-2.257 0-4.16 1.314-4.893 3.36-.582-2.168-2.257-3.36-4.734-3.36-2.175 0-3.88 1.156-4.612 3.11V7.056l-7.233 2.006v.286l.043.004c1.547.138 1.994.697 1.994 2.492v13.631h6.75v-.29l-.037-.01c-1.148-.271-1.519-.767-1.519-2.04V10.95c.304-.715.917-1.562 2.127-1.562 1.504 0 2.266 1.05 2.266 3.116v12.972h6.751v-.29l-.035-.01c-1.149-.271-1.52-.767-1.52-2.04V12.294a7.107 7.107 0 00-.095-1.21c.322-.777.97-1.696 2.23-1.696 1.524 0 2.265 1.02 2.265 3.116v12.972h7.233z"/></svg></span><span class="u-textScreenReader">Homepage</span></a></div><div class="u-paddingLeft10 u-sm-show r-paddingRight10"><a href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com/proandroiddev%3F~feature=LoMobileNavBar&~channel=ShowCollectionHome&~stage=m2">Open in app</a></div></div><div class="metabar-block u-flex0 u-flexCenter"><div class="u-flexCenter u-height65 u-xs-height56"><div class="buttonSet buttonSet--wide u-lineHeightInherit"><a class="button button--primary button--chromeless u-accentColor--buttonNormal is-inSiteNavBar u-xs-hide js-signInButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fproandroiddev.com%2F%3Fsource%3D---two_column_layout_nav----------------------------------&source=--------------------------nav_reg&operation=login" data-action="sign-in-prompt" data-redirect="https://proandroiddev.com/?source=---two_column_layout_nav----------------------------------" data-action-source="--------------------------nav_reg">Sign in</a><a class="button button--primary button--withChrome u-accentColor--buttonNormal is-inSiteNavBar js-signUpButton" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fproandroiddev.com%2F%3Fsource%3D---two_column_layout_nav----------------------------------&source=--------------------------nav_reg&operation=register" data-action="sign-up-prompt" data-redirect="https://proandroiddev.com/?source=---two_column_layout_nav----------------------------------" data-action-source="--------------------------nav_reg">Get started</a></div></div></div></div></div><div class="metabar metabar--spacer js-metabarSpacer u-height65 u-xs-height56"></div><div class="collectionHeader js-collectionHeaderContainer u-relative collectionHeader--layoutMedium collectionHeader--alignmentLeft collectionHeader--withLogo collectionHeader--withBackground collectionHeader--colorBehaviorBold collectionHeader--withNavigation collectionHeader--editorLayoutLogo is-modeView is-whiteLabel u-tintBgColor"><div class="collectionHeader-aspectRatioTable"><div class="collectionHeader-aspectRatioContent u-backgroundSizeCover js-collectionHeaderBackground" style="background-image: url("https://cdn-images-1.medium.com/max/2400/1*i5UmD6poC0MpEw0UlnWhTQ.png"); background-position: 50% 50% !important;"><div class="collectionHeader-overlayBackground u-height100vh"></div><header class="collectionHeader-heroAndInlineNav u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto u-foreground js-collectionHeader"><div class="collectionHeader-hero js-collectionHeaderHero u-clearfix u-imageSpectrum"><div class="collectionHeader-heroInner"><div class="collectionHeader-logo js-collectionHeaderLogo" style="width: 1px; float: left; padding-right: 20px; margin-right: 0;"><a class="link u-baseColor--link" href="https://proandroiddev.com" title="Go to ProAndroidDev" aria-label="Go to ProAndroidDev" data-collection-slug="proandroiddev"><div class="u-relative u-marginAuto"><div style="padding-bottom: 200%"></div><img class="collectionHeader-logoImage js-collectionHeaderLogoImage" src="https://cdn-images-1.medium.com/max/2/1*V45--ieyNysokCIUqFXTKw@2x.png" data-image-id="1*V45--ieyNysokCIUqFXTKw@2x.png" data-width="1" data-height="2" /></div></a></div><div class="collectionHeader-nameAndDescription u-hide"><a class="link u-baseColor--link" href="https://proandroiddev.com" title="Go to ProAndroidDev" aria-label="Go to ProAndroidDev" data-collection-slug="proandroiddev"><h1 class="collectionHeader-name js-collectionName">ProAndroidDev</h1></a><h2 class="collectionHeader-description js-collectionDescription">The latest posts from Android Professionals and Google Developer Experts.</h2></div></div></div></header></div><div class="collectionHeader-aspectRatioCell"><div class="collectionHeader-aspectRatioFullWidth"></div></div></div><div class="collectionHeader-blockNav"><div class="u-borderBox u-maxWidth1072 u-paddingLeft20 u-paddingRight20 u-marginAuto"><nav class="collectionHeader-nav u-clearfix js-collectionHeaderNav u-lineHeight40 u-overflowHiddenY u-tintSpectrum"><div class="buttonSet u-flex1 u-noWrap u-overflowX u-paddingBottom100 u-xs-marginRight15"><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://proandroiddev.com/submission-guidelines-b2efa7f46272">Submit</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://proandroiddev.com/archive">Archive</a></li><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://proandroiddev.com/about">About</a></li><span class="u-borderLeft1 u-paddingLeft22 u-xs-paddingLeft12 u-baseColor--borderLight"></span><li class="collectionHeader-navItem js-collectionNavItem u-inlineBlock u-fontSize13 u-textUppercase u-letterSpacing1px u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 is-external"><a class="link link--darkenOnHover u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://academy.droidcon.com" rel="nofollow noopener" target="_blank">droidcon Academy</a></li></div><div class="buttonSet u-textAlignRight u-marginLeft18 u-flex0 u-noWrap"><label class="button button--small button--chromeless button--withIcon button--withSvgIcon inputGroup u-sm-hide metabar-predictiveSearch u-baseColor--buttonNormal u-baseColor--placeholderNormal" title="Search"><span class="svgIcon svgIcon--search svgIcon--25px u-baseColor--iconLight"><svg class="svgIcon-use" width="25" height="25" ><path d="M20.067 18.933l-4.157-4.157a6 6 0 10-.884.884l4.157 4.157a.624.624 0 10.884-.884zM6.5 11c0-2.62 2.13-4.75 4.75-4.75S16 8.38 16 11s-2.13 4.75-4.75 4.75S6.5 13.62 6.5 11z"/></svg></span><input class="js-predictiveSearchInput textInput textInput--rounded textInput--darkText u-baseColor--textNormal textInput--transparent" type="search" placeholder="Search" required="true" data-collection-id="c72404660798" /></label><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--chromeless u-verticalAlignMiddle" href="https://twitter.com/proandroiddev" title="Visit “ProAndroidDev” on X" aria-label="Visit “ProAndroidDev” on X" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--twitter svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" fill="none" ><path d="M14.215 11.3l5.764-6.7h-1.366l-5.005 5.818L9.611 4.6H5l6.045 8.798L5 20.424h1.366l5.286-6.144 4.221 6.144h4.61L14.216 11.3zm-1.871 2.175l-.612-.876-4.874-6.97h2.098l3.933 5.625.613.876 5.112 7.312h-2.098l-4.172-5.966z" fill="#242424"/></svg></span></span></a><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--chromeless u-verticalAlignMiddle" href="//facebook.com/proandroiddev" title="Visit “ProAndroidDev” on Facebook" aria-label="Visit “ProAndroidDev” on Facebook" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--facebookFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" ><path d="M21 12.646C21 7.65 16.97 3.6 12 3.6s-9 4.05-9 9.046a9.026 9.026 0 007.59 8.924v-6.376H8.395V12.64h2.193v-1.88c0-2.186 1.328-3.375 3.267-3.375.93 0 1.728.07 1.96.1V9.77H14.47c-1.055 0-1.26.503-1.26 1.242v1.63h2.517l-.33 2.554H13.21V21.6c4.398-.597 7.79-4.373 7.79-8.954"/></svg></span></span></a><button class="button button--primary button--smallest u-noUserSelect button--withChrome u-accentColor--buttonNormal button--followCollection js-followCollectionButton" data-action="sign-up-prompt" data-sign-in-action="toggle-subscribe-collection" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/collection/proandroiddev" data-action-source="header----c72404660798----------------------follow_pub"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></div></nav></div></div></div><div class="u-marginBottom40 js-collectionStream"><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight15 u-size8of12" data-source="collection_home---4------0-----------------------" data-post-id="67063cde49f0" data-index="0"><div class="u-lineHeightBase postItem u-marginRight3"><a href="https://proandroiddev.com/how-coroutines-withcontext-actually-works-diving-deep-into-kotlin-coroutines-source-code-67063cde49f0?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/how-coroutines-withcontext-actually-works-diving-deep-into-kotlin-coroutines-source-code-67063cde49f0?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height350 u-width100pct u-floatLeft u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/2000/1*-Srmt7MeVK9zchpbylnyng.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">How Coroutines `withContext` Actually Works: Diving Deep into Kotlin Coroutines Source Code</span></a></div></div><div class="col u-xs-marginBottom10 u-paddingLeft9 u-paddingRight12 u-paddingTop0 u-sm-paddingTop20 u-paddingBottom25 u-size4of12 u-xs-size12of12 u-marginBottom30"><a class="" href="https://proandroiddev.com/how-coroutines-withcontext-actually-works-diving-deep-into-kotlin-coroutines-source-code-67063cde49f0?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="67063cde49f0"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp4 u-fontSize30 u-size12of12 u-xs-size12of12 u-xs-fontSize24">How Coroutines `withContext` Actually Works: Diving Deep into Kotlin Coroutines Source Code</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Unraveling Kotlin’s withContext: Behind the Scenes of Context Switching</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*PDWUz7RmoqP9kmFnZzGPUg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Dobri Kostadinov"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto">Dobri Kostadinov</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-12-16T14:44:38.309Z">Dec 16</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="3 min read"></span></div></div></div></div></div></div><div class="row u-marginTop15 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------1-----------------------" data-post-id="04e0d3d6a08f" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/advanced-mocking-techniques-with-mockk-part-2-of-5-04e0d3d6a08f?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/advanced-mocking-techniques-with-mockk-part-2-of-5-04e0d3d6a08f?source=collection_home---4------1-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/0*jxN3FNJ6BF3lh85z"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Advanced Mocking Techniques with MockK Part 2 of 5</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/advanced-mocking-techniques-with-mockk-part-2-of-5-04e0d3d6a08f?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="04e0d3d6a08f"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Advanced Mocking Techniques with MockK Part 2 of 5</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">part1</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@sandeepkella23" data-action="show-user-card" data-action-value="709acf7c07e3" data-action-type="hover" data-user-id="709acf7c07e3" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*m4ij-Lr2ZViGgYmypjtQ9A.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sandeep Kella"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@sandeepkella23" data-action="show-user-card" data-action-value="709acf7c07e3" data-action-type="hover" data-user-id="709acf7c07e3" data-collection-slug="proandroiddev" dir="auto">Sandeep Kella</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-12-16T07:16:56.398Z">Dec 15</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="a3cef8a9eeed" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/kotlin-companion-object-explained-a3cef8a9eeed?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/kotlin-companion-object-explained-a3cef8a9eeed?source=collection_home---4------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*hB3lUJFE_UMKBQk2oD7YYQ.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Kotlin companion object explained</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/kotlin-companion-object-explained-a3cef8a9eeed?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="a3cef8a9eeed"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Kotlin companion object explained</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Write more readable, performant, and maintainable code by using companion objects. Learn why, how, and what it is!</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@michalankiersztajn" data-action="show-user-card" data-action-value="36fe377f5663" data-action-type="hover" data-user-id="36fe377f5663" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*wqtk16v3lv_e1Cu_dPyT2w.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Michal Ankiersztajn"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@michalankiersztajn" data-action="show-user-card" data-action-value="36fe377f5663" data-action-type="hover" data-user-id="36fe377f5663" data-collection-slug="proandroiddev" dir="auto">Michal Ankiersztajn</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-12-16T07:02:28.598Z">Dec 15</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="2 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------3-----------------------" data-post-id="01467d917e2f" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f?source=collection_home---4------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/0*QpNnB5l8Rx0-zIuT"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Introduction to MockK and Mocking Basics Part 1 of 5</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="01467d917e2f"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Introduction to MockK and Mocking Basics Part 1 of 5</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Hey there! If you’re diving into unit testing in Android, you’ve probably come across the term “mocking.” Maybe you’ve heard of libraries…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@sandeepkella23" data-action="show-user-card" data-action-value="709acf7c07e3" data-action-type="hover" data-user-id="709acf7c07e3" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*m4ij-Lr2ZViGgYmypjtQ9A.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sandeep Kella"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@sandeepkella23" data-action="show-user-card" data-action-value="709acf7c07e3" data-action-type="hover" data-user-id="709acf7c07e3" data-collection-slug="proandroiddev" dir="auto">Sandeep Kella</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-12-14T13:18:07.840Z">Dec 14</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop15 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------4-----------------------" data-post-id="8b1713b95297" data-index="4"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/android-xr-ready-set-go-8b1713b95297?source=collection_home---4------4-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/android-xr-ready-set-go-8b1713b95297?source=collection_home---4------4-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*WHJUn2JBzM-go5aDFx90JA.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Android XR: Ready, Set, Go!</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/android-xr-ready-set-go-8b1713b95297?source=collection_home---4------4-----------------------" data-action-source="collection_home---4------4-----------------------" data-post-id="8b1713b95297"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Android XR: Ready, Set, Go!</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Get ready for the next computing platform</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@sonique6784" data-action="show-user-card" data-action-value="365cec8aaa4a" data-action-type="hover" data-user-id="365cec8aaa4a" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*gBeiRFttIu-v4tJxInQ-6w.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Cedric Ferry"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@sonique6784" data-action="show-user-card" data-action-value="365cec8aaa4a" data-action-type="hover" data-user-id="365cec8aaa4a" data-collection-slug="proandroiddev" dir="auto">Cedric Ferry</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-12-13T20:02:55.983Z">Dec 13</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------5-----------------------" data-post-id="9ea47356aa80" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/lets-build-an-android-camera-app-camerax-compose-9ea47356aa80?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/lets-build-an-android-camera-app-camerax-compose-9ea47356aa80?source=collection_home---4------5-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*3I2LPnwyUF1d6D5aLoHMMg.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Let’s build an Android camera app! CameraX + Compose</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/lets-build-an-android-camera-app-camerax-compose-9ea47356aa80?source=collection_home---4------5-----------------------" data-action-source="collection_home---4------5-----------------------" data-post-id="9ea47356aa80"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Let’s build an Android camera app! CameraX + Compose</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Writing customised camera experiences on Android has traditionally been very difficult. For one thing, photography itself is difficult: as…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@tdcolvin" data-action="show-user-card" data-action-value="c09f5ed09fb5" data-action-type="hover" data-user-id="c09f5ed09fb5" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*vnM2uh3V90GdEN5zLwhFpQ.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Tom Colvin"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@tdcolvin" data-action="show-user-card" data-action-value="c09f5ed09fb5" data-action-type="hover" data-user-id="c09f5ed09fb5" data-collection-slug="proandroiddev" dir="auto">Tom Colvin</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-12-11T15:41:21.051Z">Dec 11</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="7 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------6-----------------------" data-post-id="918491dcf69a" data-index="6"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/when-to-use-retrofit-and-when-to-use-ktor-a-guide-for-android-developers-918491dcf69a?source=collection_home---4------6-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/when-to-use-retrofit-and-when-to-use-ktor-a-guide-for-android-developers-918491dcf69a?source=collection_home---4------6-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*jO0OsQ2iyp_mEjl1DlRKbQ.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">When to Use Retrofit and When to Use Ktor: A Guide for Android Developers</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/when-to-use-retrofit-and-when-to-use-ktor-a-guide-for-android-developers-918491dcf69a?source=collection_home---4------6-----------------------" data-action-source="collection_home---4------6-----------------------" data-post-id="918491dcf69a"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">When to Use Retrofit and When to Use Ktor: A Guide for Android Developers</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Understand the Strengths of Retrofit and Ktor to Choose the Best Networking Solution for Your Android Projects</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*PDWUz7RmoqP9kmFnZzGPUg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Dobri Kostadinov"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto">Dobri Kostadinov</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-12-11T15:34:37.859Z">Dec 11</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="3 min read"></span></div></div></div></div></div></div></div></section></div><div class="streamItem streamItem--section js-streamItem"><section class="u-marginTop30 u-xs-margin0 u-marginBottom15 u-maxWidth1032 u-sm-paddingLeft20 u-sm-paddingRight20 u-borderBox u-marginAuto"><header class="heading heading--borderedBottom u-fontSize18 u-contentSansThin" ><div class="u-clearfix"><div class="heading-content u-floatLeft"><span class="heading-title heading-title--dark heading-title--lineHeightTight u-fontSize18 u-contentSansThin">Trending Blogs</span></div></div></header><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------0-----------------------" data-post-id="187d5e14d212" data-index="0"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212?source=collection_home---4------0-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*Bhfzsp01NibPkNYmWy9YyA.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Top 10 Coroutine Mistakes We All Have Made as Android Developers</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="187d5e14d212"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Top 10 Coroutine Mistakes We All Have Made as Android Developers</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*PDWUz7RmoqP9kmFnZzGPUg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Dobri Kostadinov"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@dobri.kostadinov" data-action="show-user-card" data-action-value="cb954442a18e" data-action-type="hover" data-user-id="cb954442a18e" data-collection-slug="proandroiddev" dir="auto">Dobri Kostadinov</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-03T17:30:21.474Z">Nov 3</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------1-----------------------" data-post-id="12f6a9939053" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053?source=collection_home---4------1-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*ba3JJ-JCIWGZJi94UTnThw.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">The two best ways to secure your API keys in Android projects</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="12f6a9939053"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">The two best ways to secure your API keys in Android projects</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@sagar0-0" data-action="show-user-card" data-action-value="b48b9b0e3d4d" data-action-type="hover" data-user-id="b48b9b0e3d4d" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*PCJVPFHPX_oQ4eILPEDSag.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sagar Malhotra"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@sagar0-0" data-action="show-user-card" data-action-value="b48b9b0e3d4d" data-action-type="hover" data-user-id="b48b9b0e3d4d" data-collection-slug="proandroiddev" dir="auto">Sagar Malhotra</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-04T16:28:42.201Z">Nov 4</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="05e8fe2acd2c" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?source=collection_home---4------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*QhM1jZ56sVMbyc0hgOgRPw.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Top Nine Android Developer Interview Questions You Should Know</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="05e8fe2acd2c"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Top Nine Android Developer Interview Questions You Should Know</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@skydoves" data-action="show-user-card" data-action-value="9bb203a4ab2e" data-action-type="hover" data-user-id="9bb203a4ab2e" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*to22-X47VSP4tZeElwVKKA.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Jaewoong Eum"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@skydoves" data-action="show-user-card" data-action-value="9bb203a4ab2e" data-action-type="hover" data-user-id="9bb203a4ab2e" data-collection-slug="proandroiddev" dir="auto">Jaewoong Eum</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-09T01:09:50.956Z">Nov 8</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="15 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------3-----------------------" data-post-id="0ae48d91c860" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/kotlin-tips-and-tricks-you-may-not-know-5-simplify-functional-composition-with-let-0ae48d91c860?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/kotlin-tips-and-tricks-you-may-not-know-5-simplify-functional-composition-with-let-0ae48d91c860?source=collection_home---4------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*rTFrwaUwwTN7PAUFWR3ASA.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Kotlin Tips and Tricks You May Not Know: #5 — Simplify Functional Composition with let</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/kotlin-tips-and-tricks-you-may-not-know-5-simplify-functional-composition-with-let-0ae48d91c860?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="0ae48d91c860"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Kotlin Tips and Tricks You May Not Know: #5 — Simplify Functional Composition with let</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Improve your functional composition using the let scope function</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@elenavanengelen" data-action="show-user-card" data-action-value="c55a3d9e212a" data-action-type="hover" data-user-id="c55a3d9e212a" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*N-t_FroIxVl5WDVcCO45jw@2x.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Elena van Engelen - Maslova"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@elenavanengelen" data-action="show-user-card" data-action-value="c55a3d9e212a" data-action-type="hover" data-user-id="c55a3d9e212a" data-collection-slug="proandroiddev" dir="auto">Elena van Engelen - Maslova</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-23T09:19:59.682Z">Nov 23</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------4-----------------------" data-post-id="14d04ec2426a" data-index="4"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-5-%EF%B8%8F5%EF%B8%8F%E2%83%A3-14d04ec2426a?source=collection_home---4------4-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-5-%EF%B8%8F5%EF%B8%8F%E2%83%A3-14d04ec2426a?source=collection_home---4------4-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*XDoCaRPSQa-h0DqkT5ckmA.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-5-%EF%B8%8F5%EF%B8%8F%E2%83%A3-14d04ec2426a?source=collection_home---4------4-----------------------" data-action-source="collection_home---4------4-----------------------" data-post-id="14d04ec2426a"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">keep these in mind for better code quality when doing ViewModels!</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@mrnajafi" data-action="show-user-card" data-action-value="4ced6b06c2b7" data-action-type="hover" data-user-id="4ced6b06c2b7" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*T95Zeqgg_vm1yNzTq7I3Jg.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Reza"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@mrnajafi" data-action="show-user-card" data-action-value="4ced6b06c2b7" data-action-type="hover" data-user-id="4ced6b06c2b7" data-collection-slug="proandroiddev" dir="auto">Reza</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-10-26T20:33:01.088Z">Oct 26</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------5-----------------------" data-post-id="16531ee54e8a" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a?source=collection_home---4------5-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*XNkbMjWQ4k2dd4SMunQcIw.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Android Interview Series 2024 — Part 4 (Kotlin Basics)</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a?source=collection_home---4------5-----------------------" data-action-source="collection_home---4------5-----------------------" data-post-id="16531ee54e8a"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Android Interview Series 2024 — Part 4 (Kotlin Basics)</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">This is Part 4 of the android interview question series. This part will focus on Kotlin basics.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@anitaa_1990" data-action="show-user-card" data-action-value="b69ba9cd4ff2" data-action-type="hover" data-user-id="b69ba9cd4ff2" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*062ZoiVn_WJIT9PYUS4yww.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Anitaa Murthy"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@anitaa_1990" data-action="show-user-card" data-action-value="b69ba9cd4ff2" data-action-type="hover" data-user-id="b69ba9cd4ff2" data-collection-slug="proandroiddev" dir="auto">Anitaa Murthy</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-09T12:50:22.063Z">Nov 9</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="17 min read"></span></div></div></div></div></div></div></div><div class="row u-marginTop30 u-marginLeftNegative12 u-marginRightNegative12"><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------6-----------------------" data-post-id="1a1134530215" data-index="6"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/how-to-integrate-viewmodel-in-kotlin-multiplatform-with-koin-1a1134530215?source=collection_home---4------6-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/how-to-integrate-viewmodel-in-kotlin-multiplatform-with-koin-1a1134530215?source=collection_home---4------6-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*cZ7ByLSeo7R4iJBUkADNbA.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">How to Integrate ViewModel in Kotlin Multiplatform with Koin</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/how-to-integrate-viewmodel-in-kotlin-multiplatform-with-koin-1a1134530215?source=collection_home---4------6-----------------------" data-action-source="collection_home---4------6-----------------------" data-post-id="1a1134530215"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">How to Integrate ViewModel in Kotlin Multiplatform with Koin</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">In this article, we will walk through the steps required to integrate ViewModel with Koin in a Kotlin Multiplatform project. Koin is a…</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@meet26" data-action="show-user-card" data-action-value="b69c0e11154c" data-action-type="hover" data-user-id="b69c0e11154c" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*kyarwWs9afYOsHx9TKScyw.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Meet"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@meet26" data-action="show-user-card" data-action-value="b69c0e11154c" data-action-type="hover" data-user-id="b69c0e11154c" data-collection-slug="proandroiddev" dir="auto">Meet</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-09-11T08:25:22.629Z">Sep 11</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------7-----------------------" data-post-id="138d3496c624" data-index="7"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624?source=collection_home---4------7-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624?source=collection_home---4------7-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/1*KALhC6r9lo-8E_M7QGVvhw.png"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624?source=collection_home---4------7-----------------------" data-action-source="collection_home---4------7-----------------------" data-post-id="138d3496c624"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@omarsahl" data-action="show-user-card" data-action-value="727137e47bff" data-action-type="hover" data-user-id="727137e47bff" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*TB_nVStV_doFD3tJYIwjsA@2x.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Omar Sahl"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@omarsahl" data-action="show-user-card" data-action-value="727137e47bff" data-action-type="hover" data-user-id="727137e47bff" data-collection-slug="proandroiddev" dir="auto">Omar Sahl</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-09-22T21:08:50.503Z">Sep 22</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="12 min read"></span></div></div></div></div></div></div><div class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------8-----------------------" data-post-id="07ca74eee000" data-index="8"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?source=collection_home---4------8-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?source=collection_home---4------8-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url("https://cdn-images-1.medium.com/max/800/0*ovGMYgU7aA9In-oV.jpeg"); background-position: 50% 50% !important;"><span class="u-textScreenReader">Android Interview Series 2024 — Part 8 (Android architecture)</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?source=collection_home---4------8-----------------------" data-action-source="collection_home---4------8-----------------------" data-post-id="07ca74eee000"><h3 class="u-contentSansBold u-lineHeightTightest u-xs-fontSize24 u-paddingBottom2 u-paddingTop5 u-fontSize32"><div class="u-letterSpacingTight u-lineHeightTighter u-breakWord u-textOverflowEllipsis u-lineClamp3 u-fontSize24">Android Interview Series 2024 — Part 8 (Android architecture)</div></h3><div class="u-contentSansThin u-lineHeightBaseSans u-fontSize24 u-xs-fontSize18 u-textColorNormal u-baseColor--textNormal"><div class="u-fontSize18 u-letterSpacingTight u-lineHeightTight u-marginTop7 u-textColorNormal u-baseColor--textNormal">This is Part 8 of the android interview question series. This part will focus on Android architecture.</div></div></a><div class="u-clearfix u-marginTop20"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://proandroiddev.com/@anitaa_1990" data-action="show-user-card" data-action-value="b69ba9cd4ff2" data-action-type="hover" data-user-id="b69ba9cd4ff2" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*062ZoiVn_WJIT9PYUS4yww.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Anitaa Murthy"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken" href="https://proandroiddev.com/@anitaa_1990" data-action="show-user-card" data-action-value="b69ba9cd4ff2" data-action-type="hover" data-user-id="b69ba9cd4ff2" data-collection-slug="proandroiddev" dir="auto">Anitaa Murthy</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-12T16:01:45.001Z">Nov 12</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="8 min read"></span></div></div></div></div></div></div></div></section></div></div><style class="js-collectionStyle"> .u-accentColor--borderLight {border-color: #2E987E !important;} .u-accentColor--borderNormal {border-color: #2E987E !important;} .u-accentColor--borderDark {border-color: #32826C !important;} .u-accentColor--iconLight .svgIcon,.u-accentColor--iconLight.svgIcon {fill: #2E987E !important;} .u-accentColor--iconNormal .svgIcon,.u-accentColor--iconNormal.svgIcon {fill: #2E987E !important;} .u-accentColor--iconDark .svgIcon,.u-accentColor--iconDark.svgIcon {fill: #32826C !important;} .u-accentColor--textNormal {color: #32826C !important;} .u-accentColor--hoverTextNormal:hover {color: #32826C !important;} .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #327663 !important;} .u-accentColor--textDark {color: #327663 !important;} .u-accentColor--backgroundLight {background-color: #2E987E !important;} .u-accentColor--backgroundNormal {background-color: #2E987E !important;} .u-accentColor--backgroundDark {background-color: #32826C !important;} .u-accentColor--buttonDark {border-color: #32826C !important; color: #327663 !important;} .u-accentColor--buttonDark:hover {border-color: #327663 !important;} .u-accentColor--buttonDark .icon:before,.u-accentColor--buttonDark .svgIcon{color: #32826C !important; fill: #32826C !important;} .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #2E987E !important; color: #32826C !important;} .u-accentColor--buttonNormal:hover {border-color: #32826C !important;} .u-accentColor--buttonNormal .icon:before,.u-accentColor--buttonNormal .svgIcon{color: #2E987E !important; fill: #2E987E !important;} .u-accentColor--buttonNormal.button--filled .icon:before,.u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonDark.button--filled,.u-accentColor--buttonDark.button--withChrome.is-active,.u-accentColor--fillWhenActive.is-active {background-color: #32826C !important; border-color: #32826C !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #2E987E !important; border-color: #2E987E !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .postArticle.is-withAccentColors .markup--user,.postArticle.is-withAccentColors .markup--query {color: #32826C !important;}.u-tintBgColor {background-color: rgba(125, 225, 195, 1) !important;}.u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(125, 225, 195, 1) 0%, rgba(125, 225, 195, 0) 100%) !important;}.u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(125, 225, 195, 0) 0%, rgba(125, 225, 195, 1) 100%) !important;} .u-tintSpectrum .u-baseColor--borderLight {border-color: #269278 !important;} .u-tintSpectrum .u-baseColor--borderNormal {border-color: #006F57 !important;} .u-tintSpectrum .u-baseColor--borderDark {border-color: #004732 !important;} .u-tintSpectrum .u-baseColor--iconLight .svgIcon,.u-tintSpectrum .u-baseColor--iconLight.svgIcon {fill: #269278 !important;} .u-tintSpectrum .u-baseColor--iconNormal .svgIcon,.u-tintSpectrum .u-baseColor--iconNormal.svgIcon {fill: #006F57 !important;} .u-tintSpectrum .u-baseColor--iconDark .svgIcon,.u-tintSpectrum .u-baseColor--iconDark.svgIcon {fill: #004732 !important;} .u-tintSpectrum .u-baseColor--textNormal {color: #006F57 !important;} .u-tintSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--textDark {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--textDarker {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--backgroundLight {background-color: #269278 !important;} .u-tintSpectrum .u-baseColor--backgroundNormal {background-color: #006F57 !important;} .u-tintSpectrum .u-baseColor--backgroundDark {background-color: #004732 !important;} .u-tintSpectrum .u-baseColor--buttonLight {border-color: #269278 !important; color: #269278 !important;} .u-tintSpectrum .u-baseColor--buttonLight:hover {border-color: #269278 !important;} .u-tintSpectrum .u-baseColor--buttonLight .icon:before,.u-tintSpectrum .u-baseColor--buttonLight .svgIcon {color: #269278 !important; fill: #269278 !important;} .u-tintSpectrum .u-baseColor--buttonDark {border-color: #004732 !important; color: #002F1C !important;} .u-tintSpectrum .u-baseColor--buttonDark:hover {border-color: #002F1C !important;} .u-tintSpectrum .u-baseColor--buttonDark .icon:before,.u-tintSpectrum .u-baseColor--buttonDark .svgIcon {color: #004732 !important; fill: #004732 !important;} .u-tintSpectrum .u-baseColor--buttonNormal {border-color: #006F57 !important; color: #006F57 !important;} .u-tintSpectrum .u-baseColor--buttonNormal:hover {border-color: #004732 !important;} .u-tintSpectrum .u-baseColor--buttonNormal .icon:before,.u-tintSpectrum .u-baseColor--buttonNormal .svgIcon {color: #006F57 !important; fill: #006F57 !important;} .u-tintSpectrum .u-baseColor--buttonDark.button--filled,.u-tintSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: #004732 !important; border-color: #004732 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-baseColor--buttonNormal.button--filled,.u-tintSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: #006F57 !important; border-color: #006F57 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-baseColor--link {color: #006F57 !important;} .u-tintSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--darken:active {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--dark {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:active {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--link.link--darker {color: #002F1C !important;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: #269278;} .u-tintSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: #269278;} .u-tintSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: #269278;} .u-tintSpectrum .ui-h1,.u-tintSpectrum .ui-h2,.u-tintSpectrum .ui-h3,.u-tintSpectrum .ui-h4,.u-tintSpectrum .ui-brand1,.u-tintSpectrum .ui-brand2,.u-tintSpectrum .ui-captionStrong {color: #002F1C !important; fill: #002F1C !important;} .u-tintSpectrum .ui-body,.u-tintSpectrum .ui-caps {color: #002F1C !important; fill: #002F1C !important;} .u-tintSpectrum .ui-summary,.u-tintSpectrum .ui-caption {color: #269278 !important; fill: #269278 !important;} .u-tintSpectrum .u-accentColor--borderLight {border-color: #269278 !important;} .u-tintSpectrum .u-accentColor--borderNormal {border-color: #006F57 !important;} .u-tintSpectrum .u-accentColor--borderDark {border-color: #004732 !important;} .u-tintSpectrum .u-accentColor--iconLight .svgIcon,.u-tintSpectrum .u-accentColor--iconLight.svgIcon {fill: #269278 !important;} .u-tintSpectrum .u-accentColor--iconNormal .svgIcon,.u-tintSpectrum .u-accentColor--iconNormal.svgIcon {fill: #006F57 !important;} .u-tintSpectrum .u-accentColor--iconDark .svgIcon,.u-tintSpectrum .u-accentColor--iconDark.svgIcon {fill: #004732 !important;} .u-tintSpectrum .u-accentColor--textNormal {color: #006F57 !important;} .u-tintSpectrum .u-accentColor--hoverTextNormal:hover {color: #006F57 !important;} .u-tintSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #002F1C !important;} .u-tintSpectrum .u-accentColor--textDark {color: #002F1C !important;} .u-tintSpectrum .u-accentColor--backgroundLight {background-color: #269278 !important;} .u-tintSpectrum .u-accentColor--backgroundNormal {background-color: #006F57 !important;} .u-tintSpectrum .u-accentColor--backgroundDark {background-color: #004732 !important;} .u-tintSpectrum .u-accentColor--buttonDark {border-color: #004732 !important; color: #002F1C !important;} .u-tintSpectrum .u-accentColor--buttonDark:hover {border-color: #002F1C !important;} .u-tintSpectrum .u-accentColor--buttonDark .icon:before,.u-tintSpectrum .u-accentColor--buttonDark .svgIcon{color: #004732 !important; fill: #004732 !important;} .u-tintSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #006F57 !important; color: #006F57 !important;} .u-tintSpectrum .u-accentColor--buttonNormal:hover {border-color: #004732 !important;} .u-tintSpectrum .u-accentColor--buttonNormal .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal .svgIcon{color: #006F57 !important; fill: #006F57 !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-accentColor--buttonDark.button--filled,.u-tintSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-tintSpectrum .u-accentColor--fillWhenActive.is-active {background-color: #004732 !important; border-color: #004732 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-tintSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #006F57 !important; border-color: #006F57 !important; color: rgba(125, 225, 195, 1) !important; fill: rgba(125, 225, 195, 1) !important;} .u-tintSpectrum .postArticle.is-withAccentColors .markup--user,.u-tintSpectrum .postArticle.is-withAccentColors .markup--query {color: #006F57 !important;} .u-accentColor--highlightFaint {background-color: rgba(222, 248, 237, 1) !important;} .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(168, 242, 217, 1) !important;} .postArticle.is-withAccentColors .markup--quote.is-other {background-color: rgba(222, 248, 237, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(222, 248, 237, 1), rgba(222, 248, 237, 1));} .postArticle.is-withAccentColors .markup--quote.is-me {background-color: rgba(194, 244, 226, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(194, 244, 226, 1), rgba(194, 244, 226, 1));} .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: rgba(168, 242, 217, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(168, 242, 217, 1), rgba(168, 242, 217, 1));} .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: rgba(168, 242, 217, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(168, 242, 217, 1), rgba(168, 242, 217, 1));} .postArticle.is-withAccentColors .markup--highlight {background-color: rgba(168, 242, 217, 1) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(168, 242, 217, 1), rgba(168, 242, 217, 1));}</style><style class="js-collectionStyleConstant">.u-imageBgColor {background-color: rgba(0, 0, 0, 0.24705882352941178);} .u-imageSpectrum .u-baseColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconLight .svgIcon,.u-imageSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--iconNormal .svgIcon,.u-imageSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--iconDark .svgIcon,.u-imageSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--textDarker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-baseColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important; color: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-baseColor--buttonLight .icon:before,.u-imageSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-baseColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonDark .icon:before,.u-imageSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--buttonNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonNormal .icon:before,.u-imageSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--buttonDark.button--filled,.u-imageSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--buttonNormal.button--filled,.u-imageSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-baseColor--link {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--link.link--darker {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(255, 255, 255, 0.8);} .u-imageSpectrum .ui-h1,.u-imageSpectrum .ui-h2,.u-imageSpectrum .ui-h3,.u-imageSpectrum .ui-h4,.u-imageSpectrum .ui-brand1,.u-imageSpectrum .ui-brand2,.u-imageSpectrum .ui-captionStrong {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-body,.u-imageSpectrum .ui-caps {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .ui-summary,.u-imageSpectrum .ui-caption {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconLight .svgIcon,.u-imageSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;} .u-imageSpectrum .u-accentColor--iconNormal .svgIcon,.u-imageSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--iconDark .svgIcon,.u-imageSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--textDark {color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;} .u-imageSpectrum .u-accentColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonDark .icon:before,.u-imageSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonDark.button--filled,.u-imageSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-imageSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-imageSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;} .u-imageSpectrum .postArticle.is-withAccentColors .markup--user,.u-imageSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(255, 255, 255, 0.9490196078431372) !important;} .u-imageSpectrum .u-accentColor--highlightFaint {background-color: rgba(255, 255, 255, 0.2) !important;} .u-imageSpectrum .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(255, 255, 255, 0.6) !important;} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: rgba(255, 255, 255, 0.2) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: rgba(255, 255, 255, 0.4) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.4));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));} .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: rgba(255, 255, 255, 0.6) !important;} body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));}.u-resetSpectrum .u-tintBgColor {background-color: rgba(255, 255, 255, 1) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%) !important;} .u-resetSpectrum .u-baseColor--borderLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--borderDark {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--iconLight .svgIcon,.u-resetSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconNormal .svgIcon,.u-resetSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--iconDark .svgIcon,.u-resetSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textNormal {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--textDarker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--backgroundLight {background-color: rgba(0, 0, 0, 0.09803921568627451) !important;} .u-resetSpectrum .u-baseColor--backgroundNormal {background-color: rgba(0, 0, 0, 0.2) !important;} .u-resetSpectrum .u-baseColor--backgroundDark {background-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonLight .icon:before,.u-resetSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark {border-color: rgba(0, 0, 0, 0.6) !important; color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--buttonDark .icon:before,.u-resetSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important; color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--buttonNormal .icon:before,.u-resetSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(0, 0, 0, 0.4980392156862745) !important; fill: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--buttonDark.button--filled,.u-resetSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2980392156862745) !important; border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--buttonNormal.button--filled,.u-resetSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2) !important; border-color: rgba(0, 0, 0, 0.2) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-baseColor--link {color: rgba(0, 0, 0, 0.4980392156862745) !important;} .u-resetSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--darken:active {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark {color: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--link.link--darker {color: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);} .u-resetSpectrum .ui-h1,.u-resetSpectrum .ui-h2,.u-resetSpectrum .ui-h3,.u-resetSpectrum .ui-h4,.u-resetSpectrum .ui-brand1,.u-resetSpectrum .ui-brand2,.u-resetSpectrum .ui-captionStrong {color: rgba(0, 0, 0, 0.8) !important; fill: rgba(0, 0, 0, 0.8) !important;} .u-resetSpectrum .ui-body,.u-resetSpectrum .ui-caps {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;} .u-resetSpectrum .ui-summary,.u-resetSpectrum .ui-caption {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;} .u-resetSpectrum .u-accentColor--borderLight {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderNormal {border-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--borderDark {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconLight .svgIcon,.u-resetSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--iconNormal .svgIcon,.u-resetSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--iconDark .svgIcon,.u-resetSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--textDark {color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundLight {background-color: rgba(26, 137, 23, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundNormal {background-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--backgroundDark {background-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark {border-color: rgba(17, 128, 14, 1) !important; color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark .icon:before,.u-resetSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(15, 115, 12, 1) !important; fill: rgba(15, 115, 12, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(26, 137, 23, 1) !important; color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(17, 128, 14, 1) !important; fill: rgba(17, 128, 14, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonDark.button--filled,.u-resetSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-resetSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(15, 115, 12, 1) !important; border-color: rgba(15, 115, 12, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-resetSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(17, 128, 14, 1) !important; border-color: rgba(17, 128, 14, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;} .u-resetSpectrum .postArticle.is-withAccentColors .markup--user,.u-resetSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(17, 128, 14, 1) !important;}</style><div class="js-collectionFooter u-tintBgColor u-hide"><div class="container u-maxWidth1040"><div class="u-marginTop10 u-paddingTop10 u-paddingBottom30 u-tintSpectrum"><div class="linkSet u-clearfix"><div class="u-floatRight u-textColorNormal u-baseColor--textNormal u-xs-floatLeft"><a class="button button--chromeless u-baseColor--buttonNormal u-marginLeft15 u-lineHeight35 u-xs-block u-xs-marginLeft0" href="https://proandroiddev.com/about" title="About ProAndroidDev" aria-label="About ProAndroidDev" data-collection-slug="proandroiddev">About ProAndroidDev</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://proandroiddev.com/latest" title="Latest Stories for ProAndroidDev" aria-label="Latest Stories for ProAndroidDev" data-collection-slug="proandroiddev">Latest Stories</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://proandroiddev.com/archive" title="Archive for ProAndroidDev" aria-label="Archive for ProAndroidDev" data-collection-slug="proandroiddev">Archive</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/about">About Medium</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f">Terms</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9">Privacy</a><span class="middotDivider u-xs-hide"></span><a class="button button--chromeless u-baseColor--buttonNormal u-lineHeight35 u-xs-block" href="https://medium.com/business">Teams</a></div></div></div></div></div></div></div></div><div class="loadingBar"></div><script>// <![CDATA[ window["obvInit"] = function (opt_embedded) {window["obvInit"]["embedded"] = opt_embedded; window["obvInit"]["ready"] = true;} // ]]></script><script>// <![CDATA[ var GLOBALS = {"audioUrl":"https://d1fcbxp97j4nb2.cloudfront.net","baseUrl":"https://proandroiddev.com","buildLabel":"20241216-1623-root","currentUser":{"userId":"lo_3f87166f957e","isVerified":false,"subscriberEmail":"","hasPastMemberships":false,"isEnrolledInHightower":false,"isEligibleForHightower":true,"hightowerLastLockedAt":0,"isWriterProgramEnrolled":true,"isWriterProgramInvited":false,"isWriterProgramOptedOut":false,"writerProgramVersion":0,"writerProgramEnrolledAt":0,"friendLinkOnboarding":0,"hasAdditionalUnlocks":false,"hasApiAccess":false,"writerProgramDistributionSettingOptedIn":false,"isSuspended":false,"collectionOnboardingSeen":0,"atsQualifiedAt":0},"currentUserHasUnverifiedEmail":false,"isAuthenticated":false,"isCurrentUserVerified":false,"miroUrl":"https://cdn-images-1.medium.com","moduleUrls":{"base":"https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.eBhzWGgpeTCq2eignYP2yQ.12.js","common-async":"https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.L_dvbFgPZ1QKQCbFVFNERw.12.js","hightower":"https://cdn-static-1.medium.com/_/fp/gen-js/main-hightower.bundle.jBpQ-AmW2gI0MYa6vwJodg.12.js","home-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-home-screens.bundle.VXINXi3BrSW4Ni1oF5OUCw.12.js","misc-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.FYmryJSLVzKplGrLyVk8Vw.12.js","notes":"https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.1fT0s51LhOxIFhpF7VpcMg.12.js","payments":"https://cdn-static-1.medium.com/_/fp/gen-js/main-payments.bundle.DnlxCkHj_azc_YKsYoXK_w.12.js","posters":"https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.6xwYcZsPD5BekGx_rvvtBg.12.js","power-readers":"https://cdn-static-1.medium.com/_/fp/gen-js/main-power-readers.bundle.l4jO8KDvWKsNQBZh97r9vA.12.js","pubs":"https://cdn-static-1.medium.com/_/fp/gen-js/main-pubs.bundle.bwrlrKIyNPpj9E1vXfUHtg.12.js","stats":"https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.V8KT40i1KU-zDSpeaw-3fA.12.js"},"previewConfig":{"weightThreshold":1,"weightImageParagraph":0.51,"weightIframeParagraph":0.8,"weightTextParagraph":0.08,"weightEmptyParagraph":0,"weightP":0.003,"weightH":0.005,"weightBq":0.003,"minPTextLength":60,"truncateBoundaryChars":20,"detectTitle":true,"detectTitleLevThreshold":0.15},"productName":"Medium","supportsEdit":false,"termsUrl":"//policy.medium.com/medium-terms-of-service-9db0094a1e0f","textshotHost":"textshot.textshot-production.svc.cluster.local","transactionId":"1734498062891:59f0598e5f63","useragent":{"browser":"ie","family":"ie","os":"windows","version":7,"supportsDesktopEdit":false,"supportsInteract":false,"supportsView":true,"isMobile":false,"isTablet":false,"isNative":false,"supportsFileAPI":false,"isTier1":false,"clientVersion":"","clientChannel":"","supportsRealScrollEvents":false,"supportsVhUnits":false,"ruinsViewportSections":false,"supportsHtml5Video":false,"supportsMagicUnderlines":false,"isWebView":false,"isFacebookWebView":false,"supportsProgressiveMedia":false,"supportsPromotedPosts":true,"isBot":false,"isNativeIphone":false,"supportsCssVariables":false,"supportsVideoSections":true,"emojiSupportLevel":1,"isSearchBot":false,"isSyndicationBot":false,"isNativeAndroid":false,"isNativeIos":false,"isSeoAuditBot":false,"isInternalApp":false,"supportsApplePay":false,"supportsScrollableMetabar":false},"variants":{"allow_access":true,"allow_signup":true,"allow_test_auth":"disallow","android_enable_editor_new_publishing_flow":true,"android_enable_friend_links_creation":true,"android_enable_friend_links_postpage_banners":true,"android_enable_image_sharer":true,"android_enable_lists_v2":true,"android_enable_syntax_highlight":true,"android_enable_topic_portals":true,"android_rating_prompt_stories_read_threshold":2,"android_two_hour_refresh":true,"available_annual_plan":"2c754bcc2995","available_annual_premium_plan":"4a442ace1476","available_monthly_plan":"60e220181034","available_monthly_premium_plan":"12a660186432","browsable_stream_config_bucket":"curated-topics","can_receive_tips_v0":true,"can_send_tips_v0":true,"coronavirus_topic_recirc":true,"disable_partner_program_enrollment":true,"enable_abandoned_cart_promotion_email":true,"enable_abandoned_paywall_promotion_email":true,"enable_android_dynamic_aspirational_paywall":true,"enable_android_dynamic_programming_paywall":true,"enable_android_miro_v2":true,"enable_android_offline_reading":true,"enable_android_verified_author":true,"enable_app_flirty_thirty":true,"enable_apple_sign_in":true,"enable_apple_webhook":true,"enable_aurora_pub_follower_page":true,"enable_author_cards":true,"enable_author_cards_byline":true,"enable_auto_follow_on_subscribe":true,"enable_automod":true,"enable_bg_post_post":true,"enable_boost_nia_v01":true,"enable_braintree_apple_pay":true,"enable_braintree_client":true,"enable_braintree_google_pay":true,"enable_braintree_integration":true,"enable_braintree_paypal":true,"enable_braintree_trial_membership":true,"enable_braintree_webhook":true,"enable_branch_io":true,"enable_cache_less_following_feed":true,"enable_cancellation_discount_v1_gate":true,"enable_configure_pronouns":true,"enable_conversion_model_v2":"group_2","enable_conversion_ranker_v2":"control","enable_creator_welcome_email":true,"enable_deprecate_legacy_providers_v3":true,"enable_diversification_rex":true,"enable_entities_to_follow_v2":true,"enable_eventstats_event_processing":true,"enable_explicit_signals":true,"enable_explicit_signals_updated_post_previews":true,"enable_footer_app_buttons":true,"enable_gift_banner":true,"enable_google_one_tap":true,"enable_google_webhook":true,"enable_group_gifting":true,"enable_iceland_forced_android":true,"enable_import":true,"enable_intrinsic_automatic_actions":true,"enable_ios_autorefresh":true,"enable_ios_dynamic_paywall_aspiriational":true,"enable_ios_dynamic_paywall_programming":true,"enable_ios_easy_resubscribe":true,"enable_ios_offline_reading":true,"enable_legacy_feed_in_iceland":true,"enable_lite_archive_page":true,"enable_lite_continue_this_thread":true,"enable_lite_homepage":true,"enable_lite_response_markup":true,"enable_lite_server_upstream_deadlines":true,"enable_lo_homepage":"control","enable_maim_the_meter":true,"enable_marketing_emails":true,"enable_mastodon_avatar_upload":true,"enable_mastodon_for_members":true,"enable_mastodon_for_members_username_selection":true,"enable_medium2_kbfd":true,"enable_members_only_audio":true,"enable_ml_rank_rex_anno":true,"enable_moc_load_processor_all_recs_surfaces":true,"enable_moc_load_processor_c":true,"enable_moc_load_processor_first_story":true,"enable_new_manage_membership_flow":true,"enable_new_stripe_customers":true,"enable_newsletter_lo_flow_custom_domains":true,"enable_pill_based_home_feed":true,"enable_post_bottom_responses":true,"enable_post_bottom_responses_input":true,"enable_post_bottom_responses_native":true,"enable_post_publish_permission_check":true,"enable_pp_country_expansion":true,"enable_pp_v4":true,"enable_pre_pp_v4":true,"enable_premium_tier":true,"enable_premium_tier_badge":true,"enable_pub_featuring":true,"enable_publication_hierarchy_web":true,"enable_ranker_v10":"control","enable_recaptcha_enterprise":true,"enable_recirc_model":true,"enable_recommended_publishers_query":true,"enable_rex_aggregator_v2":true,"enable_rex_new_push_notification_endpoint":true,"enable_rex_reading_history":true,"enable_rito_upstream_deadlines":true,"enable_seamless_social_sharing":true,"enable_see_pronouns":true,"enable_sharer_create_post_share_key":true,"enable_sharer_validate_post_share_key":true,"enable_simplified_digest_v2_b":true,"enable_sms_verification_for_publish":true,"enable_speechify_ios":true,"enable_speechify_widget":true,"enable_sprig":true,"enable_starspace":true,"enable_susi_redesign_android":true,"enable_susi_redesign_ios":true,"enable_switch_plan_premium_tier":true,"enable_tag_recs":true,"enable_tick_landing_page":true,"enable_tipping_v0_android":true,"enable_tipping_v0_ios":true,"enable_tribute_landing_page":true,"enable_trust_service_recaptcha":true,"enable_update_explore_wtf":true,"enable_update_topic_portals_wtf":true,"enable_updated_pub_recs_ui":true,"enable_verifications_service":true,"enable_winback_promotion_email":true,"glyph_font_set":"m2-unbound-source-serif-pro","goliath_externalsearch_enable_comment_deindexation":true,"ios_display_paywall_after_onboarding":true,"ios_enable_friend_links_creation":true,"ios_enable_friend_links_postpage_banners":true,"ios_enable_home_post_menu":true,"ios_enable_lock_responses":true,"ios_enable_verified_book_author":true,"ios_iceland_nux":true,"ios_in_app_free_trial":true,"ios_remove_twitter_onboarding_step":true,"ios_social_share_sheet":true,"limit_post_referrers":true,"limit_user_follows":true,"mobile_custom_app_icon":true,"num_post_bottom_responses_to_show":3,"onboarding_tags_from_top_views":true,"reader_fair_distribution_non_qp":true,"redefined_top_posts":true,"reengagement_notification_duration":3,"rex_generator_max_candidates":1000,"signin_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","signup_services":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple","skip_fs_cache_user_vals":true},"xsrfToken":"","iosAppId":"828256236","supportEmail":"yourfriends@medium.com","fp":{"/icons/monogram-mask.svg":"https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.12.svg","/icons/favicon-medium-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.12.ico"},"authBaseUrl":"https://medium.com","imageUploadSizeMb":25,"isAuthDomainRequest":false,"domainCollectionSlug":"proandroiddev","algoliaApiEndpoint":"https://MQ57UUUQZ2-dsn.algolia.net","algoliaAppId":"MQ57UUUQZ2","algoliaSearchOnlyApiKey":"394474ced050e3911ae2249ecc774921","iosAppStoreUrl":"https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&mt=8","iosAppLinkBaseUrl":"medium:","algoliaIndexPrefix":"medium_","androidPlayStoreUrl":"https://play.google.com/store/apps/details?id=com.medium.reader","googleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","androidPackage":"com.medium.reader","androidPlayStoreMarketScheme":"market://details?id=com.medium.reader","googleAuthUri":"https://accounts.google.com/o/oauth2/auth","androidScheme":"medium","layoutData":{"useDynamicScripts":false,"googleAnalyticsTrackingCode":"G-7JY7T788PK","jsShivUrl":"https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.12.js","useDynamicCss":false,"faviconUrl":"https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","faviconImageId":"5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19","fontSets":[{"id":8,"url":"https://glyph.medium.com/css/e/sr/latin/e/ssr/latin/e/ssb/latin/m2-unbound-source-serif-pro.css"},{"id":11,"url":"https://glyph.medium.com/css/m2-unbound-source-serif-pro.css"},{"id":9,"url":"https://glyph.medium.com/css/mkt.css"}],"glyphUrl":"https://glyph.medium.com"},"authBaseUrlRev":"moc.muidem//:sptth","stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","archiveUploadSizeMb":100,"previewConfig2":{"weightThreshold":1,"weightImageParagraph":0.05,"raiseImage":true,"enforceHeaderHierarchy":true,"isImageInsetRight":true},"isAmp":false,"iosScheme":"medium","facebook":{"key":"542599432471018","namespace":"medium-com","scope":{"default":["public_profile","email"],"connect":["public_profile","email"],"login":["public_profile","email"],"share":["public_profile","email"]}},"memberContentTopicId":"13d7efd82fb2","audioContentTopicId":"3792abbd134","isDoNotAuth":false,"buggle":{"videoUrl":"https://cdn-videos-1.medium.com","audioUrl":"https://cdn-audio-1.medium.com"},"referrerType":5,"partnerProgramEmail":"partnerprogram@medium.com","recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","countryCode":"SG","bypassMeter":false,"branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","paypal":{"clientMode":"production","oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com/redeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"}},"collectionConfig":{"mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"]},"bypassMeterWithShareKey":false,"recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","cdcMessaging":[{"text":"For more information on the novel coronavirus and Covid-19, visit ","href":"","type":"text","start":0,"end":0},{"text":"cdc.gov","href":"https://www.cdc.gov/coronavirus/2019-nCoV","type":"link","start":66,"end":73},{"text":".","href":"","type":"text","start":0,"end":0}],"braintree":{"merchantId":"m56f8fqpf7ngnrd4"},"diagnostics":{},"domain":"medium.com"} // ]]></script><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.eBhzWGgpeTCq2eignYP2yQ.12.js" async></script><script>// <![CDATA[ window["obvInit"]({"references":{"Collection":{"c72404660798":{"id":"c72404660798","name":"ProAndroidDev","slug":"proandroiddev","tags":[],"creatorId":"c6e8e225f7d5","description":"The latest posts from Android Professionals and Google Developer Experts.","shortDescription":"The latest posts from Android Professionals and Google…","image":{"imageId":"1*XVtdl45m8YaYrPI4buJ5yQ.png","filter":"","backgroundSize":"","originalWidth":1000,"originalHeight":1000,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":63652,"activeAt":1734392321917},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"twitterUsername":"proandroiddev","facebookPageName":"proandroiddev","publicEmail":"editors@proandroiddev.com","domain":"proandroiddev.com","sections":[{"type":2,"collectionHeaderMetadata":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":9,"postIds":[],"sectionHeader":"Trending Blogs"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"38769d69f98a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}}],"tintColor":"#FF7DE1C3","lightText":false,"favicon":{"imageId":"1*A8VytPZQhvUf_MG6hm_Dlw.png","filter":"","backgroundSize":"","originalWidth":128,"originalHeight":128,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF2E987E","point":0},{"color":"#FF318D75","point":0.1},{"color":"#FF32826C","point":0.2},{"color":"#FF327663","point":0.3},{"color":"#FF306B5A","point":0.4},{"color":"#FF2E5F50","point":0.5},{"color":"#FF2A5347","point":0.6},{"color":"#FF26463C","point":0.7},{"color":"#FF203931","point":0.8},{"color":"#FF192C25","point":0.9},{"color":"#FF101D19","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF7DE1C3","point":0},{"color":"#FF6ED2B5","point":0.1},{"color":"#FF5EC3A6","point":0.2},{"color":"#FF4EB397","point":0.3},{"color":"#FF3CA388","point":0.4},{"color":"#FF269278","point":0.5},{"color":"#FF008168","point":0.6},{"color":"#FF006F57","point":0.7},{"color":"#FF005C45","point":0.8},{"color":"#FF004732","point":0.9},{"color":"#FF002F1C","point":1}],"backgroundColor":"#FF7DE1C3"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE4F8EF","point":0},{"color":"#FFDEF8ED","point":0.1},{"color":"#FFD9F7EB","point":0.2},{"color":"#FFD3F6E9","point":0.3},{"color":"#FFCEF6E7","point":0.4},{"color":"#FFC8F5E4","point":0.5},{"color":"#FFC2F4E2","point":0.6},{"color":"#FFBCF4E0","point":0.7},{"color":"#FFB5F3DE","point":0.8},{"color":"#FFAFF2DB","point":0.9},{"color":"#FFA8F2D9","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF4CB196","point":0},{"color":"#FF60B99F","point":0.1},{"color":"#FF72C0A7","point":0.2},{"color":"#FF82C7B0","point":0.3},{"color":"#FF91CDB9","point":0.4},{"color":"#FFA0D4C2","point":0.5},{"color":"#FFAEDACA","point":0.6},{"color":"#FFBCE1D3","point":0.7},{"color":"#FFC9E7DB","point":0.8},{"color":"#FFD6EDE3","point":0.9},{"color":"#FFE3F3EC","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":2,"title":"Submit","postId":"b2efa7f46272","url":"https://proandroiddev.com/submission-guidelines-b2efa7f46272","source":"postId"},{"type":5,"title":"Archive","url":"https://proandroiddev.com/archive"},{"type":6,"title":"About","url":"https://proandroiddev.com/about"},{"type":3,"title":"droidcon Academy","url":"https://academy.droidcon.com"}],"colorBehavior":2,"collectionFeatures":[30],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5},"paidForDomainAt":1497851443187,"subscriberCount":63652,"tagline":"The latest posts from Android Professionals and Google Developer Experts","isOptedIntoAurora":false,"newsletterV3":{"newsletterV3Id":"278dceec521d","type":1,"name":"ProAndroidDev Digest","description":"Get updates on latest posts on ProAndroidDev and never miss a hot story! ","collectionId":"c72404660798","newsletterSlug":"proandroiddev-digest","isSubscribed":false,"showPromo":false,"avatarImageId":"","creatorId":"6c67343165e2","showNewsletterPostsInCollectionHome":false,"exportableSubscribersCount":2036,"subscribersCount":12121,"promoHeadline":"","promoBody":"","replyToEmail":""},"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092782276,"type":"Collection"}},"User":{"cb954442a18e":{"userId":"cb954442a18e","name":"Dobri Kostadinov","username":"dobri.kostadinov","createdAt":1563952269256,"imageId":"1*PDWUz7RmoqP9kmFnZzGPUg.jpeg","backgroundImageId":"","bio":"15+ years in native Android dev (Java, Kotlin). Expert in developing beautiful android native apps.","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1569999600000,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[32,48,47,29,12,8,50,21,19,2,33,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"709acf7c07e3":{"userId":"709acf7c07e3","name":"Sandeep Kella","username":"sandeepkella23","createdAt":1700073622118,"imageId":"1*m4ij-Lr2ZViGgYmypjtQ9A.png","backgroundImageId":"","bio":"Android dev by day, tech writer by night. Breaking down code so even my cat could understand it. Join me on Medium for fun, geeky, and practical Android tips!","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1720924617425,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1700148986943,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[47,29,44,41,50,37,36,19,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","type":"User"},"36fe377f5663":{"userId":"36fe377f5663","name":"Michal Ankiersztajn","username":"michalankiersztajn","createdAt":1700315091513,"imageId":"1*wqtk16v3lv_e1Cu_dPyT2w.jpeg","backgroundImageId":"","bio":"Android/Kotlin Developer & Applied Computer Science Engineer","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1714199272547,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1700574164818,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[48,29,44,41,50,37,19,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"pl-pl","type":"User"},"365cec8aaa4a":{"userId":"365cec8aaa4a","name":"Cedric Ferry","username":"sonique6784","createdAt":1528456411315,"imageId":"1*gBeiRFttIu-v4tJxInQ-6w.jpeg","backgroundImageId":"","bio":"Android Developer @ TikTok, ex-Google","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1639998885873,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1620912248573,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[29,12,11,9,8,50,5,21,3,2,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-au","type":"User"},"c09f5ed09fb5":{"userId":"c09f5ed09fb5","name":"Tom Colvin","username":"tdcolvin","createdAt":1531497350840,"imageId":"1*vnM2uh3V90GdEN5zLwhFpQ.png","backgroundImageId":"","bio":"The Android guy. Consultant Android developer and CTO of Apptaura, the app dev specialists. Google Developer Expert in Android. All articles 100% me, no AI.","twitterScreenName":"tdcolvin","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1567581713966,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1623959441226,"hasCompletedProfile":true,"userDismissableFlags":[32,29,21,19,18,49,48,47,12,41,8,50,5,2,10,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","type":"User"},"b48b9b0e3d4d":{"userId":"b48b9b0e3d4d","name":"Sagar Malhotra","username":"sagar0-0","createdAt":1663085628019,"imageId":"1*PCJVPFHPX_oQ4eILPEDSag.jpeg","backgroundImageId":"","bio":"Android dev by day, Creator by night.🥷🏻 Sharing my passion through videos, blogs and conferences.🚀","twitterScreenName":"sagar0_o","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1663472770606,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1675230034753,"hasCompletedProfile":false,"userDismissableFlags":[32,29,44,41,8,6,30,19,2,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"9bb203a4ab2e":{"userId":"9bb203a4ab2e","name":"Jaewoong Eum","username":"skydoves","createdAt":1511833595690,"imageId":"1*to22-X47VSP4tZeElwVKKA.png","backgroundImageId":"","bio":"Senior Android Developer Advocate @ Stream 🥑 • GDE for Android • OSS engineer. Love psychology, magic tricks, and writing poems. https://github.com/skydoves","twitterScreenName":"github_skydoves","allowNotes":1,"mediumMemberAt":1592552045000,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1605695102528,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[32,29,21,19,18,48,12,44,8,50,5,4,3,2,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"c55a3d9e212a":{"userId":"c55a3d9e212a","name":"Elena van Engelen - Maslova","username":"elenavanengelen","createdAt":1591973752529,"imageId":"1*N-t_FroIxVl5WDVcCO45jw@2x.jpeg","backgroundImageId":"","bio":"Independent Software Engineer, Speaker, Author https://www.linkedin.com/in/elena-van-engelen-maslova/","twitterScreenName":"ElenaVanEngelen","allowNotes":1,"mediumMemberAt":1732175498000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1591976521760,"isMembershipTrialEligible":false,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":true,"userDismissableFlags":[32,29,2,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"nl-nl","type":"User"},"4ced6b06c2b7":{"userId":"4ced6b06c2b7","name":"Reza","username":"mrnajafi","createdAt":1441781197874,"imageId":"1*T95Zeqgg_vm1yNzTq7I3Jg.png","backgroundImageId":"","bio":"Android Engineer with 14+ years of experience. https://bit.ly/flydroidz","allowNotes":1,"mediumMemberAt":1724039790512,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1602738779516,"isMembershipTrialEligible":true,"optInToIceland":true,"subdomainCreatedAt":1702350442630,"hasCompletedProfile":false,"userDismissableFlags":[29,12,8,50,5,21,36,3,2,1,33,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"sv-se","type":"User"},"b69ba9cd4ff2":{"userId":"b69ba9cd4ff2","name":"Anitaa Murthy","username":"anitaa_1990","createdAt":1453058669965,"imageId":"1*062ZoiVn_WJIT9PYUS4yww.jpeg","backgroundImageId":"","bio":"Android Developer https://github.com/anitaa1990 https://devanddroid.com/","twitterScreenName":"MurthyAnitaa","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[19,47,29],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"b69c0e11154c":{"userId":"b69c0e11154c","name":"Meet","username":"meet26","createdAt":1725965513099,"imageId":"1*kyarwWs9afYOsHx9TKScyw.png","backgroundImageId":"","bio":"Native Android Developer | DM Me For Freelancing Project | Kotlin | Jetpack Compose | Java | Helping App Developers | Content Writer | Learning KMP","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1726158409202,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","type":"User"},"727137e47bff":{"userId":"727137e47bff","name":"Omar Sahl","username":"omarsahl","createdAt":1517616099193,"imageId":"1*TB_nVStV_doFD3tJYIwjsA@2x.jpeg","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1729600861000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1591701766837,"isMembershipTrialEligible":false,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":true,"userDismissableFlags":[8,47,5,29,12],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en","type":"User"}},"Post":{"67063cde49f0":{"id":"67063cde49f0","versionId":"9a005f97c7f2","creatorId":"cb954442a18e","homeCollectionId":"c72404660798","title":"How Coroutines `withContext` Actually Works: Diving Deep into Kotlin Coroutines Source Code","detectedLanguage":"en","latestVersion":"9a005f97c7f2","latestPublishedVersion":"9a005f97c7f2","hasUnpublishedEdits":false,"latestRev":204,"createdAt":1733940156081,"updatedAt":1734362471603,"acceptedAt":0,"firstPublishedAt":1734360278309,"latestPublishedAt":1734360278309,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Unraveling Kotlin’s withContext: Behind the Scenes of Context Switching","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*-Srmt7MeVK9zchpbylnyng.jpeg","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":564,"strategy":"resample","height":0,"width":0},"wordCount":710,"imageCount":1,"readingTime":2.879245283018868,"subtitle":"Unraveling Kotlin’s withContext: Behind the Scenes of Context Switching","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":6,"isBookmarked":false,"tags":[{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin-coroutines","name":"Kotlin Coroutines","postCount":1588,"metadata":{"postCount":1588,"coverImage":{"id":"1*-Srmt7MeVK9zchpbylnyng.jpeg","originalWidth":1024,"originalHeight":564,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"mailto:dobri.kostadinov@gmail.com","alts":[],"httpStatus":0},{"url":"https://www.buymeacoffee.com/dobri.kostadinov","alts":[],"httpStatus":200},{"url":"https://medium.com/@dobri.kostadinov","alts":[{"type":2,"url":"medium://@dobri.kostadinov"},{"type":3,"url":"medium://@dobri.kostadinov"}],"httpStatus":200},{"url":"https://www.linkedin.com/in/dobrikostadinov/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1734360279442},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":50,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"how-coroutines-withcontext-actually-works-diving-deep-into-kotlin-coroutines-source-code","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"how-coroutines-withcontext-actually-works-diving-deep-into-kotlin-coroutines-source-code-67063cde49f0","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*-Srmt7MeVK9zchpbylnyng.jpeg","originalWidth":1024,"originalHeight":564,"isFeatured":true}},{"name":"aa5e","type":3,"text":"How Coroutines `withContext` Actually Works: Diving Deep into Kotlin Coroutines Source Code","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Unraveling Kotlin’s withContext: Behind the Scenes of Context Switching"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"aa1f6a84e965","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"aa5e","type":3,"text":"How Coroutines `withContext` Actually Works: Diving Deep into Kotlin Coroutines Source Code","markups":[]},{"name":"9f31","type":13,"text":"Unraveling Kotlin’s withContext: Behind the Scenes of Context Switching","markups":[{"type":10,"start":20,"end":31}]},{"name":"c6e2","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*-Srmt7MeVK9zchpbylnyng.jpeg","originalWidth":1024,"originalHeight":564,"isFeatured":true}},{"name":"08e4","type":3,"text":"Introduction","markups":[]},{"name":"9f4b","type":1,"text":"Kotlin coroutines have revolutionized asynchronous programming in Android and beyond. Among their many features, `withContext` stands out as a powerful function that allows developers to seamlessly switch between different coroutine contexts. While most developers use it, few dive into its internals to understand how it works. In this article, we’ll…","markups":[]}],"sections":[{"name":"2911","startIndex":0}]},"isFullContent":false,"subtitle":"Unraveling Kotlin’s withContext: Behind the Scenes of Context Switching"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"04e0d3d6a08f":{"id":"04e0d3d6a08f","versionId":"7e50b30719d4","creatorId":"709acf7c07e3","homeCollectionId":"c72404660798","title":"Advanced Mocking Techniques with MockK Part 2 of 5","detectedLanguage":"en","latestVersion":"7e50b30719d4","latestPublishedVersion":"7e50b30719d4","hasUnpublishedEdits":false,"latestRev":253,"createdAt":1734333202807,"updatedAt":1734361095687,"acceptedAt":0,"firstPublishedAt":1734333416398,"latestPublishedAt":1734361095573,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"part1","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*jxN3FNJ6BF3lh85z","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":879,"imageCount":1,"readingTime":3.516981132075472,"subtitle":"part1","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":2,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"kotlin-mockk","name":"Kotlin Mockk","postCount":0,"metadata":{"postCount":0,"coverImage":{"id":"0*jxN3FNJ6BF3lh85z","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"android-mockk","name":"Android Mockk","postCount":0,"metadata":{"postCount":0,"coverImage":{"id":"0*jxN3FNJ6BF3lh85z","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"mockk","name":"Mockk","postCount":79,"metadata":{"postCount":79,"coverImage":{"id":"0*jxN3FNJ6BF3lh85z","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"android-testing","name":"Android Testing","postCount":361,"metadata":{"postCount":361,"coverImage":{"id":"0*jxN3FNJ6BF3lh85z","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://medium.com/@sandeepkella23/introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f","alts":[{"type":2,"url":"medium://p/01467d917e2f"},{"type":3,"url":"medium://p/01467d917e2f"}],"httpStatus":200}],"version":"0.3","generatedAt":1734361096637},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":6,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"advanced-mocking-techniques-with-mockk-part-2-of-5","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"advanced-mocking-techniques-with-mockk-part-2-of-5-04e0d3d6a08f","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*jxN3FNJ6BF3lh85z","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"980c","type":3,"text":"Advanced Mocking Techniques with MockK Part 2 of 5","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"part1"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"1bc9dc3ef8db","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"536e","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*jxN3FNJ6BF3lh85z","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"980c","type":3,"text":"Advanced Mocking Techniques with MockK Part 2 of 5","markups":[]},{"name":"ea4f","type":14,"text":"Introduction to MockK and Mocking Basics Part 1 of 5\nHey there! If you’re diving into unit testing in Android, you’ve probably come across the term “mocking.” Maybe you’ve…medium.com","markups":[{"type":3,"start":0,"end":182,"href":"https://medium.com/@sandeepkella23/introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f","title":"https://medium.com/@sandeepkella23/introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f","rel":"","anchorType":0},{"type":1,"start":0,"end":52},{"type":2,"start":53,"end":172}],"mixtapeMetadata":{"mediaResourceId":"900c219e9f867bee5a5d529fc5de66a1","thumbnailImageId":"0*QpNnB5l8Rx0-zIuT","href":"https://medium.com/@sandeepkella23/introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f"}},{"name":"edbc","type":1,"text":"Hey again! Now that you’re comfortable with the basics of MockK, let’s level up and explore some advanced features. We’ll cover things like:","markups":[]},{"name":"bef5","type":9,"text":"Mocking static methods, objects, and final classes.","markups":[]},{"name":"e060","type":9,"text":"Using mockkStatic, mockkObject, and mockkClass.","markups":[{"type":10,"start":6,"end":17},{"type":10,"start":19,"end":30},{"type":10,"start":36,"end":46}]},{"name":"6d55","type":9,"text":"Advanced constructs like slot and capture to inspect method arguments.","markups":[{"type":10,"start":25,"end":29},{"type":10,"start":34,"end":41}]},{"name":"19c7","type":1,"text":"This is where MockK really…","markups":[]}],"sections":[{"name":"f1e7","startIndex":0}]},"isFullContent":false,"subtitle":"part1"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"a3cef8a9eeed":{"id":"a3cef8a9eeed","versionId":"f38ac49d51db","creatorId":"36fe377f5663","homeCollectionId":"c72404660798","title":"Kotlin companion object explained","detectedLanguage":"en","latestVersion":"f38ac49d51db","latestPublishedVersion":"f38ac49d51db","hasUnpublishedEdits":false,"latestRev":367,"createdAt":1733996607453,"updatedAt":1734361436539,"acceptedAt":0,"firstPublishedAt":1734332548598,"latestPublishedAt":1734361436380,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Write more readable, performant, and maintainable code by using companion objects. Learn why, how, and what it is!","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*hB3lUJFE_UMKBQk2oD7YYQ.png","filter":"","backgroundSize":"","originalWidth":1100,"originalHeight":733,"strategy":"resample","height":0,"width":0},"wordCount":427,"imageCount":1,"readingTime":1.8113207547169812,"subtitle":"Write more readable, performant, and maintainable code by using companion objects. Learn why, how, and what it is!","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":11,"isBookmarked":false,"tags":[{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin-companion-objec","name":"Kotlin Companion Objec","postCount":0,"metadata":{"postCount":0,"coverImage":{"id":"1*hB3lUJFE_UMKBQk2oD7YYQ.png","originalWidth":1100,"originalHeight":733,"isFeatured":true}},"type":"Tag"},{"slug":"kotlindev","name":"Kotlin Dev","postCount":0,"metadata":{"postCount":0},"type":"Tag"},{"slug":"kotlin-basic","name":"Kotlin Basics","postCount":0,"metadata":{"postCount":0},"type":"Tag"},{"slug":"static","name":"Static","postCount":578,"metadata":{"postCount":578,"coverImage":{"id":"1*hB3lUJFE_UMKBQk2oD7YYQ.png","originalWidth":1100,"originalHeight":733,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[],"version":"0.3","generatedAt":1734361507536},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":104,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"kotlin-companion-object-explained","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"kotlin-companion-object-explained-a3cef8a9eeed","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*hB3lUJFE_UMKBQk2oD7YYQ.png","originalWidth":1100,"originalHeight":733,"isFeatured":true}},{"name":"previewTitle","type":3,"text":"Kotlin companion object explained","alignment":1},{"name":"previewSubtitle","type":13,"text":"Write more readable, performant, and maintainable code by using…","alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Write more readable, performant, and maintainable code by using companion objects. Learn why, how, and what it is!"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"847a4fe7f99d","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"Kotlin companion object explained | Ankiersztajn","previewContent2":{"bodyModel":{"paragraphs":[{"name":"b0d5","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*hB3lUJFE_UMKBQk2oD7YYQ.png","originalWidth":1100,"originalHeight":733,"isFeatured":true}},{"name":"d7a3","type":3,"text":"Kotlin companion object explained","markups":[]},{"name":"0ab1","type":13,"text":"Your true companion","markups":[]},{"name":"85ef","type":1,"text":"In this article, you’re going to learn what companion object exactly is, how it behaves and what you can use it for in Kotlin!","markups":[{"type":10,"start":44,"end":60}]},{"name":"8d64","type":3,"text":"Why you should use it?","markups":[]},{"name":"fcdd","type":1,"text":"The key to using companion object is that you treat it like a ‘companion’ of a given class/interface . From a technical perspective, it’s a special…","markups":[{"type":10,"start":17,"end":33},{"type":10,"start":85,"end":100},{"type":1,"start":0,"end":100},{"type":1,"start":133,"end":213}]}],"sections":[{"name":"ec00","startIndex":0}]},"isFullContent":false,"subtitle":"Write more readable, performant, and maintainable code by using companion objects. Learn why, how, and what it is!"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"01467d917e2f":{"id":"01467d917e2f","versionId":"87a7e90fa818","creatorId":"709acf7c07e3","homeCollectionId":"c72404660798","title":"Introduction to MockK and Mocking Basics Part 1 of 5","detectedLanguage":"en","latestVersion":"87a7e90fa818","latestPublishedVersion":"87a7e90fa818","hasUnpublishedEdits":false,"latestRev":135,"createdAt":1734181919642,"updatedAt":1734360480513,"acceptedAt":0,"firstPublishedAt":1734182287840,"latestPublishedAt":1734360480412,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Hey there! If you’re diving into unit testing in Android, you’ve probably come across the term “mocking.” Maybe you’ve heard of libraries…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*QpNnB5l8Rx0-zIuT","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":781,"imageCount":1,"readingTime":3.147169811320755,"subtitle":"Hey there! If you’re diving into unit testing in Android, you’ve probably come across the term “mocking.” Maybe you’ve heard of libraries…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":2,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"unit-testing","name":"Unit Testing","postCount":7636,"metadata":{"postCount":7636,"coverImage":{"id":"1*foEK8u3eJE1kLgtrnHKvfg.jpeg","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"},{"slug":"mockk","name":"Mockk","postCount":79,"metadata":{"postCount":79,"coverImage":{"id":"0*jxN3FNJ6BF3lh85z","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[],"version":"0.3","generatedAt":1734360480584},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":6,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"introduction-to-mockk-and-mocking-basics-part-1-of-5","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"introduction-to-mockk-and-mocking-basics-part-1-of-5-01467d917e2f","previewContent":{"bodyModel":{"paragraphs":[{"name":"da90","type":4,"text":"","markups":[],"layout":9,"metadata":{"id":"0*QpNnB5l8Rx0-zIuT","originalWidth":1024,"originalHeight":1024}},{"name":"04cf","type":3,"text":"Introduction to MockK and Mocking Basics Part 1 of 5","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Hey there! If you’re diving into unit testing in Android, you’ve probably come across the term “mocking.” Maybe you’ve heard of libraries…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"d0f3c3041c36","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"da90","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*QpNnB5l8Rx0-zIuT","originalWidth":1024,"originalHeight":1024}},{"name":"04cf","type":3,"text":"Introduction to MockK and Mocking Basics Part 1 of 5","markups":[]},{"name":"88a8","type":1,"text":"Hey there! If you’re diving into unit testing in Android, you’ve probably come across the term “mocking.” Maybe you’ve heard of libraries like Mockito, and now you’re wondering, “What’s this MockK thing?” Don’t worry, I’m here to walk you through the basics of mocking and show you why MockK is…","markups":[]}],"sections":[{"name":"ed4d","startIndex":0}]},"isFullContent":false,"subtitle":"Hey there! If you’re diving into unit testing in Android, you’ve probably come across the term “mocking.” Maybe you’ve heard of libraries…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"8b1713b95297":{"id":"8b1713b95297","versionId":"60246d20779a","creatorId":"365cec8aaa4a","homeCollectionId":"c72404660798","title":"Android XR: Ready, Set, Go!","detectedLanguage":"en","latestVersion":"60246d20779a","latestPublishedVersion":"60246d20779a","hasUnpublishedEdits":false,"latestRev":230,"createdAt":1734118710821,"updatedAt":1734359991475,"acceptedAt":0,"firstPublishedAt":1734120175983,"latestPublishedAt":1734359991405,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Get ready for the next computing platform","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*WHJUn2JBzM-go5aDFx90JA.png","filter":"","backgroundSize":"","originalWidth":2560,"originalHeight":2558,"strategy":"resample","height":0,"width":0},"wordCount":443,"imageCount":14,"readingTime":3.121698113207547,"subtitle":"Get ready for the next computing platform","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":6,"isBookmarked":false,"tags":[{"slug":"android-xr","name":"Android Xr","postCount":5,"metadata":{"postCount":5,"coverImage":{"id":"1*WHJUn2JBzM-go5aDFx90JA.png","originalWidth":2560,"originalHeight":2558,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6237,"metadata":{"postCount":6237,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"mixed-reality","name":"Mixed Reality","postCount":3765,"metadata":{"postCount":3765,"coverImage":{"id":"1*WHJUn2JBzM-go5aDFx90JA.png","originalWidth":2560,"originalHeight":2558,"isFeatured":true}},"type":"Tag"},{"slug":"android-studio","name":"Android Studio","postCount":3655,"metadata":{"postCount":3655,"coverImage":{"id":"1*uSl5aXXimCMVBQUsv26QDw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://play.google.com/store/apps/details?id=sonique.fr.adn","alts":[],"httpStatus":200},{"url":"https://github.com/android/xr-samples","alts":[],"httpStatus":200},{"url":"https://developer.android.com/studio/preview","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1734359992165},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":57,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"android-xr-ready-set-go","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"android-xr-ready-set-go-8b1713b95297","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*WHJUn2JBzM-go5aDFx90JA.png","originalWidth":2560,"originalHeight":2558,"isFeatured":true}},{"name":"previewTitle","type":3,"text":"Android XR: Ready, Set, Go!","alignment":1},{"name":"previewSubtitle","type":13,"text":"Get ready for the next computing platform","alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Get ready for the next computing platform"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"42816e063d15","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"8a8e","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*6Bt7FYj9Knwy4nNXvTv8JQ.png","originalWidth":2560,"originalHeight":1587}},{"name":"86a6","type":3,"text":"Android XR: Ready, Set, Go!","markups":[]},{"name":"5ec5","type":3,"text":"Get ready for the next computing platform","markups":[]},{"name":"58fa","type":1,"text":"On thursday 12 December 2024, The Android invited developers and journalist in New York to present what looks like the future of Android: Android XR.\nAndroid XR is a variation of our beloved Android OS for Smart Glasses and Mixed Relality headset. The same day, on the same stage, Samsung…","markups":[]}],"sections":[{"name":"976b","startIndex":0}]},"isFullContent":false,"subtitle":"Get ready for the next computing platform"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"9ea47356aa80":{"id":"9ea47356aa80","versionId":"768eb705d36d","creatorId":"c09f5ed09fb5","homeCollectionId":"c72404660798","title":"Let’s build an Android camera app! CameraX + Compose","detectedLanguage":"en","latestVersion":"768eb705d36d","latestPublishedVersion":"768eb705d36d","hasUnpublishedEdits":false,"latestRev":1249,"createdAt":1733240327467,"updatedAt":1733935017720,"acceptedAt":0,"firstPublishedAt":1733931681051,"latestPublishedAt":1733931681051,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Writing customised camera experiences on Android has traditionally been very difficult. For one thing, photography itself is difficult: as…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*3I2LPnwyUF1d6D5aLoHMMg.png","filter":"","backgroundSize":"","originalWidth":2329,"originalHeight":1140,"strategy":"resample","height":0,"width":0},"wordCount":1390,"imageCount":6,"readingTime":6.195283018867925,"subtitle":"Writing customised camera experiences on Android has traditionally been very difficult. For one thing, photography itself is difficult: as…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":12,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"compose","name":"Compose","postCount":1049,"metadata":{"postCount":1049,"coverImage":{"id":"1*o3s6tDkZqbCo7bkHTWEJGA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6237,"metadata":{"postCount":6237,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://bsky.app/profile/tdcolvin.bsky.social","alts":[],"httpStatus":200},{"url":"https://bsky.app/profile/tdcolvin.bsky.social/post/3lcyfik4gu227","alts":[],"httpStatus":200},{"url":"https://github.com/tdcolvin/CameraXWorkshop","alts":[],"httpStatus":200},{"url":"https://www.apptaura.com/","alts":[],"httpStatus":200},{"url":"https://linkedin.com/in/tdcolvin","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1733931682745},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":96,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"lets-build-an-android-camera-app-camerax-compose","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"lets-build-an-android-camera-app-camerax-compose-9ea47356aa80","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*3I2LPnwyUF1d6D5aLoHMMg.png","originalWidth":2329,"originalHeight":1140,"isFeatured":true,"alt":"Flow chart showing how the PreviewView is passed to the Preview’s setSurfaceProvider, to create a working preview"}},{"name":"f328","type":3,"text":"Let’s build an Android camera app! CameraX + Compose","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Writing customised camera experiences on Android has traditionally been very difficult. For one thing, photography itself is difficult: as…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"855a1b6bd0d6","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"f328","type":3,"text":"Let’s build an Android camera app! CameraX + Compose","markups":[]},{"name":"2faf","type":1,"text":"Writing customised camera experiences on Android has traditionally been very difficult. For one thing, photography itself is difficult: as anyone who has used a DSLR camera will know, there are lots of esoteric settings to get right. On Android we have the additional problem that different camera hardware from diverse…","markups":[]}],"sections":[{"name":"f1eb","startIndex":0}]},"isFullContent":false,"subtitle":"Writing customised camera experiences on Android has traditionally been very difficult. For one thing, photography itself is difficult: as…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"918491dcf69a":{"id":"918491dcf69a","versionId":"4e1eb09eae54","creatorId":"cb954442a18e","homeCollectionId":"c72404660798","title":"When to Use Retrofit and When to Use Ktor: A Guide for Android Developers","detectedLanguage":"en","latestVersion":"4e1eb09eae54","latestPublishedVersion":"4e1eb09eae54","hasUnpublishedEdits":false,"latestRev":223,"createdAt":1733765486433,"updatedAt":1733935030482,"acceptedAt":0,"firstPublishedAt":1733931277859,"latestPublishedAt":1733931277859,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Understand the Strengths of Retrofit and Ktor to Choose the Best Networking Solution for Your Android Projects","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*jO0OsQ2iyp_mEjl1DlRKbQ.png","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":639,"imageCount":2,"readingTime":2.7946540880503146,"subtitle":"Understand the Strengths of Retrofit and Ktor to Choose the Best Networking Solution for Your Android Projects","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":40,"isBookmarked":false,"tags":[{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"mobile-app-development","name":"Mobile App Development","postCount":96692,"metadata":{"postCount":96692,"coverImage":{"id":"1*IXtsgrUcINV0nbaVXYmHkg.jpeg","originalWidth":1312,"originalHeight":736,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"java","name":"Java","postCount":90817,"metadata":{"postCount":90817,"coverImage":{"id":"1*0ygFBsM_EIjgR4M7ebLdbA.png","originalWidth":1058,"originalHeight":536,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"mailto:dobri.kostadinov@gmail.com","alts":[],"httpStatus":0},{"url":"https://www.buymeacoffee.com/dobri.kostadinov","alts":[],"httpStatus":200},{"url":"https://medium.com/@dobri.kostadinov","alts":[{"type":2,"url":"medium://@dobri.kostadinov"},{"type":3,"url":"medium://@dobri.kostadinov"}],"httpStatus":200},{"url":"https://www.linkedin.com/in/dobrikostadinov/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1733931278949},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":92,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"when-to-use-retrofit-and-when-to-use-ktor-a-guide-for-android-developers","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"when-to-use-retrofit-and-when-to-use-ktor-a-guide-for-android-developers-918491dcf69a","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*jO0OsQ2iyp_mEjl1DlRKbQ.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"03dc","type":3,"text":"When to Use Retrofit and When to Use Ktor: A Guide for Android Developers","markups":[],"alignment":1},{"name":"52e5","type":13,"text":"Understand the Strengths of…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Understand the Strengths of Retrofit and Ktor to Choose the Best Networking Solution for Your Android Projects"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"f0f47f035c03","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"03dc","type":3,"text":"When to Use Retrofit and When to Use Ktor: A Guide for Android Developers","markups":[]},{"name":"52e5","type":13,"text":"Understand the Strengths of Retrofit and Ktor to Choose the Best Networking Solution for Your Android Projects","markups":[]},{"name":"f738","type":4,"text":"This image was generated with the assistance of AI","markups":[],"layout":1,"metadata":{"id":"1*jO0OsQ2iyp_mEjl1DlRKbQ.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"47e5","type":1,"text":"As Android developers, choosing the right HTTP client for your project is a critical decision. Two of the most popular options today are Retrofit and Ktor. While Retrofit has been the de facto standard for years, Ktor is gaining momentum due to its modern architecture and flexibility.","markups":[{"type":1,"start":137,"end":145},{"type":1,"start":150,"end":154}]},{"name":"04a0","type":1,"text":"In this article…","markups":[{"type":1,"start":65,"end":73},{"type":1,"start":77,"end":81}]}],"sections":[{"name":"4cb2","startIndex":0}]},"isFullContent":false,"subtitle":"Understand the Strengths of Retrofit and Ktor to Choose the Best Networking Solution for Your Android Projects"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"187d5e14d212":{"id":"187d5e14d212","versionId":"21a8c916e993","creatorId":"cb954442a18e","homeCollectionId":"c72404660798","title":"Top 10 Coroutine Mistakes We All Have Made as Android Developers","detectedLanguage":"en","latestVersion":"21a8c916e993","latestPublishedVersion":"21a8c916e993","hasUnpublishedEdits":false,"latestRev":674,"createdAt":1729930522670,"updatedAt":1731558666985,"acceptedAt":0,"firstPublishedAt":1730655021474,"latestPublishedAt":1730979901976,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*Bhfzsp01NibPkNYmWy9YyA.png","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":1221,"imageCount":2,"readingTime":4.990880503144655,"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":134,"isBookmarked":false,"tags":[{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin-coroutines","name":"Kotlin Coroutines","postCount":1588,"metadata":{"postCount":1588,"coverImage":{"id":"1*-Srmt7MeVK9zchpbylnyng.jpeg","originalWidth":1024,"originalHeight":564,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":4,"links":{"entries":[{"url":"mailto:dobri.kostadinov@gmail.com","alts":[],"httpStatus":0},{"url":"https://www.buymeacoffee.com/dobri.kostadinov","alts":[],"httpStatus":200},{"url":"https://medium.com/@dobri.kostadinov","alts":[{"type":2,"url":"medium://@dobri.kostadinov"},{"type":3,"url":"medium://@dobri.kostadinov"}],"httpStatus":200},{"url":"https://www.linkedin.com/in/dobrikostadinov/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1730979902864},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":556,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"top-10-coroutine-mistakes-we-all-have-made-as-android-developers","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"top-10-coroutine-mistakes-we-all-have-made-as-android-developers-187d5e14d212","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"acbe","type":3,"text":"Top 10 Coroutine Mistakes We All Have Made as Android Developers","markups":[],"alignment":1},{"name":"e240","type":13,"text":"Understanding and Avoiding Common…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"f4f4c7b250da","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"acbe","type":3,"text":"Top 10 Coroutine Mistakes We All Have Made as Android Developers","markups":[]},{"name":"e240","type":13,"text":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines","markups":[]},{"name":"da6f","type":4,"text":"This image was generated with the assistance of AI","markups":[],"layout":1,"metadata":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"3c3b","type":3,"text":"Introduction","markups":[]},{"name":"dd1d","type":1,"text":"As Android developers, Kotlin coroutines have become an indispensable tool in our asynchronous programming toolkit. They simplify concurrent tasks, make code more readable, and help us avoid the callback hell that was prevalent with earlier approaches. However, coroutines come with their own set of challenges, and it’s easy to fall…","markups":[]}],"sections":[{"name":"c878","startIndex":0}]},"isFullContent":false,"subtitle":"Understanding and Avoiding Common Pitfalls in Asynchronous Programming with Kotlin Coroutines"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"12f6a9939053":{"id":"12f6a9939053","versionId":"3f00ad53f67e","creatorId":"b48b9b0e3d4d","homeCollectionId":"c72404660798","title":"The two best ways to secure your API keys in Android projects","detectedLanguage":"en","latestVersion":"3f00ad53f67e","latestPublishedVersion":"3f00ad53f67e","hasUnpublishedEdits":false,"latestRev":635,"createdAt":1730642016776,"updatedAt":1731555816817,"acceptedAt":0,"firstPublishedAt":1730737722201,"latestPublishedAt":1730765589277,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*ba3JJ-JCIWGZJi94UTnThw.png","filter":"","backgroundSize":"","originalWidth":1280,"originalHeight":720,"strategy":"resample","height":0,"width":0},"wordCount":925,"imageCount":5,"readingTime":4.323899371069182,"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":76,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"gradle","name":"Gradle","postCount":2926,"metadata":{"postCount":2926,"coverImage":{"id":"1*uSl5aXXimCMVBQUsv26QDw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":9,"links":{"entries":[],"version":"0.3","generatedAt":1730765589446},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":261,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"the-2-best-ways-to-secure-your-api-keys-in-android-projects","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"the-2-best-ways-to-secure-your-api-keys-in-android-projects-12f6a9939053","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*ba3JJ-JCIWGZJi94UTnThw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},{"name":"2f8c","type":3,"text":"The two best ways to secure your API keys in Android projects","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"f0863d88471e","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"2f8c","type":3,"text":"The two best ways to secure your API keys in Android projects","markups":[]},{"name":"0930","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*ba3JJ-JCIWGZJi94UTnThw.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},{"name":"e44d","type":1,"text":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is important and every application should make sure to secure their API keys to prevent any misuse of their services.","markups":[]},{"name":"92e6","type":6,"text":"NOTE: There are always some ways a hacker can…","markups":[]}],"sections":[{"name":"7150","startIndex":0}]},"isFullContent":false,"subtitle":"Protecting your Android app’s API keys ensures the privacy of user information and secures any unauthorized access to your APIs, this is…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"05e8fe2acd2c":{"id":"05e8fe2acd2c","versionId":"43467db70516","creatorId":"9bb203a4ab2e","homeCollectionId":"c72404660798","title":"Top Nine Android Developer Interview Questions You Should Know","detectedLanguage":"en","latestVersion":"43467db70516","latestPublishedVersion":"43467db70516","hasUnpublishedEdits":false,"latestRev":1590,"createdAt":1731030875512,"updatedAt":1731533186783,"acceptedAt":0,"firstPublishedAt":1731114590956,"latestPublishedAt":1731198289448,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*QhM1jZ56sVMbyc0hgOgRPw.jpeg","filter":"","backgroundSize":"","originalWidth":4608,"originalHeight":3072,"strategy":"resample","height":0,"width":0},"wordCount":3804,"imageCount":3,"readingTime":14.904716981132076,"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":77,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6237,"metadata":{"postCount":6237,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://android-developers.googleblog.com/2021/07/jetpack-compose-announcement.html","alts":[],"httpStatus":200},{"url":"https://x.com/AndroidDev/status/1726662755724181663","alts":[],"httpStatus":200},{"url":"https://developer.android.com/kotlin/first","alts":[],"httpStatus":200},{"url":"https://github.com/doveletter/","alts":[],"httpStatus":200},{"url":"https://github.com/doveletter","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/state-hoisting","alts":[],"httpStatus":200},{"url":"https://github.com/skydoves","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/coroutines-overview.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/data-classes.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/extensions.html","alts":[],"httpStatus":200},{"url":"https://medium.com/@skydoves/learn-kotlin-and-android-with-dove-letter-26265da11903","alts":[{"type":3,"url":"medium://p/26265da11903"},{"type":2,"url":"medium://p/26265da11903"}],"httpStatus":200},{"url":"https://developer.android.com/about/versions/15","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/side-effects","alts":[],"httpStatus":200},{"url":"https://developer.android.com/guide/components/activities/activity-lifecycle","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/android/app/Activity","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1731198290807},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":468,"sectionCount":1,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"top-9-android-developer-interview-questions-you-should-know","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*QhM1jZ56sVMbyc0hgOgRPw.jpeg","originalWidth":4608,"originalHeight":3072,"isFeatured":true}},{"name":"99ca","type":3,"text":"Top Nine Android Developer Interview Questions You Should Know","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"cb664a72577e","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"6d48","type":4,"text":"Unsplash@adolfofelix","markups":[],"layout":1,"metadata":{"id":"1*QhM1jZ56sVMbyc0hgOgRPw.jpeg","originalWidth":4608,"originalHeight":3072,"isFeatured":true}},{"name":"99ca","type":3,"text":"Top Nine Android Developer Interview Questions You Should Know","markups":[]},{"name":"b063","type":1,"text":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team you’re joining. While it’s impossible to predict every interview question, you can prepare by mastering the fundamental knowledge essential for working as an Android developer.","markups":[],"hasDropCap":true},{"name":"e133","type":1,"text":"The best…","markups":[]}],"sections":[{"name":"6564","startIndex":0}]},"isFullContent":false,"subtitle":"When applying for a job as an Android developer, you’ll need expertise in Android, Kotlin, and other relevant skills, depending on the team…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"0ae48d91c860":{"id":"0ae48d91c860","versionId":"18c0f45010cf","creatorId":"c55a3d9e212a","homeCollectionId":"c72404660798","title":"Kotlin Tips and Tricks You May Not Know: #5 — Simplify Functional Composition with let","detectedLanguage":"en","latestVersion":"18c0f45010cf","latestPublishedVersion":"18c0f45010cf","hasUnpublishedEdits":false,"latestRev":1677,"createdAt":1728041496245,"updatedAt":1734392321919,"acceptedAt":0,"firstPublishedAt":1732353599682,"latestPublishedAt":1734392321830,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Improve your functional composition using the let scope function","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*rTFrwaUwwTN7PAUFWR3ASA.jpeg","filter":"","backgroundSize":"","originalWidth":5456,"originalHeight":3554,"strategy":"resample","height":0,"width":0},"wordCount":887,"imageCount":1,"readingTime":3.547169811320755,"subtitle":"Improve your functional composition using the let scope function","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":11,"isBookmarked":false,"tags":[{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin-beginners","name":"Kotlin Beginners","postCount":2827,"metadata":{"postCount":2827,"coverImage":{"id":"1*1sNPNVmW3L5NHJUgJivVEA.png","originalWidth":688,"originalHeight":403,"alt":"Json DSL for kotlin"}},"type":"Tag"},{"slug":"functional-programming","name":"Functional Programming","postCount":13700,"metadata":{"postCount":13700,"coverImage":{"id":"1*NdOshsg2dBXm1Ro-_EZXlw.png","originalWidth":777,"originalHeight":362,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin-scope-functions","name":"Kotlin Scope Functions","postCount":110,"metadata":{"postCount":110,"coverImage":{"id":"1*rTFrwaUwwTN7PAUFWR3ASA.jpeg","originalWidth":5456,"originalHeight":3554,"isFeatured":true}},"type":"Tag"},{"slug":"java","name":"Java","postCount":90817,"metadata":{"postCount":90817,"coverImage":{"id":"1*0ygFBsM_EIjgR4M7ebLdbA.png","originalWidth":1058,"originalHeight":536,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://www.amazon.com/dp/9355516304","alts":[],"httpStatus":500},{"url":"https://medium.com/@elenavanengelen","alts":[{"type":2,"url":"medium://@elenavanengelen"},{"type":3,"url":"medium://@elenavanengelen"}],"httpStatus":200}],"version":"0.3","generatedAt":1734392322613},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":74,"sectionCount":1,"readingList":0,"topics":[{"topicId":"63c6f1f93ee","slug":"javascript","createdAt":1493945704961,"deletedAt":0,"image":{"id":"1*5UyyDJ1ESD11yQNd1UVAaQ@2x.jpeg","originalWidth":5472,"originalHeight":3648},"name":"Javascript","description":"An ode to code.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Javascript News and Articles — Medium","type":"Topic"},{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"kotlin-tips-and-tricks-you-may-not-know-5-simplify-functional-composition-with-let","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"kotlin-tips-and-tricks-you-may-not-know-5-simplify-functional-composition-with-let-0ae48d91c860","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*rTFrwaUwwTN7PAUFWR3ASA.jpeg","originalWidth":5456,"originalHeight":3554,"isFeatured":true}},{"name":"09f5","type":3,"text":"Kotlin Tips and Tricks You May Not Know: #5 — Simplify Functional Composition with let","markups":[{"type":10,"start":83,"end":86},{"type":1,"start":0,"end":86}],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Improve your functional composition using the let scope function"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"9a4b99a91eca","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"Simplify Functional Composition in Kotlin with let Scope Function","previewContent2":{"bodyModel":{"paragraphs":[{"name":"09f5","type":3,"text":"Kotlin Tips and Tricks You May Not Know: #5 — Simplify Functional Composition with let","markups":[{"type":10,"start":83,"end":86},{"type":1,"start":0,"end":86}]},{"name":"2ef8","type":13,"text":"Improve your functional composition using the let scope function","markups":[{"type":10,"start":46,"end":49}]},{"name":"720b","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*rTFrwaUwwTN7PAUFWR3ASA.jpeg","originalWidth":5456,"originalHeight":3554,"isFeatured":true}},{"name":"ee0a","type":3,"text":"Introduction","markups":[]},{"name":"8d4d","type":1,"text":"Functional composition, that is, chaining simple functions into a more complex one, is a common practice in Kotlin. However, in doing this, you can end up with deeply nested code that makes it less readable and harder to maintain.","markups":[]},{"name":"21b1","type":1,"text":"Consider an example where you are calculating a product’s final price…","markups":[]}],"sections":[{"name":"7f7e","startIndex":0}]},"isFullContent":false,"subtitle":"Improve your functional composition using the let scope function"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"14d04ec2426a":{"id":"14d04ec2426a","versionId":"823d5bfa0cb1","creatorId":"4ced6b06c2b7","homeCollectionId":"c72404660798","title":"Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣","detectedLanguage":"en","latestVersion":"823d5bfa0cb1","latestPublishedVersion":"823d5bfa0cb1","hasUnpublishedEdits":false,"latestRev":476,"createdAt":1725078733115,"updatedAt":1731581452458,"acceptedAt":0,"firstPublishedAt":1729974781088,"latestPublishedAt":1729974781088,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"keep these in mind for better code quality when doing ViewModels!","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*XDoCaRPSQa-h0DqkT5ckmA.png","filter":"","backgroundSize":"","originalWidth":1080,"originalHeight":500,"strategy":"resample","height":0,"width":0},"wordCount":749,"imageCount":1,"readingTime":3.026415094339623,"subtitle":"keep these in mind for better code quality when doing ViewModels!","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":51,"isBookmarked":false,"tags":[{"slug":"viewmodel","name":"Viewmodel","postCount":641,"metadata":{"postCount":641,"coverImage":{"id":"0*UWANTBQf4U1V1hGy","originalWidth":1792,"originalHeight":1024}},"type":"Tag"},{"slug":"viewmodel-testing","name":"Viewmodel Testing","postCount":4,"metadata":{"postCount":4,"coverImage":{"id":"1*XDoCaRPSQa-h0DqkT5ckmA.png","originalWidth":1080,"originalHeight":500,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"performance","name":"Performance","postCount":29784,"metadata":{"postCount":29784,"coverImage":{"id":"1*-c5IEbpSeALuFV0BO9odpg.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://www.youtube.com/@DroidFly","alts":[{"type":2,"url":"vnd.youtube://www.youtube.com/channel/UCQrQ-5TMazeb_ut7jyqvCEg"},{"type":3,"url":"https://www.youtube.com/channel/UCQrQ-5TMazeb_ut7jyqvCEg?feature=applinks"}],"httpStatus":200},{"url":"https://github.com/LloydBlv/GoodDictionary/blob/main/ui/words-list/src/test/java/com/example/words_list/WordsListViewModelTest.kt","alts":[],"httpStatus":200},{"url":"https://github.com/cashapp/turbine","alts":[],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-3-%EF%B8%8F3%EF%B8%8F%E2%83%A3-1833ce3ddd2b","alts":[{"type":3,"url":"medium://p/1833ce3ddd2b"},{"type":2,"url":"medium://p/1833ce3ddd2b"}],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-2-%EF%B8%8F-2b49281f0029","alts":[{"type":3,"url":"medium://p/2b49281f0029"},{"type":2,"url":"medium://p/2b49281f0029"}],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-1-%EF%B8%8F-bdf05287bca9","alts":[{"type":3,"url":"medium://p/bdf05287bca9"},{"type":2,"url":"medium://p/bdf05287bca9"}],"httpStatus":200},{"url":"https://mentorcruise.com/mentor/rezanajafi/","alts":[],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-android-viewmodels-essential-dos-and-donts-part-4-%EF%B8%8F-a0bad53cebd2","alts":[{"type":3,"url":"medium://p/a0bad53cebd2"},{"type":2,"url":"medium://p/a0bad53cebd2"}],"httpStatus":200}],"version":"0.3","generatedAt":1729974782747},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":220,"sectionCount":5,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"mastering-android-viewmodels-essential-dos-and-donts-part-5-️5️⃣","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"mastering-android-viewmodels-essential-dos-and-donts-part-5-️5️⃣-14d04ec2426a","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*XDoCaRPSQa-h0DqkT5ckmA.png","originalWidth":1080,"originalHeight":500,"isFeatured":true}},{"name":"8aad","type":3,"text":"Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣","markups":[],"alignment":1},{"name":"d05b","type":13,"text":"keep these in mind for better…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"keep these in mind for better code quality when doing ViewModels!"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"c7ff7cb23814","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"8aad","type":3,"text":"Mastering Android ViewModels: Essential Dos and Don’ts Part 5 🛠️5️⃣","markups":[]},{"name":"d05b","type":13,"text":"keep these in mind for better code quality when doing ViewModels!","markups":[]},{"name":"551a","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*XDoCaRPSQa-h0DqkT5ckmA.png","originalWidth":1080,"originalHeight":500,"isFeatured":true}},{"name":"c347","type":1,"text":"This will be the fifth installment in our series “Mastering Android ViewModels” where we dive deep into the essential dos and don’ts that can elevate your Android development skills. We’ve already covered several tips to improve performance and code quality in ViewModels, which have become an integral part of modern…","markups":[{"type":1,"start":49,"end":79}]}],"sections":[{"name":"fcab","startIndex":0}]},"isFullContent":false,"subtitle":"keep these in mind for better code quality when doing ViewModels!"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"16531ee54e8a":{"id":"16531ee54e8a","versionId":"6add6337798f","creatorId":"b69ba9cd4ff2","homeCollectionId":"c72404660798","title":"Android Interview Series 2024 — Part 4 (Kotlin Basics)","detectedLanguage":"en","latestVersion":"6add6337798f","latestPublishedVersion":"6add6337798f","hasUnpublishedEdits":false,"latestRev":489,"createdAt":1731146412253,"updatedAt":1731869815375,"acceptedAt":0,"firstPublishedAt":1731156622063,"latestPublishedAt":1731869815293,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"This is Part 4 of the android interview question series. This part will focus on Kotlin basics.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*XNkbMjWQ4k2dd4SMunQcIw.jpeg","filter":"","backgroundSize":"","originalWidth":1920,"originalHeight":1080,"strategy":"resample","height":0,"width":0},"wordCount":4306,"imageCount":2,"readingTime":16.632389937106918,"subtitle":"This is Part 4 of the android interview question series. This part will focus on Kotlin basics.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":7,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin-coroutines","name":"Kotlin Coroutines","postCount":1588,"metadata":{"postCount":1588,"coverImage":{"id":"1*-Srmt7MeVK9zchpbylnyng.jpeg","originalWidth":1024,"originalHeight":564,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","alts":[],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-6-kotlin-flows-730f6bf877df","alts":[{"type":3,"url":"medium://p/730f6bf877df"},{"type":2,"url":"medium://p/730f6bf877df"}],"httpStatus":200},{"url":"https://medium.com/android-news/android-interview-questions-cheat-sheet-part-ii-bea0633f0da7","alts":[{"type":3,"url":"medium://p/bea0633f0da7"},{"type":2,"url":"medium://p/bea0633f0da7"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-5-kotlin-coroutines-3dd1ae81c721","alts":[{"type":3,"url":"medium://p/3dd1ae81c721"},{"type":2,"url":"medium://p/3dd1ae81c721"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-7-jetpack-compose-ff7d2ecd9018","alts":[{"type":3,"url":"medium://p/ff7d2ecd9018"},{"type":2,"url":"medium://p/ff7d2ecd9018"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-8-android-architecture-07ca74eee000","alts":[{"type":3,"url":"medium://p/07ca74eee000"},{"type":2,"url":"medium://p/07ca74eee000"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-1-android-basics-23a713f4a648","alts":[{"type":3,"url":"medium://p/23a713f4a648"},{"type":2,"url":"medium://p/23a713f4a648"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-2-android-intermediate-472e0e787725","alts":[{"type":3,"url":"medium://p/472e0e787725"},{"type":2,"url":"medium://p/472e0e787725"}],"httpStatus":200}],"version":"0.3","generatedAt":1731869817167},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":77,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"android-interview-series-2024-part-4-kotlin-basics","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*XNkbMjWQ4k2dd4SMunQcIw.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"7d32","type":3,"text":"Android Interview Series 2024 — Part 4 (Kotlin Basics)","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"This is Part 4 of the android interview question series. This part will focus on Kotlin basics."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"7d32","type":3,"text":"Android Interview Series 2024 — Part 4 (Kotlin Basics)","markups":[]},{"name":"3f90","type":4,"text":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","markups":[{"type":3,"start":0,"end":66,"href":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","title":"","rel":"nofollow","anchorType":0}],"layout":5,"metadata":{"id":"1*XNkbMjWQ4k2dd4SMunQcIw.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"1955","type":1,"text":"This is Part 4 of the android interview question series. This part will focus on Kotlin basics.","markups":[]},{"name":"8a95","type":9,"text":"Part 1 — Android basics","markups":[{"type":3,"start":0,"end":23,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-1-android-basics-23a713f4a648","title":"","rel":"noopener","anchorType":0}]},{"name":"06f5","type":9,"text":"Part 2 — Android experts","markups":[{"type":3,"start":0,"end":24,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-2-android-intermediate-472e0e787725","title":"","rel":"noopener","anchorType":0}]},{"name":"f297","type":9,"text":"Part 3 — Java basics","markups":[{"type":3,"start":0,"end":20,"href":"https://medium.com/android-news/android-interview-questions-cheat-sheet-part-ii-bea0633f0da7","title":"","rel":"","anchorType":0}]},{"name":"0c53","type":9,"text":"Part 4 — Kotlin basics -\x3e You are here","markups":[{"type":1,"start":26,"end":38}]},{"name":"0622","type":9,"text":"Part 5 — Kotlin coroutines","markups":[{"type":3,"start":0,"end":26,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-5-kotlin-coroutines-3dd1ae81c721","title":"","rel":"noopener","anchorType":0}]},{"name":"dc65","type":9,"text":"Part 6 — Kotlin…","markups":[{"type":3,"start":0,"end":21,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-6-kotlin-flows-730f6bf877df","title":"","rel":"noopener","anchorType":0}]}],"sections":[{"name":"801d","startIndex":0}]},"isFullContent":false,"subtitle":"This is Part 4 of the android interview question series. This part will focus on Kotlin basics."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"1a1134530215":{"id":"1a1134530215","versionId":"b4cdad7ccfd4","creatorId":"b69c0e11154c","homeCollectionId":"c72404660798","title":"How to Integrate ViewModel in Kotlin Multiplatform with Koin","detectedLanguage":"en","latestVersion":"b4cdad7ccfd4","latestPublishedVersion":"b4cdad7ccfd4","hasUnpublishedEdits":false,"latestRev":879,"createdAt":1725967165616,"updatedAt":1734359609438,"acceptedAt":0,"firstPublishedAt":1726043122629,"latestPublishedAt":1734359609371,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"In this article, we will walk through the steps required to integrate ViewModel with Koin in a Kotlin Multiplatform project. Koin is a…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*cZ7ByLSeo7R4iJBUkADNbA.png","filter":"","backgroundSize":"","originalWidth":1280,"originalHeight":720,"strategy":"resample","height":0,"width":0},"wordCount":1065,"imageCount":1,"readingTime":4.218867924528302,"subtitle":"In this article, we will walk through the steps required to integrate ViewModel with Koin in a Kotlin Multiplatform project. Koin is a…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":16,"isBookmarked":false,"tags":[{"slug":"koin","name":"Koin","postCount":573,"metadata":{"postCount":573,"coverImage":{"id":"1*LPn19ANJCzcJcM8Wh2TpqQ.png","originalWidth":1993,"originalHeight":1202,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin-multiplatform","name":"Kotlin Multiplatform","postCount":1437,"metadata":{"postCount":1437,"coverImage":{"id":"0*d6s6DV5oQo_A0E6n","originalWidth":4928,"originalHeight":3264,"isFeatured":true,"unsplashPhotoId":"bAYP_kAtNWg"}},"type":"Tag"},{"slug":"compose-multiplatform","name":"Compose Multiplatform","postCount":341,"metadata":{"postCount":341,"coverImage":{"id":"1*FOiI-PpXm-n86pQt_aeKUg.png","originalWidth":2240,"originalHeight":1260,"isFeatured":true}},"type":"Tag"},{"slug":"viewmodel","name":"Viewmodel","postCount":641,"metadata":{"postCount":641,"coverImage":{"id":"0*UWANTBQf4U1V1hGy","originalWidth":1792,"originalHeight":1024}},"type":"Tag"},{"slug":"kmp","name":"Kmp","postCount":180,"metadata":{"postCount":180,"coverImage":{"id":"0*D-ieHZMS5IWWRJUG","originalWidth":1800,"originalHeight":1013,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://twitter.com/CodingMeet?source=about_page-------------------------------------","alts":[],"httpStatus":200},{"url":"https://youtube.com/playlist?list=PLlSuJy9SfzvEiYH59pDDNvFJjHoYLV0MM&si=VR1irW3wUJchQ7iz","alts":[{"type":2,"url":"http://www.youtube.com/playlist?list=PLlSuJy9SfzvEiYH59pDDNvFJjHoYLV0MM&feature=applinks"},{"type":3,"url":"http://www.youtube.com/playlist?list=PLlSuJy9SfzvEiYH59pDDNvFJjHoYLV0MM&feature=applinks"}],"httpStatus":200},{"url":"https://www.instagram.com/codingmeet26/?source=about_page-------------------------------------","alts":[],"httpStatus":200},{"url":"https://youtube.com/@codingmeet26?si=0unoWz53pxanSpv0","alts":[{"type":2,"url":"vnd.youtube://www.youtube.com/channel/UCbxVOMaM79ouNfgwEmkBNAg"},{"type":3,"url":"https://www.youtube.com/channel/UCbxVOMaM79ouNfgwEmkBNAg?feature=applinks"}],"httpStatus":200},{"url":"https://github.com/Coding-Meet?source=about_page-------------------------------------","alts":[],"httpStatus":200},{"url":"https://github.com/Coding-Meet/News-KMP-App","alts":[],"httpStatus":200},{"url":"https://www.buymeacoffee.com/CodingMeet?source=about_page-------------------------------------","alts":[],"httpStatus":200},{"url":"https://github.com/Coding-Meet/Gemini-AI-KMP-App","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/coding-meet?source=about_page-------------------------------------","alts":[],"httpStatus":999},{"url":"https://medium.com/@meet26","alts":[{"type":2,"url":"medium://@meet26"},{"type":3,"url":"medium://@meet26"}],"httpStatus":200}],"version":"0.3","generatedAt":1734359700846},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":42,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"how-to-integrate-viewmodel-in-kotlin-multiplatform-with-koin","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"how-to-integrate-viewmodel-in-kotlin-multiplatform-with-koin-1a1134530215","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*cZ7ByLSeo7R4iJBUkADNbA.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},{"name":"ed4a","type":3,"text":"How to Integrate ViewModel in Kotlin Multiplatform with Koin","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"In this article, we will walk through the steps required to integrate ViewModel with Koin in a Kotlin Multiplatform project. Koin is a…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"ed4a","type":3,"text":"How to Integrate ViewModel in Kotlin Multiplatform with Koin","markups":[]},{"name":"51a1","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*cZ7ByLSeo7R4iJBUkADNbA.png","originalWidth":1280,"originalHeight":720,"isFeatured":true}},{"name":"b1a1","type":1,"text":"In this article, we will walk through the steps required to integrate ViewModel with Koin in a Kotlin Multiplatform project. Koin is a popular dependency injection library that helps in managing object lifecycles, and Jetpack Compose provides a powerful, declarative way to build UIs in Android and across other platforms…","markups":[],"hasDropCap":true}],"sections":[{"name":"0558","startIndex":0}]},"isFullContent":false,"subtitle":"In this article, we will walk through the steps required to integrate ViewModel with Koin in a Kotlin Multiplatform project. Koin is a…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"138d3496c624":{"id":"138d3496c624","versionId":"b1fa5ac7a10e","creatorId":"727137e47bff","homeCollectionId":"c72404660798","title":"Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers","detectedLanguage":"en","latestVersion":"b1fa5ac7a10e","latestPublishedVersion":"b1fa5ac7a10e","hasUnpublishedEdits":false,"latestRev":3026,"createdAt":1725184536740,"updatedAt":1732474624706,"acceptedAt":0,"firstPublishedAt":1727039330503,"latestPublishedAt":1732474624706,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*KALhC6r9lo-8E_M7QGVvhw.png","filter":"","backgroundSize":"","originalWidth":1500,"originalHeight":500,"strategy":"resample","height":0,"width":0},"wordCount":2766,"imageCount":13,"readingTime":11.837735849056605,"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":50,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6237,"metadata":{"postCount":6237,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"animation","name":"Animation","postCount":27867,"metadata":{"postCount":27867,"coverImage":{"id":"1*17S2wuYMzP0vrW3Za0WrXw.jpeg","originalWidth":1400,"originalHeight":754,"isFeatured":true,"focusPercentX":47,"focusPercentY":34}},"type":"Tag"},{"slug":"mobile-development","name":"Mobile Development","postCount":3501,"metadata":{"postCount":3501,"coverImage":{"id":"1*NzI-VdEz-5oCizJI_ym4lQ.png","originalWidth":2288,"originalHeight":1284,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://developer.android.com/develop/ui/compose/animation/choose-api","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#graphics-modifiers","alts":[],"httpStatus":200},{"url":"https://en.wikipedia.org/wiki/B%C3%A9zier_curve","alts":[],"httpStatus":200},{"url":"https://developer.android.com/studio/debug/layout-inspector","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawing-modifiers","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/Animatable","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/ui/graphics/BlendMode","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/phases","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/InfiniteTransition","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawwithcontent","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/package-summary#(androidx.compose.ui.Modifier).offset(androidx.compose.ui.unit.Dp,androidx.compose.ui.unit.Dp)","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/custom-modifiers#chain-existing","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/package-summary#LinearEasing()","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawwithcache","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#drawbehind","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/package-summary#(androidx.compose.ui.Modifier).offset(kotlin.Function1)","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/package-summary#EaseInSine()","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/compose/animation/core/TweenSpec","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1732474626787},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":247,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"},{"topicId":"ab3d8f7f8eb1","slug":"ios-development","createdAt":1521651850182,"deletedAt":0,"image":{"id":"1*g_B4JNulmfXSj0AyEjImyA@2x.jpeg","originalWidth":5184,"originalHeight":3456},"name":"iOS Dev","description":"Appy talk.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"iOS App Development: Articles and News — Medium","type":"Topic"},{"topicId":"decb52b64abf","slug":"programming","createdAt":1493934116328,"deletedAt":0,"image":{"id":"1*iPa136b1cGEO7lvoXg6uHQ@2x.jpeg","originalWidth":6016,"originalHeight":4016},"name":"Programming","description":"The good, the bad, the buggy.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Programming News and Articles — Medium","type":"Topic"}]},"coverless":true,"slug":"animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"animation-and-masking-in-jetpack-compose-with-the-grahpicslayer-and-drawing-modifiers-138d3496c624","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*KALhC6r9lo-8E_M7QGVvhw.png","originalWidth":1500,"originalHeight":500,"isFeatured":true}},{"name":"4ca5","type":3,"text":"Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"c682bbd78f63","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"0951","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*KALhC6r9lo-8E_M7QGVvhw.png","originalWidth":1500,"originalHeight":500,"isFeatured":true}},{"name":"4ca5","type":3,"text":"Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers","markups":[]},{"name":"eace","type":1,"text":"Jetpack Compose’s animation API is both powerful and enjoyable to work with. And when combined with the graphicsLayer() and drawing modifiers, it really open up possibilities for creating some really cool animations. In this article, we'll dive into exactly that by exploring how to create the following loading animation:","markups":[{"type":10,"start":104,"end":119},{"type":3,"start":0,"end":31,"href":"https://developer.android.com/develop/ui/compose/animation/choose-api","title":"","rel":"noopener","anchorType":0},{"type":3,"start":104,"end":119,"href":"https://developer.android.com/develop/ui/compose/graphics/draw/modifiers#graphics-modifiers","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"9101","startIndex":0}]},"isFullContent":false,"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"07ca74eee000":{"id":"07ca74eee000","versionId":"e8516b506ee2","creatorId":"b69ba9cd4ff2","homeCollectionId":"c72404660798","title":"Android Interview Series 2024 — Part 8 (Android architecture)","detectedLanguage":"en","latestVersion":"e8516b506ee2","latestPublishedVersion":"e8516b506ee2","hasUnpublishedEdits":false,"latestRev":189,"createdAt":1731426987346,"updatedAt":1731871017018,"acceptedAt":0,"firstPublishedAt":1731427305001,"latestPublishedAt":1731871016952,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture.","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*ovGMYgU7aA9In-oV.jpeg","filter":"","backgroundSize":"","originalWidth":1920,"originalHeight":1080,"strategy":"resample","height":0,"width":0},"wordCount":2003,"imageCount":1,"readingTime":7.758490566037736,"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":9,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":144529,"metadata":{"postCount":144529,"coverImage":{"id":"1*IVdzt2CKqQK-moWlu18X6Q.jpeg","originalWidth":736,"originalHeight":736}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48557,"metadata":{"postCount":48557,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12268,"metadata":{"postCount":12268,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":31400,"metadata":{"postCount":31400,"coverImage":{"id":"1*WEJ1mIjP5d32jGhapRiscQ.png","originalWidth":2181,"originalHeight":1188}},"type":"Tag"},{"slug":"android-architecture","name":"Android Architecture","postCount":531,"metadata":{"postCount":531,"coverImage":{"id":"1*5k4kW5AKWVDWaqrKlbAmWA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","alts":[],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-2-android-intermediate-472e0e787725","alts":[{"type":3,"url":"medium://p/472e0e787725"},{"type":2,"url":"medium://p/472e0e787725"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-5-kotlin-coroutines-3dd1ae81c721","alts":[{"type":3,"url":"medium://p/3dd1ae81c721"},{"type":2,"url":"medium://p/3dd1ae81c721"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-1-android-basics-23a713f4a648","alts":[{"type":3,"url":"medium://p/23a713f4a648"},{"type":2,"url":"medium://p/23a713f4a648"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a","alts":[{"type":3,"url":"medium://p/16531ee54e8a"},{"type":2,"url":"medium://p/16531ee54e8a"}],"httpStatus":200},{"url":"https://medium.com/android-news/android-interview-questions-cheat-sheet-part-ii-bea0633f0da7","alts":[{"type":3,"url":"medium://p/bea0633f0da7"},{"type":2,"url":"medium://p/bea0633f0da7"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-7-jetpack-compose-ff7d2ecd9018","alts":[{"type":3,"url":"medium://p/ff7d2ecd9018"},{"type":2,"url":"medium://p/ff7d2ecd9018"}],"httpStatus":200},{"url":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-6-kotlin-flows-730f6bf877df","alts":[{"type":3,"url":"medium://p/730f6bf877df"},{"type":2,"url":"medium://p/730f6bf877df"}],"httpStatus":200}],"version":"0.3","generatedAt":1731871018537},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":16,"sectionCount":2,"readingList":0,"topics":[{"topicId":"64756708407c","slug":"android-development","createdAt":1521652914155,"deletedAt":0,"image":{"id":"1*zLD64ewnrZ3XKBtDUMXQ-w@2x.jpeg","originalWidth":3000,"originalHeight":1997},"name":"Android Dev","description":"Building little green robots.","relatedTopics":[],"visibility":1,"relatedTags":[],"relatedTopicIds":[],"seoTitle":"Android Development: Articles and News — Medium","type":"Topic"}]},"coverless":true,"slug":"android-interview-series-2024-part-8-android-architecture","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"android-interview-series-2024-part-8-android-architecture-07ca74eee000","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*ovGMYgU7aA9In-oV.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"f148","type":3,"text":"Android Interview Series 2024 — Part 8 (Android architecture)","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":4,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":0,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"f148","type":3,"text":"Android Interview Series 2024 — Part 8 (Android architecture)","markups":[]},{"name":"14c4","type":4,"text":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","markups":[{"type":3,"start":0,"end":66,"href":"https://hdwallsbox.com/3d-android-logo-background-wallpaper-43891/","title":"","rel":"nofollow","anchorType":0}],"layout":5,"metadata":{"id":"0*ovGMYgU7aA9In-oV.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},{"name":"77d7","type":1,"text":"This is Part 8 of the android interview question series. This part will focus on Android architecture.","markups":[]},{"name":"0e53","type":9,"text":"Part 1 — Android basics","markups":[{"type":3,"start":0,"end":23,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-1-android-basics-23a713f4a648","title":"","rel":"noopener","anchorType":0}]},{"name":"c452","type":9,"text":"Part 2 — Android experts","markups":[{"type":3,"start":0,"end":24,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-2-android-intermediate-472e0e787725","title":"","rel":"noopener","anchorType":0}]},{"name":"1611","type":9,"text":"Part 3 — Java basics","markups":[{"type":3,"start":0,"end":20,"href":"https://medium.com/android-news/android-interview-questions-cheat-sheet-part-ii-bea0633f0da7","title":"","rel":"noopener","anchorType":0}]},{"name":"4d2d","type":9,"text":"Part 4 — Kotlin basics","markups":[{"type":3,"start":0,"end":22,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-4-kotlin-basics-16531ee54e8a","title":"","rel":"noopener","anchorType":0}]},{"name":"33b2","type":9,"text":"Part 5 — Kotlin coroutines","markups":[{"type":3,"start":0,"end":26,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-5-kotlin-coroutines-3dd1ae81c721","title":"","rel":"noopener","anchorType":0}]},{"name":"8465","type":9,"text":"Part 6 — Kotlin Flows","markups":[{"type":3,"start":0,"end":21,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-6-kotlin-flows-730f6bf877df","title":"","rel":"noopener","anchorType":0}]},{"name":"213d","type":9,"text":"Part 7 —…","markups":[{"type":3,"start":0,"end":24,"href":"https://medium.com/@anitaa_1990/android-interview-series-2024-part-7-jetpack-compose-ff7d2ecd9018","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"1d6a","startIndex":0}]},"isFullContent":false,"subtitle":"This is Part 8 of the android interview question series. This part will focus on Android architecture."},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"}}},"paging":{"path":"/_/api/collections/c72404660798/stream","next":{"to":"1733931277859","ignoredIds":["187d5e14d212","12f6a9939053","05e8fe2acd2c","0ae48d91c860","14d04ec2426a","16531ee54e8a","1a1134530215","138d3496c624","07ca74eee000"],"page":3}},"collection":{"id":"c72404660798","name":"ProAndroidDev","slug":"proandroiddev","tags":[],"creatorId":"c6e8e225f7d5","description":"The latest posts from Android Professionals and Google Developer Experts.","shortDescription":"The latest posts from Android Professionals and Google…","image":{"imageId":"1*XVtdl45m8YaYrPI4buJ5yQ.png","filter":"","backgroundSize":"","originalWidth":1000,"originalHeight":1000,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":63652,"activeAt":1734392321917},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false,"canViewNewsletterV2Stats":false,"canCreateNewsletterV3":false},"isSubscribed":false,"isEnrolledInHightower":false,"isEligibleForHightower":false,"isSubscribedToCollectionEmails":false,"isMuted":false,"canToggleEmail":false,"isWriter":false},"logo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"twitterUsername":"proandroiddev","facebookPageName":"proandroiddev","publicEmail":"editors@proandroiddev.com","domain":"proandroiddev.com","sections":[{"type":2,"collectionHeaderMetadata":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":7,"postIds":["67063cde49f0","04e0d3d6a08f","a3cef8a9eeed","01467d917e2f","8b1713b95297","9ea47356aa80","918491dcf69a"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":9,"postIds":["187d5e14d212","12f6a9939053","05e8fe2acd2c","0ae48d91c860","14d04ec2426a","16531ee54e8a","1a1134530215","138d3496c624","07ca74eee000"],"sectionHeader":"Trending Blogs"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"38769d69f98a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}}],"tintColor":"#FF7DE1C3","lightText":false,"favicon":{"imageId":"1*A8VytPZQhvUf_MG6hm_Dlw.png","filter":"","backgroundSize":"","originalWidth":128,"originalHeight":128,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF2E987E","point":0},{"color":"#FF318D75","point":0.1},{"color":"#FF32826C","point":0.2},{"color":"#FF327663","point":0.3},{"color":"#FF306B5A","point":0.4},{"color":"#FF2E5F50","point":0.5},{"color":"#FF2A5347","point":0.6},{"color":"#FF26463C","point":0.7},{"color":"#FF203931","point":0.8},{"color":"#FF192C25","point":0.9},{"color":"#FF101D19","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF7DE1C3","point":0},{"color":"#FF6ED2B5","point":0.1},{"color":"#FF5EC3A6","point":0.2},{"color":"#FF4EB397","point":0.3},{"color":"#FF3CA388","point":0.4},{"color":"#FF269278","point":0.5},{"color":"#FF008168","point":0.6},{"color":"#FF006F57","point":0.7},{"color":"#FF005C45","point":0.8},{"color":"#FF004732","point":0.9},{"color":"#FF002F1C","point":1}],"backgroundColor":"#FF7DE1C3"},"highlightSpectrum":{"colorPoints":[{"color":"#FFE4F8EF","point":0},{"color":"#FFDEF8ED","point":0.1},{"color":"#FFD9F7EB","point":0.2},{"color":"#FFD3F6E9","point":0.3},{"color":"#FFCEF6E7","point":0.4},{"color":"#FFC8F5E4","point":0.5},{"color":"#FFC2F4E2","point":0.6},{"color":"#FFBCF4E0","point":0.7},{"color":"#FFB5F3DE","point":0.8},{"color":"#FFAFF2DB","point":0.9},{"color":"#FFA8F2D9","point":1}],"backgroundColor":"#FFFFFFFF"},"darkBackgroundSpectrum":{"colorPoints":[{"color":"#FF4CB196","point":0},{"color":"#FF60B99F","point":0.1},{"color":"#FF72C0A7","point":0.2},{"color":"#FF82C7B0","point":0.3},{"color":"#FF91CDB9","point":0.4},{"color":"#FFA0D4C2","point":0.5},{"color":"#FFAEDACA","point":0.6},{"color":"#FFBCE1D3","point":0.7},{"color":"#FFC9E7DB","point":0.8},{"color":"#FFD6EDE3","point":0.9},{"color":"#FFE3F3EC","point":1}],"backgroundColor":"#FF000000"}},"navItems":[{"type":2,"title":"Submit","postId":"b2efa7f46272","url":"https://proandroiddev.com/submission-guidelines-b2efa7f46272","source":"postId"},{"type":5,"title":"Archive","url":"https://proandroiddev.com/archive"},{"type":6,"title":"About","url":"https://proandroiddev.com/about"},{"type":3,"title":"droidcon Academy","url":"https://academy.droidcon.com"}],"colorBehavior":2,"collectionFeatures":[30],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5},"paidForDomainAt":1497851443187,"subscriberCount":63652,"tagline":"The latest posts from Android Professionals and Google Developer Experts","isOptedIntoAurora":false,"newsletterV3":{"newsletterV3Id":"278dceec521d","type":1,"name":"ProAndroidDev Digest","description":"Get updates on latest posts on ProAndroidDev and never miss a hot story! ","collectionId":"c72404660798","newsletterSlug":"proandroiddev-digest","isSubscribed":false,"showPromo":false,"avatarImageId":"","creatorId":"6c67343165e2","showNewsletterPostsInCollectionHome":false,"exportableSubscribersCount":2036,"subscribersCount":12121,"promoHeadline":"","promoBody":"","replyToEmail":""},"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092782276,"type":"Collection"},"header":{"backgroundImage":{"id":"1*i5UmD6poC0MpEw0UlnWhTQ.png","originalWidth":2000,"originalHeight":250},"logoImage":{"id":"1*V45--ieyNysokCIUqFXTKw@2x.png","originalWidth":1,"originalHeight":2,"alt":"ProAndroidDev"},"alignment":2,"layout":5},"streamItems":[{"createdAt":1734497892372,"randomId":"aee11fde1c5a","section":{"items":[{"post":{"postId":"67063cde49f0"},"itemType":"post"},{"post":{"postId":"04e0d3d6a08f"},"itemType":"post"},{"post":{"postId":"a3cef8a9eeed"},"itemType":"post"},{"post":{"postId":"01467d917e2f"},"itemType":"post"},{"post":{"postId":"8b1713b95297"},"itemType":"post"},{"post":{"postId":"9ea47356aa80"},"itemType":"post"},{"post":{"postId":"918491dcf69a"},"itemType":"post"}],"layout":4},"itemType":"section","type":"StreamItem"},{"createdAt":1734497892372,"randomId":"6ae886382d63","section":{"items":[{"post":{"postId":"187d5e14d212"},"itemType":"post"},{"post":{"postId":"12f6a9939053"},"itemType":"post"},{"post":{"postId":"05e8fe2acd2c"},"itemType":"post"},{"post":{"postId":"0ae48d91c860"},"itemType":"post"},{"post":{"postId":"14d04ec2426a"},"itemType":"post"},{"post":{"postId":"16531ee54e8a"},"itemType":"post"},{"post":{"postId":"1a1134530215"},"itemType":"post"},{"post":{"postId":"138d3496c624"},"itemType":"post"},{"post":{"postId":"07ca74eee000"},"itemType":"post"}],"layout":4,"heading":{"fallbackTitle":"Trending Blogs","headingBasic":{"title":"Trending Blogs"},"headingType":"headingBasic"}},"itemType":"section","type":"StreamItem"}]}) // ]]></script></body></html>