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.W9J-2zkF03j8TkriAGn1Tg.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%3Dtopic_portal---recommended_stories---kotlin---5-85--------------------a2184f68_2e30_40fd_8ce2_76fa8aaf7243-------&amp;source=--------------------------nav_reg&amp;operation=login" data-action="sign-in-prompt" data-redirect="https://proandroiddev.com/?source=topic_portal---recommended_stories---kotlin---5-85--------------------a2184f68_2e30_40fd_8ce2_76fa8aaf7243-------" 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%3Dtopic_portal---recommended_stories---kotlin---5-85--------------------a2184f68_2e30_40fd_8ce2_76fa8aaf7243-------&amp;source=--------------------------nav_reg&amp;operation=register" data-action="sign-up-prompt" data-redirect="https://proandroiddev.com/?source=topic_portal---recommended_stories---kotlin---5-85--------------------a2184f68_2e30_40fd_8ce2_76fa8aaf7243-------" 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(&quot;https://cdn-images-1.medium.com/max/2400/1*i5UmD6poC0MpEw0UlnWhTQ.png&quot;); 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="a950e6f9eb72" data-index="0"><div class="u-lineHeightBase postItem u-marginRight3"><a href="https://proandroiddev.com/custom-modifiers-in-jetpack-compose-a950e6f9eb72?source=collection_home---4------0-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/custom-modifiers-in-jetpack-compose-a950e6f9eb72?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(&quot;https://cdn-images-1.medium.com/max/2000/1*Oe-DGannPg34NnFtp02TjA.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Custom modifiers in Jetpack Compose</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/custom-modifiers-in-jetpack-compose-a950e6f9eb72?source=collection_home---4------0-----------------------" data-action-source="collection_home---4------0-----------------------" data-post-id="a950e6f9eb72"><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">Custom modifiers in Jetpack 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">Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…</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/@siddh.gupta99" data-action="show-user-card" data-action-value="e072cea221fc" data-action-type="hover" data-user-id="e072cea221fc" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*6rI29yuZZDr-3XD0qlJ-RQ.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Siddharth Gupta"></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/@siddh.gupta99" data-action="show-user-card" data-action-value="e072cea221fc" data-action-type="hover" data-user-id="e072cea221fc" data-collection-slug="proandroiddev" dir="auto">Siddharth Gupta</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-22T04:11:37.520Z">Nov 21</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 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="2dcc4db2f76c" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/widgets-with-glance-beyond-string-states-2dcc4db2f76c?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/widgets-with-glance-beyond-string-states-2dcc4db2f76c?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(&quot;https://cdn-images-1.medium.com/max/800/1*CRseHrplJF6Df_UEDsD73g.jpeg&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Widgets With Glance: Beyond String States</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/widgets-with-glance-beyond-string-states-2dcc4db2f76c?source=collection_home---4------1-----------------------" data-action-source="collection_home---4------1-----------------------" data-post-id="2dcc4db2f76c"><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">Widgets With Glance: Beyond String States</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">Use a custom GlanceStateDefinition to manage your widget state</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/@katiebarnett5" data-action="show-user-card" data-action-value="6d77f07dc67" data-action-type="hover" data-user-id="6d77f07dc67" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*5UmMOU3BxA7gSCobglh6zw.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Katie Barnett"></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/@katiebarnett5" data-action="show-user-card" data-action-value="6d77f07dc67" data-action-type="hover" data-user-id="6d77f07dc67" data-collection-slug="proandroiddev" dir="auto">Katie Barnett</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-21T07:03:53.504Z">Nov 20</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="aa0760383569" data-index="2"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/exploring-kotlin-coroutines-through-output-questions-aa0760383569?source=collection_home---4------2-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/exploring-kotlin-coroutines-through-output-questions-aa0760383569?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(&quot;https://cdn-images-1.medium.com/max/800/1*qgzGgrMeE9raugNDYbsfVQ.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Exploring Kotlin Coroutines through Output Questions</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/exploring-kotlin-coroutines-through-output-questions-aa0760383569?source=collection_home---4------2-----------------------" data-action-source="collection_home---4------2-----------------------" data-post-id="aa0760383569"><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">Exploring Kotlin Coroutines through Output Questions</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 unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…</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/@tanyandroid" data-action="show-user-card" data-action-value="4369a38c1d4f" data-action-type="hover" data-user-id="4369a38c1d4f" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*yEkfsQNgR3VHbOT2VzHrIg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Tanya Arora"></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/@tanyandroid" data-action="show-user-card" data-action-value="4369a38c1d4f" data-action-type="hover" data-user-id="4369a38c1d4f" data-collection-slug="proandroiddev" dir="auto">Tanya Arora</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-16T06:27:45.538Z">Nov 15</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="10 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="e4e03aef765f" data-index="3"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/a-developers-roadmap-to-mastering-kotlin-multiplatform-e4e03aef765f?source=collection_home---4------3-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/a-developers-roadmap-to-mastering-kotlin-multiplatform-e4e03aef765f?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(&quot;https://cdn-images-1.medium.com/max/800/0*D-ieHZMS5IWWRJUG&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">A Developer’s Roadmap to Mastering Kotlin Multiplatform</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/a-developers-roadmap-to-mastering-kotlin-multiplatform-e4e03aef765f?source=collection_home---4------3-----------------------" data-action-source="collection_home---4------3-----------------------" data-post-id="e4e03aef765f"><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">A Developer’s Roadmap to Mastering Kotlin Multiplatform</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 modern mobile development, cross-platform frameworks are gaining popularity because they offer key advantages, such as reducing the…</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-15T15:10:31.866Z">Nov 15</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="10 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="abb4632d0b47" data-index="4"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/collapsing-toolbar-in-compose-part-2-abb4632d0b47?source=collection_home---4------4-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/collapsing-toolbar-in-compose-part-2-abb4632d0b47?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(&quot;https://cdn-images-1.medium.com/max/800/1*khPFw1H7giplcH42MXQfFw.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Collapsing Toolbar in Compose— PART 2</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/collapsing-toolbar-in-compose-part-2-abb4632d0b47?source=collection_home---4------4-----------------------" data-action-source="collection_home---4------4-----------------------" data-post-id="abb4632d0b47"><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">Collapsing Toolbar in Compose— PART 2</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">Introduction</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/@karishma-agr1996" data-action="show-user-card" data-action-value="560f271fde33" data-action-type="hover" data-user-id="560f271fde33" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*hp8ICXAiwBt5JdknmItJ9g.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Karishma Agrawal"></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/@karishma-agr1996" data-action="show-user-card" data-action-value="560f271fde33" data-action-type="hover" data-user-id="560f271fde33" data-collection-slug="proandroiddev" dir="auto">Karishma Agrawal</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-14T05:49:17.357Z">Nov 13</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="10 min read"></span><span class="u-paddingLeft4"><span class="svgIcon svgIcon--star svgIcon--15px"><svg class="svgIcon-use" width="15" height="15" ><path d="M7.438 2.324c.034-.099.09-.099.123 0l1.2 3.53a.29.29 0 00.26.19h3.884c.11 0 .127.049.038.111L9.8 8.327a.271.271 0 00-.099.291l1.2 3.53c.034.1-.011.131-.098.069l-3.142-2.18a.303.303 0 00-.32 0l-3.145 2.182c-.087.06-.132.03-.099-.068l1.2-3.53a.271.271 0 00-.098-.292L2.056 6.146c-.087-.06-.071-.112.038-.112h3.884a.29.29 0 00.26-.19l1.2-3.52z"/></svg></span></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="07ca74eee000" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/android-interview-series-2024-part-8-android-architecture-07ca74eee000?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(&quot;https://cdn-images-1.medium.com/max/800/0*ovGMYgU7aA9In-oV.jpeg&quot;); 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------5-----------------------" data-action-source="collection_home---4------5-----------------------" 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 class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------6-----------------------" data-post-id="36d9d973a21f" data-index="6"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/sonarqube-in-android-implementation-tips-and-challenges-faced-36d9d973a21f?source=collection_home---4------6-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/sonarqube-in-android-implementation-tips-and-challenges-faced-36d9d973a21f?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(&quot;https://cdn-images-1.medium.com/max/800/1*Qb_6n_mQxOyOTuuf48s9XQ.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">SonarQube in Android — Implementation tips and challenges faced</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/sonarqube-in-android-implementation-tips-and-challenges-faced-36d9d973a21f?source=collection_home---4------6-----------------------" data-action-source="collection_home---4------6-----------------------" data-post-id="36d9d973a21f"><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">SonarQube in Android — Implementation tips and challenges faced</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">Introduction:</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/@dilipchandar89" data-action="show-user-card" data-action-value="1d8f5c41baef" data-action-type="hover" data-user-id="1d8f5c41baef" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*_ahsRfI76vTCn4JWIGHHGg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Dilipchandar"></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/@dilipchandar89" data-action="show-user-card" data-action-value="1d8f5c41baef" data-action-type="hover" data-user-id="1d8f5c41baef" data-collection-slug="proandroiddev" dir="auto">Dilipchandar</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-11T11:14:16.282Z">Nov 11</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="4 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(&quot;https://cdn-images-1.medium.com/max/800/1*Bhfzsp01NibPkNYmWy9YyA.png&quot;); 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="05e8fe2acd2c" data-index="1"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?source=collection_home---4------1-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/top-9-android-developer-interview-questions-you-should-know-05e8fe2acd2c?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(&quot;https://cdn-images-1.medium.com/max/800/1*QhM1jZ56sVMbyc0hgOgRPw.jpeg&quot;); 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------1-----------------------" data-action-source="collection_home---4------1-----------------------" 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 class="col u-xs-size12of12 js-trackPostPresentation u-paddingLeft12 u-marginBottom15 u-paddingRight12 u-size4of12" data-source="collection_home---4------2-----------------------" data-post-id="12f6a9939053" data-index="2"><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------2-----------------------" 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------2-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*ba3JJ-JCIWGZJi94UTnThw.png&quot;); 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------2-----------------------" data-action-source="collection_home---4------2-----------------------" 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><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="14d04ec2426a" data-index="3"><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------3-----------------------" 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------3-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*XDoCaRPSQa-h0DqkT5ckmA.png&quot;); 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------3-----------------------" data-action-source="collection_home---4------3-----------------------" 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------4-----------------------" data-post-id="138d3496c624" data-index="4"><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------4-----------------------" 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------4-----------------------" class="u-block u-xs-height170 u-height172 u-backgroundSizeCover u-backgroundOriginBorderBox u-backgroundColorGrayLight u-borderLighter" style="background-image: url(&quot;https://cdn-images-1.medium.com/max/800/1*KALhC6r9lo-8E_M7QGVvhw.png&quot;); 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------4-----------------------" data-action-source="collection_home---4------4-----------------------" 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------5-----------------------" data-post-id="08927e4d2855" data-index="5"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/facing-a-multithreading-tech-interview-08927e4d2855?source=collection_home---4------5-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/facing-a-multithreading-tech-interview-08927e4d2855?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(&quot;https://cdn-images-1.medium.com/max/800/0*wnibk_XT8sI6BUCk&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Facing a Multithreading Tech Interview</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/facing-a-multithreading-tech-interview-08927e4d2855?source=collection_home---4------5-----------------------" data-action-source="collection_home---4------5-----------------------" data-post-id="08927e4d2855"><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">Facing a Multithreading Tech Interview</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">Lessons from a Live Coding Session</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/@andriyveremiyenko" data-action="show-user-card" data-action-value="55eb0bd9ca57" data-action-type="hover" data-user-id="55eb0bd9ca57" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*_zSSttSTG1UslDuGUKvNvg.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Andrii Veremiienko"></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/@andriyveremiyenko" data-action="show-user-card" data-action-value="55eb0bd9ca57" data-action-type="hover" data-user-id="55eb0bd9ca57" data-collection-slug="proandroiddev" dir="auto">Andrii Veremiienko</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-10-14T05:18:54.781Z">Oct 13</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-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="14d04ea18e1a" data-index="6"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/how-to-use-koin-scopes-with-decompose-components-14d04ea18e1a?source=collection_home---4------6-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/how-to-use-koin-scopes-with-decompose-components-14d04ea18e1a?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(&quot;https://cdn-images-1.medium.com/max/800/0*eru2Zt27h8fGOHgx&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">How to use Koin scopes with Decompose components?</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-use-koin-scopes-with-decompose-components-14d04ea18e1a?source=collection_home---4------6-----------------------" data-action-source="collection_home---4------6-----------------------" data-post-id="14d04ea18e1a"><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 use Koin scopes with Decompose components?</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 I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…</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/@mikhailovskii.sergei" data-action="show-user-card" data-action-value="bc628276716f" data-action-type="hover" data-user-id="bc628276716f" data-collection-slug="proandroiddev" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*pQI7CRTSrlmr4iRF.jpg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Sergei Mikhailovskii"></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/@mikhailovskii.sergei" data-action="show-user-card" data-action-value="bc628276716f" data-action-type="hover" data-user-id="bc628276716f" data-collection-slug="proandroiddev" dir="auto">Sergei Mikhailovskii</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><time datetime="2024-11-04T21:47:34.384Z">Nov 4</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="3 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="0f621bfd06a0" data-index="7"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0?source=collection_home---4------7-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0?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(&quot;https://cdn-images-1.medium.com/max/800/1*GQIpQqipXEDa1RQm05B4Ig.jpeg&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Loading Initial Data on Android Part 2: Clear All Your Doubts</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0?source=collection_home---4------7-----------------------" data-action-source="collection_home---4------7-----------------------" data-post-id="0f621bfd06a0"><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">Loading Initial Data on Android Part 2: Clear All Your Doubts</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 a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…</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-09-20T13:34:36.468Z">Sep 20</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="8 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="10cf026739fd" data-index="8"><div class="u-lineHeightBase postItem"><a href="https://proandroiddev.com/java-and-kotlin-a-comprehensive-guide-to-new-and-key-features-across-versions-10cf026739fd?source=collection_home---4------8-----------------------" data-action="open-post" data-action-value="https://proandroiddev.com/java-and-kotlin-a-comprehensive-guide-to-new-and-key-features-across-versions-10cf026739fd?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(&quot;https://cdn-images-1.medium.com/max/800/1*yA3E5J_8MJOqw7Ng2ZCBOQ.png&quot;); background-position: 50% 50% !important;"><span class="u-textScreenReader">Java and Kotlin: A Comprehensive Guide to New and Key Features Across Versions</span></a></div><div class="col u-xs-marginBottom10 u-paddingLeft0 u-paddingRight0 u-paddingTop15 u-marginBottom30"><a class="" href="https://proandroiddev.com/java-and-kotlin-a-comprehensive-guide-to-new-and-key-features-across-versions-10cf026739fd?source=collection_home---4------8-----------------------" data-action-source="collection_home---4------8-----------------------" data-post-id="10cf026739fd"><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">Java and Kotlin: A Comprehensive Guide to New and Key Features Across Versions</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">A Version-by-Version Breakdown of Java and Kotlin Enhancements for Modern Android Development</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-10-27T19:02:40.163Z">Oct 27</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="5 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":"20241122-2326-root","currentUser":{"userId":"lo_7885dde5b3cb","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.jgL7zdhxfcJMjkJjEjB6xg.12.js","common-async":"https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.fULbttUzdHyewyAazMUYXw.12.js","hightower":"https://cdn-static-1.medium.com/_/fp/gen-js/main-hightower.bundle.NQoDXJuDHPBqR63_AdMDaA.12.js","home-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-home-screens.bundle.m76-07Q1DcEMKgEwzJjhDA.12.js","misc-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.2CLT5j6rDReEhG2bjr3NdA.12.js","notes":"https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.yrGWoeoBrJB7GBGv--gr1g.12.js","payments":"https://cdn-static-1.medium.com/_/fp/gen-js/main-payments.bundle.Cc_nfCICljMx7aW6-Pr_9w.12.js","posters":"https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.QCX6B3q-KqcSv8hiUNsQ9Q.12.js","power-readers":"https://cdn-static-1.medium.com/_/fp/gen-js/main-power-readers.bundle.nxgYPC9-BrhdicIoMMuzoA.12.js","pubs":"https://cdn-static-1.medium.com/_/fp/gen-js/main-pubs.bundle.SOwTEi0SkdYAS9MQpioQXw.12.js","stats":"https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.hA1c7rerc_dk3N05UG54qQ.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":"1732391720863:573c42df1c7","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_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_bayesian_average_pub_search":true,"enable_bg_post_post":true,"enable_billing_frequency_on_step2":"control","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_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_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_pp_country_expansion":true,"enable_pp_v4":true,"enable_pre_pp_v4":true,"enable_premium_tier":true,"enable_premium_tier_badge":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_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_update_explore_wtf":true,"enable_update_topic_portals_wtf":true,"enable_updated_pub_recs_ui":true,"enable_verifications_service":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":1,"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.jgL7zdhxfcJMjkJjEjB6xg.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":61945,"activeAt":1732248697716},"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":61945,"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":2033,"subscribersCount":12172,"promoHeadline":"","promoBody":"","replyToEmail":""},"isCurationAllowedByDefault":false,"polarisCoverImage":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"ptsQualifiedAt":1616092782276,"type":"Collection"}},"User":{"e072cea221fc":{"userId":"e072cea221fc","name":"Siddharth Gupta","username":"siddh.gupta99","createdAt":1543252064654,"imageId":"1*6rI29yuZZDr-3XD0qlJ-RQ.jpeg","backgroundImageId":"","bio":"Mobile Developer building CRED","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[29],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"6d77f07dc67":{"userId":"6d77f07dc67","name":"Katie Barnett","username":"katiebarnett5","createdAt":1517880923764,"imageId":"1*5UmMOU3BxA7gSCobglh6zw.png","backgroundImageId":"","bio":"Android GDE | Android Evangelist @ Bilue | katiebarnett.dev","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1707967430000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1704723645348,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[32,29,12,41,8,50,21,30,19,2,18,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-au","type":"User"},"4369a38c1d4f":{"userId":"4369a38c1d4f","name":"Tanya Arora","username":"tanyandroid","createdAt":1518433567762,"imageId":"1*yEkfsQNgR3VHbOT2VzHrIg.jpeg","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1623356135398,"hasCompletedProfile":true,"userDismissableFlags":[29,18,49,48,47,12,8,6,50,5,3,2,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","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"},"560f271fde33":{"userId":"560f271fde33","name":"Karishma Agrawal","username":"karishma-agr1996","createdAt":1511947635853,"imageId":"1*hp8ICXAiwBt5JdknmItJ9g.png","backgroundImageId":"","bio":"Android Developer @Eventbrite | Wanted to be a writer so I write code now | Reader","twitterScreenName":"Karishm92012666","allowNotes":1,"mediumMemberAt":1729836753000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedIosApp":1684295490600,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"subdomainCreatedAt":1602854693212,"hasCompletedProfile":false,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[32,29,12,8,5,21,4,3,2,18,1,33],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","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"},"1d8f5c41baef":{"userId":"1d8f5c41baef","name":"Dilipchandar","username":"dilipchandar89","createdAt":1640093409228,"imageId":"1*_ahsRfI76vTCn4JWIGHHGg.jpeg","backgroundImageId":"","bio":"Android Engineer, Mobile Technology Enthusiast. Seasoned Android Developer. www.linkedin.com/in/dilip-chandar-97570158","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1695314351997,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1640093410174,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":true,"isCreatorPartnerProgramEnrolled":true,"userDismissableFlags":[48,47,50,29,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"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"},"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"},"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"},"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-gb","type":"User"},"55eb0bd9ca57":{"userId":"55eb0bd9ca57","name":"Andrii Veremiienko","username":"andriyveremiyenko","createdAt":1694435243926,"imageId":"1*_zSSttSTG1UslDuGUKvNvg.jpeg","backgroundImageId":"","bio":"","twitterScreenName":"","allowNotes":1,"mediumMemberAt":1694435316000,"isWriterProgramEnrolled":true,"isSuspended":false,"firstOpenedAndroidApp":1694435355958,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":true,"userDismissableFlags":[50,29,49],"hasSeenIcelandOnboarding":true,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-us","type":"User"},"bc628276716f":{"userId":"bc628276716f","name":"Sergei Mikhailovskii","username":"mikhailovskii.sergei","createdAt":1561458583999,"imageId":"0*pQI7CRTSrlmr4iRF.jpg","backgroundImageId":"","bio":"Mobile developer @IDF Technology. Android and KMM lover, iOS enthusiast.","twitterScreenName":"","allowNotes":1,"mediumMemberAt":0,"isWriterProgramEnrolled":true,"isSuspended":false,"isMembershipTrialEligible":true,"facebookDisplayName":"","optInToIceland":true,"hasCompletedProfile":false,"userDismissableFlags":[32,29,21,19,47,12,41,8,7,5,30,36,2,10,33],"hasSeenIcelandOnboarding":false,"postSubscribeMembershipUpsellShownAt":0,"languageCode":"en-gb","type":"User"}},"Post":{"a950e6f9eb72":{"id":"a950e6f9eb72","versionId":"b007042f9c2e","creatorId":"e072cea221fc","homeCollectionId":"c72404660798","title":"Custom modifiers in Jetpack Compose","detectedLanguage":"en","latestVersion":"b007042f9c2e","latestPublishedVersion":"b007042f9c2e","hasUnpublishedEdits":false,"latestRev":293,"createdAt":1731840818531,"updatedAt":1732330459568,"acceptedAt":0,"firstPublishedAt":1732248697520,"latestPublishedAt":1732248697520,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*Oe-DGannPg34NnFtp02TjA.png","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":1222,"imageCount":2,"readingTime":4.994654088050315,"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":6,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6014,"metadata":{"postCount":6014,"coverImage":{"id":"1*9eWfzmkKPmiQFMdnt1zusQ.png","originalWidth":1500,"originalHeight":1000,"isFeatured":true}},"type":"Tag"},{"slug":"apps","name":"Apps","postCount":78072,"metadata":{"postCount":78072,"coverImage":{"id":"0*47kLDioJGA4eiyN1.jpg","originalWidth":2600,"originalHeight":1733,"isFeatured":true}},"type":"Tag"},{"slug":"development","name":"Development","postCount":112628,"metadata":{"postCount":112628,"coverImage":{"id":"1*uJKVgxbUjaG2eU2oAOvxmg.png","originalWidth":2696,"originalHeight":1742,"isFeatured":true}},"type":"Tag"},{"slug":"tech","name":"Tech","postCount":291664,"metadata":{"postCount":291664,"coverImage":{"id":"0*Zs_B6zDXGdgkK2jv","originalWidth":5120,"originalHeight":2880,"isFeatured":true,"unsplashPhotoId":"_nWaeTF6qo0"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://www.youtube.com/watch?v=BjGX2RftXsU","alts":[],"httpStatus":200},{"url":"https://engineering.teknasyon.com/composable-modifier-vs-composed-factory-in-jetpack-compose-6cbb675b0e7b","alts":[{"type":3,"url":"medium://p/6cbb675b0e7b"},{"type":2,"url":"medium://p/6cbb675b0e7b"}],"httpStatus":200}],"version":"0.3","generatedAt":1732248698316},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":60,"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":"custom-modifiers-in-jetpack-compose","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"custom-modifiers-in-jetpack-compose-a950e6f9eb72","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*Oe-DGannPg34NnFtp02TjA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"4e92","type":3,"text":"Custom modifiers in Jetpack Compose","markups":[],"alignment":1},{"name":"3a16","type":1,"text":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…"},"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":"4e92","type":3,"text":"Custom modifiers in Jetpack Compose","markups":[]},{"name":"a4f2","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*Oe-DGannPg34NnFtp02TjA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"3a16","type":1,"text":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the appearance, behaviour, and layout of composable functions without changing their core implementation.","markups":[]},{"name":"a300","type":3,"text":"Key aspects of modifiers:","markups":[]},{"name":"87fb","type":9,"text":"Chainable: Modifiers can be chained together, allowing for multiple modifications to be applied sequentially.","markups":[{"type":1,"start":0,"end":10}]},{"name":"6e91","type":9,"text":"Reusable: Custom modifiers can…","markups":[{"type":1,"start":0,"end":9}]}],"sections":[{"name":"460f","startIndex":0}]},"isFullContent":false,"subtitle":"Modifiers in Jetpack Compose are a powerful tool for customising and enhancing UI components. They allow developers to modify the…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"2dcc4db2f76c":{"id":"2dcc4db2f76c","versionId":"46e46cbd277b","creatorId":"6d77f07dc67","homeCollectionId":"c72404660798","title":"Widgets With Glance: Beyond String States","detectedLanguage":"en","latestVersion":"46e46cbd277b","latestPublishedVersion":"46e46cbd277b","hasUnpublishedEdits":false,"latestRev":913,"createdAt":1731922725319,"updatedAt":1732244286217,"acceptedAt":0,"firstPublishedAt":1732172633504,"latestPublishedAt":1732181134034,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Use a custom GlanceStateDefinition to manage your widget state","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*CRseHrplJF6Df_UEDsD73g.jpeg","filter":"","backgroundSize":"","originalWidth":1792,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":1137,"imageCount":4,"readingTime":4.990566037735849,"subtitle":"Use a custom GlanceStateDefinition to manage your widget state","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":2,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-glance","name":"Jetpack Glance","postCount":20,"metadata":{"postCount":20,"coverImage":{"id":"1*CRseHrplJF6Df_UEDsD73g.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"widget","name":"Widget","postCount":1730,"metadata":{"postCount":1730,"coverImage":{"id":"1*CRseHrplJF6Df_UEDsD73g.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"state-management","name":"State Management","postCount":3732,"metadata":{"postCount":3732,"coverImage":{"id":"1*3nU2fwxJNvRImqX86dj0dw.png","originalWidth":2162,"originalHeight":396,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://chatgpt.com/","alts":[],"httpStatus":403},{"url":"https://stackoverflow.com/a/77095689","alts":[],"httpStatus":200},{"url":"https://play.google.com/store/apps/details?id=dev.veryniche.buckaroo","alts":[],"httpStatus":200},{"url":"https://github.com/android/user-interface-samples/tree/main/AppWidget/app/src/main/java/com/example/android/appwidget/glance/weather","alts":[],"httpStatus":200},{"url":"https://github.com/KatieBarnett/MotivateMe/tree/blog/CustomGlanceStateDefinition","alts":[],"httpStatus":200},{"url":"https://medium.com/proandroiddev/widgets-with-glance-standing-out-33834eee2dee","alts":[{"type":3,"url":"medium://p/33834eee2dee"},{"type":2,"url":"medium://p/33834eee2dee"}],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/glance/glance-app-widget","alts":[],"httpStatus":200},{"url":"https://medium.com/proandroiddev/widgets-with-glance-blending-in-ae1e52a6cb6f","alts":[{"type":2,"url":"medium://p/ae1e52a6cb6f"},{"type":3,"url":"medium://p/ae1e52a6cb6f"}],"httpStatus":200}],"version":"0.3","generatedAt":1732181135181},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":10,"sectionCount":3,"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":"widgets-with-glance-beyond-string-states","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"widgets-with-glance-beyond-string-states-2dcc4db2f76c","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*CRseHrplJF6Df_UEDsD73g.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},{"name":"7ad1","type":3,"text":"Widgets With Glance: Beyond String States","markups":[],"alignment":1},{"name":"2aba","type":13,"text":"Use a custom GlanceStateDefinition to manage your widget…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Use a custom GlanceStateDefinition to manage your widget state"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"29accbb1bb50","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":"7ad1","type":3,"text":"Widgets With Glance: Beyond String States","markups":[]},{"name":"2aba","type":13,"text":"Use a custom GlanceStateDefinition to manage your widget state","markups":[]},{"name":"5e8d","type":1,"text":"This the next in my series of blog posts all about widgets. Check out Widgets with Glance: Blending in and Widgets with Glance: Standing out for some Widget UI tricks and tips.","markups":[{"type":3,"start":70,"end":102,"href":"https://medium.com/proandroiddev/widgets-with-glance-blending-in-ae1e52a6cb6f","title":"","rel":"","anchorType":0},{"type":3,"start":107,"end":140,"href":"https://medium.com/proandroiddev/widgets-with-glance-standing-out-33834eee2dee","title":"","rel":"","anchorType":0},{"type":2,"start":0,"end":176}]},{"name":"653e","type":4,"text":"Image created by ChatGPT.","markups":[{"type":3,"start":17,"end":24,"href":"https://chatgpt.com/","title":"","rel":"","anchorType":0}],"layout":1,"metadata":{"id":"1*CRseHrplJF6Df_UEDsD73g.jpeg","originalWidth":1792,"originalHeight":1024,"isFeatured":true}},{"name":"97a4","type":1,"text":"I have recently been working on an app (Pay Day: Earnings Time Tracker) that includes a lot of…","markups":[{"type":10,"start":230,"end":262},{"type":10,"start":364,"end":371},{"type":10,"start":397,"end":402},{"type":10,"start":405,"end":410},{"type":3,"start":40,"end":70,"href":"https://play.google.com/store/apps/details?id=dev.veryniche.buckaroo","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"da73","startIndex":0},{"name":"e92b","startIndex":3}]},"isFullContent":false,"subtitle":"Use a custom GlanceStateDefinition to manage your widget state"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"aa0760383569":{"id":"aa0760383569","versionId":"07c66affabb8","creatorId":"4369a38c1d4f","homeCollectionId":"c72404660798","title":"Exploring Kotlin Coroutines through Output Questions","detectedLanguage":"en","latestVersion":"07c66affabb8","latestPublishedVersion":"07c66affabb8","hasUnpublishedEdits":false,"latestRev":453,"createdAt":1730717170973,"updatedAt":1732086615978,"acceptedAt":0,"firstPublishedAt":1731738465538,"latestPublishedAt":1732086615978,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*qgzGgrMeE9raugNDYbsfVQ.png","filter":"","backgroundSize":"","originalWidth":924,"originalHeight":485,"strategy":"resample","height":0,"width":0},"wordCount":2382,"imageCount":1,"readingTime":9.188679245283017,"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":17,"isBookmarked":false,"tags":[{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin-coroutines","name":"Kotlin Coroutines","postCount":1569,"metadata":{"postCount":1569,"coverImage":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"programming","name":"Programming","postCount":446511,"metadata":{"postCount":446511,"coverImage":{"id":"1*YUIhHmZyuEn92w2azqpfXg.jpeg","originalWidth":1280,"originalHeight":1280}},"type":"Tag"},{"slug":"asynchronous","name":"Asynchronous","postCount":4665,"metadata":{"postCount":4665,"coverImage":{"id":"1*W0G_upXTYxYppLE7evdWlw.png","originalWidth":512,"originalHeight":361,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://tanyatechzone.com/2024/05/15/composing-suspend-functions/","alts":[],"httpStatus":200},{"url":"https://tanyatechzone.com/2024/02/15/kotlin-coroutines/","alts":[],"httpStatus":200},{"url":"https://tanyatechzone.com/2024/03/15/coroutine-cancellation-and-timeouts/","alts":[],"httpStatus":200},{"url":"https://tanyatechzone.com/2024/06/26/exploring-coroutinecontext/","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1732086616474},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":99,"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":"exploring-kotlin-coroutines-through-output-questions","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"exploring-kotlin-coroutines-through-output-questions-aa0760383569","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*qgzGgrMeE9raugNDYbsfVQ.png","originalWidth":924,"originalHeight":485,"isFeatured":true}},{"name":"c941","type":3,"text":"Exploring Kotlin Coroutines through Output Questions","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"03eae46e496b","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":"c941","type":3,"text":"Exploring Kotlin Coroutines through Output Questions","markups":[]},{"name":"d3fd","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*qgzGgrMeE9raugNDYbsfVQ.png","originalWidth":924,"originalHeight":485,"isFeatured":true}},{"name":"afa2","type":1,"text":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct scenario, allowing us to understand and reinforce our knowledge of coroutine concepts. By exploring and analyzing the outputs, we gain a deeper understanding of the behavior and…","markups":[]}],"sections":[{"name":"2994","startIndex":0}]},"isFullContent":false,"subtitle":"In this unique blog, we delve into the world of Kotlin coroutines through a series of output questions. Each question presents a distinct…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"e4e03aef765f":{"id":"e4e03aef765f","versionId":"535262401917","creatorId":"9bb203a4ab2e","homeCollectionId":"c72404660798","title":"A Developer’s Roadmap to Mastering Kotlin Multiplatform","detectedLanguage":"en","latestVersion":"535262401917","latestPublishedVersion":"535262401917","hasUnpublishedEdits":false,"latestRev":199,"createdAt":1731675335935,"updatedAt":1731739693071,"acceptedAt":0,"firstPublishedAt":1731683431866,"latestPublishedAt":1731739692993,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"In modern mobile development, cross-platform frameworks are gaining popularity because they offer key advantages, such as reducing the…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*D-ieHZMS5IWWRJUG","filter":"","backgroundSize":"","originalWidth":1800,"originalHeight":1013,"strategy":"resample","height":0,"width":0},"wordCount":2460,"imageCount":4,"readingTime":9.983018867924528,"subtitle":"In modern mobile development, cross-platform frameworks are gaining popularity because they offer key advantages, such as reducing the…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":60,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"multiplatform","name":"Multiplatform","postCount":385,"metadata":{"postCount":385,"coverImage":{"id":"0*D-ieHZMS5IWWRJUG","originalWidth":1800,"originalHeight":1013,"isFeatured":true}},"type":"Tag"},{"slug":"kmp","name":"Kmp","postCount":177,"metadata":{"postCount":177,"coverImage":{"id":"0*D-ieHZMS5IWWRJUG","originalWidth":1800,"originalHeight":1013,"isFeatured":true}},"type":"Tag"},{"slug":"roadmaps","name":"Roadmap","postCount":0,"metadata":{"postCount":0,"coverImage":{"id":"0*f2gAzJOpxA6Usrs1.","originalWidth":595,"originalHeight":589}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"https://blog.jetbrains.com/kotlin/2024/10/kotlin-multiplatform-development-roadmap-for-2025/","alts":[],"httpStatus":200},{"url":"https://ktor.io/","alts":[],"httpStatus":200},{"url":"https://www.jetbrains.com/","alts":[],"httpStatus":200},{"url":"https://getstream.io/blog/kotlin-multiplatform-roadmap/","alts":[],"httpStatus":200},{"url":"https://getstream.io/blog/build-app-kotlin-multiplatform/","alts":[],"httpStatus":200},{"url":"https://reactivex.io/","alts":[],"httpStatus":200},{"url":"https://reactnative.dev/","alts":[],"httpStatus":200},{"url":"https://twitter.com/getstream_io","alts":[],"httpStatus":200},{"url":"https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform","alts":[],"httpStatus":200},{"url":"https://twitter.com/github_skydoves","alts":[],"httpStatus":200},{"url":"https://flutter.dev/","alts":[],"httpStatus":200},{"url":"https://developer.android.com/jetpack/androidx/releases/datastore","alts":[],"httpStatus":200},{"url":"https://kmp.jetbrains.com/","alts":[],"httpStatus":200},{"url":"https://github.com/skydoves","alts":[],"httpStatus":200},{"url":"https://github.com/Kotlin/kotlinx.serialization","alts":[],"httpStatus":200},{"url":"https://developer.android.com/jetpack/androidx/releases/annotation","alts":[],"httpStatus":200},{"url":"https://github.com/android/kotlin-multiplatform-samples","alts":[],"httpStatus":200},{"url":"https://github.com/skydoves/kmp-developer-roadmap","alts":[],"httpStatus":200},{"url":"https://github.com/sqldelight/sqldelight","alts":[],"httpStatus":200},{"url":"https://www.jetbrains.com/compose-multiplatform/","alts":[],"httpStatus":200},{"url":"https://github.com/square/moshi","alts":[],"httpStatus":200},{"url":"https://github.com/Kamel-Media/Kamel","alts":[],"httpStatus":200},{"url":"https://github.com/Kotlin/kotlinx-datetime","alts":[],"httpStatus":200},{"url":"https://github.com/coil-kt/coil","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/multiplatform.html","alts":[],"httpStatus":200},{"url":"https://github.com/qdsfdhvh/compose-imageloader","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/coroutines-overview.html","alts":[],"httpStatus":200},{"url":"https://github.com/JetBrains/compose-multiplatform","alts":[],"httpStatus":200},{"url":"https://github.com/skydoves/landscapist","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/docs/multiplatform-expect-actual.html","alts":[],"httpStatus":200},{"url":"https://github.com/google/gson","alts":[],"httpStatus":200},{"url":"https://developer.android.com/jetpack/androidx/releases/paging","alts":[],"httpStatus":200},{"url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","alts":[],"httpStatus":200},{"url":"https://developer.android.com/compose","alts":[],"httpStatus":200},{"url":"https://github.com/Foso/Ktorfit","alts":[],"httpStatus":200},{"url":"https://github.com/badoo/Reaktive","alts":[],"httpStatus":200},{"url":"https://developer.android.com/kotlin/multiplatform","alts":[],"httpStatus":200},{"url":"https://developer.android.com/jetpack/androidx/releases/collection","alts":[],"httpStatus":200},{"url":"https://developer.android.com/jetpack/androidx/releases/room","alts":[],"httpStatus":200},{"url":"https://developer.android.com/kotlin/multiplatform#supported-platforms","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1731739694605},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":310,"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":"a-developers-roadmap-to-mastering-kotlin-multiplatform","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"a-developers-roadmap-to-mastering-kotlin-multiplatform-e4e03aef765f","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*D-ieHZMS5IWWRJUG","originalWidth":1800,"originalHeight":1013,"isFeatured":true}},{"name":"210b","type":3,"text":"A Developer’s Roadmap to Mastering Kotlin Multiplatform","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"In modern mobile development, cross-platform frameworks are gaining popularity because they offer key advantages, such as reducing the…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"c1a40c49a8cb","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":"ad64","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"0*D-ieHZMS5IWWRJUG","originalWidth":1800,"originalHeight":1013,"isFeatured":true}},{"name":"210b","type":3,"text":"A Developer’s Roadmap to Mastering Kotlin Multiplatform","markups":[]},{"name":"139f","type":1,"text":"In modern mobile development, cross-platform frameworks are gaining popularity because they offer key advantages, such as reducing the resources needed to develop separate native apps and maintaining code consistency across different platforms.","markups":[]},{"name":"cf12","type":1,"text":"By allowing developers to write shareable code, these frameworks enable faster development and easier maintenance, making them attractive…","markups":[]}],"sections":[{"name":"3c75","startIndex":0}]},"isFullContent":false,"subtitle":"In modern mobile development, cross-platform frameworks are gaining popularity because they offer key advantages, such as reducing the…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"abb4632d0b47":{"id":"abb4632d0b47","versionId":"0095364dc637","creatorId":"560f271fde33","homeCollectionId":"c72404660798","title":"Collapsing Toolbar in Compose— PART 2","detectedLanguage":"en","latestVersion":"0095364dc637","latestPublishedVersion":"0095364dc637","hasUnpublishedEdits":false,"latestRev":1208,"createdAt":1731145971702,"updatedAt":1731845967161,"acceptedAt":0,"firstPublishedAt":1731563357357,"latestPublishedAt":1731637055917,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Introduction","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*khPFw1H7giplcH42MXQfFw.png","filter":"","backgroundSize":"","originalWidth":3600,"originalHeight":900,"strategy":"resample","height":0,"width":0},"wordCount":2315,"imageCount":9,"readingTime":9.935849056603773,"subtitle":"Introduction","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":15,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"compose","name":"Compose","postCount":1017,"metadata":{"postCount":1017,"coverImage":{"id":"0*D93jriU2RFT12oYQ.jpeg","originalWidth":1400,"originalHeight":933,"isFeatured":true}},"type":"Tag"},{"slug":"scroll","name":"Scroll","postCount":1196,"metadata":{"postCount":1196,"coverImage":{"id":"1*khPFw1H7giplcH42MXQfFw.png","originalWidth":3600,"originalHeight":900}},"type":"Tag"},{"slug":"nestedscrollconnection","name":"Nestedscrollconnection","postCount":2,"metadata":{"postCount":2,"coverImage":{"id":"1*khPFw1H7giplcH42MXQfFw.png","originalWidth":3600,"originalHeight":900}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://medium.com/@niranjanky14/nested-scrolling-in-compose-key-concepts-steps-7603cc4c5be5","alts":[{"type":3,"url":"medium://p/7603cc4c5be5"},{"type":2,"url":"medium://p/7603cc4c5be5"}],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/layouts/custom","alts":[],"httpStatus":200},{"url":"https://github.com/mazzouzi/collapsing-toolbar-with-parallax-effect-and-curved-motion-in-compose","alts":[],"httpStatus":200},{"url":"https://proandroiddev.com/mastering-scroll-in-jetpack-compose-part-1-7bacefce436e#e62c-f7d9ba16a21c","alts":[{"type":3,"url":"medium://p/7bacefce436e"},{"type":2,"url":"medium://p/7bacefce436e"}],"httpStatus":200},{"url":"https://www.linkedin.com/in/karishma-agrawal-she-her-06966a126/","alts":[],"httpStatus":999},{"url":"https://medium.com/kotlin-and-kotlin-for-android/collapsing-toolbar-in-jetpack-compose-a-closer-look-at-the-toolbar-part-2-45593feca5b2","alts":[{"type":2,"url":"medium://p/45593feca5b2"},{"type":3,"url":"medium://p/45593feca5b2"}],"httpStatus":200}],"version":"0.3","generatedAt":1731637056837},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":37,"sectionCount":4,"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":"collapsing-toolbar-in-compose-part-2","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":2,"uniqueSlug":"collapsing-toolbar-in-compose-part-2-abb4632d0b47","previewContent":{"bodyModel":{"paragraphs":[{"name":"4cd7","type":3,"text":"Collapsing Toolbar in Compose— PART 2","markups":[{"type":2,"start":0,"end":37}],"alignment":1},{"name":"ca7b","type":4,"text":"","markups":[],"layout":10,"metadata":{"id":"1*khPFw1H7giplcH42MXQfFw.png","originalWidth":3600,"originalHeight":900}},{"name":"f0bf","type":3,"text":"Introduction","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Introduction"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"3688d4bad225","webCanonicalUrl":"","mediumUrl":"","migrationId":"","notifyFollowers":true,"notifyTwitter":true,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":true,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isEligibleForRevenue":true,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":1,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"mongerRequestType":1,"layerCake":6,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","curationEligibleAt":1731845967090,"isProxyPost":false,"proxyPostFaviconUrl":"","proxyPostProviderName":"","proxyPostType":0,"isSuspended":false,"isLimitedState":false,"seoTitle":"","previewContent2":{"bodyModel":{"paragraphs":[{"name":"4cd7","type":3,"text":"Collapsing Toolbar in Compose— PART 2","markups":[{"type":2,"start":0,"end":37}]},{"name":"ca7b","type":4,"text":"","markups":[],"layout":5,"metadata":{"id":"1*khPFw1H7giplcH42MXQfFw.png","originalWidth":3600,"originalHeight":900}},{"name":"f0bf","type":3,"text":"Introduction","markups":[]},{"name":"e7e6","type":1,"text":"Creating smooth, responsive user experiences in modern UI development often involves complex scrolling interactions. One common requirement is nested scrolling, where a scrollable component is embedded within another. Jetpack Compose, with its declarative approach, provides an elegant way to handle such interactions.","markups":[]},{"name":"8e43","type":1,"text":"In PART 1 of this article, we covered…","markups":[{"type":1,"start":3,"end":9},{"type":1,"start":96,"end":102}]}],"sections":[{"name":"d3ce","startIndex":0}]},"isFullContent":false,"subtitle":"Introduction"},"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":7,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12100,"metadata":{"postCount":12100,"coverImage":{"id":"1*ypwQP-qbAWOmO24P5y9ozA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"android-architecture","name":"Android Architecture","postCount":528,"metadata":{"postCount":528,"coverImage":{"id":"1*xcshg-xnyCBIcCOuftcJIg.jpeg","originalWidth":1024,"originalHeight":1024,"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":14,"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"},"36d9d973a21f":{"id":"36d9d973a21f","versionId":"767ed60c9fc9","creatorId":"1d8f5c41baef","homeCollectionId":"c72404660798","title":"SonarQube in Android — Implementation tips and challenges faced","detectedLanguage":"en","latestVersion":"767ed60c9fc9","latestPublishedVersion":"767ed60c9fc9","hasUnpublishedEdits":false,"latestRev":773,"createdAt":1731312542589,"updatedAt":1731528607154,"acceptedAt":0,"firstPublishedAt":1731323656282,"latestPublishedAt":1731338425299,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Introduction:","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*Qb_6n_mQxOyOTuuf48s9XQ.png","filter":"","backgroundSize":"","originalWidth":1572,"originalHeight":596,"strategy":"resample","height":0,"width":0},"wordCount":868,"imageCount":4,"readingTime":3.975471698113208,"subtitle":"Introduction:","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":9,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"},{"slug":"sonarqube","name":"Sonarqube","postCount":1350,"metadata":{"postCount":1350,"coverImage":{"id":"1*0DQ2ey6ZjLwvgJcQSOl9kQ.png","originalWidth":1873,"originalHeight":860,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12100,"metadata":{"postCount":12100,"coverImage":{"id":"1*ypwQP-qbAWOmO24P5y9ozA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"software-tools","name":"Software Tools","postCount":417,"metadata":{"postCount":417,"coverImage":{"id":"1*ZHKgJ-YpR4ERofswLDw1mw.png","originalWidth":1715,"originalHeight":1114,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://www.docker.com/?source=post_page-----7d11e2ef6932--------------------------------","alts":[],"httpStatus":200},{"url":"https://buymeacoffee.com/dilipchandar","alts":[],"httpStatus":200},{"url":"https://www.sonarsource.com/products/sonarqube/downloads/?source=post_page-----7d11e2ef6932--------------------------------","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/dilip-chandar-97570158?","alts":[],"httpStatus":999},{"url":"https://medium.com/@niranjanky14/sonarqube-tutorial-for-getting-started-in-android-app-7d11e2ef6932","alts":[{"type":3,"url":"medium://p/7d11e2ef6932"},{"type":2,"url":"medium://p/7d11e2ef6932"}],"httpStatus":200}],"version":"0.3","generatedAt":1731338426293},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":26,"sectionCount":4,"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":"sonarqube-in-android-implementation-tips-and-challenges-faced","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":false,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"sonarqube-in-android-implementation-tips-and-challenges-faced-36d9d973a21f","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*Qb_6n_mQxOyOTuuf48s9XQ.png","originalWidth":1572,"originalHeight":596,"isFeatured":true}},{"name":"c9ec","type":3,"text":"SonarQube in Android — Implementation tips and challenges faced","markups":[],"alignment":1},{"name":"ac9b","type":3,"text":"Introduction:","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Introduction:"},"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":"c9ec","type":3,"text":"SonarQube in Android — Implementation tips and challenges faced","markups":[]},{"name":"3b93","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*Qb_6n_mQxOyOTuuf48s9XQ.png","originalWidth":1572,"originalHeight":596,"isFeatured":true}},{"name":"ac9b","type":3,"text":"Introduction:","markups":[]},{"name":"2ec1","type":1,"text":"SonarQube is an open-source tool that helps developers and teams improve the quality of their code:","markups":[]},{"name":"f0d2","type":9,"text":"Code quality analysis: Analyzes code quality for over 30 languages, frameworks, and IaC platforms","markups":[{"type":1,"start":0,"end":21}]},{"name":"789f","type":9,"text":"Automatic reviews: Performs automatic reviews with static analysis of code to detect bugs and code smells","markups":[{"type":1,"start":0,"end":17}]},{"name":"b4de","type":9,"text":"Integration with DevOps platforms…","markups":[{"type":1,"start":0,"end":33}]}],"sections":[{"name":"ae7d","startIndex":0}]},"isFullContent":false,"subtitle":"Introduction:"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"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":103,"isBookmarked":false,"tags":[{"slug":"androiddev","name":"AndroidDev","postCount":12100,"metadata":{"postCount":12100,"coverImage":{"id":"1*ypwQP-qbAWOmO24P5y9ozA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin-coroutines","name":"Kotlin Coroutines","postCount":1569,"metadata":{"postCount":1569,"coverImage":{"id":"1*Bhfzsp01NibPkNYmWy9YyA.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"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":495,"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"},"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":71,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6014,"metadata":{"postCount":6014,"coverImage":{"id":"1*9eWfzmkKPmiQFMdnt1zusQ.png","originalWidth":1500,"originalHeight":1000,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12100,"metadata":{"postCount":12100,"coverImage":{"id":"1*ypwQP-qbAWOmO24P5y9ozA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"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":462,"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"},"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":61,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"gradle","name":"Gradle","postCount":2906,"metadata":{"postCount":2906,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12100,"metadata":{"postCount":12100,"coverImage":{"id":"1*ypwQP-qbAWOmO24P5y9ozA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":8,"links":{"entries":[],"version":"0.3","generatedAt":1730765589446},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":198,"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"},"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":44,"isBookmarked":false,"tags":[{"slug":"viewmodel","name":"Viewmodel","postCount":632,"metadata":{"postCount":632,"coverImage":{"id":"1*_tefJfVrG10f1-Imn8nfHA.png","originalWidth":1060,"originalHeight":602,"isFeatured":true}},"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":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"performance","name":"Performance","postCount":28889,"metadata":{"postCount":28889,"coverImage":{"id":"1*vbDT7Qz5VO62kSp_4AooVw.jpeg","originalWidth":1280,"originalHeight":1280}},"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":212,"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"},"138d3496c624":{"id":"138d3496c624","versionId":"fd00f9dcead7","creatorId":"727137e47bff","homeCollectionId":"c72404660798","title":"Animation and Masking in Jetpack Compose with the grahpicsLayer() and Drawing Modifiers","detectedLanguage":"en","latestVersion":"fd00f9dcead7","latestPublishedVersion":"fd00f9dcead7","hasUnpublishedEdits":false,"latestRev":2990,"createdAt":1725184536740,"updatedAt":1731742991332,"acceptedAt":0,"firstPublishedAt":1727039330503,"latestPublishedAt":1727039330503,"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":2683,"imageCount":13,"readingTime":11.524528301886793,"subtitle":"Using the graphicsLayer(), CompositingStrategy and drawing modifiers for masking and animating content in Jetpack Compose.","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":47,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6014,"metadata":{"postCount":6014,"coverImage":{"id":"1*9eWfzmkKPmiQFMdnt1zusQ.png","originalWidth":1500,"originalHeight":1000,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"animation","name":"Animation","postCount":27598,"metadata":{"postCount":27598,"coverImage":{"id":"1*ae5yz8vxTp95Vlg9H7Xvqg.jpeg","originalWidth":1920,"originalHeight":1080,"isFeatured":true,"focusPercentX":49,"focusPercentY":30}},"type":"Tag"},{"slug":"mobile-development","name":"Mobile Development","postCount":3406,"metadata":{"postCount":3406,"coverImage":{"id":"1*_eYkK2pW9UkTYbsR2BoXmQ.png","originalWidth":1920,"originalHeight":1080,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"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/animation/choose-api","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/custom-modifiers#chain-existing","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/phases","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/TweenSpec","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/graphics/draw/modifiers#graphics-modifiers","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/reference/kotlin/androidx/compose/animation/core/InfiniteTransition","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/animation/core/Animatable","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#drawwithcontent","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/package-summary#LinearEasing()","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1727039333239},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":234,"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"},"08927e4d2855":{"id":"08927e4d2855","versionId":"48b1fd128257","creatorId":"55eb0bd9ca57","homeCollectionId":"c72404660798","title":"Facing a Multithreading Tech Interview","detectedLanguage":"en","latestVersion":"48b1fd128257","latestPublishedVersion":"48b1fd128257","hasUnpublishedEdits":false,"latestRev":942,"createdAt":1727075511796,"updatedAt":1731649338238,"acceptedAt":0,"firstPublishedAt":1728883134781,"latestPublishedAt":1728883134781,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"Lessons from a Live Coding Session","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*wnibk_XT8sI6BUCk","filter":"","backgroundSize":"","originalWidth":6000,"originalHeight":4000,"strategy":"resample","height":0,"width":0},"wordCount":795,"imageCount":1,"readingTime":3.2,"subtitle":"Lessons from a Live Coding Session","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":32,"isBookmarked":false,"tags":[{"slug":"coroutine","name":"Coroutine","postCount":1639,"metadata":{"postCount":1639,"coverImage":{"id":"1*W0G_upXTYxYppLE7evdWlw.png","originalWidth":512,"originalHeight":361,"isFeatured":true}},"type":"Tag"},{"slug":"multithreading","name":"Multithreading","postCount":2807,"metadata":{"postCount":2807,"coverImage":{"id":"1*YxdPApzQaYl7xsXADJplew.jpeg","originalWidth":512,"originalHeight":512,"isFeatured":true}},"type":"Tag"},{"slug":"tech-interview","name":"Tech Interview","postCount":943,"metadata":{"postCount":943,"coverImage":{"id":"0*wnibk_XT8sI6BUCk","originalWidth":6000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"49CyfcBLDY8"}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":2,"links":{"entries":[{"url":"https://unsplash.com?utm_source=medium&utm_medium=referral","alts":[],"httpStatus":200},{"url":"https://unsplash.com/@mineral_of_demon?utm_source=medium&utm_medium=referral","alts":[],"httpStatus":200}],"version":"0.3","generatedAt":1728883135275},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":183,"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":"facing-a-multithreading-tech-interview","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"facing-a-multithreading-tech-interview-08927e4d2855","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*wnibk_XT8sI6BUCk","originalWidth":6000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"49CyfcBLDY8"}},{"name":"e0cc","type":3,"text":"Facing a Multithreading Tech Interview","markups":[],"alignment":1},{"name":"1230","type":13,"text":"Lessons from a Live Coding Session","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"Lessons from a Live Coding Session"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"d0d6546383c8","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":"f8c3","type":4,"text":"Photo by Nastia Petruk on Unsplash","markups":[{"type":3,"start":9,"end":22,"href":"https://unsplash.com/@mineral_of_demon?utm_source=medium&utm_medium=referral","title":"","rel":"photo-creator","anchorType":0},{"type":3,"start":26,"end":34,"href":"https://unsplash.com?utm_source=medium&utm_medium=referral","title":"","rel":"photo-source","anchorType":0}],"layout":3,"metadata":{"id":"0*wnibk_XT8sI6BUCk","originalWidth":6000,"originalHeight":4000,"isFeatured":true,"unsplashPhotoId":"49CyfcBLDY8"}},{"name":"e0cc","type":3,"text":"Facing a Multithreading Tech Interview","markups":[]},{"name":"1230","type":13,"text":"Lessons from a Live Coding Session","markups":[]},{"name":"aad9","type":3,"text":"Motivation","markups":[]},{"name":"f35b","type":1,"text":"I’ve recently gone through several interesting tech interviews and one of the new challenges for me was a multithreading interview. It was a one-hour live-coding session where I had to solve typical Android multithreading issues. Even though I have experience with threads and coroutines, it was still a challenge. The…","markups":[]}],"sections":[{"name":"f491","startIndex":0}]},"isFullContent":false,"subtitle":"Lessons from a Live Coding Session"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"14d04ea18e1a":{"id":"14d04ea18e1a","versionId":"a3582a2f2c9c","creatorId":"bc628276716f","homeCollectionId":"c72404660798","title":"How to use Koin scopes with Decompose components?","detectedLanguage":"en","latestVersion":"a3582a2f2c9c","latestPublishedVersion":"a3582a2f2c9c","hasUnpublishedEdits":false,"latestRev":357,"createdAt":1730751602511,"updatedAt":1731555714796,"acceptedAt":0,"firstPublishedAt":1730756854384,"latestPublishedAt":1731055011050,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"0*eru2Zt27h8fGOHgx","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":552,"imageCount":2,"readingTime":2.4663522012578616,"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":8,"isBookmarked":false,"tags":[{"slug":"kotlin-multiplatform","name":"Kotlin Multiplatform","postCount":1385,"metadata":{"postCount":1385,"coverImage":{"id":"1*8kMaRJPi-HkK7N_ccEyAGw.png","originalWidth":470,"originalHeight":266,"isFeatured":true}},"type":"Tag"},{"slug":"koin","name":"Koin","postCount":564,"metadata":{"postCount":564,"coverImage":{"id":"1*8kMaRJPi-HkK7N_ccEyAGw.png","originalWidth":470,"originalHeight":266,"isFeatured":true}},"type":"Tag"},{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12100,"metadata":{"postCount":12100,"coverImage":{"id":"1*ypwQP-qbAWOmO24P5y9ozA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://insert-koin.io/docs/reference/koin-core/scopes/#what-is-a-scope","alts":[],"httpStatus":200},{"url":"https://www.linkedin.com/in/sergei-mikhailovskii-bb4951158/","alts":[],"httpStatus":999}],"version":"0.3","generatedAt":1731055011801},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":69,"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":"how-to-use-koin-scopes-with-decompose-components","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"how-to-use-koin-scopes-with-decompose-components-14d04ea18e1a","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"0*eru2Zt27h8fGOHgx","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"43ea","type":3,"text":"How to use Koin scopes with Decompose components?","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…"},"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":"43ea","type":3,"text":"How to use Koin scopes with Decompose components?","markups":[]},{"name":"05f5","type":4,"text":"Image generated by ChatGPT","markups":[],"layout":1,"metadata":{"id":"0*eru2Zt27h8fGOHgx","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"ebe7","type":1,"text":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by using scopes in Koin. Let me show the problem at the beginning. We have two components that represent whole screens — list screen component…","markups":[]}],"sections":[{"name":"a37d","startIndex":0}]},"isFullContent":false,"subtitle":"In this article I’d like to share the approach of how I resolved the issue with the registration of the big amount of named dependencies by…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":false,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"0f621bfd06a0":{"id":"0f621bfd06a0","versionId":"0e52a39e2ad0","creatorId":"9bb203a4ab2e","homeCollectionId":"c72404660798","title":"Loading Initial Data on Android Part 2: Clear All Your Doubts","detectedLanguage":"en","latestVersion":"0e52a39e2ad0","latestPublishedVersion":"0e52a39e2ad0","hasUnpublishedEdits":false,"latestRev":1749,"createdAt":1726737055130,"updatedAt":1731748747397,"acceptedAt":0,"firstPublishedAt":1726839276468,"latestPublishedAt":1727080043089,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*GQIpQqipXEDa1RQm05B4Ig.jpeg","filter":"","backgroundSize":"","originalWidth":3000,"originalHeight":2000,"strategy":"resample","height":0,"width":0},"wordCount":1757,"imageCount":5,"readingTime":7.463522012578616,"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":111,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack","name":"Jetpack","postCount":1441,"metadata":{"postCount":1441,"coverImage":{"id":"1*oUI6LjDJWABc8DVRmcV8qg.png","originalWidth":1640,"originalHeight":924,"isFeatured":true}},"type":"Tag"},{"slug":"compose","name":"Compose","postCount":1017,"metadata":{"postCount":1017,"coverImage":{"id":"0*D93jriU2RFT12oYQ.jpeg","originalWidth":1400,"originalHeight":933,"isFeatured":true}},"type":"Tag"},{"slug":"jetpack-compose","name":"Jetpack Compose","postCount":6014,"metadata":{"postCount":6014,"coverImage":{"id":"1*9eWfzmkKPmiQFMdnt1zusQ.png","originalWidth":1500,"originalHeight":1000,"isFeatured":true}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":7,"links":{"entries":[{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt;l=122?q=defaultViewModelProviderFactory&start=21","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:lifecycle/lifecycle-viewmodel-savedstate/src/androidMain/kotlin/androidx/lifecycle/SavedStateViewModelFactory.android.kt;l=42?q=SavedStateViewModelFactory&sq=","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:hilt/hilt-navigation/src/main/java/androidx/hilt/navigation/HiltNavBackStackEntry.kt;l=43?q=navBackStackEntry.defaultViewModelProviderFactory","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavHost.kt;l=551?q=visibleEntries.lastOrNull()","alts":[],"httpStatus":200},{"url":"https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt;l=74?q=NavBackStackEntry","alts":[],"httpStatus":200},{"url":"https://dagger.dev/hilt/view-model","alts":[],"httpStatus":200},{"url":"https://dagger.dev/api/latest/dagger/hilt/android/ViewModelLifecycle.html","alts":[],"httpStatus":200},{"url":"https://github.com/doveletter","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/mental-model#parallel","alts":[],"httpStatus":200},{"url":"https://github.com/skydoves/pokedex-compose","alts":[],"httpStatus":200},{"url":"https://github.com/google/dagger/blob/5f761866468cc7ba9fd6047ad5b1a93d62e9a919/java/dagger/hilt/android/internal/lifecycle/HiltViewModelFactory.java#L100","alts":[],"httpStatus":200},{"url":"https://github.com/google/dagger/blob/5f761866468cc7ba9fd6047ad5b1a93d62e9a919/java/dagger/hilt/android/internal/builders/ViewModelComponentBuilder.java#L27","alts":[],"httpStatus":200},{"url":"https://medium.com/@der.x/restartable-stateflows-in-compose-46316ce670a9","alts":[{"type":3,"url":"medium://p/46316ce670a9"},{"type":2,"url":"medium://p/46316ce670a9"}],"httpStatus":200},{"url":"https://github.com/skydoves","alts":[],"httpStatus":200},{"url":"https://developer.android.com/topic/libraries/architecture/viewmodel/viewmodel-savedstate","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-mutable-state-flow/","alts":[],"httpStatus":200},{"url":"https://youtu.be/8m1W4PyYMYQ?feature=shared","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/map-latest.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-sharing-started/","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-latest.html","alts":[],"httpStatus":200},{"url":"https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-state-flow/","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://kotlinlang.org/docs/flow.html","alts":[],"httpStatus":200},{"url":"https://developer.android.com/develop/ui/compose/navigation","alts":[],"httpStatus":200},{"url":"https://developer.android.com/reference/kotlin/androidx/lifecycle/compose/package-summary#extension-functions","alts":[],"httpStatus":200},{"url":"https://medium.com/proandroiddev/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62","alts":[{"type":3,"url":"medium://p/f1747c20ce62"},{"type":2,"url":"medium://p/f1747c20ce62"}],"httpStatus":200}],"version":"0.3","generatedAt":1727080044557},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":624,"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":"loading-initial-data-part-2-clear-all-your-doubts","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"loading-initial-data-part-2-clear-all-your-doubts-0f621bfd06a0","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*GQIpQqipXEDa1RQm05B4Ig.jpeg","originalWidth":3000,"originalHeight":2000,"isFeatured":true}},{"name":"d1db","type":3,"text":"Loading Initial Data on Android Part 2: Clear All Your Doubts","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"b3a2bf2314ab","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":"6f1d","type":4,"text":"Unsplash@anniespratt","markups":[],"layout":1,"metadata":{"id":"1*GQIpQqipXEDa1RQm05B4Ig.jpeg","originalWidth":3000,"originalHeight":2000,"isFeatured":true}},{"name":"d1db","type":3,"text":"Loading Initial Data on Android Part 2: Clear All Your Doubts","markups":[]},{"name":"3de5","type":1,"text":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local database. It’s essential to select the right trigger point to avoid side effects, while also preserving the data as state to handle configuration changes in Android.","markups":[],"hasDropCap":true},{"name":"0118","type":1,"text":"We’ve…","markups":[{"type":10,"start":113,"end":127},{"type":10,"start":131,"end":140},{"type":3,"start":161,"end":213,"href":"https://medium.com/proandroiddev/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62","title":"","rel":"","anchorType":0},{"type":3,"start":376,"end":380,"href":"https://kotlinlang.org/docs/flow.html","title":"","rel":"","anchorType":0},{"type":2,"start":160,"end":216}]}],"sections":[{"name":"91e5","startIndex":0}]},"isFullContent":false,"subtitle":"When a user enters a screen, the default data should be fetched by triggering the business logic, whether from the network or local…"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"},"10cf026739fd":{"id":"10cf026739fd","versionId":"ea639b969bb6","creatorId":"cb954442a18e","homeCollectionId":"c72404660798","title":"Java and Kotlin: A Comprehensive Guide to New and Key Features Across Versions","detectedLanguage":"en","latestVersion":"ea639b969bb6","latestPublishedVersion":"ea639b969bb6","hasUnpublishedEdits":false,"latestRev":651,"createdAt":1728131968410,"updatedAt":1731579005810,"acceptedAt":0,"firstPublishedAt":1730055760163,"latestPublishedAt":1730055760163,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"A Version-by-Version Breakdown of Java and Kotlin Enhancements for Modern Android Development","postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*yA3E5J_8MJOqw7Ng2ZCBOQ.png","filter":"","backgroundSize":"","originalWidth":1024,"originalHeight":1024,"strategy":"resample","height":0,"width":0},"wordCount":1016,"imageCount":2,"readingTime":4.217295597484277,"subtitle":"A Version-by-Version Breakdown of Java and Kotlin Enhancements for Modern Android Development","publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":6,"isBookmarked":false,"tags":[{"slug":"android","name":"Android","postCount":143459,"metadata":{"postCount":143459,"coverImage":{"id":"1*JZHO5lsnXJ3BvUdHHbN8xA.png","originalWidth":8418,"originalHeight":2506,"isFeatured":true}},"type":"Tag"},{"slug":"android-app-development","name":"Android App Development","postCount":48048,"metadata":{"postCount":48048,"coverImage":{"id":"1*n5IdajkJmMlLpduU38hgKQ.png","originalWidth":2560,"originalHeight":1440,"isFeatured":true}},"type":"Tag"},{"slug":"androiddev","name":"AndroidDev","postCount":12100,"metadata":{"postCount":12100,"coverImage":{"id":"1*ypwQP-qbAWOmO24P5y9ozA.png","originalWidth":6912,"originalHeight":3456,"isFeatured":true}},"type":"Tag"},{"slug":"kotlin","name":"Kotlin","postCount":30870,"metadata":{"postCount":30870,"coverImage":{"id":"0*nRaVO7xkxB5806Vm.jpeg","originalWidth":768,"originalHeight":432,"isFeatured":true}},"type":"Tag"},{"slug":"java","name":"Java","postCount":89238,"metadata":{"postCount":89238,"coverImage":{"id":"1*HzEZxjSIfG7VC-LVtI4Kzw.jpeg","originalWidth":1920,"originalHeight":1080}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":1,"links":{"entries":[{"url":"mailto:dobri.kostadinov@gmail.com","alts":[],"httpStatus":0},{"url":"https://www.linkedin.com/in/dobrikostadinov/","alts":[],"httpStatus":429},{"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://medium.com/kotlin-academy/java-and-kotlin-versions-in-android-when-to-upgrade-and-when-to-avoid-cf47edbbac5b","alts":[{"type":2,"url":"medium://p/cf47edbbac5b"},{"type":3,"url":"medium://p/cf47edbbac5b"}],"httpStatus":200}],"version":"0.3","generatedAt":1730055761470},"isLockedPreviewOnly":false,"metaDescription":"","totalClapCount":9,"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":"java-and-kotlin-a-comprehensive-guide-to-new-and-key-features-across-versions","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"java-and-kotlin-a-comprehensive-guide-to-new-and-key-features-across-versions-10cf026739fd","previewContent":{"bodyModel":{"paragraphs":[{"name":"previewImage","type":4,"text":"","layout":10,"metadata":{"id":"1*yA3E5J_8MJOqw7Ng2ZCBOQ.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"1fd6","type":3,"text":"Java and Kotlin: A Comprehensive Guide to New and Key Features Across Versions","markups":[],"alignment":1},{"name":"40e7","type":13,"text":"A Version-by-Version…","markups":[],"alignment":1}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"A Version-by-Version Breakdown of Java and Kotlin Enhancements for Modern Android Development"},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"","approvedHomeCollectionId":"c72404660798","isNewsletter":false,"newsletterId":"ec6c069e2514","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":"1fd6","type":3,"text":"Java and Kotlin: A Comprehensive Guide to New and Key Features Across Versions","markups":[]},{"name":"40e7","type":13,"text":"A Version-by-Version Breakdown of Java and Kotlin Enhancements for Modern Android Development","markups":[]},{"name":"c974","type":4,"text":"This image was generated with the assistance of AI","markups":[],"layout":1,"metadata":{"id":"1*yA3E5J_8MJOqw7Ng2ZCBOQ.png","originalWidth":1024,"originalHeight":1024,"isFeatured":true}},{"name":"9bce","type":3,"text":"Introduction","markups":[]},{"name":"c4d6","type":1,"text":"In the previous article, I explored which version of Java and Kotlin you can or cannot use depending on your AGP, Android Studio etc.. Lets continue that journey by specifying which features you have in each version of Java and Kotlin. It never hurts to refresh our memory from time…","markups":[{"type":3,"start":0,"end":23,"href":"https://medium.com/kotlin-academy/java-and-kotlin-versions-in-android-when-to-upgrade-and-when-to-avoid-cf47edbbac5b","title":"","rel":"","anchorType":0}]}],"sections":[{"name":"c492","startIndex":0}]},"isFullContent":false,"subtitle":"A Version-by-Version Breakdown of Java and Kotlin Enhancements for Modern Android Development"},"cardType":0,"isDistributionAlertDismissed":false,"isShortform":false,"shortformType":0,"responsesLocked":false,"isLockedResponse":false,"isPublishToEmail":true,"responseDistribution":0,"isMarkedPaywallOnly":false,"type":"Post"}}},"paging":{"path":"/_/api/collections/c72404660798/stream","next":{"to":"1731323656282","ignoredIds":["187d5e14d212","05e8fe2acd2c","12f6a9939053","14d04ec2426a","138d3496c624","08927e4d2855","14d04ea18e1a","0f621bfd06a0","10cf026739fd"],"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":61945,"activeAt":1732248697716},"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":["a950e6f9eb72","2dcc4db2f76c","aa0760383569","e4e03aef765f","abb4632d0b47","07ca74eee000","36d9d973a21f"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":9,"postIds":["187d5e14d212","05e8fe2acd2c","12f6a9939053","14d04ec2426a","138d3496c624","08927e4d2855","14d04ea18e1a","0f621bfd06a0","10cf026739fd"],"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":61945,"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":2033,"subscribersCount":12172,"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":1732391719643,"randomId":"82663a056e93","section":{"items":[{"post":{"postId":"a950e6f9eb72"},"itemType":"post"},{"post":{"postId":"2dcc4db2f76c"},"itemType":"post"},{"post":{"postId":"aa0760383569"},"itemType":"post"},{"post":{"postId":"e4e03aef765f"},"itemType":"post"},{"post":{"postId":"abb4632d0b47"},"itemType":"post"},{"post":{"postId":"07ca74eee000"},"itemType":"post"},{"post":{"postId":"36d9d973a21f"},"itemType":"post"}],"layout":4},"itemType":"section","type":"StreamItem"},{"createdAt":1732391719643,"randomId":"20769348ee27","section":{"items":[{"post":{"postId":"187d5e14d212"},"itemType":"post"},{"post":{"postId":"05e8fe2acd2c"},"itemType":"post"},{"post":{"postId":"12f6a9939053"},"itemType":"post"},{"post":{"postId":"14d04ec2426a"},"itemType":"post"},{"post":{"postId":"138d3496c624"},"itemType":"post"},{"post":{"postId":"08927e4d2855"},"itemType":"post"},{"post":{"postId":"14d04ea18e1a"},"itemType":"post"},{"post":{"postId":"0f621bfd06a0"},"itemType":"post"},{"post":{"postId":"10cf026739fd"},"itemType":"post"}],"layout":4,"heading":{"fallbackTitle":"Trending Blogs","headingBasic":{"title":"Trending Blogs"},"headingType":"headingBasic"}},"itemType":"section","type":"StreamItem"}]}) // ]]></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10