<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tiago Danin</title>
    <description>The latest articles on DEV Community by Tiago Danin (@tiagodanin).</description>
    <link>https://dev.to/tiagodanin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F25349%2Fafc70f15-ff4a-46d1-bdb7-9586146f7239.jpg</url>
      <title>DEV Community: Tiago Danin</title>
      <link>https://dev.to/tiagodanin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tiagodanin"/>
    <language>en</language>
    <item>
      <title>Creating an AI Agent in Claude Code to Control my Smartphone</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Fri, 22 Aug 2025 19:19:38 +0000</pubDate>
      <link>https://dev.to/tiagodanin/creating-an-ai-agent-in-claude-code-to-control-my-smartphone-1e3e</link>
      <guid>https://dev.to/tiagodanin/creating-an-ai-agent-in-claude-code-to-control-my-smartphone-1e3e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Automating Android app documentation and testing with artificial intelligence&lt;/strong&gt;&lt;/p&gt;

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

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

&lt;p&gt;I was facing a specific challenge: I needed to automatically document various flows of an Android application. That's when I started exploring ways to accomplish this process, and one of the tools I decided to test was Claude Code.&lt;/p&gt;

&lt;p&gt;Initially, Claude Code didn't adapt very well. However, as an Android developer, during a chat conversation, it was demonstrated how to use ADB commands to simulate user actions like clicks, typing, and other interactions, so that the AI could control my smartphone.&lt;/p&gt;

&lt;p&gt;I thought about looking for an MCP (Model Context Protocol) that already implemented this functionality, but I couldn't find any suitable one, so I decided to build my own: &lt;a href="https://github.com/TiagoDanin/Android-Debug-Bridge-MCP" rel="noopener noreferrer"&gt;Android-Debug-Bridge-MCP&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Power of ADB UI Automator
&lt;/h3&gt;

&lt;p&gt;One of the most valuable features of ADB is the UI Automator, which returns a detailed XML of the current interface. This makes the use of the &lt;code&gt;adb shell tap x y&lt;/code&gt; command much more precise for clicking on specific screen elements, for example, since it shows exactly their positions and the LLM understands the XML format better than an image.&lt;/p&gt;

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

&lt;p&gt;What I needed to organize was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What types of elements to detect in the interface&lt;/li&gt;
&lt;li&gt;How to show the content and position of each element&lt;/li&gt;
&lt;li&gt;How to allow Claude Code to execute the correct action at the exact position&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Evolving the Agent
&lt;/h3&gt;

&lt;p&gt;After integrating Claude Code with my MCP, I rewrote the agent and gradually improved it until I reached an efficient flow. My AI agent follows a simple but effective pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visualize&lt;/strong&gt; the current screen content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute&lt;/strong&gt; a specific action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat&lt;/strong&gt; the process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate&lt;/strong&gt; a complete test report&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real Example: Testing Stock Pulse App
&lt;/h2&gt;

&lt;p&gt;I'll show how the agent automatically tested the process of adding a stock (NVDA) within an app I helped develop called StockPulse:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Command Used
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@agent-app-tester Open br.com.idopterlabs.Tickerapp, add an Nvidia stock to the portfolio, click Save, and I expect the stock's current data to be displayed on the screen. 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent then executed the entire flow automatically. It created a test folder called &lt;code&gt;tickerapp_nvda_test&lt;/code&gt;, opened the StockPulse app, and began its work. First, it captured an initial screenshot showing the empty portfolio screen. Then it navigated to add a new stock by tapping the "+" button and captured the stock selection screen.&lt;/p&gt;

&lt;p&gt;Next, the agent selected NVIDIA (NVDA) from the list, verified the stock details were properly displayed, and generated a complete report with all screenshots and results documented.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Result
&lt;/h3&gt;

&lt;p&gt;The agent automatically generated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organized screenshots&lt;/li&gt;
&lt;li&gt;Complete markdown report&lt;/li&gt;
&lt;li&gt;Documentation of each step&lt;/li&gt;
&lt;li&gt;Success/failure status for each stage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this in less than 2 minutes, without manual intervention!&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases and Possibilities
&lt;/h2&gt;

&lt;p&gt;The combination of MCP with Claude Code opens up various possibilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Automation&lt;/strong&gt; becomes incredibly powerful with this approach. You can execute automated regression tests for critical flows without any manual intervention, validate interface elements and layouts automatically, and simulate realistic user interactions for usability testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intelligent Documentation&lt;/strong&gt; is another game-changer. The system can automatically capture organized screenshots for app documentation, create detailed documentation of user journeys within applications, generate technical manuals with step-by-step guides and visual evidence, and even perform periodic monitoring to verify application states.&lt;/p&gt;

&lt;p&gt;The possibilities are practically infinite - any need involving automated control of Android devices can benefit from this solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Setup
&lt;/h2&gt;

&lt;p&gt;Getting started is straightforward. You'll need ADB installed and configured on your system, an Android device connected or emulator running, and Claude Code properly set up.&lt;/p&gt;

&lt;p&gt;To install the MCP, simply run &lt;code&gt;npm install -g android-debug-bridge-mcp&lt;/code&gt; in your terminal. Then add it to Claude Code with the command &lt;code&gt;claude mcp add --scope project android-debug-bridge-mcp -- npx android-debug-bridge-mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next, configure a custom agent with specific prompts for your test cases. You can find my configuration at: &lt;a href="https://github.com/TiagoDanin/Android-Debug-Bridge-MCP/issues/4" rel="noopener noreferrer"&gt;app-tester.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once everything is set up, you can start executing tests using simple and direct commands to begin automation.&lt;/p&gt;

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

&lt;p&gt;Claude Code, when combined with the right tools and well-structured instructions, demonstrates impressive potential for automation. This experiment represents only the beginning of a broader exploration - there's plenty of room for future improvements.&lt;/p&gt;

&lt;p&gt;It's important to recognize that for more complex scenarios, the expertise of a professional QA is still necessary. AI automation complements, but doesn't completely replace, specialized testing knowledge.&lt;/p&gt;

&lt;p&gt;Despite the limitations, I confess it was extremely gratifying to develop this solution. It not only met my initial objective of documenting application flows but also opened doors to new automation possibilities that previously seemed impractical.&lt;/p&gt;

&lt;p&gt;The project will continue evolving, and I hope to bring new features in the future.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks to my friend Iago Cavalcante for reviewing the translation and introducing me to Claude Code.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>claude</category>
      <category>android</category>
      <category>testing</category>
      <category>ai</category>
    </item>
    <item>
      <title>React 18 - Uma nova maneira de usar o useState (Processamento em lote)</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Wed, 03 Aug 2022 00:11:00 +0000</pubDate>
      <link>https://dev.to/tiagodanin/react-18-uma-nova-maneira-de-usar-o-usestate-processamento-em-lote-1ee9</link>
      <guid>https://dev.to/tiagodanin/react-18-uma-nova-maneira-de-usar-o-usestate-processamento-em-lote-1ee9</guid>
      <description>&lt;h1&gt;
  
  
  O que mondou no React 18?
&lt;/h1&gt;

&lt;p&gt;Uma das maiores mudanças do React 17 para o React 18 foi o processamento dos estados serem feitos em lote por padrão, é com isso é preciso ficar atento ao novo funcionamento na hora de migrar uma aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é processamento em lote (Batch)?
&lt;/h2&gt;

&lt;p&gt;Imagine uma esteira, que fábrica um equipamento e cada braço mecânico colocar um tipo de peça, mas o mais importante em nenhum momento essa esteira fica desligada enquanto tá produzindo ou pular uma etapa. O processamento em lote, mais conhecido também como Batch, é exatamente isso, temos uma entrada de dados e todas as tarefas são executadas em ordem sem pular passos, e no final tem um resultado provindo de todos os passos realizadas.&lt;/p&gt;

&lt;p&gt;Veja mais em &lt;a href="https://pt.wikipedia.org/wiki/Processamento_em_lote" rel="noopener noreferrer"&gt;pt.wikipedia.org/wiki/Processamento_em_lote&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Novo ciclo de atualização de estados
&lt;/h2&gt;

&lt;p&gt;Para entender melhor, vamos ao um exemplo, abaixo há uma aplicação em React 17, no qual pegar uma lista de super-heróis e planetas do Star Wars usando o &lt;a href="https://swapi.dev/" rel="noopener noreferrer"&gt;SWAPI&lt;/a&gt; e mostrar o seu total na tela.&lt;/p&gt;

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

&lt;p&gt;Podemos observar que há uma tarefa que vai executar uma chamada da função &lt;code&gt;fetchData&lt;/code&gt; e posteriormente vai obter a lista de super-heróis e planetas e atualizar dois estados (&lt;code&gt;heros&lt;/code&gt; e &lt;code&gt;planets&lt;/code&gt;).&lt;br&gt;
Agora se criamos um observado para os dois estados, e ele atualizar a soma do total das duas lista.&lt;/p&gt;

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

&lt;p&gt;Dessa modo toda vez que houve uma alteração em um dos dois estados, o total vai ser atualizado na tela.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/react-17-status-y63xcn?view=preview"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Se olhamos o Console da aplicação, ou mesmo olhamos em câmera lenta para tela vamos nota que há três atualizações dos dados do total na tela.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;O primeiro é o estado inicial da aplicação após carregada.&lt;/li&gt;
&lt;li&gt;O segundo é por causa da mudança do estado do &lt;code&gt;heros&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;O terceiro é por causa da mudança do estado do &lt;code&gt;planets&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Podemos concluir que o processamos não foi feito em Batch, pois antes de terminar a tarefa da função fetchData tivemos o disparo de saída de eventos (troca de estados) mais de uma vez.&lt;/p&gt;

&lt;p&gt;Agora vamos olhar a mesma aplicação, só que dessa vez rodando com React 18.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/react-18-status-0bp0vq?view=preview"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Vamos olhar novamente o Console da aplicação&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;O primeiro é o estado inicial da aplicação após carregada.&lt;/li&gt;
&lt;li&gt;O segundo é por causa da mudança do estado do &lt;code&gt;heros&lt;/code&gt; e &lt;code&gt;planets&lt;/code&gt;. &lt;strong&gt;Mas só um evento é disparado&lt;/strong&gt;, por sua vez apenas uma atualização da tela é realizada.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Desse modo os invocadores de eventos, timeouts e operações assíncronas agora no React 18 atualizam em lotes os estados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais as vantagens e desvantagens
&lt;/h2&gt;

&lt;p&gt;Uma desvantagem é que as aplicações já existente depois de migrado precisam de um cuidado para verificar se está tudo funcionando normalmente, já que pode ter impactos em seu fluxo de observadores. Fora isso o &lt;code&gt;Automatic Batching&lt;/code&gt; melhorar muito o desempenho da aplicação uma vez que as atualizações vão ocorrer com menos frequências e vai ser mais fácil de gerência a atualização dos estados, assim como é feito no &lt;a href="https://react-redux.js.org/api/batch" rel="noopener noreferrer"&gt;Redux&lt;/a&gt; ou &lt;a href="https://api.flutter.dev/flutter/widgets/State/setState.html" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;, onde é possível usar Batch ou atualização imediata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como usar novamente a atualização imediata
&lt;/h2&gt;

&lt;p&gt;Podemos usar o &lt;code&gt;flushSync&lt;/code&gt; do &lt;code&gt;react-dom&lt;/code&gt; para força a atualização, veja no exemplo abaixo. &lt;/p&gt;

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

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/react-18-status-0bp0vq"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Com isso podemos reproduzir o mesmo comportamento que tínhamos no React 17&lt;/p&gt;

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

&lt;p&gt;Veja mais em &lt;a href="https://reactjs.org/blog/2022/03/29/react-v18.html#new-feature-automatic-batching" rel="noopener noreferrer"&gt;reactjs.org/blog/2022/03/29/react-v18.html#new-feature-automatic-batching&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;React 17 &lt;a href="https://codesandbox.io/s/react-17-status-y63xcn?file=/src/App.js" rel="noopener noreferrer"&gt;https://codesandbox.io/s/react-17-status-y63xcn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;React 18 &lt;a href="https://codesandbox.io/s/react-18-status-5e16rc?file=/src/App.js" rel="noopener noreferrer"&gt;https://codesandbox.io/s/react-18-status-5e16rc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;React 18 com FlushSync &lt;a href="https://codesandbox.io/s/react-18-status-flushsync-0bp0vq?file=/src/App.js" rel="noopener noreferrer"&gt;https://codesandbox.io/s/react-18-status-flushsync-0bp0vq&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>ptbr</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Criando aplicativos para Android Wear OS com Jetpack Compose</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sat, 25 Jun 2022 22:33:00 +0000</pubDate>
      <link>https://dev.to/tiagodanin/criando-aplicativos-no-android-wear-os-com-jetpack-compose-436g</link>
      <guid>https://dev.to/tiagodanin/criando-aplicativos-no-android-wear-os-com-jetpack-compose-436g</guid>
      <description>&lt;h1&gt;
  
  
  Jetpack Compose no Wear OS
&lt;/h1&gt;

&lt;p&gt;A Google recentemente anunciou na &lt;a href="https://android-developers.googleblog.com/2022/05/announcing-compose-for-wear-os-beta.html" rel="noopener noreferrer"&gt;Google I/O&lt;/a&gt; o beta do Jetpack Compose para o Wear OS, a versão do Android para Smartwatch. Um dos principais foco do Compose é a criação de interface de maneira rápida usando sintaxe declarativa, semelhante ao que há no iOS com SwiftUI, hoje demostrarei a criação de um simples aplicativo em poucos minutos utilizado o que há de mais moderno para desenvolvimento de aplicativos para Android.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Aplicativo
&lt;/h2&gt;

&lt;p&gt;O aplicativo que vamos desenvolver consiste em controlar a quantidade de copos de água você tomou ao logo do dia, para isso vamos precisar da versão mais recente do Android Studio, no meu caso estou utilizado o &lt;a href="https://developer.android.com/studio/archive" rel="noopener noreferrer"&gt;Android Studio Electric Eel (2022.1.1) Canary 5&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciando um novo projeto
&lt;/h2&gt;

&lt;p&gt;Com Android Studio aberto vamos em criar um novo projeto&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl1fbradprucewxyfwjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl1fbradprucewxyfwjj.png" alt="Image description" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na lista de template vai ter um chamando Wear OS &amp;gt;&amp;gt; Empty Compose Activity, selecionaremos e vamos continuar.&lt;/p&gt;

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

&lt;p&gt;O próximo passo é configurar o nosso app com nome, id, localização do projeto, e versão mínima do Android Wear OS. Para esse exemplo utilizaremos a API Level 30, conforme na imagem acima.&lt;/p&gt;

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

&lt;p&gt;Vai ser gerado as seguintes arquivos e pastas, a customização no Compose não acontecer via os arquivos de resources (RES) em formato XML, em vez disso para diminuir a curva de aprendizagem boa parte do app é feito usado Kotlin, como a personalização do app que agora fica localizado em &lt;code&gt;/theme&lt;/code&gt;, por enquanto vamos apenas trocar as cores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.tiagodanin.waterwearos.presentation.theme&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;...&lt;/span&gt;

&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;Blue700&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF1976d2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;Blue900&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF0d47a1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;DeepPurple200&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFb39ddb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;DeepPurple400&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF512da8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;wearColorPalette&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Colors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Blue700&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;primaryVariant&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Blue900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;secondary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DeepPurple200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;secondaryVariant&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DeepPurple400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;onPrimary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;onSecondary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;onError&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Black&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para isso basta informar na referência da variável &lt;code&gt;primary&lt;/code&gt;, por exemplo, a nova cor que deseja. Nesse caso vou usar um Azul pois remete a água.&lt;/p&gt;

&lt;p&gt;OBS: A função &lt;code&gt;Color&lt;/code&gt; é a representação da cor em ARGB, exemplo vermelho (FFFF0000), é representado como &lt;code&gt;Color(0xFFFF0000)&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando a Tela
&lt;/h2&gt;

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

&lt;p&gt;A tela principal já é criada por padrão ele fica localizando no &lt;code&gt;MainActivity.kt&lt;/code&gt;, se rodamos o app no emulador (ou dispositivo físico) vamos ter a seguinte tela:&lt;/p&gt;

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

