/* Ċ Ġ* Ġ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 . input . key Ċ Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . size Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . focus Ċ import Ġandroidx . compose . ui . focus . Experimental Focus Ċ import Ġandroidx . compose . ui . focus . Focus Request er Ċ import Ġandroidx . compose . ui . focus Request er Ċ import Ġandroidx . compose . ui . test . junit 4 . create Compose Rule Ċ import Ġandroidx . compose . ui . test . on Root Ċ import Ġandroidx . compose . ui . test . perform KeyPress Ċ import Ġcom . google . common . truth . Truth Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ @ Opt In ( ĊĠĠĠ ĠExperimental Focus :: class , ĊĠĠĠ ĠExperimental Key Input :: class Ċ ) Ċ class ĠShort cuts Test Ġ{ ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġrule Ġ= Ġcreate Compose Rule () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshortcuts _ triggered () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocus Request er Ġ= ĠFocus Request er () ĊĠĠĠĠĠĠĠ Ġvar Ġtriggered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ( 1 0 . dp , Ġ 1 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus Request er ( focus Request er ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. shortcuts Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Key . Meta Left Ġ+ ĠKey . Enter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriggered Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Request er . request Focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Key Cons umed Ġ= Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Meta Left , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsecond Key Cons umed Ġ= Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Enter , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Typed Event ( Key . Enter ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Meta Left , ĠKey EventType . KeyUp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( first Key Cons umed ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( second Key Cons umed ). isTrue () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshortcuts _ states () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocus Request er Ġ= ĠFocus Request er () ĊĠĠĠĠĠĠĠ Ġvar Ġtriggered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġset Shortcut s Ġby Ġmutable State Of ( true ) ĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ( 1 0 . dp , Ġ 1 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus Request er ( focus Request er ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. shortcuts Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set Shortcut s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Key . Enter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriggered Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Request er . request Focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Enter , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Enter , ĠKey EventType . KeyUp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDis ables Ġshortcuts ĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Shortcut s Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Enter , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshortcuts _ priority () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocus Request er Ġ= ĠFocus Request er () ĊĠĠĠĠĠĠĠ Ġvar Ġenter Triggered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġshortcut Triggered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ( 1 0 . dp , Ġ 1 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus Request er ( focus Request er ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. shortcuts Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Key . Enter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenter Triggered Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Key . Shift Left Ġ+ ĠKey . Enter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshortcut Triggered Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Request er . request Focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Shift Left , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Enter , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( enter Triggered ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( shortcut Triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Enter , ĠKey EventType . KeyUp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Shift Left , ĠKey EventType . KeyUp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Enter , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( enter Triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( shortcut Triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshortcuts _ multiple () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocus Request er Ġ= ĠFocus Request er () ĊĠĠĠĠĠĠĠ Ġvar Ġa Triggered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġc Triggered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ( 1 0 . dp , Ġ 1 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus Request er ( focus Request er ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. shortcuts Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Key . Meta Left Ġ+ ĠKey . A ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Triggered Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Key . Meta Left Ġ+ ĠKey . C ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Triggered Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Request er . request Focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . Meta Left , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . C , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( a Triggered ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( c Triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . C , ĠKey EventType . KeyUp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . on Root (). perform KeyPress ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey . A , ĠKey EventType . KeyDown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrule . run On Idle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( a Triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( c Triggered ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }