<?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: Cengiz TORU</title>
    <description>The latest articles on DEV Community by Cengiz TORU (@cengiztoru).</description>
    <link>https://dev.to/cengiztoru</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%2F864323%2Fc37befd2-58ad-464d-be75-175cd99fd64a.png</url>
      <title>DEV Community: Cengiz TORU</title>
      <link>https://dev.to/cengiztoru</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cengiztoru"/>
    <language>en</language>
    <item>
      <title>‍What is the Dependency Injection Benefits Implementation Methods</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Tue, 05 Jul 2022 05:51:49 +0000</pubDate>
      <link>https://dev.to/cengiztoru/what-is-the-dependency-injectionbenefitsimplementation-methods-14a0</link>
      <guid>https://dev.to/cengiztoru/what-is-the-dependency-injectionbenefitsimplementation-methods-14a0</guid>
      <description>&lt;h3&gt;
  
  
  &lt;a href="https://medium.com/huawei-developers/make-easier-user-authentication-processes-even-on-cross-platforms-and-cross-apps-huawei-keyri-c9a9b0371cbf?source=your_stories_page-------------------------------------"&gt;👨🏼‍💻&lt;/a&gt; What is Dependency Injection❓ Benefits❓Implementation Methods❓| with Code Examples
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oFKzTYtq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/500/0%2AlEvYRjInjYLz9a5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oFKzTYtq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/500/0%2AlEvYRjInjYLz9a5w.png" alt="" width="500" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Hi folks 👋. In this article, we’ll talk about Dependency Injection. We’ll look for answers of some questions such as What is the Dependency Injection❓ Why we should care about it❓ Benefits❓ What are the methods to implement DI❓&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a Dependency❓
&lt;/h3&gt;

&lt;p&gt;In the real world, we need some tools, objects, things for completing some tasks. So while we modelling the real world to programming as objects we need some other objects for doing some things. So for completing our main job we &lt;em&gt;depend on&lt;/em&gt; some &lt;em&gt;other objects&lt;/em&gt;, processes, functionalities etc. That’s exactly what dependency is.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dependency is some required object instances which we depend on them &amp;amp; we need them in order to completing somethings.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aRiRBN00--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A7ZHmG4kstWZJ3B9V_-7skw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aRiRBN00--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A7ZHmG4kstWZJ3B9V_-7skw.png" alt="" width="880" height="381"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example Class Creating its Dependencies&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For instance; in the real world a developer needs to ☕, 💻, IDE (can’t find emoji 😊). While modelling this developer to programming, the developer class has to have them. In the above class, the &lt;em&gt;Developer&lt;/em&gt; class needs a &lt;strong&gt;&lt;em&gt;Coffee&lt;/em&gt;&lt;/strong&gt; class instance, a &lt;strong&gt;&lt;em&gt;Computer&lt;/em&gt;&lt;/strong&gt; class instance, an &lt;strong&gt;&lt;em&gt;IDE&lt;/em&gt;&lt;/strong&gt; class instance and if needed so on… In the above class &lt;strong&gt;&lt;em&gt;coffee&lt;/em&gt;&lt;/strong&gt; , &lt;strong&gt;&lt;em&gt;computer&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;integratedDevEnv&lt;/em&gt;&lt;/strong&gt; are dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Methods of Providing the Dependencies❓
&lt;/h3&gt;

&lt;h4&gt;
  
  
  By Self Construction
&lt;/h4&gt;

&lt;p&gt;In this method, the class creates needed dependencies by itself. For instance above &lt;em&gt;Developer&lt;/em&gt; class creates and initializes its dependencies &lt;em&gt;coffee&lt;/em&gt;, &lt;em&gt;computer&lt;/em&gt;, &lt;em&gt;integratedDevEnv&lt;/em&gt; by itself.&lt;/p&gt;

&lt;h4&gt;
  
  
  By Injection
&lt;/h4&gt;

&lt;p&gt;In this method, dependencies are injected from outside of the class into the class. As you see in the below, the class requests its needed dependencies while it's being created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mks8QuYK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AI7GIGhBuzLj7N1iKPqmF9Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mks8QuYK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AI7GIGhBuzLj7N1iKPqmF9Q.png" alt="" width="880" height="382"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example Class Which Dependencies Injected from Outside&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  💉 What is Dependency Injection❓
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Dependency Injections is a design pattern that allows us to &lt;strong&gt;separate the creation and use of dependencies&lt;/strong&gt;. It allow us to manage dependencies easily.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By this, we can inject required dependencies at run-time instead of creating them in the needed class. Also, it is the implementation of Dependency Inversion — SOLID’s 5th principle — .&lt;/p&gt;

&lt;h3&gt;
  
  
  🤔💉 Why we should care and use Dependency Injection❓ Benefits❓
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/54d7404f7e49b1d9692ccac82825789c/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/54d7404f7e49b1d9692ccac82825789c/href"&gt;https://medium.com/media/54d7404f7e49b1d9692ccac82825789c/href&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Self Construction&lt;/em&gt;&lt;/strong&gt; is &lt;strong&gt;&lt;em&gt;quite simple&lt;/em&gt;&lt;/strong&gt;. No big efforts or costs. And also the main class — eg. _Developer — _class has full control over how and when to create dependencies. But has some cons as below;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;It violates to Single Responsibility Principle&lt;/em&gt;&lt;/strong&gt; ; The Developer class needs to know how to create dependencies and also how to use them together. That’s too much responsibility. Each class should be responsible for just one functionality, responsibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Untestable&lt;/em&gt;&lt;/strong&gt; ; &lt;strong&gt;a)&lt;/strong&gt; When a unit &lt;em&gt;test failed&lt;/em&gt; we don’t know what is the &lt;em&gt;actual reason&lt;/em&gt;. Is the reason is &lt;em&gt;Developer&lt;/em&gt; class or another dependent class- created runtime dependencies-. &lt;strong&gt;b)&lt;/strong&gt; &lt;em&gt;Dependencies don’t replaceable&lt;/em&gt;. So when we want to mock the dependencies with different variants of them for testing different scenarios we just can’t do that. Because the dependencies are hard so the class preventing to using a &lt;a href="https://en.wikipedia.org/wiki/Test_double"&gt;test double&lt;/a&gt;. &lt;strong&gt;&lt;em&gt;For instance&lt;/em&gt;&lt;/strong&gt; ; if we want to check the productivity of a &lt;em&gt;Developer&lt;/em&gt; with a Latte instead of an Espresso, a Mac instead of a Matebook or VSCode instead of Android Studio we just can’t implement this scenario easily. Because dependencies are not replaceable.
&lt;a href="https://medium.com/media/c2282babe0a1b173f157dfe5a08bd7c8/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/c2282babe0a1b173f157dfe5a08bd7c8/href"&gt;https://medium.com/media/c2282babe0a1b173f157dfe5a08bd7c8/href&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Tightly Coupling&lt;/em&gt;&lt;/strong&gt; ; Developer class is tightly coupled to &lt;em&gt;Coffee&lt;/em&gt;, &lt;em&gt;Computer&lt;/em&gt;, &lt;em&gt;IDE&lt;/em&gt; classes. So when we want to use the &lt;em&gt;Developer&lt;/em&gt; class we have to use &lt;em&gt;Coffee, Computer, IDE&lt;/em&gt; classes. And also we can’t replace them with other variants of one. Also when a change occured in dependency classes, all dependent classes have to change. So maintainability is hard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Dependency Injection, we try to resolve the above problems. Also has cons like needing more time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Benefits of the Implementing Dependency Injection are&lt;/strong&gt; ; ease of testing, reusability of code, ease of refactoring, reducing boilerplate code, help to loose coupling and so on…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s take a closer look at some of them.&lt;/p&gt;

&lt;h4&gt;
  
  
  Ease of Testing
&lt;/h4&gt;

&lt;p&gt;One of the key benefits of DI is that it &lt;strong&gt;makes testing easier&lt;/strong&gt;. But how becomes easier? Is it just a magic wand? Let’s look at how testing becomes easier &lt;strong&gt;phase by phase&lt;/strong&gt; and see the &lt;em&gt;side benefits of DI&lt;/em&gt; ( Dependency Injection ).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Encouraging Single Responsibility&lt;/em&gt;&lt;/strong&gt; ; DI is force us a little bit to separate responsibilities. Each class should be responsible for its functionality. No need to worry about creating dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Resolving Tightly Coupling&lt;/em&gt;&lt;/strong&gt; ; By separating the responsibilities of the classes we will have &lt;em&gt;loosely coupled&lt;/em&gt; classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Encouraging Making Classes Replaceable&lt;/em&gt;&lt;/strong&gt; ; DI enables us to use d_ependency inversion_ and rely on &lt;em&gt;higher-level abstractions&lt;/em&gt;. By this, we can prepare the different implementations of our classes and pass instances of them to the needed classes. So dependencies will be easily replaceable with different implementations. Let’s make an example for more understanding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aRiRBN00--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A7ZHmG4kstWZJ3B9V_-7skw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aRiRBN00--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A7ZHmG4kstWZJ3B9V_-7skw.png" alt="" width="880" height="381"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example Class Creating its Dependencies&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Firstly we write our classes as above. It manages its dependencies. Also, it does its responsibilities. Okay, let's abstract our dependency &lt;em&gt;classes Coffee, Computer, IDE.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f8OV8brj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdJpyIz_OehE9egv13QQEPQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f8OV8brj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdJpyIz_OehE9egv13QQEPQ.png" alt="" width="880" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;High Level Abstractions of Classes with Dependency Inversion&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;— Actually taking a slip is not the responsibility of the Coffee class. But for simplicity I add it here —&lt;/p&gt;

&lt;p&gt;We abstracted our classes. When we have to a different variant of &lt;em&gt;Coffee&lt;/em&gt; such as Espresso, Americano, Latte etc. we need just implement this interface. Same thing for &lt;em&gt;IDE&lt;/em&gt; and &lt;em&gt;Computer&lt;/em&gt; classes. Now we can prepare easily different implementations as below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gibBjC7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AMFAwnRs5Qg05to_dE_E4rQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gibBjC7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AMFAwnRs5Qg05to_dE_E4rQ.png" alt="" width="880" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Different implementations of classes&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Okay, we abstracted our classes but replaceability is how working?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--61pj-c04--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AX8JRafjtEKHdCUfkKMv4Tg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--61pj-c04--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AX8JRafjtEKHdCUfkKMv4Tg.png" alt="" width="880" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Passing different dependencies to the same class&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When we want to create a &lt;em&gt;MobileDeveloper &lt;/em&gt;— or &lt;em&gt;BackEndDeveloper &lt;/em&gt;— we can pass any coffee instance or any computer instance or any IDE instance to it. Dependencies are easily replaceable. And also dependencies are reusable for different developers such as below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XQzW340c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AgQJy1Lc847YCaCwn4z4YHw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XQzW340c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AgQJy1Lc847YCaCwn4z4YHw.png" alt="" width="880" height="150"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Using the same dependencies for different instances&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now our classes are so flexible by &lt;em&gt;Dependency Inversion&lt;/em&gt; and implementation of &lt;em&gt;DI&lt;/em&gt;. We depend on &lt;em&gt;high-level abstract&lt;/em&gt; classes and inject a &lt;em&gt;specific implementation at run-time&lt;/em&gt;, based on the required use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ease of test&lt;/em&gt;&lt;/strong&gt; ; We can easily inject mock instances to our classes for imitation of different scenarios thanks to the easy replaceability of dependencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oCj92feT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6g2HOrxWRpNbjdq3tYuJ4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oCj92feT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6g2HOrxWRpNbjdq3tYuJ4w.png" alt="" width="880" height="207"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Testing example by passing different instances to developers&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Increase Code Reusability
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Dependencies can be used several times.&lt;/li&gt;
&lt;li&gt;Thanks to each class having one functionality — Single Responsibility— we can use classes in different areas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Easy Code Refactoring
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Classes are now separated and isolated. One change will not affect a lot of code lines.&lt;/li&gt;
&lt;li&gt;If we want to change an implementation detail such as migrating from Firebase to HMS Core we can easily create a new class and inject an instance of a new class from our dependency providing center (for ex; Module classes in Hilt).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are some benefits of DI such as above.&lt;/p&gt;

&lt;h3&gt;
  
  
  💉🛣️ Methods of Implementing Dependency Injection❓
&lt;/h3&gt;

&lt;h4&gt;
  
  
  By Field Injection / Setter Injection
&lt;/h4&gt;

&lt;p&gt;When some classes are instantiated by the system/library/framework we have to set dependencies by setter functions or by builder pattern.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pqjl4dPL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASgkh72zaz5MAg51YzW-rXg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pqjl4dPL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASgkh72zaz5MAg51YzW-rXg.png" alt="" width="880" height="515"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Field / Setter Injection Example&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  By Constructor Injection
&lt;/h4&gt;

&lt;p&gt;In this method, we pass needed dependencies while creating an instance of a class. We can do that in 2 ways as below.&lt;/p&gt;

&lt;h4&gt;
  
  
  Manual Constructor Injection
&lt;/h4&gt;

&lt;p&gt;Before creating our target class instance we create dependencies of its. Then we pass dependencies while creating the target class instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--en4RdyBp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AAXIo9Yx5WBFf-_8XlLQKOA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--en4RdyBp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AAXIo9Yx5WBFf-_8XlLQKOA.png" alt="" width="880" height="229"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Manual Constructor Injection&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For creating a &lt;em&gt;MobileDeveloper&lt;/em&gt; instance we have to prepare dependencies of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is so boilerplate code. We have to create dependencies whenever we want to use the class.&lt;/li&gt;
&lt;li&gt;It violates the &lt;em&gt;Single Responsibility&lt;/em&gt; Principle. When a class wants to use an instance of &lt;em&gt;MobileDeveloper&lt;/em&gt; it will be responsible both for its job and managing dependencies.&lt;/li&gt;
&lt;li&gt;A change in &lt;em&gt;MobileDeveloper&lt;/em&gt; class will affect a lot of areas. So maintainability is hard. Management is hard.&lt;/li&gt;
&lt;li&gt;We have to know which class needs which dependencies or we will look at the class for needed dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Did you think as&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wtf 💩. I just want to create a shit instance, use it and just focus to my main job&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Yeah, you are totally right. And I agree with you🤗.&lt;/strong&gt; Also, I have a solution for you in order to solve this. Let’s move to the next title.&lt;/p&gt;

&lt;h4&gt;
  
  
  Automated Dependency Injection via Libraries
&lt;/h4&gt;

&lt;p&gt;In the previous title, we created, provided and managed dependencies ourselves. But there are various libraries to do that behalf of us. There are many features of them and they have 2 key functionality almost all.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Allowing us to define how each dependency should be provided.&lt;/strong&gt; Syntax etc depends on the library which you use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3qcDk_LG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlTf4hUXSlx41HfNcrHz6VA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3qcDk_LG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlTf4hUXSlx41HfNcrHz6VA.png" alt="" width="880" height="579"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Providing Dependencies with Hilt in Android Development&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each function is responsible for handling one dependency. When we need an instance of &lt;strong&gt;&lt;em&gt;MobileDeveloper&lt;/em&gt;&lt;/strong&gt; the DI library will create an instance of &lt;em&gt;Coffee&lt;/em&gt; by calling &lt;em&gt;provideCoffee()&lt;/em&gt; and pass it to &lt;em&gt;provideMobileDeveloper()&lt;/em&gt;. The same thing goes on for &lt;em&gt;computer&lt;/em&gt; and &lt;em&gt;ide params&lt;/em&gt;. When all params are provided, &lt;em&gt;provideMobileDeveloper&lt;/em&gt;() function will create an instance of &lt;em&gt;MobileDeveloper&lt;/em&gt;. Finally, the DI library will give us the instance provided by &lt;em&gt;provideMobileDeveloper&lt;/em&gt;() function whenever we need it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Allowing us to define variables that are going to inject.&lt;/strong&gt; We just define dependencies that we need and the library will generate boilerplate code for us and provide all needed dependencies to us. When we need a &lt;em&gt;MobileDeveloper&lt;/em&gt; instance we just need to inform the library. And then use it without worrying about its dependencies etc. So cool, isn’t it 😎?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xISgszrX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AWm5oPco1iCgWWq9MdoFEkw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xISgszrX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AWm5oPco1iCgWWq9MdoFEkw.png" alt="" width="880" height="227"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Injecting variables with Hilt in Android Development&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Creating and using dependencies are separated.&lt;/em&gt; The layer of providing the dependencies is separated, clear and easy to understand. Other parts of the app don’t worry about dependencies. They just focus on their jobs.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Easy maintenance&lt;/em&gt; because the creation of dependencies is centralized in some files. And the rest of the app using here. So when we change the provider function it will affect all of the code which uses it. So no any manually refactoring.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Classes are loosely coupled.&lt;/em&gt; They can easily be replaceable. So easy testable. If we want to testing to &lt;em&gt;mobileDevelopers&lt;/em&gt; with &lt;em&gt;Latte&lt;/em&gt; instead of &lt;em&gt;Americano&lt;/em&gt; we just need to change &lt;em&gt;fun provideCoffee() = Latte().&lt;/em&gt; That’s it. — Keep in mind, for doing that we need high-level abstractions. —&lt;/li&gt;
&lt;li&gt;No boilerplate code in our codebase because it is handled by the library.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More time cost&lt;/li&gt;
&lt;li&gt;A little bit learning curve&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔚 💚 👏 Conclusion
&lt;/h3&gt;

&lt;p&gt;Dependency Injection is not a magic wand. It will be so significant, useful, and applicable when we care about SOLID, Clean Coding Principles and Modular Architecture etc. It is just an idea of handling dependencies somewhere instead of the dependent class. It will be good practice if we dedicate a part of our app to DI. For achieving that, many libraries, frameworks help us. Of course, we can do that without any 3rd party library or framework. But libraries, frameworks decrease a lot of boilerplate code and make easier management of dependencies.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;So let’s continue our development life with implementing DI via libraries, frameworks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy Coding 👩‍💻.Thanks for reading🤗. Have a healthy life. See you in the next articles👋.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/f687b28fdf7b8589fc075ad2a12dae68/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/f687b28fdf7b8589fc075ad2a12dae68/href"&gt;https://medium.com/media/f687b28fdf7b8589fc075ad2a12dae68/href&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  REFERENCES
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/cengiztoru/"&gt;Cengiz TORU - Software Engineer - Huawei | LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cengiztoru"&gt;cengiztoru - Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://developer.android.com/training/dependency-injection"&gt;Dependency Injection — Developers Android&lt;/a&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://betterprogramming.pub/straightforward-simple-dependency-inversion-vs-dependency-injection-7d8c0d0ed28e"&gt;Dependency Inversion vs. Dependency Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/android-news/basics-of-dependency-injection-for-dummies-b844d642e174"&gt;Basics of Dependency Injection for dummies!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>cleanarchitecture</category>
      <category>programming</category>
      <category>development</category>
      <category>android</category>
    </item>
    <item>
      <title>Android Jetpack Navigation Component #2 Fragmentler Arası Veri Taşıma İşlemleri</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Wed, 22 Jun 2022 11:52:51 +0000</pubDate>
      <link>https://dev.to/cengiztoru/android-jetpack-navigation-component-2-fragmentler-arasi-veri-tasima-islemleri-3ka0</link>
      <guid>https://dev.to/cengiztoru/android-jetpack-navigation-component-2-fragmentler-arasi-veri-tasima-islemleri-3ka0</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Au_EjKe1NGd7acnTO74lk7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Au_EjKe1NGd7acnTO74lk7w.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bir önceki yazımı okumadıysanız lütfen okuduktan sonra bu yazıyı okuyun. Okumamanız halinde bu yazıdakileri anlayamayabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@cengiz.toru/navigation-architecture-component-1-ekranlar-aras%C4%B1-ge%C3%A7i%C5%9F-i%CC%87%C5%9Flemleri-59937bdb7703" rel="noopener noreferrer"&gt;Navigation Architecture Component #1 Ekranlar Arası Geçiş İşlemleri&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ekranlar arası geçiş yaparken sıklıkla veri taşıma ihtiyacımız olur. Bu yazıda Navigation Component ile ekranlar arasında nasıl veri taşıyabileceğimizi anlatmaya çalışacağım. Keyifli okumalar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Öncelikle şunu belirtmek istiyorum. Veri taşımanın en hızlısı, en hafifi, kısacası best-practise yöntemi bundle ile taşımaktır. Primitive tipteki veriler direk o verinin tipindeki fonksiyon yardımıyla bundle’a eklenerek taşınabilir. Obje taşırken de modeli parcelable dizayn ederek bundle’ın parcelable fonksiyonu yardımıyla bundle’a eklenerek taşınabilir.&lt;/p&gt;

&lt;p&gt;Google ekranlar arası veri taşırken büyük verilerin taşınmamasını, veriye ait bir id / key değerinin taşınmasının önermektedir. Çünkü Android’de kayıt edilen veriler için toplam alan sınırlıdır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Büyük veriler taşımak için &lt;a href="https://developer.android.com/topic/libraries/architecture/viewmodel" rel="noopener noreferrer"&gt;buraya&lt;/a&gt;göz atabilirsiniz.&lt;/p&gt;

&lt;p&gt;Bu kadarcık teoriden sonra artık kodlama kısmına geçebiliriz 💻.&lt;/p&gt;

&lt;h3&gt;
  
  
  PRIMITIVE TİPTEKİ VERİLERİ GEÇİŞ ESNASINDA TAŞIMA
&lt;/h3&gt;

&lt;p&gt;Öncelikle NavigationGraph’ta verilerin taşınacağı ekrana taşınacak verileri tanımlamamız lazım.&lt;/p&gt;


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


&lt;p&gt;Navigation Graph dosyamızın içinde Fragmente gönderilecek veriler yukarıdaki gibi argument tagleri arasında tanımlanabilir. Gerekmesi halinde argumentin nullable olma durumuda &lt;em&gt;app:nullable=”true veya false”&lt;/em&gt; şeklinde eklenebilir.&lt;/p&gt;

&lt;p&gt;Şimdi de verileri ilgili ekrana nasıl gönderebileceğimize bakalım.&lt;/p&gt;


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


&lt;p&gt;Primitive tipteki verileri yukarıdaki koddaki gibi gönderebiliriz. Öncelikle bir bundle nesnesi oluşturuyoruz. Ardından verilerimizi bundle nesnesinin verimizin tipi ile aynı olan fonksiyonu yardımıyla bundle nesnesine ekliyoruz. Bir önceki yazıda ekranlar arası geçiş yapmayı öğrenmiştik. Ekranlar arası geçiş yaparken navigate fonksiyonuna bundle nesnesini 2. parametre olarak vererek verilerimizi taşıyabiliriz.&lt;/p&gt;

&lt;p&gt;Son olarak ilgili ekrana taşınanan verileri nasıl yakalayacağımıza bakalım.&lt;/p&gt;


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


&lt;p&gt;Verilerimizi onCreate metodunda yukarıdaki şekilde elde edebiliriz.&lt;/p&gt;

&lt;h3&gt;
  
  
  GEÇİŞ ESNASINDA NESNELERİ TAŞIMA
&lt;/h3&gt;

&lt;p&gt;Öncelikle modelimizi Parcelable olacak şekilde hazırlayalım.&lt;/p&gt;


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


&lt;p&gt;Daha sonra veri göndereceğimiz ekrana modelimiz için bir argument ekleyelim.&lt;/p&gt;


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


&lt;p&gt;Burada argType olarak modelimizin tam yolunu vermeye dikkat edelim.&lt;/p&gt;

&lt;p&gt;Daha sonra bu ekrana verilerimizi navigate fonksiyonu ile gönderelim.&lt;/p&gt;


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


&lt;p&gt;Öncelikle bir bundle nesnesi oluşturuyoruz. Daha sonra bundle nesnesinin putParcelable fonksiyonuna verimizi ekliyoruz. Son olarak bundle nesnemizi navigation controller nesnemizin navigate fonksiyonuna 2. parametre olarak veriyoruz. Bu şekilde (nesne olan) verimizi ilgili ekrana gönderebiliriz.&lt;/p&gt;

&lt;p&gt;Şimdi ilgili ekranda gelen veriyi nasıl yakalayabileceğimize bakalım.&lt;/p&gt;


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


&lt;p&gt;Gönderilen veriyi arguments nesnesinin getParcelable fonksiyonu ile elde edebiliriz.&lt;/p&gt;

&lt;p&gt;Şimdi dananın kuyruğunun koptuğu yere geldik. Lütfen dayanın bundan sonraki başlık önemli.&lt;/p&gt;

&lt;h3&gt;
  
  
  SAFE ARGS İLE VERİ TAŞIMA
&lt;/h3&gt;

&lt;p&gt;SafeArgs gradle plugini Navigation Components ile geldi. SafeArgs ile verileri taşırken Type-Safety veriler taşıyabiliyoruz.&lt;/p&gt;

&lt;p&gt;Type-Safety kavramının ne olduğunu, önemini bilmiyorsanız aşağıdaki yazımı okuyabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@cengiz.toru/type-safety-tip-t%C3%BCr-g%C3%BCvenli%C4%9Fi-12cbbb554dc4" rel="noopener noreferrer"&gt;Type Safety (Tip — Tür Güvenliği)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SafeArgs yapısını kullanabilmek için bazı ayarlar yapmamız gerekiyor.&lt;/p&gt;

&lt;p&gt;Öncelikle AndroidX kullanımını gradle.properties dosyamızda &lt;em&gt;android.useAndroidX=true&lt;/em&gt; koduyla açmış olduğumuzdan emin olmamız gerekiyor.&lt;/p&gt;

&lt;p&gt;Daha sonra build.gradle(Module: app) dosyamızın başına sadece kotlinde kullanmak için&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply plugin: "androidx.navigation.safeargs.kotlin"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Javada veya hem Javada hem Kotlinde kullanabilmek için&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply plugin: "androidx.navigation.safeargs"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;eklememiz gerekiyor.&lt;/p&gt;

&lt;p&gt;Daha sonra build.gradle(Project: …) dosyamıza&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buildscript {
   dependencies {
        def nav_version = "2.3.0"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

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

&lt;/div&gt;


&lt;p&gt;eklememiz gerekiyor. Bunları yaptıktan sonra projemizi Rebuild edelim. SafeArgs, ekranlarımızın isminin sonuna Directions eklenmiş sınıflar oluşturacaktır. Ör: LoginFragment için LoginFragmentDirections&lt;/p&gt;

&lt;p&gt;SafeArgs kullanmak için argument tanımında ve veriyi ilgili ekranda yakalama adımlarında herhangi bir değişiklik yapmıyoruz.&lt;/p&gt;

&lt;p&gt;Şimdi SafeArgs ile nasıl veri gönderdiğimize bakalım.&lt;/p&gt;


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



&lt;p&gt;Verimizi SafeArgs tarafından oluşturulmuş olan (sonu Directions ile biten) sınıfın içindeki, gerçekleşmesini istediğimiz ekran geçişinin bulunduğu fonksiyona parametre olarak veriyoruz. Bu fonksiyon ismini NavigationGraph içindeki action taglerininin id attributelerinden alır. Fonksiyon bize NavDirections tipinde bir nesne döndürür. NavigationController nesnesinin navigate fonksiyonuna bu nesneyi verirsek ekran geçişi sağlanmış olacak.&lt;/p&gt;

&lt;h4&gt;
  
  
  SAFEARGS KULLANSAK NE OLUR? KULLANMASAK NE OLUR?
&lt;/h4&gt;

&lt;p&gt;Şimdi SafeArgs yapısının avantajına bakalım. SafeArgs ile veri taşırken Tip Güvenliğinin sağlandığından bahsetmiştim. Şimdi ona bakalım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A_3I6Kkx9GqBLeETyrF6WdQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A_3I6Kkx9GqBLeETyrF6WdQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dalgınlıkla verileri gönderirken yanlış veri tipinde veri göndermeye çalışmamız halinde (yukarıdaki resimdeki gibi) IDE bizi uyarır. Varsayalım ki dalgınlığımız o kadar üzerimizde ki uyarıyı görmedik bu sefer de projeyi compile ederken hata alırız.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ATUnZURWOEaPn1lm0MHuG7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ATUnZURWOEaPn1lm0MHuG7g.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Böylece uygulama canlıya çıktıktan sonra olabilecek hatalar uygulama canlıya çıkmadan önlenmiş olur.&lt;/p&gt;

&lt;p&gt;Peki SafeArgs kullanmazsak ne olur?&lt;/p&gt;

&lt;p&gt;SafeArgs kullamazsak veri taşırken Type-Safety validasyonu yapılmaz. Bu da yanlış tipte veri göndermemiz halinde hata almamaz, hatta projenin sorunsuz build edilmesi demek olur. Ancak uygulama hata yaptığımız yeri çalıştırmaya çalıştığında çökecektir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F992%2F1%2A7BrRACRKGiVds5S8ofnrfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F992%2F1%2A7BrRACRKGiVds5S8ofnrfw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Örneğin HomeFragment bizden bir User nesnesi beklerken biz User tipinden farklı tipte veri gönderecek olursak (SafeArgs kullanmıyorsak) hiç hata almayız. Projemiz de derlenir. Ama verilerin gönderildiği ekran verileri yakalamaya çalışırken yakalayamayacak ve uygulama çökecektir.&lt;/p&gt;

&lt;p&gt;Acil bir şekilde canlıya çıkan, testi az yapılabilmiş bir projede böyle bir hata başımızı fazlasıyla ağrıtabilir. Bu tarz durumların oluşmaması için SafeArgs kullanmanızı tavsiye ederim.&lt;/p&gt;

&lt;p&gt;Gönderilen verileri yakalarken yukarıdaki koda alternatif olarak şu şekilde bir kod parçacığı da kullanılabilir.&lt;/p&gt;


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


&lt;p&gt;Bu yazımda Navigation Component ile ekranlar arasında nasıl veri taşıyabileceğimizi anlatmaya çalıştım. Olabildiğince Türkçe kaynak oluşturmaya çalışıyorum. Ama malumunuz sektörün dili İngilizce. Bu sebeple de bazı kelimeler İngilizce kalıyor. Çünkü ya Türkçe’si yok yada Türkçe’si anlamsız oluyor. Bunu anlayışla karşılayacağınızı umuyorum.&lt;/p&gt;

&lt;p&gt;Yazıyı beğendiyseniz 👏 butonuna basarsanız sevinirim. Daha fazla insanın faydalanması için paylaşmanızı rica ederim. Buna benzer yazıları yazmaya devam etmeyi düşünüyorum. Yazdıklarımdan haberdar olmak için takip edebilirsiniz. Sonraki yazı da görüşmek üzere.&lt;/p&gt;

&lt;h4&gt;
  
  
  LİNKLER
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/cengiztoru/Simple-Navigation-Component-Example" rel="noopener noreferrer"&gt;cengiztoru/Simple-Navigation-Component-Example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.android.com/guide/navigatio" rel="noopener noreferrer"&gt;Navigation Component Google Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.android.com/guide/navigation/navigation-pass-data" rel="noopener noreferrer"&gt;Navigation Component Google Pass Data&lt;/a&gt;&lt;/p&gt;

</description>
      <category>navigationcomponent</category>
      <category>safeargs</category>
      <category>data</category>
      <category>jetpack</category>
    </item>
    <item>
      <title>Modüler Yapı Nedir: Faydaları ve Yaklaşım Biçimleri</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Wed, 22 Jun 2022 05:35:47 +0000</pubDate>
      <link>https://dev.to/cengiztoru/moduler-yapi-nedir-faydalari-ve-yaklasim-bicimleri-559j</link>
      <guid>https://dev.to/cengiztoru/moduler-yapi-nedir-faydalari-ve-yaklasim-bicimleri-559j</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8DRVF-t8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AeSh_a8yzfyfztsck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8DRVF-t8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AeSh_a8yzfyfztsck.png" alt="" width="880" height="659"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Build with Legos&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Selamlar 👋, bu makalede Modüler Yapı kavramına, neden ihtiyaç duyduğumuza, modüler yapının faydalarına, modüler yapı kurma yaklaşımlarına bakacağız. Hadi başlayalım. Keyifli okumalar ☕🍫🤗.&lt;/p&gt;
&lt;h4&gt;
  
  
  Modüler Yapı Nedir❓
&lt;/h4&gt;

&lt;p&gt;Yazdığımız projelerimizi-uygulamalarımızı olabildiğince birbirinden bağımsız-izole olacak şekilde daha küçük alt parçalara, katmanlara ayırdığımız yapı olarak tanımlayabiliriz.&lt;/p&gt;
&lt;h4&gt;
  
  
  Modüler Yapıya Neden İhtiyaç Duyarız❓
&lt;/h4&gt;

&lt;p&gt;Uygulamalarımız günden güne büyüyor. Sürekli yeni özellikler ekleniyor. Ve giderek projede çalışan geliştirici sayısı da artıyor. Bir yerden sonra yeni özellik eklemenin maliyeti artıyor. Bir değişiklik yapılacağı zaman başka bir geliştiricinin işi bekletilmek zorunda kalınabiliyor. Yapılan bir değişiklik birden fazla yeri etkileyebiliyor. Buda haliyle test süreçlerini uzatıyor, release’leri geciktiriyor. Projenin codebase’i büyüdükçe projenin build edilme süresi de giderek artıyor. Buda geliştiricinin verimliliğini düşürebiliyor.&lt;/p&gt;

&lt;p&gt;Bunun gibi durumlardan dolayı kodlarımızı, feature’larımızı olabildiğince birbirinden bağımsız çalışacak katmanlar haline getirmeye ihtiyacımız oluyor. Bu sayede genel anlamda proje yönetimi kolaylaşıyor. Bir yerde yapılan değişiklik daha az yeri, geliştiriciyi etkiliyor. Build süreleri kısalıyor. Geliştiricilere siz şu şu modülden sorumlusunuz denilerek geliştiricilerin odaklanacağı asıl feature’lar belirlenebiliyor.&lt;/p&gt;
&lt;h4&gt;
  
  
  Modüler Yapının Faydaları Nelerdir❓
&lt;/h4&gt;

&lt;p&gt;Genel olarak yukarıda paragrafta bahsettim aslında ama şimdi biraz daha başlık başlık değinelim 👊.&lt;/p&gt;

&lt;a href="https://medium.com/media/e831d372549517830cd6c8f2bcbb2120/href"&gt;https://medium.com/media/e831d372549517830cd6c8f2bcbb2120/href&lt;/a&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Ölçeklenebilirliği Artırma (&lt;/strong&gt;Scalability*&lt;em&gt;)&lt;/em&gt;*
&lt;/h4&gt;

&lt;p&gt;Uygulama büyüdükçe yeni ihtiyaçlar ortaya çıktıkça uygulamanın yönetimi zorlaşıyor. Projedeki geliştirici sayısı da artıyor. Bir yerden sonra bir feature geliştiren bir geliştirici başka bir geliştiriciyi bloklayabiliyor. Eklenecek özellik başka yerleri etkileyebiliyor. Bunu çözmek için proje küçük modüllere ayrılıp hangi developerların hangi modüller üzerinde geliştirme yapılacağı belirlenerek bu problem üstesinden gelinebilir.&lt;/p&gt;

&lt;p&gt;Uygulama ayrı ayrı handle edilebilir hale gelmiş olacak. Seperation of Concern’ü artırmış olacak. Her şeyin ayrı testi, resource’ları olmuş olacak. Her geliştirici kendi alanına odaklanabilmiş olacak. Bu geliştiricinin verimliliğini de artıran bir etmen. Geliştiricilere yetkiler tanımlayarak her modüle erişmesi de engellenebilir.&lt;/p&gt;
&lt;h4&gt;
  
  
  Bakım Yapmayı Kolaylaştırma (Maintainability)
&lt;/h4&gt;

&lt;p&gt;Uygulamada herhangi bir değişiklik yapılacağı zaman monolitik uygulamada büyük kod dosyaları, package’ları arasında kaybolmak yerine modüler yapıdaki bir uygulamada yapılacak iş ile ilgili modüle giderek daha az bir kod incelenir. Bu sayede projenin büyük bölümü taramak, anlamaya çalışmak ile uğraşmak yerine nispeten daha az kod ile uğraşılmış olur. Elde edilen hatanın tespit edilmesi ve bug’ların çözülmesi kolaylaşır, süresi kısalır. Eklenecek yeni özellik daha az yeri etkiler. Daha kolay eklenir.&lt;/p&gt;
&lt;h4&gt;
  
  
  Continuous Integration Sürecini Hızlandırma
&lt;/h4&gt;

&lt;p&gt;Monolik bir uygulamada bir değişiklik yaptığınızda tüm testlerini koşturmanız gerekebilirken modüler bir uygulamada ise değişikliğin yapıldığı modül ve ilişkili yerlerin testlerinin koşulması yeterli olacaktır. Yapılan değişiklikten diğer modüller etkilenmez. Bu yüzden de diğer modüllerin testlerinin koşulmasına gerek kalmaz. Buda CI sürecimizi bir nebze olsun hızlandırır.&lt;/p&gt;
&lt;h4&gt;
  
  
  Daha Küçük Kurulum Dosyası (APK) Elde Etmeyi Sağlama
&lt;/h4&gt;

&lt;p&gt;Modüler bir uygulamada Bundle ve Dynamic Features sayesinde daha küçük boyutlu kurulum dosyaları elde ederiz. Buda kullanıcılarımızın memnuniyetini attıran bir etmen.&lt;/p&gt;
&lt;h4&gt;
  
  
  Kodun Tekrar Kullanılabilirliğini Artırma
&lt;/h4&gt;

&lt;p&gt;Uygulama modüler halde olduğunda, bir modül kolayca alınıp başka bir projeye aktarılabilir. Farklı projelerde kullanılan ortak componentlerin paylaşılabilmesini, belli başlı bazı modülleri build ederek bir codebase üzerinden farklı uygulamalar çıkarabilmeyi kolaylaştırır.&lt;/p&gt;
&lt;h4&gt;
  
  
  Daha Hızlı Compilation
&lt;/h4&gt;

&lt;p&gt;Monolitik bir uygulamada A dosyasını değiştirdiğimizde tüm uygulama compile edilirken modüler bir uygulamada aynı dosyayı değiştirdiğimiz zaman o dosyanın içinde bulunduğu modül ve ilişkili yerler compile edilir. Bu da daha kısa süre de build almamızı sağlar.&lt;/p&gt;

&lt;a href="https://medium.com/media/4576792b77ad91d269bb854bcbf59c3d/href"&gt;https://medium.com/media/4576792b77ad91d269bb854bcbf59c3d/href&lt;/a&gt;
&lt;h4&gt;
  
  
  Modüler Yapıyı Kurma Yaklaşımları
&lt;/h4&gt;
&lt;h4&gt;
  
  
  Katman Bazlı Modüler Yapı Yaklaşımı
&lt;/h4&gt;

&lt;p&gt;Uygulamanın data, domain, presentation vb şekilde ayrı ayrı katmanlara ayırıp sonrasında bunları ayrı modül haline getiren yaklaşımdır. Katmanlar arası (ui-bussiness logic…) izolasyon ve güzel bir yapı (structure) sağlar. Bir modülde yapılan değişiklik diğer modülleri etkilemez. Bu sayede modüller bağımsız şekilde test edilebilir olur. Fena olmayan bir package hiyerarşisine sahip uygulamayı katmanlı modüler yapıya geçirmek biraz daha kolay olur.&lt;/p&gt;
&lt;h4&gt;
  
  
  Özellik (Feature) Bazlı Modüler Yapı Yaklaşımı
&lt;/h4&gt;

&lt;p&gt;Uygulamada var olan özellikleri modül modül ayırma ve özellikleri birbirinden bağımsız hale getirme yaklaşımıdır. Bir özellikte yapılan bir değişiklik başka bir özelliği pek etkilemez. Bu sayede sadece ilgili modül ile ilgili testlerin koşulması yeterli olur.&lt;/p&gt;

&lt;p&gt;Android bir projede sağladığı en büyük faydalardan bir tanesi &lt;em&gt;dynamic features&lt;/em&gt;’ları kullanabilmektir. Bu sayede ihtiyaç oldukça bazı modüller indirilip kurulup kullanılabiliyor. Dolayısıyla uygulama ilk indirildiği zaman tüm özelliklerin büyük boyutlu bir apk ile indirilmesine gerek kalmıyor. Sadece kullanıcının sık kullanacağı özellikleri cihazında barındırması sağlanıyor. Bu da depolama ve mobil veri kullanımını iyileştiriyor.&lt;/p&gt;

&lt;p&gt;Katmanlı mimariye göre implement edilmesi daha zordur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ui8UJ_oZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/735/0%2AQ_eIrfEFtprmZS2g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ui8UJ_oZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/735/0%2AQ_eIrfEFtprmZS2g.jpg" alt="" width="735" height="683"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Kaynak&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Hibrit Modüler Yapı Yaklaşımı
&lt;/h4&gt;

&lt;p&gt;Katman Bazlı yaklşım ile Özellik Bazlı yaklaşımın birlikte harmanlanarak kullanılmasıdır. Örneğin; önce top level’da özellik bazlı modüler bir yaklaşımı implement edip sonrasında her bir özellik modülü içerisinde katman bazlı modüler yapı yaklaşımı uygulanır.&lt;/p&gt;
&lt;h4&gt;
  
  
  Son Sözler
&lt;/h4&gt;

&lt;p&gt;Modülerizasyonun tek bir çözümü yok. Çeşitli seçeneklerimiz var. Ve bizde kendi projemizin durumlarına, ihtiyaçlarımıza göre hareket ederek karar vermeliyiz. Kısa zamandaki maliyetlerimize ve uzun dönemli olarak modülarizasyonun uygulamamıza getireceği faydaları göz önünde bulundurarak karar vermeliyiz. Monolitik yapıda bir uygulamamız varsa Katman Bazlı Modülerlik ile başlayabiliriz. Katman Bazlı Modülerliği oturttuktan sonra &lt;em&gt;Dynamic Delivery&lt;/em&gt;’e ulaşmak istiyorsak Özellik Bazlı Modülerlik için kolları sıvayabiliriz.&lt;/p&gt;

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

&lt;p&gt;Bu makalede Modüler Yapı kavramını, faydalarını ve implement edilme yöntemlerini inceledik. Okuduğunuz için teşekkür ederim 👏. Umarım faydalı olmuştur. Görüşmek üzere, sağlıcakla kalın👋🤗.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KBqGEU1B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ABQG_8GpS_3yedPUT2QKG_w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBqGEU1B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ABQG_8GpS_3yedPUT2QKG_w.gif" alt="" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Kaynak&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Referanslar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/cengiztoru/"&gt;Cengiz TORU - Software Engineer - Huawei | LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cengiztoru"&gt;cengiztoru - Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

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




</description>
      <category>androidappdevelopmen</category>
      <category>modular</category>
      <category>android</category>
      <category>cleanarchitecture</category>
    </item>
    <item>
      <title>Android Jetpack Navigation Component #1 Fragmentler Arası Geçiş İşlemleri</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Fri, 17 Jun 2022 07:06:17 +0000</pubDate>
      <link>https://dev.to/cengiztoru/android-jetpack-navigation-component-1-fragmentler-arasi-gecis-islemleri-2haa</link>
      <guid>https://dev.to/cengiztoru/android-jetpack-navigation-component-1-fragmentler-arasi-gecis-islemleri-2haa</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Au_EjKe1NGd7acnTO74lk7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2Au_EjKe1NGd7acnTO74lk7w.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigation&lt;/strong&gt; , uygulamada ekranlar arasında yapılan geçişler demektir. Biz normalde bu geçiş işlemlerini manuel olarak yapardık. Navigation componenti bu geçişleri daha tutarlı bir şekilde yapmamızı sağlar. Bunun yanında geri butonuna basılması, veri taşıma, animasyon gibi konularda da işimizi kolaylaştırıyor.&lt;/p&gt;

&lt;p&gt;Bu yazıda navigation component kurulumunu, ekranlar arası geçiş işlemini ve geçişlere animasyon ekleme işlemlerini anlatmaya çalışacağım. Keyifli okumalar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigation&lt;/strong&gt; ; Navigation Graph, NavHost, NavController olmak üzere 3 temel parçadan oluşur. &lt;strong&gt;NavigationGraph&lt;/strong&gt; ekranlarımızın ve geçişlerimizin içinde olduğu bir xml dosyasıdır. &lt;strong&gt;NavHost&lt;/strong&gt; uygulamadaki ekranlarımızın barındığı ortamdır. SingleActivity-MultiFragment yapısı için Activity olarak düşünebilirsiniz. &lt;strong&gt;NavController&lt;/strong&gt; ise NavigationGraph içerisinde bulunan ekranlar arası geçişleri yapmamızı, yönetmemizi sağlayan yapıdır. Eğer kafanızda biraz soyut kaldıysa merak etmeyin şimdi adım adım yapacağız.&lt;/p&gt;

&lt;p&gt;Öncelikle dependecy’leri ekleyelim. Alltaki dependencyleri build.gradle(Module:app) dosyasına ekleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//NavigationComponent dependencies
def nav_version = "2.3.0"
implementation _"_androidx.navigation:navigation-fragment-ktx:$nav_version_"_  
implementation _"_androidx.navigation:navigation-ui-ktx:$nav_version_"_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Alttaki dependencyleri ise build.gradle(Project:…) dosyasında dependencies bloğunun içine yazalım.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Daha sonra ekranlarımızı tasarlayalım. (Ekran tasarımını burada yapmayacağım. Ama &lt;a href="https://github.com/cengiztoru/Sample-Navigation-Component-Example" rel="noopener noreferrer"&gt;&lt;strong&gt;buraya&lt;/strong&gt;&lt;/a&gt;basarak konu ile ilgili &lt;a href="https://github.com/cengiztoru/Sample-Navigation-Component-Example" rel="noopener noreferrer"&gt;&lt;strong&gt;githubdaki projeme&lt;/strong&gt;&lt;/a&gt; ulaşabilirsiniz.)&lt;/p&gt;
&lt;h3&gt;
  
  
  NAVIGATION GRAPH OLUŞTURMA
&lt;/h3&gt;

&lt;p&gt;Şimdi de ekranlar arasındaki geçişleri belirtmemizi sağlayan &lt;strong&gt;Navigation Graph&lt;/strong&gt; dosyamızı ekleyelim. Bunun için &lt;strong&gt;Res → New → Android Resource File&lt;/strong&gt; tıklayıp kaynak tipi navigation olan navigation_graph adlı bir dosya oluşturalım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A4ooUotYvTZdPTiXwY5HeMw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A4ooUotYvTZdPTiXwY5HeMw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu dosyanın design kısmını açalım. Yeni bir ekran eklemek için sol üstteki + butonuna basalım. Burada ekranlarınızı sırasıyla eklemenizi tavsiye ederim. Önce giriş yapma ekranı, sonra kayıt olma ekranı, sonra anasayfanız gibi. Tabiki bu sıralama uygulamanızın yapısına göre değişebilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F284%2F1%2AEmQzBiEeyPMCP8_gjpL0uQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F284%2F1%2AEmQzBiEeyPMCP8_gjpL0uQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aşağıdaki gif resminde nasıl ekleyebileceğinizi daha detaylı görebilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2Amv4UUP6R7Vpw6Z-BbHujlQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2Amv4UUP6R7Vpw6Z-BbHujlQ.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Biz ekranlarımızı yukarıdaki şekilde eklerken ide bizim için onun kodlarını navigation_graph dosyasına yazar. İncelemek isterseniz Xml / Code kısmına ekranına geçebilirsiniz.&lt;/p&gt;

&lt;p&gt;Şimdi de hangi ekrandan hangi ekrana geçiş yapıldığını belirtelim. Örneğin SplashFragmentimizde kullanıcının giriş yapıp yapmadığını kontrol ediyor olalım. Kullanıcının giriş yapmış olması halinde HomeFragmente aksi takdirde LoginFragmente yönlendirelim. LoginFragmentte de kullanıcı SignUp fragmentine geçebiliyor ve dönebiliyor olsun. Bu işlemi aşağıdaki gifteki gibi yapabiliriz. Başını kaçırırsanız lütfen tekrar başa dönmesini bekleyin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2Ah417ujS2Ov2_uGQFh6Ii_g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F600%2F1%2Ah417ujS2Ov2_uGQFh6Ii_g.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yine biz bu işlemleri yaparken ide bizim için bu işlemlerin kodlarını xml tarafına yazıyor. İncelerseniz bu sefer fragment tagleri içerisine &lt;strong&gt;action&lt;/strong&gt; taglerinin geldiğiniz göreceksiniz.&lt;/p&gt;
&lt;h3&gt;
  
  
  NAVHOST EKLEME
&lt;/h3&gt;

&lt;p&gt;NavigationGraph ile işimiz bittiğine göre artık NavHost’a geçebiliriz. NavHost ekranlarımızı barındıran ortamdır. Bunun için main_activity.xml dosyasına şu kodları yazıyoruz.&lt;/p&gt;


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



&lt;p&gt;Eklediğimiz fragmentin NavHost’a ait fragment olduğunu belirtmek için &lt;strong&gt;&lt;em&gt;android:name&lt;/em&gt;&lt;/strong&gt; satırını ekliyoruz. Daha sonra bu fragmentin hangi Navigation Graph dosyasını host edeceğini &lt;strong&gt;&lt;em&gt;app:navGraph&lt;/em&gt;&lt;/strong&gt; satırı ile belirtiyoruz. Son olarak bu fragmentin uygulamadaki varsayılan NavHost olduğunu belirtmek için &lt;strong&gt;&lt;em&gt;app:defaultNavHost=true&lt;/em&gt;&lt;/strong&gt; kodunu ekliyoruz.&lt;/p&gt;

&lt;p&gt;NavHost ile işimiz bitti. Buraya kadar ekranlarımız arasındaki geçişleri ve bu geçişlerin hangi host üzerinden yapılacağını belirttik. Şimdi de bu geçişleri yapma adımına geçelim.&lt;/p&gt;

&lt;h3&gt;
  
  
  EKRANLAR ARASI GEÇİŞ YAPMA
&lt;/h3&gt;

&lt;p&gt;Geçişleri yapmak için bir tane NavController nesnesine ihtiyacımız var. Bu nesneyi elde ettikten sonra nesnenin navigate fonksiyonunu kullanarak geçişleri yapabiriz. Navigate fonksiyonuna NavigationGraph içerisindeki gerçekleşmesini istediğimiz geçişin (action tagleri) id değerini parametre olarak veririz. Bir Fragment için aşağıdaki kodu inceleyelim.&lt;/p&gt;


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


&lt;p&gt;Öncelikle NavController sınıfından bir nesne referansı üretiyoruz. Daha sonra onViewCreated metodunda bu nesneyi oluşturuyor, initalize ediyoruz. Daha sonra kayıt ol butonuna tıklanıldığında bu nesnenin navigate fonksiyonu yardımıyla ekran geçişini sağlıyoruz. Tıklama olayını yorum satırı haline getirdiğim şekilde de yakalayabiliriz. Bu geçişin yapıldığı navigation_graph kodu ise şöyle&lt;/p&gt;


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


&lt;p&gt;Dikkat edeceğiniz üzere Kotlin tarafında navigate fonksiyonuna xml dosyasındaki action taginin id değerini parametre olarak gönderdik. Bu sayede giriş ekranından kayıt olma ekranına geçmiş olduk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F476%2F1%2AH4-oG1Y_JZZg4Vi97AduvA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F476%2F1%2AH4-oG1Y_JZZg4Vi97AduvA.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ekran geçiş örneği&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kayıt ekranında kullanıcının &lt;strong&gt;geri butonuna basma&lt;/strong&gt; sı halinde navigation bu olayı yakalayacak ve bir önceki ekrana dönme işlemini kendisi otomatik olarak gerçekleştirecek. Bizim manuel olarak yönetimini yapmaktan kurtaracaktır.&lt;/p&gt;
&lt;h4&gt;
  
  
  BİR EKRANDAN GERİ DÖNÜLMESİNİ ENGELLEME
&lt;/h4&gt;

&lt;p&gt;Bazen uygulamalarımızda kullanıcıların bazı ekranlardan geri dönmesini istemeyiz. Örneğin giriş yapma ekranından bilgilerini girdikten sonra anasayfaya geçen kullanıcının geri butonuna basması halinde giriş ekranına dönmesini değil de direk uygulamadan çıkmasını isteriz. Bunu navigation component ile yapmak için action taginin içine&lt;/p&gt;

&lt;p&gt;&lt;em&gt;app:popUpTo=”&lt;a class="mentioned-user" href="https://dev.to/id"&gt;@id&lt;/a&gt;/loginFragment”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;app:popUpToInclusive=”true”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;kodlarını eklememiz gerekir.&lt;/p&gt;


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


&lt;p&gt;Bu sayede LoginFragmentten HomeFragmete gidildikten sonra kullanıcının geri basması halinde navigation kullanıcıyı giriş ekranına yönlendirmek yerine direk uygulamadan çıkmasını sağlayacaktır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F472%2F1%2Ab7UCtjSaZTmLsAzv_0z2sg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F472%2F1%2Ab7UCtjSaZTmLsAzv_0z2sg.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  EKRANLAR ARASI GEÇİŞE ANİMASYON EKLEME
&lt;/h3&gt;

&lt;p&gt;Öncelikle animasyon klasörümüzü ve animasyon dosyalarımızı oluşturuyoruz. Daha sonra animasyon eklemek istediğimiz geçişin action taginin içine aşağıdaki gibi 4 satır kod ekliyoruz. Sağlıklı bir giriş ve çıkış animasyonu için 4 satırıda eklemenizi tavsiye ederim.&lt;/p&gt;


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


&lt;p&gt;İlgili resourceları burada yazmadım. Onları &lt;a href="https://github.com/cengiztoru/Sample-Navigation-Component-Example" rel="noopener noreferrer"&gt;b &lt;strong&gt;uraya&lt;/strong&gt;&lt;/a&gt;tıklayarak konu ile ilgili &lt;a href="https://github.com/cengiztoru/Sample-Navigation-Component-Example" rel="noopener noreferrer"&gt;&lt;strong&gt;githubdaki projemde&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;n&lt;/strong&gt; alabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F476%2F1%2A9ywctgpsCjw9bmvsNSxlRQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F476%2F1%2A9ywctgpsCjw9bmvsNSxlRQ.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu yazımda Navigation Component ile ekranlar arası geçiş yapmayı, gidilen ekrandan geri dönmeyi engellemeyi, geçişlere animasyon eklemeyi anlatmaya çalıştım. Sonraki yazımda Navigation ile ekranlar arası geçişte nasıl veri taşıyabileceğimizi anlatmaya çalışacağım. Yazıyı beğendiyseniz 👏 butonuna basarsanız sevinirim. Daha fazla insanın faydalanması için paylaşmanızı rica ederim. Buna benzer yazıları yazmaya devam etmeyi düşünüyorum. Yazdıklarımdan haberdar olmak için takip edebilirsiniz. Sonraki yazı da görüşmek üzere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@cengiz.toru/navigation-architecture-component-2-veri-ta%C5%9F%C4%B1ma-i%CC%87%C5%9Flemleri-269775be977" rel="noopener noreferrer"&gt;Navigation Architecture Component #2 Veri Taşıma İşlemleri&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;LİNKLER&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/cengiztoru/Simple-Navigation-Component-Example" rel="noopener noreferrer"&gt;cengiztoru/Simple-Navigation-Component-Example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.android.com/guide/navigatio" rel="noopener noreferrer"&gt;Navigation Component Google Guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>jetpack</category>
      <category>androidappdevelopment</category>
      <category>fragments</category>
    </item>
    <item>
      <title>Type Safety (Tip — Tür Güvenliği)</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Fri, 17 Jun 2022 07:00:46 +0000</pubDate>
      <link>https://dev.to/cengiztoru/type-safety-tip-tur-guvenligi-34j1</link>
      <guid>https://dev.to/cengiztoru/type-safety-tip-tur-guvenligi-34j1</guid>
      <description>&lt;h3&gt;
  
  
  Type Safety (Tip — Tür Güvenliği)
&lt;/h3&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Özetle derleyicilerin, derleme esnasında değişkenleri doğrulamasıdır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Biraz açalım.
&lt;/h4&gt;

&lt;p&gt;Sayı değeri alan bir değişkenimiz olduğunu düşünün. Bu değişkenimize daha sonrasında string bir değer atamamamız gerekir. Ama bazen dalgınlığımıza gelir böyle hatalar yapabiliriz. Bu hatalar bizlere zaman kaybettirir. Eğer bir uygulama aceleye gelmiş ve testi az yapılmış ise uygulama canlıya çıktıktan sonra kullanıcılar hatanın yapıldığı ekrana girince uygulama çöker, beklediklerinden farklı sonuçlar alır. Ondan sonra şikayetler yağar. Şimdi ara dur hata neden kaynaklanıyor?&lt;/p&gt;

&lt;p&gt;Bu tarz durumların oluşmasını engellemek için diller ve derleyicilerin iş birliği ile type-safety kavramı ortaya çıktı.&lt;/p&gt;

&lt;p&gt;Derleyiciler compile time anında değişkenlere doğru değerler atanıp atanmadığını kontrol ederler. Değişkenlere yanlış değer atanmış olması halinde derleme esnasında hata verir ve runtime anındaki oluşabilecek hataların önüne geçilmiş olur. Hatta bazı derleyiciler kod yazma anında değişkene yanlış tipte bir veri atamamız halinde bizi uyarırlar.&lt;/p&gt;

&lt;h4&gt;
  
  
  Şimdi birkaç örnek inceleyelim.
&lt;/h4&gt;

&lt;p&gt;Örneğin Java type safe bir dil iken JavaScript type safe bir dil değildir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Javascriptte&lt;/strong&gt; bir değişken yazarken tipini belirtme zorunluluğu yoktur. Buna Type Inference (Tip çıkarımı) denir. Bu sayede int olarak ilk değerini almış bir değişkene daha sonra string bir değer atanabilir. Buda o değişkeni kullanacağımız yerlerde hatalar almamıza sebep olacaktır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b7CMrIHq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/414/1%2Af1K7hpD7JVbvW49DRtv-1w.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b7CMrIHq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/414/1%2Af1K7hpD7JVbvW49DRtv-1w.jpeg" alt="" width="414" height="101"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;JavaScripte type safety olmaması&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yukarıdaki kod parçacığında int olan bir değişkene string bir değer atamamıza rağmen herhangi bir hata , uyarı almadık.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Javada&lt;/strong&gt; bir değişken yazarken tipinin ne olduğunu belirtmek zorundasınız. Daha sonra o değişkene o tip dışındaki bir veri atayamazsınız. Hem kod anında, hemde derleme esnasında hata alırsınız.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LZY-sEb9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/505/1%2AIaL1lL19dH-zyjwcWYmDng.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LZY-sEb9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/505/1%2AIaL1lL19dH-zyjwcWYmDng.jpeg" alt="" width="505" height="295"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Javada type safety&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yukarıdaki kod parçacığında int türünden tanımladığımız değişkenimize string verdiğimizde kod yazarken ve derleme esnasında hata alıyoruz. Bu hatayı almamız Type Safety kavramıdır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Şöyle bir problemimiz olsun&lt;/strong&gt;. Bir manav dükkanına bir dayımız gitmiş olsun. Bu dayımız 1 kilo elma, 3 kilo portakal, 10 kilo muz alsın. Bizde bu dayımızın ödeyeceği toplam ücreti gösteren bir program yazalım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mixEaBjh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/916/1%2ASymRdKQMwkJi2bK7J0Cm8w.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mixEaBjh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/916/1%2ASymRdKQMwkJi2bK7J0Cm8w.jpeg" alt="" width="880" height="327"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Problem çözümüne ilişkin JavaScript kodu (Visual Studio Code)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Bu problemi type safety olmayan bir dilde yazarsak, dalgınlık anında int değer alması gereken bir değişkene string değer verirsek, derleyici ne kod yazarken, ne derleme anında, ne de çalışma anında bize bir hata vermezse alacağımız sonuç&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bbGiXke5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/915/1%2AjSN9lbJ-Q0OETpWldn_Rrg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bbGiXke5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/915/1%2AjSN9lbJ-Q0OETpWldn_Rrg.jpeg" alt="" width="880" height="145"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Type Safety olmayan bir dilde olabilecekler&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;gibi absürt bir veri olur. Biz toplam ücret olarak bir sayı beklerken bambaşka bir yazı çıktı. Type safety işte burada devreye giriyor.&lt;/p&gt;

&lt;p&gt;Şimdi de bunu Javada yazalım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LPPLhLJa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1004/1%2AGTOi2i3ZfWmWpBRWl8SN8w.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LPPLhLJa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1004/1%2AGTOi2i3ZfWmWpBRWl8SN8w.jpeg" alt="" width="880" height="425"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Probleme ilişkin Java kodu&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dikkat ederseniz daha kodu yazarken kodun altı kızarıyor, hata veriyor. Farz edelim ki dalgınlığımız o kadar üzerimizde ki onu da göremedik. Kodu derlemeye başladığımız zaman derleyici bize&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_-mTXGzl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/802/1%2AtcQ93Xr8dgN8C4GriSNQuQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_-mTXGzl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/802/1%2AtcQ93Xr8dgN8C4GriSNQuQ.jpeg" alt="" width="802" height="101"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Type Safety hatası&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;gibi bir hata verir. Bu sayede uygulamamızı canlıya çıkarmadan hatamızı düzeltmiş oluruz.&lt;/p&gt;

&lt;p&gt;Daha fazla örnek incelemek için &lt;a href="https://stackoverflow.com/questions/260626/what-is-type-safe"&gt;buraya&lt;/a&gt;tıklayabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dipnot&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;: Java ile JavaScript arasında isim benzerliği dışında pek bir benzerlik yoktur. Netscape firması JavaScripti piyasaya süreceği sıralar Sun Microsystem tarafından geliştirilen Java popüler bir dildi. Netscape firması da Javanın bu popülerliğinden yararlanmak için JavaScript ismini kullandı ve amacına da ulaştı.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Özetle&lt;/strong&gt; type safety, derleyicilerin kodu derlerken değişkenlerimizin tipleri ile atanan değerlerin tipleri arasında farklılık olması durumunda hata vermesi ve kodu derlememesidir. Tip validasyonu yapmasıdır.&lt;/p&gt;

&lt;p&gt;Bir yazının daha sonuna geldik. Basit ama önemli bir kavram olan Type Safety kavramını anlatmaya çalıştım. Beğendiyseniz 👏 butonuna basarsanız sevinirim. Daha fazla insanın faydalanması için de paylaşmanızı rica ederim. Sonraki yazımda görüşmek üzere kendinize iyi bakın.&lt;/p&gt;

</description>
      <category>compilers</category>
      <category>java</category>
      <category>javascript</category>
      <category>typesafety</category>
    </item>
    <item>
      <title>Github Readme dosyasına gömülü video nasıl eklenir</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Mon, 13 Jun 2022 06:53:44 +0000</pubDate>
      <link>https://dev.to/cengiztoru/github-readme-dosyasina-gomulu-video-nasil-eklenir-ho3</link>
      <guid>https://dev.to/cengiztoru/github-readme-dosyasina-gomulu-video-nasil-eklenir-ho3</guid>
      <description>&lt;h3&gt;
  
  
  Github Readme dosyasına gömülü video nasıl eklenir?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IIIWPyEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-zO5GC_wdGUDuOb6R-IelA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IIIWPyEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-zO5GC_wdGUDuOb6R-IelA.jpeg" alt="" width="880" height="606"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Kaynak&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Giriş
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Selamlar🖐.&lt;/strong&gt; Bu yazımda readme dosyalarına gömülü bir videoyu kolayca nasıl ekleyebileceğinizden bahsedeceğim.&lt;/p&gt;

&lt;p&gt;Eğer aşağıdaki seçeneklerden birisi ile Readme dosyanıza video eklerseniz&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Birinci Seçenek
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[![Now in Android: 55] // Title
(https://i.ytimg.com/vi/Hc79sDi3f0U/maxresdefault.jpg)] // Thumbnail
(https://www.youtube.com/watch?v=Hc79sDi3f0U "Now in Android: 55") // Video Link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;İkinci seçenek
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[&amp;lt;img src="https://i.ytimg.com/vi/Hc79sDi3f0U/maxresdefault.jpg" width="50%"&amp;gt;](https://www.youtube.com/watch?v=Hc79sDi3f0U "Now in Android: 55")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;aşağıdaki resimdeki gibi bir çıktı elde edersiniz. Kullanıcı videonun küçük resmine tıkladığında github sayfasından çıkıp başka bir sayfaya yönlendirilecektir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iNc3yT3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AVitByKjas2fYCI24Gc4Clw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iNc3yT3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AVitByKjas2fYCI24Gc4Clw.gif" alt="" width="600" height="422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Gömülü olmayan video örneği&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Bu gömülü bir video ekleme değildir aslında. Çünkü kullanıcı videoyu izleyebilmek için başka bir websitesine yönlendiriliyor. Kullanıcının github sayfamıza olan odağını- ilgisini kaybetmemek için başka sayfaya gitmesini tabiki istemiyoruz.&lt;/p&gt;

&lt;p&gt;Peki gömülü bir videoyu Readme dosyamıza nasıl ekleyebiliriz. Sihirli sözcükler için hazır mısınız?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sadece &lt;strong&gt;“ Sürükle &amp;amp; Bırak”&lt;/strong&gt;  😄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RmuPTiRN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2Aa2fC7zy5F1O6ITaA48Cwkw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RmuPTiRN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2Aa2fC7zy5F1O6ITaA48Cwkw.gif" alt="" width="600" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sürükle-Bırak ile Readme dosyasına nasıl video eklenir&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Bu yöntemle, reponuz ile ilgili videolarınızı kolay bir şekilde Readme dosyanıza ekleyebilirsiniz. Kullanıcı videoyu izlemek için başka bir siteye de gitmeyeceği için kullanıcının odağınıda kaybetmemiş olursunuz.&lt;/p&gt;

&lt;p&gt;Ayrıca eklenen bu gömülü video açılıp kapanabilir (collapsed- expanded). Ek olarak kullanıcılarınız videonun sesini değiştirip videoyu da tam ekran izleyebilirler.&lt;/p&gt;

&lt;p&gt;Aynı yöntemle resimlerinizi Readme dosyanıza ekleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Aklınızda bulunsun; resimler ve gifler için &lt;a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files"&gt;maksimum dosya boyutu&lt;/a&gt; 10MB’tır. Video için ise ücretsiz Github hesabınızda 10MB iken ücretli Github hesabınızda ise Readme’ye bu şekilde ekleyebileceğiniz maksimum video dosya boyutu 100MB’tır&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Öneri;&lt;/strong&gt; Repolarınız için Readme dosyası hazırlarken Intellij IDEA ile kullanılabilen &lt;a href="https://plugins.jetbrains.com/plugin/7793-markdown"&gt;Markdown Plugin&lt;/a&gt;’i yerine Github’ın websitesini ( yukarıdaki gifte gösterdiğim gibi) kullanınız. Çünkü bu plugin bazen düzgün çalışamayabiliyor. Video için sürekle &amp;amp; bırak gibi bir özelliği desteklemiyor. (Resimler için destekliyor bu arada). Video için sürükle &amp;amp; bırak özelliği Github websitesinde var olan bir özellik. Bu yüzden bazı Readme dosyalarının görünümleri Github websitesinde ve Intellij IDEA’de farklı gözükebilmektedir. Plugini kullanarak önemli bir zaman kaybettim.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sonuç
&lt;/h4&gt;

&lt;p&gt;Bu makalede Github tarafından sağlanan Sürükle &amp;amp; Bırak özelliği sayesinde Readme dosyalarımıza gerçek gömülü bir videoyu kolayca nasıl ekleyebileceğimizi öğrendik. Eğer makaleyi beğendiyseniz alkış butonuna basabilir ve makaleyi paylaşabilirsiniz. Sonraki makalelerde görüşmek üzere 🤗.&lt;/p&gt;

&lt;h4&gt;
  
  
  Kaynaklar
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/hdgurkey/how-to-add-an-embedded-video-to-github-readme-file-30ok"&gt;👨🏼‍💻 How to Add an Embedded Video to Github Readme File&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2021-05-13-video-uploads-now-generally-available/"&gt;Video uploads now generally available | GitHub Changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files"&gt;Attaching files - GitHub Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>markdown</category>
      <category>vidéo</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>Make Easier User Authentication Processes (even on Cross Platforms and Cross Apps) | Huawei Keyri...</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Thu, 21 Apr 2022 15:58:12 +0000</pubDate>
      <link>https://dev.to/cengiztoru/make-easier-user-authentication-processes-even-on-cross-platforms-and-cross-apps-huawei-keyri-2289</link>
      <guid>https://dev.to/cengiztoru/make-easier-user-authentication-processes-even-on-cross-platforms-and-cross-apps-huawei-keyri-2289</guid>
      <description>&lt;h3&gt;
  
  
  Make Easier User Authentication Processes (even on Cross Platforms and Cross Apps) | Huawei Keyring vs Google Identity Smart Lock for Passwords
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ls0UA10J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AsHiJRWIiIAcA8D_V" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ls0UA10J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AsHiJRWIiIAcA8D_V" alt="" width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hi folks 👋, I have a question for you ❓&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤔 💭 Imagine you own a company such as Meta ( ex-Facebook). So you have a lot of apps/projects such as Facebook, WhatsApp, Instagram. Sometimes your users forget the account/passsword of your apps so they can’t log in to the app. And they try to “Forget Password” functionality of your apps. They try to recover their passwords. They spend time on that. This causes a non-easy and non user-friendly app experience for users. Also, your Forget Password service get a lot of requests and it is a cost for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/ebc2f5a06f3f52804bf8e99797d42181/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/ebc2f5a06f3f52804bf8e99797d42181/href"&gt;https://medium.com/media/ebc2f5a06f3f52804bf8e99797d42181/href&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤔 You come up with a brilliant idea; &lt;strong&gt;Sharing Credentials&lt;/strong&gt;. You want to ease the authentication process of users by sharing credentials between cross apps and cross platforms such as Android Apps-Websites. Users will be needed just remember one password when they can &lt;strong&gt;share credentials between your projects&lt;/strong&gt;. How would you do this❓&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;🔎 In this article, we will look for answers to this question both on devices that have HMS Core and devices that have Google Play Services.&lt;/p&gt;

&lt;p&gt;Huawei Keyring Service fully matches your requirements. Let’s look at it.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑🔐 Huawei Keyring
&lt;/h3&gt;

&lt;p&gt;The Keyring is an SDK provided by Huawei which allows you to store user credentials locally on Android phones, tablets and also share these credentials between different apps and even platforms such as websites and quick apps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keyring provides &lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/overview-0000001133344960"&gt;APIs for android apps&lt;/a&gt;, &lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/javascript-overview-0000001214568685"&gt;APIs for web apps&lt;/a&gt;, and &lt;a href="https://developer.huawei.com/consumer/en/doc/development/quickApp-Guides/quickapp-access-keyring-kit-0000001161177180"&gt;APIs for quick apps&lt;/a&gt;. Apps can integrate relevant APIs to use Keyring. All user credentials will be &lt;strong&gt;stored in HMS Core Keyring&lt;/strong&gt; regardless of which type of APIs you are calling, implementing unified &lt;strong&gt;credential management and sharing&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hf-C-P-K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/989/0%2A7Z-D57pOBzbTb6SH" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hf-C-P-K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/989/0%2A7Z-D57pOBzbTb6SH" alt="" width="880" height="449"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How Keyring works with different platforms&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  💾🔏Storing &amp;amp; Retrieving Credentials Securely
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/b9c01a1ccf54591de29db932b04792a2/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/b9c01a1ccf54591de29db932b04792a2/href"&gt;https://medium.com/media/b9c01a1ccf54591de29db932b04792a2/href&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Keyring stores user credentials &lt;strong&gt;on the user device&lt;/strong&gt; for automatic sign-in later. The Keyring &lt;strong&gt;encrypts&lt;/strong&gt; the credentials and stores them on the HMS Core. Additionally, while you save a credential you can pass true to &lt;strong&gt;&lt;em&gt;userAuth&lt;/em&gt;&lt;/strong&gt; variable of a Credential instance in order to request&lt;a href="https://github.com/Explore-In-HMS/Explore-Landmarks/blob/master/art/01Login/04BiometricAuth.png"&gt;&lt;strong&gt;Biometric Verification&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;or Lock Screen Password&lt;/strong&gt; when an app tries to access this credential.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When an app/platform tries to access a credential which &lt;strong&gt;userAuth&lt;/strong&gt; variable given true, the &lt;strong&gt;Keyring SDK&lt;/strong&gt; will handle user authentication by &lt;a href="https://github.com/Explore-In-HMS/Explore-Landmarks/blob/master/art/01Login/04BiometricAuth.png"&gt;&lt;strong&gt;Biometric Verification&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;or Lock Screen Password&lt;/strong&gt;. The app/platform can’t access the password of the credential until the authentication has been successfull.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also, you can save &lt;strong&gt;multiple credentials&lt;/strong&gt;. So that provides multiple login options to the user.&lt;/p&gt;

&lt;h4&gt;
  
  
  📱📲 Cross-App SignIn &amp;amp; 💻📲 Cross-Platform SignIn ( SHARING CREDENTIALS )
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VaQL6tU3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2AesctU4Kz1ZamW8Ok1R-Ayw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VaQL6tU3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2AesctU4Kz1ZamW8Ok1R-Ayw.png" alt="" width="512" height="512"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sharing Credentials&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can pass app and website identities which you want to share this credential with them to &lt;em&gt;sharedWith&lt;/em&gt; variable while creating a credential instance to save. So you can define other android apps, websites, and quick apps in order to share user credentials securely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Nz2JyVD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/944/1%2ApoOCD4KDgdyrNthbASwWnA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Nz2JyVD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/944/1%2ApoOCD4KDgdyrNthbASwWnA.png" alt="" width="880" height="107"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;For sharing a credential securely with other platforms you need some basic information&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can get credentials shared with your app in addition to saved by your app while retrieving the credential list. You need to pass a &lt;em&gt;trustedAppList&lt;/em&gt; to your request -such as saving a credential process- in order to define which platforms (android app, website, quick app) trusted your app and has possibly shared some credentials with your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For instance;&lt;/strong&gt; A user logged into Instagram. And Instagram saved the user credentials with a &lt;em&gt;trustedAppList&lt;/em&gt;. Suppose this &lt;em&gt;trustedAppList&lt;/em&gt; includes a Facebook android app, Facebook Website, and WhatsApp android app identities. The Facebook Android app will try to retrieve saved credentials from HMS Core when the user enters the Facebook android app. If the Facebook android app passes Instagram app identities in a &lt;em&gt;trustedAppList&lt;/em&gt; while retrieving saved credentials, it will be able to obtain saved credentials from the Instagram app to HMS Core. After then the Facebook app will show obtained list and the &lt;strong&gt;user will be able to select the Instagram credentials to log in Facebook app&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One credential two different apps. Seamless &amp;amp; Effortless user experience. That’s the power of Keyring.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note; the &lt;em&gt;trustedAppList&lt;/em&gt; can be different while saving credentials and obtaining the credential list. It doesn’t have to be the same. For instance, when you save CredentialA you can pass 3 Identities to share this credential. And when saving CredentialB you can pass just 1 Identity. Even you can pass nothing -just the app which saved the credential can retrieve it. When you retrieve the saved credential list you can pass 5 Identity. No problem. Just customize as your needs (Which platforms do you want to share Credential with? Which platforms/apps possibly shared credentials with you?).&lt;/p&gt;

&lt;h4&gt;
  
  
  💪Supported Devices
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6fVGMhuJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1014/1%2AOiL4PgvbsZ4wx1Gsy3Vgpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6fVGMhuJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1014/1%2AOiL4PgvbsZ4wx1Gsy3Vgpg.png" alt="" width="880" height="202"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Devices that can use Keyring&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Devices must have HMS Core to use Keyring Service. The keyring is so cool solution for our needs to ease our customer's life and reduce our web request cost. That’s nice but is there any solution for devices that have Google Play Services instead of HMS Core.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑Google Identity Smart Lock for Passwords
&lt;/h3&gt;

&lt;p&gt;This SDK provides programmatically &lt;strong&gt;saving and retrieving credentials&lt;/strong&gt; and automatically signs users in across devices and websites.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note; for updated user experience and other improvements, Google recommends using One Tap instead of Smart Lock for Password if One Tap sign-in meets your needs. But keep in mind, One Tap has no feature such as sharing credentials between apps or websites.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h4&gt;
  
  
  💾 Storing &amp;amp; Retrieving Credentials
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hAKmNzQO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2A5NiZ2BNyZJhYaUnMYc1jzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hAKmNzQO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2A5NiZ2BNyZJhYaUnMYc1jzw.png" alt="" width="512" height="512"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Storage on mobile devices&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can specify sign-in systems with password-based sign-in or &lt;a href="https://developers.google.com/android/reference/com/google/android/gms/auth/api/credentials/IdentityProviders"&gt;commonly-used sign-in providers&lt;/a&gt; such as Google, and Twitter Sign-In while retrieving the credentials or saving a credential.&lt;/p&gt;

&lt;p&gt;Smart Lock for Password &lt;a href="https://developers.google.com/identity/smartlock-passwords/android/store-credentials#store_credentials"&gt;&lt;strong&gt;requests confirmation from the user&lt;/strong&gt;&lt;/a&gt; for storing credentials. If the user chooses not to save credentials, the user won’t be prompted again to save any account’s credentials for the app. The user can opt-in later from the Google Settings app, in the Smart Lock for Passwords section. There is no such thing in Keyring.&lt;/p&gt;

&lt;p&gt;Smart Lock for Passwords doesn’t provide a credential list that includes all saved credentials. Instead, it &lt;a href="https://developers.google.com/identity/smartlock-passwords/android/retrieve-credentials#handle_multiple_saved_credentials"&gt;throws exceptions&lt;/a&gt; if has multiple credentials or no credentials. Then you should handle these states to call the appropriate APIs or show appropriate screens. You should call &lt;em&gt;startResolutionForResult()&lt;/em&gt; when multiple credentials exist. Then the SDK will &lt;strong&gt;show saved credentials in the UI&lt;/strong&gt; to prompt the user to choose an account. You will retrieve the selected credential when the user chooses any credential in the UI.&lt;/p&gt;

&lt;h4&gt;
  
  
  💻📲 Sharing Credentials
&lt;/h4&gt;

&lt;p&gt;Smart Lock for Passwords provides you with that sharing of credentials between apps and websites to automatically sign in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But there is &lt;strong&gt;no feature&lt;/strong&gt; such as &lt;strong&gt;sharing credentials between android apps&lt;/strong&gt;. For that you should use Content Providers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To associate an app with a website, you need to declare associations by hosting a &lt;strong&gt;Digital Asset Links JSON file&lt;/strong&gt; on your website, and adding a link to the Digital Asset Link file to your app’s manifest. And also your website’s sign-in domain must be available through &lt;strong&gt;HTTPS&lt;/strong&gt;. And your &lt;strong&gt;app needs to be released in the public channel&lt;/strong&gt; for associations to be picked up.&lt;/p&gt;

&lt;h4&gt;
  
  
  💡 Sign-In Hints &amp;amp; Autofill
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/db5e15b9437c1b861a1303ccc56529d1/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/db5e15b9437c1b861a1303ccc56529d1/href"&gt;https://medium.com/media/db5e15b9437c1b861a1303ccc56529d1/href&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Smart Lock for Passwords provides sign-in &lt;strong&gt;hints&lt;/strong&gt; such as the user’s name and email address when retrieving user credential requests fail. When you save password credentials using Smart Lock on devices running Android O or newer, Smart Lock uses the native &lt;strong&gt;autofill confirmation dialog&lt;/strong&gt; over its own dialog whenever possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑🔐 Huawei Keyring vs Google Identity Smart Lock for Passwords
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wSv6_7Ob--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AV3JBmD0Vt6U4_n9TDWWolw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wSv6_7Ob--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AV3JBmD0Vt6U4_n9TDWWolw.png" alt="" width="880" height="613"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Huawei Keyring vs Google Identity Smart Lock for Passwords&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1SjSrqZMsKUJr4d6aXsbfakU_KSHJq93W/edit#gid=858545918"&gt;You can view the excel table more detailly by clicking here.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  🔚 💚 👏 Conclusion
&lt;/h4&gt;

&lt;p&gt;In this article, we learned how we can make easier our customer’s authentication processes. And also we compared Huawei Keyring Service and Google Identity Smart Lock for Password SDK. I hope it is helpful and informative for you. Don’t hesitate to &lt;a href="https://www.linkedin.com/in/cengiztoru/"&gt;contact me&lt;/a&gt; if you find some wrong information. Thanks for reading. Have a healthy life. See you in the next articles👋.&lt;/p&gt;

&lt;p&gt;(Don’t forget breaking the clap button 😊)&lt;/p&gt;

&lt;h3&gt;
  
  
  REFERENCES
&lt;/h3&gt;

&lt;p&gt;References in the table&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/credential-0000001133185188"&gt;Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/credentialtype-0000001179304561"&gt;Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/android/reference/com/google/android/gms/auth/api/credentials/IdentityProviders"&gt;IdentityProviders | Google Play services | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Keyring
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Explore-In-HMS/Explore-Landmarks/blob/master/app/src/main/java/com/hms/explorelandmarks/ui/authentication/CredentialManagementViewModel.kt"&gt;Explore-Landmarks/CredentialManagementViewModel.kt at master · Explore-In-HMS/Explore-Landmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/hms/huawei-keyring/"&gt;Keyring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-Guides/introduction-0000001133141068"&gt;Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/huawei-developers/manage-your-credentials-with-huawei-keyring-ac7f2d82b4ac"&gt;👨🏼‍💻 Manage Your Credentials with Huawei Keyring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://basavarajnavi.medium.com/shares-the-users-credentials-between-your-android-apps-quick-apps-and-web-apps-using-huawei-cb4f8a69ddac"&gt;Shares the user’s credentials between your Android apps, quick apps, and web apps using Huawei…&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Smart Lock for Passwords
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/identity"&gt;Google Identity | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/identity/smartlock-passwords/android"&gt;Smart Lock for Passwords on Android | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/identity/smartlock-passwords/android/associate-apps-and-sites"&gt;Enable automatic sign-in across apps and websites | Smart Lock for Passwords on Android | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>android</category>
      <category>crossplatform</category>
      <category>google</category>
      <category>keyring</category>
    </item>
    <item>
      <title>Kullanıcı Kimlik Doğrulama Süreçlerini Kolaylaştırma (Cross Platformlar ve Cross Uygulamalar…</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Thu, 07 Apr 2022 18:12:17 +0000</pubDate>
      <link>https://dev.to/cengiztoru/kullanici-kimlik-dogrulama-sureclerini-kolaylastirma-cross-platformlar-ve-cross-uygulamalar-3ah</link>
      <guid>https://dev.to/cengiztoru/kullanici-kimlik-dogrulama-sureclerini-kolaylastirma-cross-platformlar-ve-cross-uygulamalar-3ah</guid>
      <description>&lt;h3&gt;
  
  
  👨🏼‍💻Kullanıcı Kimlik Doğrulama Süreçlerini Kolaylaştırma (Cross Platformlar ve Uygulamalar dahil) | Keyring vs SmartLock for Passwords
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ls0UA10J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AsHiJRWIiIAcA8D_V" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ls0UA10J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2AsHiJRWIiIAcA8D_V" alt="" width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Giriş&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Herkese merhabalar👋, Sizin için bir sorum var❓&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤔 💭 Düşünün ki Meta -eski adıyla Facebook- gibi bir şirketiniz var. Dolayısyla Facebook, Whatsapp, Instagram gibi bir çok uygulamanız/projeniz var. Bazen kullanıcılarınız şifrelerini/hesaplarını unuttukları için sizin uygulamalarınıza giremiyorlar. Bu yüzden de uygulamalarınızdaki “Şifremi Unuttum” özelliğini kullanarak şifrelerini kurtarmaya çalışıyorlar. Buna bir zaman harcıyorlar. Bu durum kullanıcılar için kolay olmayan, kullanıcı dostu olmayan bir uygulama deneyimi yaşamalarına sebep oluyor. E tabi sizin Şifremi Unuttum servisleriniz de çokça istek aldığı için maliyetleriniz artıyordur.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/ebc2f5a06f3f52804bf8e99797d42181/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/ebc2f5a06f3f52804bf8e99797d42181/href"&gt;https://medium.com/media/ebc2f5a06f3f52804bf8e99797d42181/href&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤔 Aklınıza kullanıcı bilgilerini projeleriniz arasında paylaşmak gibi bir fikir gelir. Kullanıcı bilgilerini uygulamalar arasında ve platfromlar arasında -Android Uygulamalar/Websiteler gibi- paylaşarak kullanıcı doğrulama süreçlerini kolaylaştırmak istiyorsunuz. Kullanıcılar projeleriniz arasında bilgilerini paylaşabilirse sadece 1 şifreyi hatırlamaları yeterli olacaktır. &lt;strong&gt;Projeleriniz, uygulamalarınız arasında kullanıcı bilgilerini nasıl paylaşırdınız&lt;/strong&gt; ❓&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🔎Bu makalede hem HMS Core’a sahip cihazlar için hemde Google Play Servislerine sahip cihazlar için sorumuzun cevabını arayacağız.&lt;/p&gt;

&lt;p&gt;Huawei Keyring Servisi bizim ihtiyaçlarımızı tam olarak karşılıyor. Hadi inceleyelim bakalım.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑🔐 Huawei Keyring
&lt;/h3&gt;

&lt;p&gt;Keyring kullanıcı kimlik bilgilerini Android cihazlarda saklamamızı, bunları farklı uygulamalar arasında hatta web siteleri, quick app’ler gibi platformlarla da paylaşabilmemizi sağlayan Huawei tarafından sağlanan bir SDK’dir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keyring &lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/overview-0000001133344960"&gt;android uygulamaları&lt;/a&gt;, &lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/javascript-overview-0000001214568685"&gt;web uygulamaları&lt;/a&gt; ve &lt;a href="https://developer.huawei.com/consumer/en/doc/development/quickApp-Guides/quickapp-access-keyring-kit-0000001161177180"&gt;quick (hızlı) uygulamalar&lt;/a&gt; için API’lar barındırır. Uygulamalar Keyring’i kullanmak için ilgili API’yi entegre edebilirler. Tüm kullanıcı bilgileri birleşik yönetim ve paylaşım için, hangi API’leri çağırdığınızdan bağımsız olarak HMS Core Keyring’te saklanacaktır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hf-C-P-K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/989/0%2A7Z-D57pOBzbTb6SH" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hf-C-P-K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/989/0%2A7Z-D57pOBzbTb6SH" alt="" width="880" height="449"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Keyring farklı platformlarlar nasıl çalışır&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  💾🔏Kullanıcı kimlik bilgilerini güvenli bir şekilde saklama ve elde etme
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/b9c01a1ccf54591de29db932b04792a2/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/b9c01a1ccf54591de29db932b04792a2/href"&gt;https://medium.com/media/b9c01a1ccf54591de29db932b04792a2/href&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keyring kullanıcının kimlik bilgilerini &lt;strong&gt;şifreleyip&lt;/strong&gt; kullanıcının cihazında bulunan HMS Core’a kayıt eder. Ek olarak herhangi birisi bizim daha önce kaydettiğimiz bir kimlik bilgisine eriştiğinde &lt;a href="https://github.com/Explore-In-HMS/Explore-Landmarks/blob/master/art/01Login/04BiometricAuth.png"&gt;&lt;strong&gt;biyometrik doğrulama&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;ve kilit açma ekranının şifresi&lt;/strong&gt; ni sormak istiyorsak, kimlik bilgisini kayıt ederken (Credential), hazırladığımız kimlik bilgisini &lt;strong&gt;&lt;em&gt;userAuth&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;değişkenine true vererek bunu sağlayabiliriz.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Herhangi bir uygulama/platform &lt;strong&gt;userAuth&lt;/strong&gt; değişken değerinin true olduğu bir kimlik bilgisine erişmeye çalıştığında Keyring kullanıcıdan &lt;a href="https://github.com/Explore-In-HMS/Explore-Landmarks/blob/master/art/01Login/04BiometricAuth.png"&gt;&lt;strong&gt;biyometrik doğrulama&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;veya kilit açma ekranının şifresi&lt;/strong&gt; ile o cihazın gerçek sahibi olduğunu doğrulamasını ister. Doğrulama yapılmadığı sürece uygulama/platform erişmeye çalıştığı kimlik bilgisinin şifresine erişemez. Ayrıca kullanıcılara birden fazla giriş seçeneği sunmak için &lt;strong&gt;birden fazla kimlik bilgisini kayıt edebilirsiniz&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  📱📲 Cross-App Giriş &amp;amp; 💻📲 Cross-Platform Giriş ( Kimlik Bilgilerini Paylaşma)
&lt;/h4&gt;

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

&lt;p&gt;Bir kimlik bilgisini kayıt ederken, bu kimlik bilgisini paylaşmak istediğiniz uygulamaların ve platformların bazı bilgilerini o kimlik bilgisinin &lt;strong&gt;&lt;em&gt;sharedWith&lt;/em&gt;&lt;/strong&gt; değişkenine paslayabilirsiniz. Böylece kaydettiğiniz kimlik bilgisini tanımladığınız uygulamalarla, platformlarla güvenli bir şekilde paylaşabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Nz2JyVD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/944/1%2ApoOCD4KDgdyrNthbASwWnA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Nz2JyVD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/944/1%2ApoOCD4KDgdyrNthbASwWnA.png" alt="" width="880" height="107"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Kimlik bilgisini diğer platformlarla paylaşırken diğer platformların bazı basit bilgilerine ihtiyacınız vardır.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kayıtlı olan kimlik bilgilerini Keyring’ten çekerken daha önce sizin uygulamanızdan kaydettiğiniz kimlik bilgilerine ek olarak sizin uygulamanızla paylaşılmış olan kimlik bilgilerini de elde edebilirsiniz. Bunun hangi uygulamaların/platformların sizin uygulamanıza güvendiğini ve sizin uygulamanızla bazı veriler paylaşmış olabileceğini tanımlamak için kayıtlı kimlik bilgileri isteğinde bulunurken -bir kimlik bilgisini kayıt ederkenki gibi &lt;em&gt;trustedAppList&lt;/em&gt; paslayabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Örneğin;&lt;/strong&gt; Bir kullanıcı Instagram android uygulamasına giriş yaptı ve Instagram’da kullanıcıyı kayıt ederken bir &lt;em&gt;trustedAppList&lt;/em&gt; ile kaydetti. Varsayalım ki bu &lt;em&gt;trustedAppList&lt;/em&gt; Instagram websitesinin, Facebook android uygulamasının, Facebook websitesinin, WhatsApp android uygulamasının bilgilerini(identity) içeriyor olsun. Bir kullanıcı Facebook uygulamasına girdiğinde Facebook uygulaması daha önce kayıt edilmiş kimlik bilgilerini HMS Core’dan isteyecektir. Facebook android uygulaması bu istekte bulunurken eğer Instagram’ın bilgilerini(identity) bir &lt;em&gt;trustedAppList&lt;/em&gt; içinde paslarsa Instagram tarafından HMS Core’a kayıt edilmiş kimlik bilgilerini de elde edebilecektir. Daha sonrasında Facebook uygulaması elde ettiği listeyi ekranda gösterecek ve kullanıcı da Facebook uygulamasına giriş yapabilmek için Instagram hesabının kimlik bilgilerini kullanabilecektir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tek kimlik bilgisi, 2 farklı uygulama. Sorunsuz ve zahmetsiz kullanıcı deneyimi. İşte Keyring’in gücü 💪&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not; Kimlik bilgilerini kayıt ederken ve daha önce kayıtlı kimlik bilgilerini çekerken &lt;em&gt;trustedAppList&lt;/em&gt; farklı olabilir. Aynı olmak zorunda değildir. Örneğin A kimlik bilgisini kayıt ederken bu kimlik bilgisini 3 platformla/uygulayla paylaşmak istiyorsanız sadece 3 tane platform bilgisini (identity) listeye ekleyebilirsiniz. B kimlik bilgisi için sadece 1 platfrom bilgisi paslayabilirsiniz. Ve hatta isterseniz hiç platfrom bilgisi paslamayadabilirsiniz. Bu durumda kimlik bilgisine sadece onu kayıt eden uygulama erişebilecektir. Daha önce kayıtlı kimlik bilgilerine erişirken de isterseniz 5 tane platform bilgisi paslayabilirsiniz. Herhangi bir problem olmaz. İhtiyaçlarınıza göre özelleştirebilirsiniz. (XXX kimlik bilgisini hangi platformlar ile paylaşmak istiyorsunuz? Hangi platformlar sizinle kimlik bilgisi paylaşımında bulunmuş olabilir?)&lt;/p&gt;

&lt;h4&gt;
  
  
  💪Supported Devices
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6fVGMhuJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1014/1%2AOiL4PgvbsZ4wx1Gsy3Vgpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6fVGMhuJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1014/1%2AOiL4PgvbsZ4wx1Gsy3Vgpg.png" alt="" width="880" height="202"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Keyring kullanan cihazlar&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Keyring Servisini kullanabilmek için cihazlarda HMS Core bulunmalıdır. Keyring kullanıcılarımızın hayatını kolaylaştırmak ve web request maliyetlerimizi azaltmak için çok güzel bir çözüm. Peki HMS Core bulundurmayıp da Google Play Servisleri’ne sahip cihazlar için bir çözüm var mı?&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑Google Identity Smart Lock for Passwords
&lt;/h3&gt;

&lt;p&gt;Bu SDK programatik olarak &lt;strong&gt;kimlik bilgilerini kaydetmeyi, elde etmeyi&lt;/strong&gt; ve kullanıcıların farklı cihazlar ve websiteleri arasında oturum açmasını sağlar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not; güncellenmiş kullanıcı deneyimi ve diğer geliştirmeler için Google ihtiyaçlarınızı karşılıyorsa Smart Lock for Passwords yerine One Tap kullanmanızı tavsiye eder. Ama One Tap’in uygulamalar veya websiteleri arasında kimlik bilgisi paylaşma gibi bir özelliği bulunmamaktadır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tK6pxDpV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A0aMirnu556HE-o9pdYkkVQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tK6pxDpV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A0aMirnu556HE-o9pdYkkVQ.png" alt="" width="880" height="185"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Smart Lock for Passwords bulunduran Android cihazlar icin versiyon 4.4 veya üstü olmalıdır.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  💾 Kullanıcı kimlik bilgilerini saklama ve alma
&lt;/h4&gt;

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

&lt;p&gt;Bir kimlik bilgisini kayıt ederken veya kimlik bilgilerini çekerken oturum açma tipini şifre tabanlı oturum açma veya Google ile giriş, Twitter ile giriş gibi &lt;a href="https://developers.google.com/android/reference/com/google/android/gms/auth/api/credentials/IdentityProviders"&gt;sık kullanılan oturum açma sağlayıcıları&lt;/a&gt; olarak belirtebilirsiniz.&lt;/p&gt;

&lt;p&gt;Smart Lock for Passwords kimlik bilgilerini kayıt etmek için &lt;a href="https://developers.google.com/identity/smartlock-passwords/android/store-credentials#store_credentials"&gt;&lt;strong&gt;kullanıcıdan onay ister&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt; Kullanıcının onay vermemesi halinde uygulamanızın kimlik bilgilerini saklama isteği kullanıcıya bir daha gösterilmez. Kullanıcı bu tercihini daha sonra Google Ayarlar uygulamasının Smart Lock for Password başlığından değiştirebilir. &lt;strong&gt;Keyring’te böyle bir durum yoktur.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Smart Lock for Passwords kayıtlı olan tüm kimlik bilgilerinin içinde bulunduğu bir liste vermez. Eğer birden fazla kimlik bilgisi varsa veya hiç yoksa size liste vermek yerine &lt;a href="https://developers.google.com/identity/smartlock-passwords/android/retrieve-credentials#handle_multiple_saved_credentials"&gt;hata fırlatır&lt;/a&gt;. Daha sonrasında uygun API’yi çağırma veya uygun ekranı gösterme durumlarını sizin yönetmeniz gerekir. Birden fazla kimlik bilgisi varsa &lt;em&gt;startResolutionForResult()&lt;/em&gt; metodunu çağırmalısınız. Daha sonra &lt;strong&gt;SDK&lt;/strong&gt; kullanıcının bir tanesini seçmesi için &lt;strong&gt;kimlik bilgilerini ekranda listeler&lt;/strong&gt;. Kullanıcının ekrandaki kimlik bilgilerinden birini seçmesi halinde ilgili kimlik bilgisi size verilir.&lt;/p&gt;

&lt;h4&gt;
  
  
  💻📲 Kimlik Bilgilerini Paylaşma
&lt;/h4&gt;

&lt;p&gt;Smart Lock for Passwords otomatik giriş için uygulamalar ve websiteleri arasında kimlik bilgilerini paylaşma imkanı sağlar.Ama kimlik bilgilerini &lt;strong&gt;android uygulamalar arasında&lt;/strong&gt; paylaşma gibi bir özelliği &lt;strong&gt;yoktur&lt;/strong&gt;. Bunun yerine Content Provider gibi bir yapı kullanmanız gerekir.&lt;/p&gt;

&lt;p&gt;Bir uygulama ile websiteyi ilişkilendirmek için aralarındaki ilişkiyi websitenize ekleyeceğiniz &lt;a href="https://developers.google.com/identity/smartlock-passwords/android/associate-apps-and-sites"&gt;&lt;strong&gt;Digital Asset Links JSON&lt;/strong&gt;&lt;/a&gt; dosyasında tanımlamanız gerekir. Ve uygulamanızın manifest dosyasına bu dosya için bir link eklemeniz gerekmekte. Ayrıca websitenizin oturum açma domaini &lt;strong&gt;HTTPS&lt;/strong&gt; üzerinden erişilebilir olmalıdır. Ve ilişkilendirmelerin yapılabilmesi için uygulamanızın &lt;strong&gt;public&lt;/strong&gt; bir kanal üzerinden &lt;strong&gt;release&lt;/strong&gt; edilmesi gerekir.&lt;/p&gt;

&lt;h4&gt;
  
  
  💡 Oturum açma ipuçları &amp;amp; Otomatik Doldurma
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/db5e15b9437c1b861a1303ccc56529d1/href"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/db5e15b9437c1b861a1303ccc56529d1/href"&gt;https://medium.com/media/db5e15b9437c1b861a1303ccc56529d1/href&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SmartLock for Passwords kayıtlı kimlik bilgilerini alma isteği başarısız olduğunda kullanıcı adı, e-posta adresi gibi giriş yapma ipuçları sağlar. Android O veya üzerindeki cihazlarda şifre kimlik bilgilerini kaydetmek için Smart Lock kullandığınızda, Smart Lock mümkün oldukça &lt;strong&gt;native otomatik doldurma onay diyaloğu&lt;/strong&gt; gösterir.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑🔐 Huawei Keyring vs Google Identity Smart Lock for Passwords
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wSv6_7Ob--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AV3JBmD0Vt6U4_n9TDWWolw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wSv6_7Ob--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AV3JBmD0Vt6U4_n9TDWWolw.png" alt="" width="880" height="613"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Huawei Keyring vs Google Identity Smart Lock for Passwords&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1SjSrqZMsKUJr4d6aXsbfakU_KSHJq93W/edit#gid=858545918"&gt;Buraya tıklayarak excel tablosunu daha detaylı görüntüleyebilirsiniz.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🔚 💚 👏 Son sözler
&lt;/h3&gt;

&lt;p&gt;Bu makalemizde kullanıcılarımızın kimliklerini doğrulama süreçlerini nasıl kolaylaştırabileceğimize baktık. Ayrıca Huawei Keyring Servisini ve Google Identity Smart Lock For Password SDK’sını kıyasladık. Umarım sizler için faydalı ve bilgilendirici olmuştur. Bir hata görmeniz durumunda lütfen &lt;a href="https://www.linkedin.com/in/cengiztoru/"&gt;benimle iletişime geçmekten&lt;/a&gt; çekinmeyin. Okuduğunuz için teşekkürler. Sonraki makalelerde görüşmek üzere sağlıklı günler dilerim👋.&lt;/p&gt;

&lt;p&gt;(Alkış butonunu kırmayı unutmayalım pls.😊)&lt;/p&gt;

&lt;h3&gt;
  
  
  Kaynaklar
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Keyring
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Explore-In-HMS/Explore-Landmarks/blob/master/app/src/main/java/com/hms/explorelandmarks/ui/authentication/CredentialManagementViewModel.kt"&gt;Explore-Landmarks/CredentialManagementViewModel.kt at master · Explore-In-HMS/Explore-Landmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/hms/huawei-keyring/"&gt;Keyring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-Guides/introduction-0000001133141068"&gt;Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/huawei-developers/manage-your-credentials-with-huawei-keyring-ac7f2d82b4ac"&gt;👨🏼‍💻 Manage Your Credentials with Huawei Keyring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://basavarajnavi.medium.com/shares-the-users-credentials-between-your-android-apps-quick-apps-and-web-apps-using-huawei-cb4f8a69ddac"&gt;Shares the user’s credentials between your Android apps, quick apps, and web apps using Huawei…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/credential-0000001133185188"&gt;Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.huawei.com/consumer/en/doc/development/Security-References/credentialtype-0000001179304561"&gt;Document&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Smart Lock for Passwords
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/identity"&gt;Google Identity | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/identity/smartlock-passwords/android"&gt;Smart Lock for Passwords on Android | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/identity/smartlock-passwords/android/associate-apps-and-sites"&gt;Enable automatic sign-in across apps and websites | Smart Lock for Passwords on Android | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/android/reference/com/google/android/gms/auth/api/credentials/IdentityProviders"&gt;IdentityProviders | Google Play services | Google Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>hms</category>
      <category>android</category>
      <category>huawei</category>
      <category>google</category>
    </item>
    <item>
      <title>‍ How to Add an Embedded Video to Github Readme File</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Sat, 12 Feb 2022 16:16:50 +0000</pubDate>
      <link>https://dev.to/cengiztoru/how-to-add-an-embedded-video-to-github-readme-file-29c</link>
      <guid>https://dev.to/cengiztoru/how-to-add-an-embedded-video-to-github-readme-file-29c</guid>
      <description>&lt;h3&gt;
  
  
  How to Add an Embedded Video to Github Readme Files
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IIIWPyEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-zO5GC_wdGUDuOb6R-IelA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IIIWPyEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A-zO5GC_wdGUDuOb6R-IelA.jpeg" alt="" width="880" height="606"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hi everyone 🖐.&lt;/strong&gt; In this article, I wanna show to you how you can add an embedded video into your readme files easily.&lt;/p&gt;

&lt;p&gt;When you added a video to your readme file as below&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Option One
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[![Now in Android: 55] // Title
(https://i.ytimg.com/vi/Hc79sDi3f0U/maxresdefault.jpg)] // Thumbnail
(https://www.youtube.com/watch?v=Hc79sDi3f0U "Now in Android: 55") // Video Link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Option Two
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[&amp;lt;img src="https://i.ytimg.com/vi/Hc79sDi3f0U/maxresdefault.jpg" width="50%"&amp;gt;](https://www.youtube.com/watch?v=Hc79sDi3f0U "Now in Android: 55")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you will see a view as below. When a user clicks a thumbnail that exists in your readme file the user will be navigated to another website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iNc3yT3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AVitByKjas2fYCI24Gc4Clw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iNc3yT3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AVitByKjas2fYCI24Gc4Clw.gif" alt="" width="600" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Actually, this is not an embedded video because for watching the video user must navigate to another website, and of course, we don’t want this in order to don’t lose the focus of the user.&lt;/p&gt;

&lt;p&gt;So how we should add an embedded video? Dou you ready for the magic worlds??&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Just “ &lt;strong&gt;Drag &amp;amp; Drop&lt;/strong&gt; ” 😄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RmuPTiRN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2Aa2fC7zy5F1O6ITaA48Cwkw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RmuPTiRN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2Aa2fC7zy5F1O6ITaA48Cwkw.gif" alt="" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this way, you can add an embedded video to your readme files easily without losing users' focus because they will not go to another website for viewing your video. And this video view can be collapsed- expanded. And also your users can change the volume of the video and watch your video on full screen.&lt;/p&gt;

&lt;p&gt;You can also add your &lt;strong&gt;images&lt;/strong&gt; with this method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind&lt;/strong&gt; the &lt;a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files"&gt;&lt;strong&gt;maximum file size&lt;/strong&gt;&lt;/a&gt; is 10MB for images and gifs. 10MB for videos on a free GitHub plan. 100MB for videos on a paid GitHub plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finally&lt;/strong&gt; , I wanna suggest that use the GitHub website (such as I showed in the gifs) instead &lt;a href="https://plugins.jetbrains.com/plugin/7793-markdown"&gt;Markdown plugin&lt;/a&gt; with Intellij IDE when you prepare a readme file for your repo. Because sometimes it is not working properly and features such as drag &amp;amp; drop is not supported for videos (The plugin supports drag &amp;amp; drop for images). This feature is provided by the Github website. That’s why the result of the same readme file might be different in Intellij IDE and the Github website. I wasted my time by using the plugin.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;We learned how we can add a real embedded video to our readme files easily by Drag &amp;amp; Drop feature provided by Github. If you like the article please clap the article and share it. See you in the next articles. Stay tuned.&lt;/p&gt;

&lt;h4&gt;
  
  
  References
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2021-05-13-video-uploads-now-generally-available/"&gt;Video uploads now generally available | GitHub Changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files"&gt;Attaching files - GitHub Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>opensource</category>
      <category>plugins</category>
      <category>github</category>
      <category>intellij</category>
    </item>
    <item>
      <title>Android 12 ile gelen yeni özellikler</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Thu, 03 Feb 2022 13:52:18 +0000</pubDate>
      <link>https://dev.to/cengiztoru/android-12-ile-gelen-yeni-ozellikler-3h33</link>
      <guid>https://dev.to/cengiztoru/android-12-ile-gelen-yeni-ozellikler-3h33</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" alt="Android 12" width="880" height="495"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Android 12&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Selamlar 👋, bu makalede, Android 12 ile beraber gelen yeni özelliklere bakacağız.&lt;/p&gt;
&lt;h4&gt;
  
  
  Kişiye Özel, Güvenli &amp;amp; Zahmetsiz
&lt;/h4&gt;

&lt;p&gt;Android 12 kişiselleştirme, gizlilik &amp;amp; güvenlik, kolaylık için bir çok özellik ile geliyor. Bu yüzden Android 12 her zamankinden daha kişiye özel, güvenli ve zahmetsiz olarak lanse ediliyor. Haydi gelen özelliklere göz atalım.&lt;/p&gt;
&lt;h4&gt;
  
  
  😎 Kişiselleştirilebilen radikal yeni tasarım
&lt;/h4&gt;

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

&lt;p&gt;Android 12'nin arayüz ile ilgili bir çok değişiklikle geleceğini duymuş olabilirsiniz. &lt;strong&gt;Evet Android 12, diğer Android versiyonlarına nazaran şuana kadar ki en büyük tasarım değişikliği&lt;/strong&gt; (daha ferah tasarım, renk kontrastı optimizasyonları, şekiller, ışık ve hareketler, özelleştirilebilen sistem renkleri vb) &lt;strong&gt;ile geliyor.&lt;/strong&gt; Neredeyse tüm arayüz yeniden tasarlanmış. Ek olarak Android 12 ile beraber daha akışkan ve iyi animasyonlarla hareketlerimize daha fazla tepki veren bir arayüz geliyor. Bu sayede her dokunuşumuzda arayüz canlı bir sistem olduğunu bizlere hissettiriyor.&lt;/p&gt;

&lt;p&gt;Ve ayrıca bir çok şeyi kendimize göre özelleştirebiliyoruz. Bu yüzden Android 12 şuana kadar ki en çok kişiye özel olan Android sürümüdür. Artık Android daha modern daha ferah, daha konforlu ve kullanması daha zevkli.&lt;/p&gt;
&lt;h3&gt;
  
  
  Duvar kağını baz alan tasarım
&lt;/h3&gt;

&lt;p&gt;Siz duvar kağıdınızı değiştirdiğinizde tüm Android 12 deneyiminiz duvar kağıdınıza göre değişiyor. Peki nasıl? Siz yeni bir duvar kağıdı ayarladıktan sonra Android duvar kağıdınızdaki renkleri tespit ediyor ve bunları tüm sistemize (Bildirimler, Hızlı Menü, Ayarlar, Widget’lar, hatta sonradan yüklediğiniz uygulamalar) uyguluyor. Böylece tüm telefonun görünümünü ve size hissettirdiklerini kolayca değiştirebilirsiniz. Sizcede bu harika değil mi?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Duvar kağını eksen alan arayüz&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Widget’lar
&lt;/h4&gt;

&lt;p&gt;Android 12 ile beraber widget’larda tüm arayüzle beraber yenilendiler. Widget’ların renkleri de duvar kağıdınızı baz alır. Bu sayede tüm sistem ile uyum içinde görünüler. Artık widget’lar daha ferah ve modernler.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YeEyWMtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AaumULD8recmS1PO7LpSfyQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YeEyWMtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AaumULD8recmS1PO7LpSfyQ.png" alt="" width="880" height="421"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Duvar kağını eksen alan widget’lar&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;💬 Android 12 ile beraber Konuşma Widget’ı adındaki widget ile chat’lerimizi ve konuşmalarımızı ana ekranımıza koyabiliyoruz. Bu sayede sevdiğimiz kişilerle olan sohbetlerimizi kaçırmamış oluyoruz. Cevapsız çağrılar, kişininin doğum günü ve daha fazlasını bu widget üzerinde tek bakışta görebiliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LnS3Q9vq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlQGX8GLPVUzmdhDjLhGjHA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LnS3Q9vq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlQGX8GLPVUzmdhDjLhGjHA.png" alt="" width="880" height="293"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Widget Seçme Ekranı &amp;amp; Konuşma Widgetlarının ana ekranda görünümü&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Widget’ların daha interaktif olmaları sayesinde artık küçük işler için ana uygulamayı açmamıza gerek yok. Ek olarak widget seçme ekranı da yenilendi. Android 12'den önce bir widget’ın önizlemesini widget seçme ekranına uygulamayı geliştiren kişilerin koyduğu bir resim aracılığıyla görebiliyorduk. Artık Android 12 ile beraber işletim sistemi kendisi bizim cihazımızın ayarlarına en uygun şekilde (koyu-açık tema, duvar kağıdı renkleri, font vb) bir widget önizlemesi oluşturacak. Bu sayede uygulamayı geliştiren kişilerin cihazlarında widget’ın görünümünü temsil eden bir resim yerine bizim cihazımıza daha uygun ve gerçekçi bir widget önizlemesi görebileceğiz. Ek olarak artık widget önizlemesinin altında widget açıklaması da bulunabilecek.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9f0nARyI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/844/1%2AsM6gY2TdUSLprlnR0FNH4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9f0nARyI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/844/1%2AsM6gY2TdUSLprlnR0FNH4g.png" alt="" width="844" height="644"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Interaktif widget, Widget seçme ekranı&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🎤📸 Mikrofon &amp;amp; Kamera Erişim Belirteci ve Kontrolü
&lt;/h4&gt;

&lt;p&gt;Android 12 ile beraber herhangi bir uygulama mikrofonumuza veya kameramıza erişmeye başladığında sağ üstte bu durumu gösteren bir belirteç gözükür. Bu gizlilik ve güvenlik anlamında çok güzel bir özellik. Yanılmıyorsam bu özellik iOS’ta da var. Bu özelliğin Android’e de gelmesi çok güzel oldu.&lt;/p&gt;

&lt;p&gt;Ayrıca mikfrofon ve kameramızıın erişebilirlik durumunu ayarlayabilmemiz için yukarıdaki menüye 2 tane yeni buton eklenmiş. Bu butonlar sayesinde kamera ve mikrofonu kullanmadığımız durumlarda bunları kapatabiliyoruz. Bu yüzden işletim sistemi uygulamaları dahil hiçbir uygulama bizim mikfronumuza veya kameramıza erişemiyor. (Erişmeye çalıştıklarında boş bir kayıt elde edeceklerdir.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oXhmS2ZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2A1vtH6zwoS6lam7MdSdtUoA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oXhmS2ZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2A1vtH6zwoS6lam7MdSdtUoA.gif" alt="" width="600" height="858"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Mikrofon &amp;amp; Kamera Erişim Belirteci ve Kontrol Butonları&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🚩 Konum erişim düzeyini belirleme
&lt;/h4&gt;

&lt;p&gt;Bazı uygulamalar hizmetlerini bizlere sunabilmek için ihtiyaçları olmasa bile kesin konumumuza erişmeye çalışıbilirler. Buda bizler için bir gizlik ve güvenlik ihlalidir. Android 12 ile beraber bizden konum isteyen uygulamalara istersek minimum hata payı ile kesin konumumuzu paylaşırız istersek de yaklaşık bir konum paylaşabiliriz. Bundan sonra tüm kontrol bizde 💪.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IfbFcVU0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/364/1%2A9z2SF8S4MrMexGEUMJ3Fpw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IfbFcVU0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/364/1%2A9z2SF8S4MrMexGEUMJ3Fpw.gif" alt="" width="364" height="772"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Konum erişim düzeyini belirleme ekranı&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🔏 Gizlilik panosu
&lt;/h4&gt;

&lt;p&gt;Android 12 ile beraber gizlilik panosu aracılığıyla son 24 saatte hangi uygulamaların mikrofonumuza, kameramıza veya lokasyonumuza eriştiğini görebiliyoruz. Ayrıca rahatsız olduğumuz herhangi bir uygulama olması halinde o uygulamanının izinlerini yönetebiliyoruz. Bundan sonra “yemek yemek yemek” veya “elbise elbise elbise” dediğimizde hangi uygulamaların bizleri dinlediğini verilerimizi satarak bize hedefli reklamlar gösterdiğini anlayabileceğiz. Tabi ihtiyacımız olmadığı zamanlarda mikrofonumuzu kapatabildiğimizi de yukarda bahsetmiştik.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DR1XiZvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/392/1%2AfueRnCk1cei3yLLYMOKp5A.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DR1XiZvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/392/1%2AfueRnCk1cei3yLLYMOKp5A.gif" alt="" width="392" height="804"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Gizlilik panosu&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🎮🎯🎳 İndirirken oyna
&lt;/h4&gt;

&lt;p&gt;Android 12 ile beraber oyunları oynamak için çok fazla beklemeyeceğiz. İndirirken Oyna özelliği sayesinde tüm oyunu indirmeye gerek kalmadan oyunumuzu oynamaya başlayabileceğiz. (Şuan da Google Play’deki tüm oyunlar için bu desteklenmemekte. Desteklenen oyun sayısı zamanla artacaktır.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8y3n5NkX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AaklPWMwh6Wl_MPV1oE6EqQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8y3n5NkX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AaklPWMwh6Wl_MPV1oE6EqQ.gif" alt="" width="600" height="521"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;İndirirken Oyna&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Kaydırırma esnasında germe animasyonu
&lt;/h4&gt;

&lt;p&gt;Normalde kaydırılabilir bir alanın başına veya en sonuna geldiğimizde bir parlama efekti görüyorduk. Android 12 ile beraber bu parıltı efekti yerine daha akıcı olan bir gerilme animasyonu göreceğiz. Aşağıdaki resimde bu animasyonun Twitter ve Telegram’da nasıl göründüğünü görebilirsiniz. Bu özellik ile kaydırılabilir alanlar biraz daha iOS’vari olmuş.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fbjCvGEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AavGbfNvc7iY1ks2L4JT79A.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fbjCvGEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AavGbfNvc7iY1ks2L4JT79A.gif" alt="" width="600" height="304"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;İlk resim: Parıltı Efekti, İkinci Resim: Yeni Gerilme Animasyonu, Üçüncü resim: Yeni animasyonun Twitter’daki görünümü, Dördüncü resim: Yeni animasyonun Telegram’daki görünümü&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🕯 Ekstra Karartma
&lt;/h4&gt;

&lt;p&gt;Bazen (az ışıklı ortamlarda, yatakta) telefonumuzun parlaklığını en kısık hale getirsek bile gözlerimiz ekranın parlaklığından rahatsız olur. Android 12 bu tarz durumlar için ekranımızın daha fazla kararmasını sağlayan Ekstra Karartma adlı bir özellik ile geliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nPwsbN2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/562/1%2A5E9pTwlg97mu3F-L9DuQQA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nPwsbN2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/562/1%2A5E9pTwlg97mu3F-L9DuQQA.gif" alt="" width="562" height="316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ekstra Karartma&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  📸 Uzun ekran görüntüsü alma
&lt;/h4&gt;

&lt;p&gt;Android 12 ile beraber direkt işletim sisteminin bir özelliği olarak uzun ekran görüntüleri alabileceğiz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PzPxfmeP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/388/1%2A-VIHQvRm16HL9lux4cTCIg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PzPxfmeP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/388/1%2A-VIHQvRm16HL9lux4cTCIg.gif" alt="" width="388" height="804"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Uzun ekran görüntüsü alma&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🔎 Alan Büyütme
&lt;/h3&gt;

&lt;p&gt;Android 12 ile beraber bir büyüteç özelliğimiz geliyor. Bu büyüteç özelliğini başlatabilmek için bir kısayol da atayabiliyoruz. Bu özellik ile ekran içeriğinin geri kalanın görüntüsünü kaybetmeden ekranımızın bir bölümünü yakınlaştırabiliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qi2ULYBL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/302/1%2AWxnS1jRKw_ybEfihq-j6sg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qi2ULYBL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/302/1%2AWxnS1jRKw_ybEfihq-j6sg.gif" alt="" width="302" height="528"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Alan Büyütme&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  📲Veri Aktarımı (Telefon Klonlama)
&lt;/h4&gt;

&lt;p&gt;Android 12 ile beraber, eski telefonumuzdaki tüm verilerimizi yeni Android cihazımıza kablo veya WiFi aracılığıyla aktarabiliyoruz. Bu özellik iPhone ile de çalışıyor 👍.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rG2Hlkci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/381/1%2AL0ZLObeMIjpp5bdciT9kHw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rG2Hlkci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/381/1%2AL0ZLObeMIjpp5bdciT9kHw.png" alt="" width="381" height="503"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Yeni Cihaza Veri Aktarımı&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  🔚 💚 Özet
&lt;/h4&gt;

&lt;p&gt;Bu makalede Android 12 ile beraber cihazlarımıza gelecek başlıca özelliklere göz attık. Android 12 ile beraber gelen birçok özellik var. Bana göre yukarıda bahsettiklerim diğer özelliklere nazaran daha önemli bizim için. O yüzden bunları sizlerle paylaşmak istedim. Okuduğunuz için teşekkür ederim. Sonraki makalemde Android 12 beraber gelen ve android geliştiricileri ilgilendiren özellikleri ve API’ları paylaşacağım inşAllah. Bir android geliştiriciyseniz sonraki makale için takipte kalabilirsiniz.&lt;/p&gt;

&lt;p&gt;In the next article, I’ll share new features and APIs that come with Android 12 and concern android developers. If you are an android developer please stay tuned for the next article.&lt;/p&gt;

&lt;p&gt;Görüşmek üzere, sağlıcakla kalın👋.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/cengiztoru/"&gt;Cengiz TORU - Istanbul, Turkey | Professional Profile | LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Kaynaklar
&lt;/h4&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.android.com/android-12/"&gt;Android 12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shirsh94.medium.com/android-12-top-12-features-in-new-updates-19583e0572a6"&gt;Android 12, Top 12 features in new updates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xda-developers.com/android-12/amp/"&gt;Android 12: Everything you need to know about Google's new big update!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidauthority.com/android-12-features-1195735/"&gt;Android 12 features: Everything you need to know about Google's latest OS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>hms</category>
      <category>android12</category>
      <category>huawei</category>
      <category>android</category>
    </item>
    <item>
      <title>‍ What’s new in Android 12</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Thu, 03 Feb 2022 13:34:03 +0000</pubDate>
      <link>https://dev.to/cengiztoru/whats-new-in-android-12-5hh2</link>
      <guid>https://dev.to/cengiztoru/whats-new-in-android-12-5hh2</guid>
      <description>&lt;h3&gt;
  
  
  What’s new in Android 12
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" alt="Android 12" width="880" height="495"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Android 12&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hello everyone 👋, in this article, we’ll look at new features coming to Android with Android 12 for last users.&lt;/p&gt;

&lt;h4&gt;
  
  
  Personal, Safe &amp;amp; Effortless
&lt;/h4&gt;

&lt;p&gt;Android 12 is coming with a lot of features for customization, privacy &amp;amp; security, ease. That’s why Android 12 is being launched as more personalized, secure, and effortless than ever before. Okay, let’s start to look at the features.&lt;/p&gt;

&lt;h4&gt;
  
  
  😎 Personalizable Radical New Design
&lt;/h4&gt;

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

&lt;p&gt;Maybe you hear that the Android 12 has many changes in UI. Yes, Android 12 has the biggest UI changes (more spacious design, color contrast optimizations, shapes, light and motion, customizable system colors, etc.) over Android versions. Almost all UI reimagined. Additionally, starting with Android 12, android is smoother and has a more responsive UI to out touches with good animations. In this way, the interface makes us feel that it is an alive system at every touch.&lt;/p&gt;

&lt;p&gt;And also you can customize a lot of things. So Android 12 is the most personal Android version ever. Now android is more modern, more spacious, more comfortable, and more enjoyable to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Wallpaper Based Design&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When you change your wallpaper, your entire Android 12 experience will be changed based on your wallpaper. But how? Android will extract colors on your wallpaper after you set a new wallpaper. And these colors will be applied to your all system (Notifications, Quick Menu, Settings, Widgets, even the apps you installed afterward). So you can easily personalize the look and feel of your entire phone. That’s amazing, isn’t it?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---aSs-kgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6KmWqsmBR33q7oz5g5EPbQ.png" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Wallpaper based UI&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Widgets
&lt;/h4&gt;

&lt;p&gt;With Android 12 widgets are redesigned with the entire UI. Widgets’ colors are based on your wallpaper. In this way, they appear in harmony with the whole system. Now widgets are more modern, more spacious.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YeEyWMtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AaumULD8recmS1PO7LpSfyQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YeEyWMtt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AaumULD8recmS1PO7LpSfyQ.png" alt="" width="880" height="421"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Wallpaper based widgets&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;💬 With Android 12 we have a widget type called Conversation Widget. With conversation widgets, you can put your conversations on your home screen. So you never miss a chat from your loved ones. You can even see missed calls, birthdays, and more at a glance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LnS3Q9vq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlQGX8GLPVUzmdhDjLhGjHA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LnS3Q9vq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AlQGX8GLPVUzmdhDjLhGjHA.png" alt="" width="880" height="293"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Widget Picker View &amp;amp; Conversation Widgets on Home&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now widgets are more interactive. So you don’t need to open the main app for doing some simple operations. Additionally, the widget picker view is revised. Before Android 12, we would see an image in the widget picker view for widget preview. And this image was provided by the app developers. But with Android 12, the OS will generate a widget preview that more closely matches your current settings such as dark/light theme, wallpaper colors, font, etc. So you will see a more realistic widget preview that more matches your device instead of an image obtained from the developer's device. And also widgets will have a description.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9f0nARyI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/844/1%2AsM6gY2TdUSLprlnR0FNH4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9f0nARyI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/844/1%2AsM6gY2TdUSLprlnR0FNH4g.png" alt="" width="844" height="644"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Interactive widget, Widget Picker View&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🎤📸 Mic &amp;amp; Camera Access Indicator and Controls
&lt;/h4&gt;

&lt;p&gt;With Android12 when any app accessed your microphone or camera a visual indicator will appear on the top-right of the screen and your status bar. This is so cool feature about privacy &amp;amp; security. This feature already exists on iOS. Its great news about this feature is coming to Android, too.&lt;/p&gt;

&lt;p&gt;And also there are new 2 toggles to control the microphone &amp;amp; camera available status. Thanks to the quick menu you can now disable the camera and microphone when you don’t use them. So no apps can access your microphone or camera, even OS apps. (If any app tries to access they will just obtain an empty stream.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oXhmS2ZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2A1vtH6zwoS6lam7MdSdtUoA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oXhmS2ZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2A1vtH6zwoS6lam7MdSdtUoA.gif" alt="" width="600" height="858"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Mic &amp;amp; Camera Access Indicator &amp;amp; Toggles&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🚩 Control Location Access Level
&lt;/h4&gt;

&lt;p&gt;Maybe many apps try to access your precise location even they don’t need it for providing their services to you. This is a violation of privacy &amp;amp; security for us as last users. With Android 12 you can select a location that you want to share with apps. The whole control is yours. You can share your precise location with minimum tolerance or you can share just your approximate location with the apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IfbFcVU0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/364/1%2A9z2SF8S4MrMexGEUMJ3Fpw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IfbFcVU0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/364/1%2A9z2SF8S4MrMexGEUMJ3Fpw.gif" alt="" width="364" height="772"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Location Access Level Selection Dialog&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔏 Privacy Dashboard
&lt;/h4&gt;

&lt;p&gt;With Android 12 thanks to Privacy Dashboard now you can see which apps accessed your microphone, camera, or location over the past 24 hours. And also if you see any apps that you’re not comfortable with them, you can manage their permissions by the dashboard. From now on, we will be able to understand which applications are listening to us when we say “eat eat eat” or “dress dress dress”, selling our data and showing us targeted ads. Of course, we mentioned above that we can turn off our microphone when we don’t need it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DR1XiZvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/392/1%2AfueRnCk1cei3yLLYMOKp5A.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DR1XiZvJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/392/1%2AfueRnCk1cei3yLLYMOKp5A.gif" alt="" width="392" height="804"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Privacy Dashboard&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🎮🎯🎳 Play as You Download
&lt;/h4&gt;

&lt;p&gt;With Android 12 we’ll not be waiting too much time to play games. With the Play as You Download feature, you can start playing games without needing to wait for the full download to finish. (Not all games on Google Play will allow for now. More games will be available with this feature later.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8y3n5NkX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AaklPWMwh6Wl_MPV1oE6EqQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8y3n5NkX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AaklPWMwh6Wl_MPV1oE6EqQ.gif" alt="" width="600" height="521"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Play as You Download&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Stretch Overscroll&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;When we come to the beginning or end of a scrollable container we see a glow effect. With Android 12 we’ll see more smooth stretch animation instead of the glow effect. You can see on the below image how new animation looks on Twitter and Telegram. With this feature, the scrollable areas are a little more iOS-like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fbjCvGEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AavGbfNvc7iY1ks2L4JT79A.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fbjCvGEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2AavGbfNvc7iY1ks2L4JT79A.gif" alt="" width="600" height="304"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;First Image: Glow Effect, Second Image: New stretch animation, Third Image: New animation on Twitter, Fourth Image: New animation on Telegram&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🕯 Extra Dim
&lt;/h4&gt;

&lt;p&gt;Sometimes (ex: low light environments, on the bed) our eyes are uncomfortable using the phone even we turn down all the brightness. Android 12 comes with a feature called Extra Dim for such situations. When you turn on this feature your screen will have an extra dim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nPwsbN2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/562/1%2A5E9pTwlg97mu3F-L9DuQQA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nPwsbN2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/562/1%2A5E9pTwlg97mu3F-L9DuQQA.gif" alt="" width="562" height="316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Extra Dim feature&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  📸 Long Screenshot
&lt;/h4&gt;

&lt;p&gt;With Android 12 we can take long screenshots natively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PzPxfmeP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/388/1%2A-VIHQvRm16HL9lux4cTCIg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PzPxfmeP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/388/1%2A-VIHQvRm16HL9lux4cTCIg.gif" alt="" width="388" height="804"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Long Screenshot&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔎 Area Magnification
&lt;/h3&gt;

&lt;p&gt;With Android 12 we have a magnifier which we can set a shortcut to use it. With this tool, you can zoom into a part of your screen without having to lose context on the rest of the screen content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qi2ULYBL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/302/1%2AWxnS1jRKw_ybEfihq-j6sg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qi2ULYBL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/302/1%2AWxnS1jRKw_ybEfihq-j6sg.gif" alt="" width="302" height="528"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AREA MAGNIFIER&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  📲 Transferring Data (Phone Cloning)
&lt;/h4&gt;

&lt;p&gt;With Android 12, you can transfer all your data by connecting your old phone to your new Android with a cable or shared WiFi connection. This feature even works with iPhone 👍.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rG2Hlkci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/381/1%2AL0ZLObeMIjpp5bdciT9kHw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rG2Hlkci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/381/1%2AL0ZLObeMIjpp5bdciT9kHw.png" alt="" width="381" height="503"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Data transfer to new device&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔚 💚 Conclusion
&lt;/h4&gt;

&lt;p&gt;In this article, we talked about the top new features coming with Android 12 to our devices. There is a lot of features already. In my opinion, the above features are more important than others for us. So I wanted to share them with you. Thanks for reading. In the next article, I’ll share new features / APIs that come with Android 12 and concern android developers. If you are an android developer please stay tuned for the next article.&lt;/p&gt;

&lt;p&gt;Have a healthy life. See you 👋.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/cengiztoru/"&gt;Cengiz TORU - Istanbul, Turkey | Professional Profile | LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  References
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.android.com/android-12/"&gt;Android 12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shirsh94.medium.com/android-12-top-12-features-in-new-updates-19583e0572a6"&gt;Android 12, Top 12 features in new updates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xda-developers.com/android-12/amp/"&gt;Android 12: Everything you need to know about Google's new big update!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidauthority.com/android-12-features-1195735/"&gt;Android 12 features: Everything you need to know about Google's latest OS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>android12</category>
      <category>androidappdevelopment</category>
      <category>android</category>
      <category>huawei</category>
    </item>
    <item>
      <title>Supporting RTL Design on Android</title>
      <dc:creator>Cengiz TORU</dc:creator>
      <pubDate>Mon, 26 Jul 2021 09:40:04 +0000</pubDate>
      <link>https://dev.to/cengiztoru/supporting-rtl-design-on-android-5fg3</link>
      <guid>https://dev.to/cengiztoru/supporting-rtl-design-on-android-5fg3</guid>
      <description>&lt;p&gt;Hello Android followers. Today I’ll write all my RTL ( Right to Left ) support design experiences on Android. I hope this article will save your time. Take your tea/coffee/water and let's start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---dmNc-Ge--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdvqOnyWiuFUwzvPkMq0QdQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---dmNc-Ge--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdvqOnyWiuFUwzvPkMq0QdQ.png" alt="" width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;RTL Support Design&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Almost all scripts in the world are written from Left to Right. But some script like Arabic is written from Right to Left. So for the best user experience, we should support Right to Left design, too.&lt;/p&gt;

&lt;p&gt;When a UI changed from LTR to RTL (or vice versa) it’s named “ &lt;strong&gt;mirroring&lt;/strong&gt; ”. If you looking for a design guidelines about which UI components should be mirroring and which UI components shouldn't mirroring, you can check out &lt;a href="https://material.io/design/usability/bidirectionality.html#mirroring-layout"&gt;&lt;strong&gt;&lt;em&gt;material.io&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some Important Points From The&lt;/strong&gt; &lt;a href="https://material.io/design/usability/bidirectionality.html#mirroring-layout"&gt;&lt;strong&gt;material.io Article&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Numbers such as those on a clock and phone numbers are shouldn’t be mirrored.&lt;/li&gt;
&lt;li&gt;LTR text shouldn’t be displayed in reverse order. E.g. if a number in LTR is 123456 in RTL must be 123456, too. Don't reverse it. The direction of such texts must be LTR.&lt;/li&gt;
&lt;li&gt;The texts untranslated to RTL language shouldn’t be mirrored (even if it’s parts of a phrase)&lt;/li&gt;
&lt;li&gt;Charts and graphs shouldn’t be mirrored.&lt;/li&gt;
&lt;li&gt;Icons that don’t communicate direction such as a camera 📸, search 🔍, keyboard ⌨️, headset 🎧, call 📞 are shouldn’t be mirrored&lt;/li&gt;
&lt;li&gt;Icons containing numbers should be localized for other languages that use different numerals.&lt;/li&gt;
&lt;li&gt;You shouldn’t mirror slashes on images. Because the LTR slashes describe an off state for both LTR and RTL languages. E.g. No Parking&lt;/li&gt;
&lt;li&gt;Media playback buttons and media progress indicator shouldn't be mirrored if they refer to the direction of tape being played&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Android OS has native RTL design support since SDK 17 version. Keep in mind.&lt;/p&gt;

&lt;p&gt;First of all, you must add android:supportsRtl="true" to the &lt;a href="http://developer.android.com/guide/topics/manifest/application-element.html"&gt;&lt;/a&gt; element in your manifest file for your app to supporting RTL design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trick&lt;/strong&gt; : If your app supports multiple languages and if you have code snippet like &lt;em&gt;config.setLayoutDirection(Locale.US)&lt;/em&gt; you must change it. Otherwise, your app will not support the RTL design. You can change the code line like below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BIPEXhVO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9pa80I9S6fvnKQ6G-nsE4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BIPEXhVO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9pa80I9S6fvnKQ6G-nsE4g.png" alt="" width="880" height="155"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Setting layout direction to locale base&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After that, replace your app’s all left/right layout properties start/end with their equivalents. If you must support versions earlier than SDK 17 you should use both left/right and start/end properties in the same view. When you do this The Android OS is gonna handle your almost all views layout mirroring automatically. In my opinion, set your minSdkVersion is 21 so Android 5. Because almost all phones sdk version is over than 21 in 2021. In this article, I assume your minSdkVersion is 19 and higher.&lt;/p&gt;

&lt;p&gt;You can feel terrible when you think about replacing all left/right properties to start/end. Stop feeling like that, calm down and keep reading. I have a trick for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trick&lt;/strong&gt; : Android Studio just has a tool for replacing all properties with their RTL equalivents. For doing this follow these steps.&lt;/p&gt;

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

&lt;p&gt;Click right on res folder. After that hold to the cursor on Refactor finally click Add Right-to-Left (RTL) Support. When you did these a window will appear like below.&lt;/p&gt;

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

&lt;p&gt;On this window unmark Update AndroidManifest.xml and mark Replace Left/Right Properties with Start/End properties and Run it. After the operations finished a window will appear like below.&lt;/p&gt;

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

&lt;p&gt;It shows you which layouts will be refactoring. If you want to refactor only your project layouts you can exclude other layout files from came 3rd party libraries.&lt;/p&gt;

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

&lt;p&gt;Select layout files which you don’t want to refactor, click right and exclude all. When you did these your layout files will be like below.&lt;/p&gt;

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

&lt;p&gt;After that click Do Refactor. And now your all layout properties changed with their equivalents. Check your local changes and Run Project💨. You can see your almost all layouts will be supporting RTL design.&lt;/p&gt;

&lt;p&gt;By only these changes your app maybe can’t fully support RTL design. For a fully supported RTL design, you should pay attention to the below sections.&lt;/p&gt;
&lt;h3&gt;
  
  
  Supporting Directional Resources
&lt;/h3&gt;

&lt;p&gt;Android’s RTL engine reverses layout direction but doesn’t reverse resources (so drawables) automatically. So if we have a directional image we must reverse it manually.&lt;/p&gt;

&lt;p&gt;You know android projects resources directories have some qualifiers as &lt;strong&gt;-night&lt;/strong&gt; , &lt;strong&gt;-v24&lt;/strong&gt; , &lt;strong&gt;-v21&lt;/strong&gt; , &lt;strong&gt;-xxhdpi&lt;/strong&gt; , &lt;strong&gt;-ar&lt;/strong&gt;  . Like these also has -ldrtl qualifier meaning “layout direction right-to-left” for resources working on RTL languages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o0YD21DF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/170/1%2A8Locp8mVleWWFyMrdYXSDA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o0YD21DF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/170/1%2A8Locp8mVleWWFyMrdYXSDA.png" alt="" width="170" height="468"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Some resources qualifiers on the android project&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supporting Images, Icons&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q2xci4Mt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/158/1%2AernpA9uxsIbJSRGfyruKDA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q2xci4Mt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/158/1%2AernpA9uxsIbJSRGfyruKDA.png" alt="" width="158" height="106"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Directional image / icon&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Suppose we have a shopping cart image like the above A option. It must be shown as the B option in RTL design. Normally we place A image as &lt;em&gt;res/drawable/ic_cart.png&lt;/em&gt; or &lt;em&gt;res/drawable/ic_cart.xml&lt;/em&gt; on our project. For supporting this image on RTL design firstly prepare a new directory named as &lt;em&gt;res/drawable&lt;/em&gt; &lt;strong&gt;&lt;em&gt;-ldrtl&lt;/em&gt;&lt;/strong&gt;. After that get your right to left supported image (B option) having the same name as LTR image and place it in the drawable &lt;strong&gt;-ldrtl&lt;/strong&gt; directory. The Android OS will render the right file when loading your interfaces. It will support LTR design and RTL design both.&lt;/p&gt;

&lt;p&gt;(Also for using some resource files in LTR design you can prepare files with -ldrtl qualifier)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trick&lt;/strong&gt; : If you are using icons as Vector Assets (files with .xml extension) you don’t need a new directory with -ldrtl qualifier. When you add &lt;strong&gt;&lt;em&gt;android:autoMirrored="true"&lt;/em&gt;&lt;/strong&gt; line in vector tag, your icon gonna has RTL support automatically. ( &lt;strong&gt;This work SDK 19 and higher version.&lt;/strong&gt; ) So you don’t need to store 2 files in your project. In this way, your apk size will be smaller. And when you want to change your icon it will be enough to change only one file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supporting Animations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Animations that use X-axis don't work well on RTL design. You can prepare res\transition-ldrtl or res\anim-ldrtl directories and placing RTL design-supported animation files in these directories. Make sure LTR animation file and RTL animation file names are the same. For example, res\anim\ &lt;strong&gt;slide_out_right.xml&lt;/strong&gt; and res\anim &lt;strong&gt;-ldrtl\slide_out_right.xml&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Supporting Views
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Supporting RecyclerView&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Officially supported. You don’t need to do anything in addition to the above. How wonderful, isn’t it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supporting ViewPagers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use ViewPager2 in your project also you can skip this section. Because ViewPager2 officially supports RTL design. Otherwise, If you use ViewPager you can support RTL design in 2 ways; rotating some views and migrating to ViewPager2.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rotating Views&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You need to add a new value as &lt;em&gt;locale_viewpager_rotation=&lt;/em&gt; &lt;strong&gt;&lt;em&gt;0&lt;/em&gt;&lt;/strong&gt; to integers.xml. After that prepare another &lt;em&gt;integers.xml&lt;/em&gt; file under the &lt;em&gt;values-ldrtl&lt;/em&gt; folder. Add &lt;em&gt;locale_viewpager_rotation =&lt;/em&gt; &lt;strong&gt;&lt;em&gt;180&lt;/em&gt;&lt;/strong&gt; value in this xml file. Finally &lt;em&gt;android:rotationY="@integer/locale_viewpager_rotation”&lt;/em&gt; code snippet to your viewpager (You can also use this method for any view). In this way, your viewpagers will be rotated on RTL design. For fully supporting may need to rotate the content of viewpager items, too. And indicators, too.&lt;/p&gt;

&lt;p&gt;I tried this method. It isn’t an efficient solution so in my opinion just migrate to ViewPager 2.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Migrating ViewPager2&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ViewPager2 built on RecyclerView so it has RTL support officially. So for the best solution &lt;a href="https://developer.android.com/training/animation/vp2-migration"&gt;&lt;strong&gt;migrate your ViewPager adapter to ViewPager2&lt;/strong&gt;&lt;/a&gt;adapter. And get benefits of ViewPager2.&lt;/p&gt;

&lt;p&gt;Also if you use TabLayout with ViewPager you must migrate it to ViewPager2 implementation, too. You can use&lt;/p&gt;


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


&lt;p&gt;code snippet instead of &lt;em&gt;mTabLayout.setupWithViewPager(mViewPager) .&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supporting TextViews&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TextView officially supports RTL design. If you use start-end properties instead of left-right it works well in RTL design. So when you setted an RTL script text to textview, text will start from right automatically.&lt;/p&gt;

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

&lt;p&gt;But if in RTL mode you set an LTR script text, textView’s text will start left like below (Even if you replaced left/right to start/end).&lt;/p&gt;

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

&lt;p&gt;If you don't want to this, you can add &lt;strong&gt;&lt;em&gt;android:textDirection=”locale"&lt;/em&gt;&lt;/strong&gt; attribute to your textViews. I recommend this because the screen becomes more fluid. When you did this your textViews shown as below. Even if textView’s text LTR script, it will start from right. Of course, you can combine this attribute with styles in styles.xml.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Z4--bky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/492/1%2Ar4DAB7IvfXZI1dLOh1ijrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Z4--bky--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/492/1%2Ar4DAB7IvfXZI1dLOh1ijrg.png" alt="" width="492" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally&lt;/p&gt;

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

&lt;p&gt;In some cases, if you be obligated to setting textView direction to LTR and if you want to LTR scripts shown on right in RTL design, you can set&lt;/p&gt;


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


&lt;p&gt;programmatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supporting EditTexts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EditText officially supports RTL design. If you use start-end properties instead of left-right it works well in RTL design. So when you write an RTL script text to edittext, the edittext’s text will start from right automatically.&lt;/p&gt;

&lt;p&gt;But when the app is in RTL mode if you write an LTR script text, editText’s text will start left like as TextView. If you don’t want to this and even in LTR scripts if you want to edditext’s text start from right you can try below options&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First of all, be careful for adding &lt;strong&gt;&lt;em&gt;android:gravity&lt;/em&gt;&lt;/strong&gt; property.&lt;/li&gt;
&lt;li&gt;If your edittext is inside TextInputLayout you can add &lt;strong&gt;&lt;em&gt;android:textDirection=”locale”&lt;/em&gt;&lt;/strong&gt; attribute to &lt;strong&gt;TextInputLayout&lt;/strong&gt;. It will works like below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eJgefEor--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/462/1%2A-IGMWd7UeCSBMLcKWzMYrA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eJgefEor--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/462/1%2A-IGMWd7UeCSBMLcKWzMYrA.png" alt="" width="462" height="102"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;An EditText inside TextInputLayout&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If &lt;strong&gt;&lt;em&gt;android:textDirection=”locale”&lt;/em&gt;&lt;/strong&gt; not works you can try adding &lt;strong&gt;android:textAlignment=”viewStart"&lt;/strong&gt; attribute to &lt;strong&gt;TextInputEditText&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have simple edittext you can add &lt;strong&gt;&lt;em&gt;android:textDirection=”locale”&lt;/em&gt;&lt;/strong&gt; attribute to your EditText. If &lt;strong&gt;&lt;em&gt;android:textDirection=”locale”&lt;/em&gt;&lt;/strong&gt; not works you can try adding &lt;strong&gt;android:textAlignment=”viewStart”&lt;/strong&gt; attribute to EditText.&lt;/li&gt;
&lt;li&gt;If you want to fix the cursor to the far right of the edittext you can use below code snippet&lt;/li&gt;
&lt;/ul&gt;


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


&lt;p&gt;&lt;strong&gt;Supporting WebViews&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you loading an HTML data/block to webView if it hasn’t got RTL support you can manipulate it by below code snippet. So it will support RTL design.&lt;/p&gt;


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


&lt;p&gt;&lt;strong&gt;Supporting Custom Layouts for Specific Scripts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to add a specific version of the layout that is designed for only Arabic text, your directory structure becomes the following:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;res/layout/main.xml&lt;/strong&gt; This layout file is loaded by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;res/layout-ar/main.xml&lt;/strong&gt; This layout file is loaded with Arabic text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;res/layout-ldrtl/main.xml&lt;/strong&gt; This layout file is loaded only for non-Arabic languages that use an RTL text direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some Code Snippets which maybe you’ll need&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you use &lt;em&gt;Gravity.LEFT/RIGHT&lt;/em&gt; you should replace to &lt;em&gt;Gravity.START/END&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If you want to learn the layout direction of a view you can obtain it by &lt;em&gt;view.layoutDirection&lt;/em&gt; code snippet&lt;/li&gt;
&lt;li&gt;For obtaining the layout direction of a context you can use this &lt;em&gt;context&lt;/em&gt;.&lt;em&gt;resources&lt;/em&gt;.&lt;em&gt;configuration&lt;/em&gt;.&lt;em&gt;layoutDirection&lt;/em&gt; code snippet.&lt;/li&gt;
&lt;li&gt;For changing layoutDirection you can use view.&lt;em&gt;layoutDirection&lt;/em&gt; = View.&lt;em&gt;LAYOUT_DIRECTION_RTL&lt;/em&gt; code snippet&lt;/li&gt;
&lt;li&gt;For checking layout direction is you can use a condition like below&lt;/li&gt;
&lt;/ul&gt;


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


&lt;ul&gt;
&lt;li&gt;For obtaining text direction of a view you can do this with &lt;em&gt;view&lt;/em&gt;.&lt;em&gt;textDirection. S_o you can set like _view&lt;/em&gt;.&lt;em&gt;textDirection = view.textDirection = View.TEXT_DIRECTION_RTL&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;For layout direction for specific locale you can use &lt;em&gt;TextUtils. getLayoutDirectionFromLocale (locale)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;If you have a custom view and if you need a callback when RTL properties changed you can override the below function&lt;/li&gt;
&lt;/ul&gt;


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


&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For fully supported RTL design in your app, briefly you can follow these steps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace your app’s all left/right layout properties with start/end which are their equivalents.&lt;/li&gt;
&lt;li&gt;If you use ViewPager, just migrate ViewPager2.&lt;/li&gt;
&lt;li&gt;Set text direction “locale” for your text views&lt;/li&gt;
&lt;li&gt;Add autoMirrored = true in your icons which need to mirroring in RTL design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading. If you think the article is useful please clap 👏 and share so more people benefit.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Keep In Touch&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/cengiztoru/"&gt;Cengiz TORU - Istanbul, Turkey | Professional Profile | LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cengiztoru?tab=repositories"&gt;cengiztoru - Repositories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sources&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://material.io/design/usability/bidirectionality.html#mirroring-layout"&gt;Material Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android-developers.googleblog.com/2013/03/native-rtl-support-in-android-42.html"&gt;Native RTL support in Android 4.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@zhangqichuan/rtl-support-in-android-898e11f31561"&gt;RTL Support in Android&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/android-news/rtl-support-on-android-here-is-all-you-need-know-e13f2df512e2"&gt;RTL Support on Android. Here is all you need to know&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Support Layout Mirroring Developers Android
&lt;/h3&gt;

</description>
      <category>arabic</category>
      <category>mobileappdevelopment</category>
      <category>android</category>
      <category>ui</category>
    </item>
  </channel>
</rss>