&lt;p&gt;O primeiro passo agora é criarmos a tela principal do nosso jeito, mas antes de adicionarmos elementos relacionados ao nosso aplicativo, precisamos mostra elemento comuns do sistema, nos smartphones temos a StatusBar (onde mostrar a hora) e NavigationBar, no Wear OS também temos algo semelhante que pode mostrar horas, indicador de página entre outros aspectos, ele é conhecido como &lt;a href="https://developer.android.com/codelabs/compose-for-wear-os#7" rel="noopener noreferrer"&gt;Scaffold&lt;/a&gt;:&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@OptIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ExperimentalWearMaterialApi&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;WearApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;WaterWearOSTheme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;background&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MaterialTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;timeText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;TimeText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nosso Layout principal é montado da seguinte maneira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;WaterWearOSTheme { UI Compose }&lt;/code&gt; é o nosso utilitário para aplicar o tema em todos os elementos de UI que tem dentro dele&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Scaffold(Props) { UI Compose}&lt;/code&gt; criar uma estrutura base de layout

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;modifier: Modifier&lt;/code&gt; Modificadores de layout e elementos comuns&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timeText = { UI Compose }&lt;/code&gt; informar qual relógio será mostrado no topo&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;TimeText()&lt;/code&gt; É layout padrão do relógio que fica no topo&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Uma das vantagens do Jetpack Compose é a fácil customização de elementos já existentes, uma das maneiras mais simples de fazer isso é usando os modificadores (&lt;code&gt;Modifier&lt;/code&gt;) que estão disponíveis na maioria dos componentes, como no caso do &lt;code&gt;Scaffold&lt;/code&gt;, onde foi definido que ele ocuparia o máximo da tela (&lt;code&gt;.fillMaxSize()&lt;/code&gt;) e teria um fundo na cor preta (&lt;code&gt;.background(MaterialTheme.colors.background)&lt;/code&gt;). O Resultado que vamos obter é: &lt;/p&gt;

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

&lt;p&gt;Podemos prosseguir agora o app, vamos criar uma nova função de Compose para uma barra de progresso de quantidade de água tomada no dia, mas antes é preciso importar ela dentro do corpo do Scaffold.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@OptIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ExperimentalWearMaterialApi&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;WearApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;WaterWearOSTheme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;background&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MaterialTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;timeText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;TimeText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;ProgressIndicatorWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Corpo&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;ProgressIndicatorWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c1"&gt;// Nova UI Compose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como já é de esperado há uma maneira de fazer a barra de progresso usando os componentes padrão do Compose, assim como no Jetpack Compose para smartphone, o nome dela é [&lt;code&gt;CircularProgressIndicator&lt;/code&gt;](&lt;a href="https://developer.android.com/reference/kotlin/androidx/wear/compose/material/package-summary#CircularProgressIndicator(kotlin.Float,androidx.compose.ui.Modifier,kotlin.Float,kotlin.Float,androidx.compose.ui.graphics.Color,androidx.compose.ui.graphics.Color,androidx.compose.ui.unit.Dp)" rel="noopener noreferrer"&gt;https://developer.android.com/reference/kotlin/androidx/wear/compose/material/package-summary#CircularProgressIndicator(kotlin.Float,androidx.compose.ui.Modifier,kotlin.Float,kotlin.Float,androidx.compose.ui.graphics.Color,androidx.compose.ui.graphics.Color,androidx.compose.ui.unit.Dp)&lt;/a&gt;, e o que diferencia no Wear são poucas coisas, uma delas e a disposição dos elementos sobre a tela.&lt;/p&gt;

&lt;p&gt;Vamos olhar uma parte da assinatura desse componente que estamos usando, no momento estamos da seguinte maneira o codigo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;ProgressIndicatorWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;CircularProgressIndicator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;startAngle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;360f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;endAngle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;strokeWidth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;O que precisamos para criar a nossa barra é saber onde posicionar, para isso precisamos entender algumas das propriedades da nossa tela.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;startAngle&lt;/code&gt; Ângulo de começo da barra&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;endAngle&lt;/code&gt; Ângulo de fim da barra&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;progress&lt;/code&gt; O progresso total, onde &lt;code&gt;1.0f&lt;/code&gt; é &lt;code&gt;100%&lt;/code&gt; e &lt;code&gt;0.0f&lt;/code&gt; é &lt;code&gt;0%&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A disposição dos ângulos é dada da seguinte maneira:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friomv4dhxyepf9bqrj52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friomv4dhxyepf9bqrj52.png" alt="Image description" width="470" height="340"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Com base nisso podemos finalizar a barra antes do texto da hora, configurando da seguinte maneira &lt;code&gt;startAngle = 295f, endAngle = 245f&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flp5j5m6v97ali2530fv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flp5j5m6v97ali2530fv8.png" alt="Image description" width="336" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estamos perto do final, agora precisamos adicionar informações (litros tomados) e ação (beber água) para cada copo de água, para isso vamos fazer uma nova função de UI Compose e usar um elemento de layout flexível para alinhamento:&lt;/p&gt;

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

&lt;p&gt;Os três principais elementos são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Box: elementos dentro do outros / Sobrepostos &lt;/li&gt;
&lt;li&gt;Column: Um em baixo do outro (Coluna)&lt;/li&gt;
&lt;li&gt;Row: Um do lado do outro (Linha)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Queremos a seguinte estrutura no &lt;code&gt;ProgressIndicatorWater&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgp4pzvl7zp4u8xv1kry.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgp4pzvl7zp4u8xv1kry.png" alt="Image description" width="519" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para isso podemos usar o Box.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;ProgressIndicatorWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Box para centralizar&lt;/span&gt;
    &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;contentAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;CircularProgressIndicator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;startAngle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;295f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;endAngle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;245f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;strokeWidth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nc"&gt;InfoWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Importação do novo Compose&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;InfoWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já dentro do &lt;code&gt;InfoWater&lt;/code&gt; precisamos de algo como &lt;code&gt;Column&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxziva6xw6o33edjg9y6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxziva6xw6o33edjg9y6s.png" alt="Image description" width="800" height="298"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;InfoWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;verticalArrangement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrangement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;horizontalAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CenterHorizontally&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E por fim adicionaremos os dois elementos de composição que planejavamos, nada diferente do que já é no Android Mobile com Jetpack Compose. O Botão e o Texto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;InfoWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;verticalArrangement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrangement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;horizontalAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CenterHorizontally&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Nosso texto&lt;/span&gt;
        &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxWidth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;horizontal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;textAlign&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TextAlign&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MaterialTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Você já bebeu 1 litro de água hoje"&lt;/span&gt; &lt;span class="c1"&gt;// Texto&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;// Nosso botão&lt;/span&gt;
        &lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                      &lt;span class="c1"&gt;// Ação do click&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;painter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;painterResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drawable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cup_water&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;contentDescription&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Cup Water"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ButtonDefaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DefaultButtonSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wrapContentSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ícone em questão que importei não é padrão do kit de desenvolvimento, você pode baixa ele por fora, eu utilizo o &lt;a href="https://materialdesignicons.com/" rel="noopener noreferrer"&gt;Material Design Icons Community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Depois de feito o donwload do SVG dele, no menu de opções da pasta &lt;code&gt;res&lt;/code&gt;, selecione:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjait8w89zuehhrzn2cw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjait8w89zuehhrzn2cw.png" alt="Image description" width="759" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Lembrando de que para importar você pode usar o mesmo nome, exemplo &lt;code&gt;R.drawable.[nome]&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lógica
&lt;/h2&gt;

&lt;p&gt;É por fim a parte lógica, criaremos um estado para quantidade de litros: &lt;br&gt;
&lt;code&gt;private val count: MutableState&amp;lt;Float&amp;gt; = mutableStateOf(0f)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e vamos modificar a nossa barra de progresso para levar em conta que 3 litros é o ideal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;ProgressIndicatorWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;recomedByDay&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.0f&lt;/span&gt; &lt;span class="c1"&gt;// 3 Litros&lt;/span&gt;
    &lt;span class="c1"&gt;// Progresso = Todal do dia / Recomendação&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;progressOfDay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;recomedByDay&lt;/span&gt;

    &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;contentAlignment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;CircularProgressIndicator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;startAngle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;295f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;endAngle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;245f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;progressOfDay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Valor do progresso&lt;/span&gt;
            &lt;span class="n"&gt;strokeWidth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nc"&gt;InfoWater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O mesmo com nosso texto e botão, vamos mostrar a quantidade e no evento do clique do botão considera 500ml água ingerida.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
fun InfoWater() {
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
    ) {
        Text(
            modifier = Modifier
                .fillMaxWidth()
                .padding(horizontal = 30.dp),
            textAlign = TextAlign.Center,
            color = MaterialTheme.colors.primary,
            text = "Você já bebeu ${count.value} litro de água hoje" // Resultado
        )
        Button(
            modifier = Modifier.padding(top = 5.dp),
            onClick = { count.value += 0.5f }, // Ação
        ) {
            Icon(
                painter = painterResource(id = R.drawable.cup_water),
                contentDescription = "airplane",
                modifier = Modifier
                    .size(ButtonDefaults.DefaultButtonSize)
                    .wrapContentSize(align = Alignment.Center),
            )
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se abrimos o app novamente vamos o seguinte resultado&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figp5bx6q2wo7q72y3hwk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figp5bx6q2wo7q72y3hwk.gif" alt="Image description" width="650" height="650"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;No desenvolvimento desse app foram usados alguns dos componentes disponíveis do Jetpack Compose para Wear OS, no link abaixo você pode conferir diversos outros UI Compose:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.android.com/training/wearables/compose" rel="noopener noreferrer"&gt;developer.android.com/training/wearables/compose&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Você pode seguir as implementações adicionado novas funcionalidade como persitencia de dados😉&lt;/p&gt;

&lt;p&gt;Link do repositório: &lt;a href="https://github.com/TiagoDanin/WearOS-Count-Water-App/" rel="noopener noreferrer"&gt;Github.com/TiagoDanin/WearOS-Count-Water-App&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>ptbr</category>
      <category>jetpack</category>
    </item>
    <item>
      <title>Arrow Function Vs Normal Function</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 22:15:31 +0000</pubDate>
      <link>https://dev.to/tiagodanin/arrow-function-vs-normal-function-55gl</link>
      <guid>https://dev.to/tiagodanin/arrow-function-vs-normal-function-55gl</guid>
      <description>&lt;h1&gt;
  
  
  O que é Arrow Function ?
&lt;/h1&gt;

&lt;p&gt;Uma alternativa mais simples para criar funções, com algumas características diferente da função regular.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Syntax&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;soma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  This (Contexto)
&lt;/h2&gt;

&lt;p&gt;Seu contexto por padrão é o contexto global. Veja um exemplo de comparação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//false&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//true&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;No Chrome o contexto padrão é o &lt;code&gt;window&lt;/code&gt;, logo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//true&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Arguments (Argumentos)
&lt;/h2&gt;

&lt;p&gt;Não há &lt;code&gt;Arguments&lt;/code&gt;, em alguns casos como no Node.Js ele pode recebe os argumentos globais.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt; &lt;span class="c1"&gt;//Uncaught ReferenceError: arguments is not defined&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em uma regular função teríamos uma saída: &lt;code&gt;{ '0': true }&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Constructor (Construtor)
&lt;/h2&gt;

&lt;p&gt;Sem &lt;code&gt;Constructor&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//TypeError: a is not a constructor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nome da Função
&lt;/h2&gt;

&lt;p&gt;Em Arrow, o nome é o identificado que está recebendo a função. Numa regular podemos define o nome de uma função, como no exemplo abaixo, eu coloquei o nome sendo &lt;code&gt;d&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;d&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//a&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//b&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Retorno de Objeto
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casaA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;cozinha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casaB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;cozinha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casaC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;cozinha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;casaA&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//undefined&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;casaB&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//{ cozinha: true }&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;casaC&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//{ cozinha: true }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A &lt;code&gt;casaA&lt;/code&gt; retorna &lt;code&gt;undefined&lt;/code&gt; pois não há retorno na função. Não viu isso ? Vou rescrever &lt;code&gt;casaA&lt;/code&gt; e &lt;code&gt;casaB&lt;/code&gt; no modo normal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casaA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;cozinha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casaB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;cozinha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;casaA&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//undefined&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;casaB&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//{ cozinha: true }&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Sacou? Por isso usamos o parênteses no primeiro exemplo, &lt;code&gt;casaB&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Veja mais em MDN: &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Functions/Arrow_functions" rel="noopener noreferrer"&gt;developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Functions/Arrow_functions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Lista - Analisadores de Perfil no GitHub</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 16:21:43 +0000</pubDate>
      <link>https://dev.to/tiagodanin/lista-analisadores-de-perfil-no-github-3g11</link>
      <guid>https://dev.to/tiagodanin/lista-analisadores-de-perfil-no-github-3g11</guid>
      <description>&lt;p&gt;Abaixo os links para alguns analisadores de perfil no GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitstar-ranking.com/TiagoDanin" rel="noopener noreferrer"&gt;Gitstar Ranking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ghuser.io/TiagoDanin" rel="noopener noreferrer"&gt;GHUser.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitstalk.netlify.com/tiagodanin" rel="noopener noreferrer"&gt;Gitstalk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sourcerer.io/tiagodanin" rel="noopener noreferrer"&gt;Sourcerer.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://Commits.top/brazil.html" rel="noopener noreferrer"&gt;Commits Top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>lista</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Usando PulseAudio no HDMI</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 16:07:37 +0000</pubDate>
      <link>https://dev.to/tiagodanin/usando-pulseaudio-no-hdmi-c3f</link>
      <guid>https://dev.to/tiagodanin/usando-pulseaudio-no-hdmi-c3f</guid>
      <description>&lt;h1&gt;
  
  
  Usando PulseAudio no HDMI
&lt;/h1&gt;

&lt;p&gt;Depois que migre para o PulseAudio tive um problema ao tenta usar o HDMI do notebook. Jogos, videos e musicas não estavam reproduzindo na saída do HDMI.&lt;/p&gt;

&lt;h2&gt;
  
  
  SOLUÇÃO
&lt;/h2&gt;

&lt;p&gt;Instalar o pavucontrol.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; pavucontrol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois podemos abrir o pavucontrol, navegue até onde tem seu dispositivo HDMI e clique no botão &lt;code&gt;✅&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Agora ele é o dispositivo padrão de saída de audio. :)&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>linux</category>
      <category>hdmi</category>
      <category>audio</category>
    </item>
    <item>
      <title>Lista de apps — Automatizando fluxo de trabalho no GitHub</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 16:02:41 +0000</pubDate>
      <link>https://dev.to/tiagodanin/lista-de-apps-automatizando-fluxo-de-trabalho-no-github-gdm</link>
      <guid>https://dev.to/tiagodanin/lista-de-apps-automatizando-fluxo-de-trabalho-no-github-gdm</guid>
      <description>&lt;p&gt;Uma das melhores coisa de usar o GitHub é a quantidade de integrações disponíveis, hoje eu separei alguma das que eu mais uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Travis CI: Testes &amp;amp; Build&lt;/li&gt;
&lt;li&gt;Crowdin: Tradução&lt;/li&gt;
&lt;li&gt;ImgBot: Otimização de Imagens&lt;/li&gt;
&lt;li&gt;Codacy: Analise de Código&lt;/li&gt;
&lt;li&gt;GitHub (Telegram): Notificação de Issues/PR’s &amp;amp; Commits&lt;/li&gt;
&lt;li&gt;Renovate: Atualização de Dependências&lt;/li&gt;
&lt;li&gt;PR Triage: Organização de Issues/PR’s&lt;/li&gt;
&lt;li&gt;Snyk: Verificação de Vulnerabilidade&lt;/li&gt;
&lt;li&gt;CuboHub: Gerado de Página Estáticas&lt;/li&gt;
&lt;li&gt;WIP: Proteção de Branch &amp;amp; Organização de PR’s&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>ptbr</category>
      <category>lista</category>
    </item>
    <item>
      <title>O melhor plugin de Auto Complete para ZSH</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 15:58:23 +0000</pubDate>
      <link>https://dev.to/tiagodanin/o-melhor-plugin-de-auto-complete-para-zsh-2g8m</link>
      <guid>https://dev.to/tiagodanin/o-melhor-plugin-de-auto-complete-para-zsh-2g8m</guid>
      <description>&lt;p&gt;Uma das maiores maravilhas de usar o ZSH, é sua flexibilidade de customização, tendo uma grande quantidade de plugins desenvolvido por usuários.&lt;/p&gt;

&lt;p&gt;Em torno de um ano atrás (em 2017) eu achei o melhor plugin, o zsh-autosuggestions, sua principal característica é a exibição de comandos digitados anteriormente em forma de uma cor “cinzenta silenciada”.&lt;/p&gt;

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

&lt;p&gt;Assim como os editores de código como Atom e Sublime, usando a tecla “tab” você consegue completa a sequencia de caracteres, já existente no histórico do arquivo, em nosso caso séria do “zhistory”. O aumento de produtividade é perceptivo nos primeiros dias.&lt;/p&gt;

</description>
      <category>zsh</category>
      <category>linux</category>
      <category>terminal</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>O perfil perfeito no GitHub</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 15:53:14 +0000</pubDate>
      <link>https://dev.to/tiagodanin/o-perfil-perfeito-no-github-5cco</link>
      <guid>https://dev.to/tiagodanin/o-perfil-perfeito-no-github-5cco</guid>
      <description>&lt;p&gt;Vou dar algumas dicas de como criar um perfil apresentável no GitHub.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faça parte de comunidades open source e contribua para elas. Os melhores projetos para fazer contribuição são aqueles que você usar ou já está familiarizado com as ferramentas, pacotes, aplicativos e até mesmo jogos.&lt;/li&gt;
&lt;li&gt;Tenha repositórios organizados.&lt;/li&gt;
&lt;li&gt;Não uso o mesmo repositório para dois guarda dois projetos diferentes.&lt;/li&gt;
&lt;li&gt;Crie um README, ele tem que ter minimo a descrição do software e instruções para instalações e como fazer o seu uso.&lt;/li&gt;
&lt;li&gt;Tenha uma padrão universal de organização dos tópicos de seu README (Você vai usar eles em outros projetos como ponto de partida).&lt;/li&gt;
&lt;li&gt;Para repositórios com o arquivo "package.json", recomendo usar o Package-Json-to-Readme ou Gen-README como ponto de partida do README.&lt;/li&gt;
&lt;li&gt;Faça commits que descrever a modificação realizada (Nada como "Update X.js" ou "up").&lt;/li&gt;
&lt;li&gt;Escolha uma licença, o site escolhaumalicenca.com.br pode ajuda você nisso.&lt;/li&gt;
&lt;li&gt;Não coloque muitos arquivos na raiz, o ideal seria você usar subdiretórios para organizar os arquivos.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rc0mvhww08v2kd8f8ry.png" width="600" height="346"&gt;
&lt;/li&gt;
&lt;li&gt;Use os "badges" para mostrar status do projeto. Há vários desses no site shields.io.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsu7asgxsqxtgkk4rm26h.png" width="351" height="40"&gt;
&lt;/li&gt;
&lt;li&gt;Sempre que possível crie testes.&lt;/li&gt;
&lt;li&gt;Use ferramentas de CI (Continuar integração), para fazer build e roda testes. Recomendo usar o Travis CI a integração dele com GitHub é perfeita e ainda tem "badges"&lt;/li&gt;
&lt;li&gt;Tenha um site para seu projeto, assim fica mais fácil de acha ele fora do GitHub. Caso não queira ter o trabalho de criar um do zero use o GitHub Pages.&lt;/li&gt;
&lt;li&gt;Separe seus forks em uma organização. Dica: Você pode manter eles sempre atualizados usar o bot &lt;a href="https://github.com/apps/pull" rel="noopener noreferrer"&gt;Pull&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Não faça gambiarras :), lembre-se que o mundo todo vai ver seu código.&lt;/li&gt;
&lt;li&gt;Evite demorar muito responder issue ou pull requests.&lt;/li&gt;
&lt;li&gt;Tenha foto de perfil apresentável e uma rápida descrição.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outras sugestões em &lt;a href="https://github.com/training-center/forum/issues/23" rel="noopener noreferrer"&gt;github.com/training-center/forum/issues/23&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>github</category>
      <category>git</category>
      <category>perfil</category>
    </item>
    <item>
      <title>Construindo meu novo site com UIKit, Jus e CuboHub</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 15:44:12 +0000</pubDate>
      <link>https://dev.to/tiagodanin/construindo-meu-novo-site-com-uikit-jus-e-cubohub-3apf</link>
      <guid>https://dev.to/tiagodanin/construindo-meu-novo-site-com-uikit-jus-e-cubohub-3apf</guid>
      <description>&lt;h1&gt;
  
  
  Construindo meu novo site com UIKit, Jus e CuboHub
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Um poucos sobre as três ferramentas.
&lt;/h2&gt;

