/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . compose . ui . focus Ċ Ċ import Ġandroidx . compose . runtime . collection . Experimental Collection Api Ċ import Ġandroidx . compose . runtime . collection . Mutable Vector Ċ import Ġandroidx . compose . runtime . collection . mutable Vector Of Ċ import Ġandroidx . compose . ui . node . Experimental Layout Node Api Ċ import Ġandroidx . compose . ui . node . Layout Node Ċ import Ġandroidx . compose . ui . node . Modified Focus Node Ċ import Ġandroidx . compose . ui . util . fast ForEach Ċ Ċ internal Ġval ĠF OC US _ TAG Ġ= Ġ" Compose ĠFocus " Ċ Ċ @ Opt In ( Experimental Layout Node Api :: class ) Ċ internal Ġfun ĠLayout Node . focus able Children 2 (): ĠList < Modified Focus Node > Ġ{ ĊĠĠĠ Ġval Ġfocus able Children Ġ= Ġmutable ListOf < Modified Focus Node >() ĊĠĠĠ Ġ// ĠTODO ( b / 1 5 2 5 2 9 3 9 5 ): ĠWrite Ġa Ġtest Ġfor ĠLayout Node . focus able Children (). ĠWe Ġwere Ġcalling Ġthe Ġwrong ĊĠĠĠ Ġ// Ġ Ġfunction Ġon Ġ[ Layout Node Wrapper ] Ġbut Ġno Ġtest Ġcaught Ġthis . ĊĠĠĠ Ġouter Layout Node Wrapper . find Next Focus Wrapper ()?. let Ġ{ Ġfocus able Children . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġchildren . fast ForEach Ġ{ Ġlayout Ġ-> Ġfocus able Children . addAll ( layout . focus able Children 2 ()) Ġ} ĊĠĠĠ Ġreturn Ġfocus able Children Ċ } Ċ Ċ // ĠTODO ( b / 1 4 4 1 2 6 7 5 9 ): ĠFor Ġnow Ġwe Ġalways Ġreturn Ġthe Ġfirst Ġfocus able Ġchild . ĠWe Ġmight Ġwant Ġto Ċ // Ġ Ġprovide Ġsome ĠAPI Ġthat Ġallows Ġthe Ġdevelopers Ġflexibility Ġto Ġspecify Ġwhich Ġfocus able Ċ // Ġ Ġchild Ġthey Ġneed , Ġor Ġprovide Ġa Ġpriority Ġamong Ġchildren . Ċ /** Ċ Ġ* ĠS ear ches Ġ( B read th - first ) Ġthrough Ġall Ġthe Ġchildren Ġand Ġreturns Ġthe Ġfirst Ġfocus Ġwrapper Ġfound . Ċ Ġ* Ċ Ġ* Ġ@ param Ġqueue Ġa Ġmutable Ġlist Ġused Ġas Ġa Ġqueue Ġfor Ġb read th - first Ġsearch . Ċ Ġ*/ Ċ @ Opt In ( ĊĠĠĠ ĠExperimental Collection Api :: class , ĊĠĠĠ ĠExperimental Layout Node Api :: class Ċ ) Ċ internal Ġfun ĠLayout Node . search Children For Focus Node ( ĊĠĠĠ Ġqueue : ĠMutable Vector < Layout Node > Ġ= Ġmutable Vector Of () Ċ ): ĠModified Focus Node ? Ġ{ ĊĠĠĠ Ġ// ĠCheck Ġif Ġany Ġchild Ġhas Ġa Ġfocus ĠWrapper . ĊĠĠĠ Ġ_ children . forEach Ġ{ Ġlayout Node Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġfocus Node Ġ= Ġlayout Node . outer Layout Node Wrapper . find Next Focus Wrapper () ĊĠĠĠĠĠĠĠ Ġif Ġ( focus Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfocus Node ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( layout Node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPerform Ġa Ġb read th - first Ġsearch Ġthrough Ġthe Ġchildren . ĊĠĠĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocus Node Ġ= Ġqueue . remove At ( 0 ). search Children For Focus Node ( queue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( focus Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfocus Node ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ }