{"id":2447,"date":"2022-05-05T11:38:24","date_gmt":"2022-05-05T18:38:24","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/surface-duo\/?p=2447"},"modified":"2022-05-05T11:38:24","modified_gmt":"2022-05-05T18:38:24","slug":"accessibility-dual-screen","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/surface-duo\/accessibility-dual-screen\/","title":{"rendered":"Accessibility in a dual-screen application"},"content":{"rendered":"<p>\n  Hello Android developers! \n<\/p>\n<p>\n  Accessibility is an important step in the design and development flow of any Android application. Ensuring that everyone can use it in any situation will make the experience better, and the app will benefit from having an extended and diverse audience. When you design your app with accessibility in mind, you ensure that people with disabilities understand your application better, benefit from increased user satisfaction and will receive feedback from a diverse user base.\n<\/p>\n<p>\n  An important feature of large screens and foldable devices is the extra space, which helps improve productivity. Users will be able to navigate through your application efficiently only if it is built with accessibility in mind, so you should consider all kinds of disabilities \u2013 be it situational (very bright or very dark environments, cannot use audio) or physical impairments.\n<\/p>\n<p>\n  We recently improved the accessibility of our <a href=\"https:\/\/github.com\/microsoft\/surface-duo-dual-screen-experience-example\">Dual-Screen Experience Example<\/a> application and would love to share with you the steps we followed. We will dive more into how to enhance <a href=\"https:\/\/developer.android.com\/guide\/topics\/ui\/accessibility\">accessibility for View-based layouts<\/a>, but these concepts can also be used for an application developed with Jetpack Compose. To learn more about the differences in attributes and implementation, you can refer to the <a href=\"https:\/\/developer.android.com\/jetpack\/compose\/accessibility\">Jetpack Compose accessibility page<\/a>.\n<\/p>\n<h2>How to get started<\/h2>\n<p>\n  There are multiple tools out there to help you get started with testing the accessibility of your Android application.\n<\/p>\n<ol>\n<li>\n<p><b><a href=\"https:\/\/accessibilityinsights.io\/docs\/android\/getstarted\/setup\/\">Accessibility Insights<\/a><\/b><\/p>\n<p>\n  This tool connects your computer to your testing environment, displays what issues are found, and generates a report. This is extremely useful in case you want to use emulators or devices with multiple screens, since you will be able to develop and control your test devices on the same machine.\n<\/p>\n<p>\n  <img decoding=\"async\" width=\"1099\" height=\"401\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image.png\" class=\"wp-image-2448\" alt=\"Accessibility Insights tool screenshot showing three failed accessibility tests from the dual-screen experience app\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image.png 1099w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-300x109.png 300w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-1024x374.png 1024w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-768x280.png 768w\" sizes=\"(max-width: 1099px) 100vw, 1099px\" \/><br\/><em>Figure 1: Accessibility Insights checking an application displayed on a dual-screen emulator<\/em>\n<\/p>\n<\/li>\n<li>\n<p><b><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.google.android.apps.accessibility.auditor\">Accessibility Scanner<\/a> and Google Play Store report<\/b><\/p>\n<p>\n  In case you would only like to work with the device under test, this application can be downloaded from Google Play Store and has the option to create a report by taking screenshots through a bubble button. This is based on the Accessibility Test Framework, which is integrated in the latest versions of Android Studio and generates warnings directly on the layouts. If you are using Google Play Store to distribute your application to users, the framework is also integrated in the <a href=\"https:\/\/support.google.com\/googleplay\/android-developer\/answer\/9844487\">pre-launch report<\/a> that is generated after uploading a release.\n<\/p>\n<\/li>\n<li>\n<p><b>Accessibility in Espresso testing<\/b><\/p>\n<p>\n  To identify accessibility issues early in the development flow, you can include <a href=\"https:\/\/developer.android.com\/training\/testing\/espresso\/accessibility-checking\">AccessibilityChecks<\/a> in your <strong>Espresso tests<\/strong>, and it makes a test fail when an issue is detected. For instance, we created a custom AndroidJUnitRunner class where we can add settings which apply to all UI tests at the same time (also sets up the HiltTestApplication so we can easily control the components we need inside the tests).\n<\/p>\n<pre>class HiltJUnitRunner : AndroidJUnitRunner() {\r\n    override fun newApplication(\r\n        classLoader: ClassLoader?,\r\n        name: String?,\r\n        context: Context?\r\n    ): Application =\r\n        super.newApplication(classLoader, HiltTestApplication::class.java.name, context).apply {\r\n            MapConfig.TEST_MODE_ENABLED = true\r\n            AccessibilityChecks.enable()\r\n        }\r\n}<\/pre>\n<p>\n  In <strong>build.gradle (app)<\/strong>, we just declare this new custom class to be used for instrumentation tests:\n<\/p>\n<pre>android {\r\n   defaultConfig {\r\n      testInstrumentationRunner \"com.microsoft.device.samples.dualscreenexperience.HiltJUnitRunner\" \r\n   }\r\n}\r\n<\/pre>\n<\/li>\n<li>\n<p><b>Android Studio lint warnings<\/b><\/p>\n<p>\n  Besides the Android Test Framework layouts integration, Android Studio also generates <strong>lint warnings<\/strong> when content labelling has not been added to components which usually need it (such as ImageView, ImageButton). Just make sure your layouts do not include <strong>AppCompat <\/strong>widgets directly, because those <strong>do not generate any warnings<\/strong> and should only be used for custom views. If the top-level activity \/ dialog is provided by AppCompat, it automatically includes compatible widgets.\n<\/p>\n<\/li>\n<li>\n<p><b>Accessibility services<\/b><\/p>\n<p>\n  Manually testing your app using accessibility services such as <a href=\"https:\/\/support.google.com\/accessibility\/android\/answer\/6283677\"><strong>TalkBack<\/strong><\/a> and <a href=\"https:\/\/support.google.com\/accessibility\/android\/answer\/6122836\"><strong>SwitchAccess<\/strong><\/a> is important so you can understand the way your layouts are explained to people with disabilities. They demonstrate if someone can easily navigate through your app and reach all the views in the correct order.\n<\/li>\n<\/ol>\n<h2>Minor changes make a significant difference<\/h2>\n<p>\n  After creating a list with all the issues found using the tools described in the previous section, we started implementing the improvements.\n<\/p>\n<h3>\n  Content labelling \n<\/h3>\n<p>\n  The first step was to make sure that all widgets either include <code>contentDescription<\/code> or the <code>android:importantForAccessibility= \"no\"<\/code> attribute. The latter is mostly used for illustrations which do not bring any additional information, so they can be skipped by accessibility services.\n<\/p>\n<p>\n  It&#8217;s important to have content labels, but it&#8217;s even more important that they are descriptive, so anyone can understand what they represent. For instance, in RecyclerView components, we mostly show the values of an item&#8217;s details. This information isn&#8217;t useful without context, so it&#8217;s more helpful to include both the label and the value in the <code>contentDescription<\/code>. Keep in mind that the type of component is already added to the content description by accessibility services (such as &#8220;button&#8221;).\n<\/p>\n<p>\n  As an example, this is how we create our <a href=\"https:\/\/github.com\/microsoft\/surface-duo-dual-screen-experience-example\/blob\/main\/app\/src\/main\/java\/com\/microsoft\/device\/samples\/dualscreenexperience\/presentation\/product\/util\/StarRatingView.kt\">StarRatingView<\/a> component, which is attached to the product items. The stars are illustrations, so we declared that they are not important for accessibility, while for the text we added a more descriptive content label (&#8220;Rating: &lt;value&gt;&#8221;):\n<\/p>\n<pre>for (index in MIN_STARS until STAR_COUNT) {\r\n    addView(\r\n        AppCompatImageView(context).apply {\r\n            id = getStarImageId(index)\r\n            setImageResource(R.drawable.ic_star_empty)\r\n            gravity = Gravity.CENTER_VERTICAL\r\n            importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO\r\n        },\r\n        LayoutParams(heightView.dpToPx(context), heightView.dpToPx(context)).apply {\r\n            marginEnd = starMargin.dpToPx(context)\r\n        }\r\n    )\r\n}\r\naddView(\r\n    TextView(context, null, 0, R.style.GoldText).apply {\r\n        id = textViewId\r\n        text = ratingValue.toString()\r\n        textSize = heightView\r\n        contentDescription = context.getString(R.string.rating_with_label, ratingValue.toString())\r\n    },\r\n    LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply {\r\n        marginStart = starMargin.dpToPx(context)\r\n    }\r\n)<\/pre>\n<p>\n  Furthermore, it is important to have <strong>unique<\/strong> <code>contentDescription<\/code> values to prevent confusion. We encountered a case where two <b>About<\/b> labels appeared on the same screen while referring to different elements, one being about the <b>About Store<\/b> tab, while the other meant the <b>About App<\/b> menu item. To fix this, we extended the <code>contentDescription<\/code> values to make them specific to the section they were included in.\n<\/p>\n<p>\n  Another thing to consider is invisible elements. Even if an element is invisible to users, you may still want it to be recognized by accessibility services. In the Dual Screen Experience example, we set the title of the dialog we are showing to confirm an order even though it is not visible (because we used <code>dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)<\/code>). This way, it won&#8217;t show on the screen, but it can still be read by accessibility services.\n<\/p>\n<h3>\n  Color contrast\n<\/h3>\n<p>\n  We worked together with our designer to match the device system theme to the Dual-Screen Experience Example application, which initially had only dark mode support. We wanted to offer both options to users \u2013 <strong>light<\/strong> theme and <strong>dark<\/strong> theme, to accommodate multiple preferences, various light sensitivities, and to be sure the app can be used in any environment. The main thing to keep in mind is that you need to consider the color contrast ratio of your elements \u2013 for example, the background and foreground of an ImageView, or the color of TextView components compared to their backgrounds. The W3C (World Wide Web Consortium) recommends a contrast ratio of at least <strong>3:1<\/strong>, and you can find more details <a href=\"https:\/\/www.w3.org\/TR\/UNDERSTANDING-WCAG20\/visual-audio-contrast-contrast.html\">on the W3C constrast page<\/a>.\n<\/p>\n<p>\n  <img decoding=\"async\" width=\"1152\" height=\"914\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-1.png\" class=\"wp-image-2449\" alt=\"Surface Duo showing the dual-screen experience app launch screen, on the left screen in light mode and the right screen in dark mode\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-1.png 1152w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-1-300x238.png 300w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-1-1024x812.png 1024w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-1-768x609.png 768w\" sizes=\"(max-width: 1152px) 100vw, 1152px\" \/><br\/><em>Figure 2: Light theme vs Dark theme for the Launch Activity<\/em>\n<\/p>\n<h2>Important aspects for dual-screen devices<\/h2>\n<p>\n  When talking about dual-screen, foldable, and large screen implementations, we often use Views or Fragments side-by-side so we can display more content and take advantage of the whole display area. From an accessibility point of view, it is important to check that on normal single-screen devices, the implementation does not add the components on top of each other, because that means a lot of noise for the accessibility services and the application becomes hard to understand. Inside the accessibility testing tools, this appears as with the following warning: \u201c<strong>Multiple clickable items share this location on the screen.<\/strong>\u201d.\n<\/p>\n<p>\n  Starting with the <strong>1.0.0-alpha3<\/strong> version, our <a href=\"https:\/\/docs.microsoft.com\/dual-screen\/android\/api-reference\/dualscreen-library\/navigation-component\/\">Foldable Navigation component<\/a> uses the <code>replace()<\/code> function for the Fragments instead of the <code>add()<\/code> one. This means that accessibility services will only take into account the current destination of the Navigation component and its layout, without including the <code>startDestination<\/code> of the navigation-graph. The Dual-Screen Experience Example already uses the latest version of this control, so you can try it out inside the app.\n<\/p>\n<h3>\n  Touch target size\n<\/h3>\n<p>\n  Since devices with multiple or large screens are all about productivity, we need to ensure that we use the minimum recommended touch target size for clickable items, which is <strong>48x48dp<\/strong> according to the <a href=\"https:\/\/material.io\/design\/usability\/accessibility.html#layout-and-typography\">Material Design Accessibility guidelines<\/a>. This ensures that everyone can easily and quickly trigger the actions they need. There are multiple ways to enlarge the touch target area without changing the appearance of content:\n<\/p>\n<ul>\n<li>\n    Adding <code>paddings<\/code> or <code>insets<\/code> (insets can be added when the component has a custom drawable for the background)\n  <\/li>\n<li>\n    Declaring <strong>minimum<\/strong> width and height and letting the widget decide its own actual size (by using <code>android:minWidth<\/code>\/<code>android:minHeight<\/code> attributes or <code>app:layout_constraintWidth_min<\/code>\/<code>app:layout_constraintHeight_min<\/code> if the parent is a ConstraintLayout)\n  <\/li>\n<li>\n    Using a <a href=\"https:\/\/developer.android.com\/reference\/android\/view\/TouchDelegate.html\"><strong>TouchDelegate<\/strong><\/a> or moving the click listener to the parent of the widget\n  <\/li>\n<li>\n    Have the TextViews use an <code>android:textSize<\/code> or <code>app:autoSizeMinTextSize<\/code> of minimum <code>12sp<\/code>\n  <\/li>\n<\/ul>\n<p>\n  <img decoding=\"async\" width=\"807\" height=\"442\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-2.png\" class=\"wp-image-2450\" alt=\"Android Studio layout preview of a guitar-buying view showing spacing between controls\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-2.png 807w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-2-300x164.png 300w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-2-768x421.png 768w\" sizes=\"(max-width: 807px) 100vw, 807px\" \/><br\/><em>Figure 3: ImageButton with padding which complies with the minimum target touch size<\/em>\n<\/p>\n<h3>\n  Grouping views\n<\/h3>\n<p>\n  In order to increase efficiency when using accessibility services, multiple views which describe a single object can be grouped in a container so that their label is read only once. When the device has a larger screen, having a smaller number of grouped views makes the navigation faster. That means that the container needs to have the <code>android:screenReaderFocusable<\/code> attribute (or <code>android:focusable<\/code> for apps with support for API level 27 and lower) and a good description (either the descriptive labels of the children or a custom summary).\n<\/p>\n<p>\n  <img decoding=\"async\" width=\"1100\" height=\"355\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-3.png\" class=\"wp-image-2451\" alt=\"Android Studio XML editor and preview pane, showing control groupings\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-3.png 1100w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-3-300x97.png 300w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-3-1024x330.png 1024w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-3-768x248.png 768w\" sizes=\"(max-width: 1100px) 100vw, 1100px\" \/><br\/><em>Figure 4: Grouping views in Android Studio by adding the focusable attribute on a CardView<\/em>\n<\/p>\n<h3>\n  Focus order\n<\/h3>\n<p>\n  Usually, the focus order generated by default is the same as the natural way of visualizing the UI elements on the screen. In case you would like to control the logical order without adding other containers, there are some attributes you can use, such as <code>android:accessibilityTraversalBefore<\/code> and <code>android:accessibilityTraversalAfter<\/code>. For example, in the Sign &amp; Confirm Order dialog, we wanted to keep the colors in a separate container from the ink stroke width control, so the generated order was <b>InkStroke<\/b> button &gt; <b>Reset<\/b> button &gt; <b>InkColor<\/b> buttons. However, we also wanted to keep the Ink controls together, so we added the attribute to the Reset button to have focus after the colors.\n<\/p>\n<p>\n  <img decoding=\"async\" width=\"1099\" height=\"816\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-4.png\" class=\"wp-image-2452\" alt=\"Android Studio XML editor and preview pane, showing the focus order on a screen\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-4.png 1099w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-4-300x223.png 300w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-4-1024x760.png 1024w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2022\/05\/word-image-4-768x570.png 768w\" sizes=\"(max-width: 1099px) 100vw, 1099px\" \/><br\/><em>Figure 5: Changing the focus order in Android Studio for an ImageButton using the android:accessibilityTraversalAfter attribute<\/em>\n<\/p>\n<h2>Accessibility in custom controls and views<\/h2>\n<p>\n  When creating custom components, the recommended way is to extend an existing Android widget which already has improved accessibility support. Some of our Foldable controls (<a href=\"https:\/\/docs.microsoft.com\/dual-screen\/android\/api-reference\/dualscreen-library\/bottomnavigation\/surfaceduo-bottomnavigationview\">BottomNavigationView<\/a>, <a href=\"https:\/\/docs.microsoft.com\/dual-screen\/android\/api-reference\/dualscreen-library\/tabs\/surfaceduo-tablayout\">TabLayout<\/a>) use this exact approach, so they behave similarly to the Android components developers are already used to.\n<\/p>\n<p>\n  If you prefer to create a custom view yourself, there are multiple improvements you can make: \n<\/p>\n<ul>\n<li>\n    Use <code>Android attributes<\/code> for the state (for example, if you need to change the UI or know when a view is selected, use the <code>isSelected<\/code> attribute)\n  <\/li>\n<li>\n    Keep the <code>focusable<\/code> and <code>clickable<\/code> attributes up to date when the state of a custom view changes\n  <\/li>\n<li>\n    Describe custom states with <code>ViewCompat.setStateDescription()<\/code> (do not forget to test using Accessibility Services and check for double labelling)\n  <\/li>\n<li>\n    Send <code>AccessibilityEvents<\/code> when an action is triggered (to change the default implementation of the View)\n  <\/li>\n<li>\n    Replace the click action label used by Accessibility Services with something more specific and descriptive using <code>ViewCompat.replaceAccessibilityAction<\/code> (for example, this will replace the word &#8220;activate&#8221; from TalkBack&#8217;s announcement of a clickable view &#8220;Double tap to &lt;activate&gt;&#8221;)\n  <\/li>\n<\/ul>\n<p>\n  For example, in our <a href=\"https:\/\/github.com\/microsoft\/surface-duo-dual-screen-experience-example\/blob\/main\/app\/src\/main\/java\/com\/microsoft\/device\/samples\/dualscreenexperience\/presentation\/product\/util\/CustomizeCardView.kt\">CustomizeCardView<\/a> component, we use the following functions for selecting and unselecting an item. The <code>replaceClickActionLabel<\/code> function uses the ViewCompat.replaceAccessibilityAction mentioned above and modifies TalkBack&#8217;s announcement to &#8220;Double tap to select&#8221;.\n<\/p>\n<pre>\r\n  fun unselect() {\r\n      isSelected = false\r\n      isClickable = true\r\n      setCardBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent))\r\n      cardElevation = unselectedCardElevation\r\n      contentDescription = buildContentDescription()\r\n      replaceClickActionLabel(this, resources.getString(R.string.select_action_label))\r\n  }\r\n\r\n  fun select() {\r\n      isSelected = true\r\n      isClickable = false\r\n      setCardBackgroundColor(MaterialColors.getColor(this, R.attr.colorSurface))\r\n      cardElevation = selectedCardElevation\r\n      contentDescription = buildContentDescription()\r\n      replaceClickActionLabel(this, null)\r\n  }<\/pre>\n<h2>Resources and feedback<\/h2>\n<p>\n  We are continuously improving the Dual-Screen Experience Example, so we would love to have you try it out by installing it from <a href=\"https:\/\/aka.ms\/DualScreenExperiencePlayStore\">Google Play Store<\/a> and tell us your feedback! You can find the code of the application on <a href=\"https:\/\/github.com\/microsoft\/surface-duo-dual-screen-experience-example\">Github<\/a> and can join a discussion or create an issue. You can also check out the code for the SDK components <a href=\"https:\/\/github.com\/microsoft\/surface-duo-sdk\">here<\/a>.\n<\/p>\n<p>\n  If you have any questions or would like to tell us about your dual-screen applications, use the <a href=\"http:\/\/aka.ms\/SurfaceDuoSDK-Feedback\">feedback forum<\/a> or message us on Twitter <a href=\"https:\/\/twitter.com\/surfaceduodev\">@surfaceduodev<\/a>.\u00a0\n<\/p>\n<p>\n  Finally, please join us every Friday on <a href=\"https:\/\/twitch.tv\/surfaceduodev\" target=\"_blank\" rel=\"noopener\">Twitch<\/a> at 11am Pacific time to chat about Surface Duo developer topics! This week you can also catch us on <a href=\"https:\/\/twitch.tv\/surfaceduodev\" target=\"_blank\" rel=\"noopener\">Twitch<\/a> on Friday May 6th at 13h00 in Europe, so if you&#8217;re in that region of the world please drop in with your accessibility questions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello Android developers! Accessibility is an important step in the design and development flow of any Android application. Ensuring that everyone can use it in any situation will make the experience better, and the app will benefit from having an extended and diverse audience. When you design your app with accessibility in mind, you ensure [&hellip;]<\/p>\n","protected":false},"author":79072,"featured_media":2449,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[721,473,46],"class_list":["post-2447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-surface-duo-sdk","tag-accessibility","tag-kotlin","tag-surface-duo"],"acf":[],"blog_post_summary":"<p>Hello Android developers! Accessibility is an important step in the design and development flow of any Android application. Ensuring that everyone can use it in any situation will make the experience better, and the app will benefit from having an extended and diverse audience. When you design your app with accessibility in mind, you ensure [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/posts\/2447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/users\/79072"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/comments?post=2447"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/posts\/2447\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/media\/2449"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/media?parent=2447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/categories?post=2447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/tags?post=2447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}