&lt;p&gt;Jus é uma incrível framework que permite em pouco tempo construir um site funcionar de modo semelhante ao Jekyll, só que com um sistema mais fácil de usar e eu gosto do jeito que ele trabalha com os modelos de paginas.&lt;/p&gt;

&lt;p&gt;Já o UIKit para min é “o novo Bootstrap”. Você tem os componentes com um padrão bem simples e limpo.&lt;/p&gt;

&lt;p&gt;Crie o CuboHub para atualizar os sites dos meus projetos de forma automática.&lt;/p&gt;

&lt;h2&gt;
  
  
  O começo!
&lt;/h2&gt;

&lt;p&gt;Bom meu antigo website usava um tema que baixei na internet e fiz algumas modificações nele. Depois de um tempo a quantidade de projetos aumentaram e eu comecei a ter problemas de compatibilidade em alguns dispositivos, também tive dificuldades para manter as páginas sempre atualizadas.&lt;/p&gt;

&lt;p&gt;Dei o primeiro passo, comecei a criar um gerador para isso, chamado de CuboHub disponível no Github: &lt;a href="https://github.com/CuboHub" rel="noopener noreferrer"&gt;https://github.com/CuboHub&lt;/a&gt;. A página é atualizada toda fez que tem uma nova modificação no repositório. Em seguida eu comecei a planeja meu novo website encontrei as ferramentas certas para o trabalho UIKit e Jus, com o layout em minha cabeça eu fui capaz de executar esse projeto em dois dias. O resultados você pode ver aqui tiagodanin.github.io.&lt;/p&gt;

&lt;p&gt;PS: Jus usar o lobars, uma ferramenta incrível!&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Jus
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diversos formatados de arquivos suportados (é realmente incrível a quantidade).&lt;/li&gt;
&lt;li&gt;Fácil de usar.&lt;/li&gt;
&lt;li&gt;URLs limpas.&lt;/li&gt;
&lt;li&gt;Suportado em GitHub Pages.&lt;/li&gt;
&lt;li&gt;Muitas opções/funções para fazer modelo de página.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UIKit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CSS limpo.&lt;/li&gt;
&lt;li&gt;Responsive web design.&lt;/li&gt;
&lt;li&gt;Suporte para plataformas mobiles.&lt;/li&gt;
&lt;li&gt;RTL suporte.&lt;/li&gt;
&lt;li&gt;Usar prefixo “uk-” para tudo. :) Sem conflito com seu css.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CuboHub
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Eu sou o desenvolvedor :v.&lt;/li&gt;
&lt;li&gt;Acompanhar seus commits.&lt;/li&gt;
&lt;li&gt;Fácil de configurar.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>html</category>
      <category>site</category>
      <category>prbr</category>
      <category>css</category>
    </item>
    <item>
      <title>GitHub vs Outros</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 15:36:15 +0000</pubDate>
      <link>https://dev.to/tiagodanin/github-vs-outros-5705</link>
      <guid>https://dev.to/tiagodanin/github-vs-outros-5705</guid>
      <description>&lt;p&gt;Um grande números de desenvolvedores estão migrando para outros serviços, devido recente aquisição do GitHub pela Microsoft. No entanto não houve mudanças e o GitHub continuar sendo o melhor (Minha opinião), logo fiz uma lista abaixo de coisas que muitos serviços de hospedagem de projetos em Git não tem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email confidencial.&lt;/li&gt;
&lt;li&gt;Usar sua conta para fazer login em outros site (Exemplos GitLab, Crowdin, Rocket.Chat e etc).&lt;/li&gt;
&lt;li&gt;Design organizado e bonito.&lt;/li&gt;
&lt;li&gt;Code Owners (Melhor coisa para projeto grande).&lt;/li&gt;
&lt;li&gt;IPv6 ❤.&lt;/li&gt;
&lt;li&gt;Suporte ao GIT LFS&lt;/li&gt;
&lt;li&gt;Notificações (Novos comentários, pull requests, versões e etc).&lt;/li&gt;
&lt;li&gt;Uptime alto dos servidores.&lt;/li&gt;
&lt;li&gt;API limpa e fácil de usar (Ainda há dois projetos que tornam isso mais incrível. Octokit e Probot).&lt;/li&gt;
&lt;li&gt;Integração com Deploy/CLI diretamente do Github com seu provedores de hospedagem: Amazon, Azure, Heroku, TravisCI, Google Cloud e etc.&lt;/li&gt;
&lt;li&gt;Aquivos de suporte (Guia de contribuição, Documentação, Templante para issue e pull requests).&lt;/li&gt;
&lt;li&gt;Reações nos comentários.&lt;/li&gt;
&lt;li&gt;SEO Otimizado (Seu projeto aberto é facilmente indexado e achado nos motores de busca e rede sócias).&lt;/li&gt;
&lt;li&gt;Pesquisar, também há suporte para regras de pesquisar de nome de aquivos/conteúdos e também consegue fazer pesquisar de códigos, usuários e tags.&lt;/li&gt;
&lt;li&gt;Sistema de revisão de diff consegue acha funções modificadas.&lt;/li&gt;
&lt;li&gt;Muitos serviços (Ex. Hospedagem) oferecem suporte a clona um repositório do Github com um simples clique.&lt;/li&gt;
&lt;li&gt;Marketplace (Tudo qualquer tipo de integração com seu projeto você acha na loja, e boa parte delas são grátis para projeto de código aberto).&lt;/li&gt;
&lt;li&gt;Drag e drop de tarefas.&lt;/li&gt;
&lt;li&gt;Explore (Uma página que mostrar os principais projetos em destaque e desenvolvedores).&lt;/li&gt;
&lt;li&gt;GitHub Classroom (Ajuda professore e alunos no controle de repositórios escolares).&lt;/li&gt;
&lt;li&gt;É 100% grátis para estudantes.&lt;/li&gt;
&lt;li&gt;Também é conhecido com "Facebook dos desenvolvedores" (Você pode acompanha projeto que gosta, pessoas e fornecer seu feedback).&lt;/li&gt;
&lt;li&gt;Usuários também usam (Um exemplo disso é o repositório do Telegram Desktop, uma parte dos issues são feitos por pessoas sem relação com TI).&lt;/li&gt;
&lt;li&gt;Quantidade de clientes e desenvolvedores ❤ usando GitHub.&lt;/li&gt;
&lt;li&gt;Estáticas de projeto.&lt;/li&gt;
&lt;li&gt;Status :)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mesmo assim você tá querendo migrar? Eu recomendo usar o Gogs ou Gitea.&lt;/p&gt;

</description>
      <category>github</category>
      <category>ptbr</category>
      <category>git</category>
    </item>
    <item>
      <title>Resolvendo erro do wine não fazer conexões SSL</title>
      <dc:creator>Tiago Danin</dc:creator>
      <pubDate>Sun, 07 Apr 2019 15:25:26 +0000</pubDate>
      <link>https://dev.to/tiagodanin/resolvendo-erro-do-wine-nao-fazer-conexoes-ssl-bhj</link>
      <guid>https://dev.to/tiagodanin/resolvendo-erro-do-wine-nao-fazer-conexoes-ssl-bhj</guid>
      <description>&lt;p&gt;Recentemente eu sair do Arch puro para o Manjaro… E fui fazer a instalação de programas que eu uso, como o wine.&lt;/p&gt;

&lt;p&gt;Depois de execultar um &lt;code&gt;sudo pacman -S wine&lt;/code&gt; no terminal, e abrir o wine. Encontrei um problema, ele não fazia conexões SSL nos aplicativos. Hoje eu verificando o log com calma achei isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;004f:err:winediag:schan_imp_init Failed to load libgnutls, secure connections will not be available.
004f:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth &amp;gt;= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A solução para o problema é bem simples, basta fazer a instalação dos seguintes pacotes: ‘lib32-gnutls gnutls`.&lt;/p&gt;

&lt;p&gt;Agora basta fazer reboot no wine e vai tá funcionado normalmente.&lt;/p&gt;

</description>
      <category>archlinux</category>
      <category>linux</category>
      <category>ptbr</category>
      <category>wine</category>
    </item>
  </channel>
</rss>
