/* Ċ Ġ* ĠCopyright Ġ( c ) ĠMicrosoft ĠCorporation . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠLicensed Ġunder Ġthe ĠMIT ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . microsoft . device . dual screen . tw op anel ayout Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . platform . Local Context Ċ import Ġandroidx . navigation . Nav Host Controller Ċ import Ġandroidx . navigation . compose . remember Nav Controller Ċ import Ġcom . microsoft . device . dual screen . tw op anel ayout . tw op anel ayout . Single Pane Container Ċ import Ġcom . microsoft . device . dual screen . tw op anel ayout . tw op anel ayout . Two Pane Container Ċ import Ġcom . microsoft . device . dual screen . tw op anel ayout . tw op anel ayout . is Single Pane Ċ import Ġcom . microsoft . device . dual screen . tw op anel ayout . tw op anel ayout . is Single Pane Layout Ċ import Ġcom . microsoft . device . dual screen . tw op anel ayout . tw op anel ayout nav . Single Pane Container Ċ import Ġcom . microsoft . device . dual screen . tw op anel ayout . tw op anel ayout nav . Two Pane Container Ċ import Ġcom . microsoft . device . dual screen . window state . remember Window State Ċ import Ġcom . microsoft . device . dual screen . tw op anel ayout . tw op anel ayout nav . is Single Pane Ġas Ġis Single Pane Nav Ċ Ċ /** Ċ Ġ* ĠA Ġlayout Ġcomponent Ġthat Ġplaces Ġits Ġchildren Ġin Ġone Ġor Ġtwo Ġpan es Ġvert ically Ġor Ġh orizontally Ġto Ċ Ġ* Ġsupport Ġthe Ġlayout Ġon Ġfold able Ġor Ġdual - screen Ġform Ġfactors . ĠOne - pane Ġcan Ġbe Ġused Ġto Ġlayout Ġon Ċ Ġ* Ġthe Ġsingle - screen Ġdevice , Ġor Ġsingle - screen Ġmode Ġon Ġthe Ġfold able Ġor Ġdual - screen Ġdevices . ĠTwo - pane Ċ Ġ* Ġcan Ġbe Ġused Ġto Ġlayout Ġleft / right Ġor Ġtop / bottom Ġscreens Ġon Ġthe Ġfold able Ġor Ġdual - screen Ġdevices . Ċ Ġ* ĠThe Ġtablet Ġor Ġwide Ġscreen Ġdevices Ġwill Ġdisplay Ġtwo - pane Ġlayout Ġby Ġdefault . Ċ Ġ* Ċ Ġ* ĠThe Ġ[ Two Pane Layout ] Ġlayout Ġis Ġable Ġto Ġassign Ġchildren Ġwidths Ġor Ġheight s Ġaccording Ġto Ġtheir Ġweights Ċ Ġ* Ġprovided Ġusing Ġthe Ġ[ Two Pane Scope . weight ] Ġmodifier . ĠIf Ġall Ġthe Ġchildren Ġhave Ġnot Ġprovided Ġa Ġweight , Ċ Ġ* Ġthey Ġwill Ġbe Ġlayout Ġequ ally , Ġwith Ġthe Ġpotential Ġpadding Ġin - between Ġbased Ġon Ġthe Ċ Ġ* Ġphysical Ġh inge Ġbetween Ġtwo Ġscreens . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmodifier : ĠThe Ġmodifier Ġto Ġbe Ġapplied Ġto Ġthe ĠTwo Pane Layout Ċ Ġ* Ġ@ param Ġpane Mode : ĠThe Ġ[ Two Pane Mode ] Ġthat Ġdetermines Ġwhen Ġone Ġor Ġtwo Ġpan es Ġare Ġshown Ċ Ġ* Ġ@ param Ġpane 1 : ĠThe Ġcontent Ġto Ġshow Ġin Ġpane Ġ 1 Ċ Ġ* Ġ@ param Ġpane 2 : ĠThe Ġcontent Ġto Ġshow Ġin Ġpane Ġ 2 Ċ Ġ*/ Ċ @ Composable Ċ fun ĠTwo Pane Layout ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġpane Mode : ĠTwo Pane Mode Ġ= ĠTwo Pane Mode . Two Pane , ĊĠĠĠ Ġpane 1 : Ġ@ Composable ĠTwo Pane Scope . () Ġ-> ĠUnit , ĊĠĠĠ Ġpane 2 : Ġ@ Composable ĠTwo Pane Scope . () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġnav Controller Ġ= Ġremember Nav Controller () ĊĊĠĠĠ ĠTwo Pane Layout ( modifier , Ġpane Mode , Ġnav Controller , Ġpane 1 , Ġpane 2 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġlayout Ġcomponent Ġthat Ġplaces Ġits Ġchildren Ġin Ġone Ġor Ġtwo Ġpan es Ġvert ically Ġor Ġh orizontally Ġto Ċ Ġ* Ġsupport Ġthe Ġlayout Ġon Ġfold able Ġor Ġdual - screen Ġform Ġfactors . ĠOne - pane Ġcan Ġbe Ġused Ġto Ġlayout Ġon Ċ Ġ* Ġthe Ġsingle - screen Ġdevice , Ġor Ġsingle - screen Ġmode Ġon Ġthe Ġfold able Ġor Ġdual - screen Ġdevices . ĠTwo - pane Ċ Ġ* Ġcan Ġbe Ġused Ġto Ġlayout Ġleft / right Ġor Ġtop / bottom Ġscreens Ġon Ġthe Ġfold able Ġor Ġdual - screen Ġdevices . Ċ Ġ* ĠThe Ġtablet Ġor Ġwide Ġscreen Ġdevices Ġwill Ġdisplay Ġtwo - pane Ġlayout Ġby Ġdefault . Ċ Ġ* Ċ Ġ* ĠThe Ġ[ Two Pane Layout ] Ġlayout Ġis Ġable Ġto Ġassign Ġchildren Ġwidths Ġor Ġheight s Ġaccording Ġto Ġtheir Ġweights Ċ Ġ* Ġprovided Ġusing Ġthe Ġ[ Two Pane Scope . weight ] Ġmodifier . ĠIf Ġall Ġthe Ġchildren Ġhave Ġnot Ġprovided Ġa Ġweight , Ċ Ġ* Ġthey Ġwill Ġbe Ġlayout Ġequ ally , Ġwith Ġthe Ġpotential Ġpadding Ġin - between Ġbased Ġon Ġthe Ċ Ġ* Ġphysical Ġh inge Ġbetween Ġtwo Ġscreens . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmodifier : ĠThe Ġmodifier Ġto Ġbe Ġapplied Ġto Ġthe ĠTwo Pane Layout Ċ Ġ* Ġ@ param Ġpane Mode : ĠThe Ġ[ Two Pane Mode ] Ġthat Ġdetermines Ġwhen Ġone Ġor Ġtwo Ġpan es Ġare Ġshown Ċ Ġ* Ġ@ param Ġnav Controller : ĠThe Ġnav Controller Ġto Ġuse Ġwhen Ġnavig ating Ġwithin Ġthe Ġsingle Ġpane Ġcontainer Ċ Ġ* Ġ@ param Ġpane 1 : ĠThe Ġcontent Ġto Ġshow Ġin Ġpane Ġ 1 Ċ Ġ* Ġ@ param Ġpane 2 : ĠThe Ġcontent Ġto Ġshow Ġin Ġpane Ġ 2 Ċ Ġ*/ Ċ @ Composable Ċ fun ĠTwo Pane Layout ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġpane Mode : ĠTwo Pane Mode Ġ= ĠTwo Pane Mode . Two Pane , ĊĠĠĠ Ġnav Controller : ĠNav Host Controller , ĊĠĠĠ Ġpane 1 : Ġ@ Composable ĠTwo Pane Scope . () Ġ-> ĠUnit , ĊĠĠĠ Ġpane 2 : Ġ@ Composable ĠTwo Pane Scope . () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġ( Local Context . current Ġas ? ĠActivity ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠClass CastException (" Local Ġcontext Ġcould Ġnot Ġbe Ġcast Ġas Ġan ĠActivity ") ĊĠĠĠ Ġval Ġwindow State Ġ= Ġactivity . remember Window State () ĊĊĠĠĠ Ġis Single Pane Ġ= Ġis Single Pane Layout ( window State . window Mode , Ġpane Mode ) ĊĊĠĠĠ Ġif Ġ( is Single Pane ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSingle Pane Container ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller Ġ= Ġnav Controller , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane 1 Ġ= Ġpane 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane 2 Ġ= Ġpane 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠTwo Pane Container ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow State Ġ= Ġwindow State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane 1 Ġ= Ġpane 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane 2 Ġ= Ġpane 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġlayout Ġcomponent Ġthat Ġplaces Ġits Ġchildren Ġin Ġone Ġor Ġtwo Ġpan es Ġvert ically Ġor Ġh orizontally Ġto Ċ Ġ* Ġsupport Ġthe Ġlayout Ġon Ġfold able Ġor Ġdual - screen Ġform Ġfactors . ĠOne - pane Ġcan Ġbe Ġused Ġto Ġlayout Ġon Ċ Ġ* Ġthe Ġsingle - screen Ġdevice , Ġor Ġsingle - screen Ġmode Ġon Ġthe Ġfold able Ġor Ġdual - screen Ġdevices . ĠTwo - pane Ċ Ġ* Ġcan Ġbe Ġused Ġto Ġlayout Ġleft / right Ġor Ġtop / bottom Ġscreens Ġon Ġthe Ġfold able Ġor Ġdual - screen Ġdevices . Ċ Ġ* ĠThe Ġtablet Ġor Ġwide Ġscreen Ġdevices Ġwill Ġdisplay Ġtwo - pane Ġlayout Ġby Ġdefault . Ċ Ġ* Ċ Ġ* ĠLike Ġ[ Two Pane Layout ], Ġthe Ġ[ Two Pane Layout Nav ] Ġlayout Ġis Ġable Ġto Ġassign Ġchildren Ġwidths Ġor Ġheight s Ġaccording Ġto Ġtheir Ġweights Ċ Ġ* Ġprovided Ġusing Ġthe Ġ[ Two Pane Nav Scope . weight ] Ġmodifier . ĠIf Ġall Ġthe Ġchildren Ġhave Ġnot Ġprovided Ġa Ġweight , Ċ Ġ* Ġthey Ġwill Ġbe Ġlayout Ġequ ally , Ġwith Ġthe Ġpotential Ġpadding Ġin - between Ġbased Ġon Ġthe Ċ Ġ* Ġphysical Ġh inge Ġbetween Ġtwo Ġscreens . Ċ Ġ* Ċ Ġ* ĠInstead Ġof Ġthe Ġfixed Ġpane Ġ 1 Ġand Ġpane Ġ 2 Ġparameters Ġin Ġthe Ġoriginal Ġ[ Two Pane Layout ], Ġ[ Two Pane Layout Nav ] Ġwas Ġmade Ċ Ġ* Ġto Ġbe Ġmore Ġflexible Ġand Ġcustom izable Ġby Ġaccepting ĠNav Host Controller Ġparameters Ġand Ġan Ġarray Ġof Ġmultiple Ċ Ġ* Ġdest inations . ĠIn Ġsingle Ġpane Ġmode , Ġnavigation Ġis Ġdone Ġwith Ġa ĠNav Host , Ġbut Ġin Ġtwo Ġpane Ġmode , Ġthe Ġcontent Ġin Ċ Ġ* Ġeach Ġscreen / pane Ġis Ġupdated Ġmanually Ġby Ġchanging Ġthe Ġcontent Ġshown Ġin Ġthe Ġlayout . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmodifier : ĠThe Ġmodifier Ġto Ġbe Ġapplied Ġto Ġthe ĠTwo Pane Layout Ċ Ġ* Ġ@ param Ġnav Controller : ĠThe Ġnav Controller Ġto Ġuse Ġwhen Ġnavig ating Ġwithin Ġthe Ġsingle Ġpane Ġcontainer Ċ Ġ* Ġ@ param Ġpane Mode : ĠThe Ġ[ Two Pane Mode ] Ġthat Ġdetermines Ġwhen Ġone Ġor Ġtwo Ġpan es Ġare Ġshown Ċ Ġ* Ġ@ param Ġdest inations : ĠThe Ġdest inations Ġthat Ġwill Ġbe Ġdisplayed Ġin Ġthe Ġlayout Ċ Ġ* Ġ@ param Ġsingle Pane Start Destination : ĠThe Ġstart Ġdestination Ġfor Ġsingle Ġpane Ġmode Ċ Ġ* Ġ@ param Ġpane 1 Start Destination : ĠThe Ġstart Ġdestination Ġfor Ġpane Ġ 1 Ġin Ġtwo Ġpane Ġmode Ċ Ġ* Ġ@ param Ġpane 2 Start Destination : ĠThe Ġstart Ġdestination Ġfor Ġpane Ġ 2 Ġin Ġtwo Ġpane Ġmode Ċ Ġ*/ Ċ @ Composable Ċ fun ĠTwo Pane Layout Nav ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġnav Controller : ĠNav Host Controller , ĊĠĠĠ Ġpane Mode : ĠTwo Pane Mode Ġ= ĠTwo Pane Mode . Two Pane , ĊĠĠĠ Ġdest inations : ĠArray < Destination >, ĊĠĠĠ Ġsingle Pane Start Destination : ĠString , ĊĠĠĠ Ġpane 1 Start Destination : ĠString , ĊĠĠĠ Ġpane 2 Start Destination : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġ( Local Context . current Ġas ? ĠActivity ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠClass CastException (" Local Ġcontext Ġcould Ġnot Ġbe Ġcast Ġas Ġan ĠActivity ") ĊĠĠĠ Ġval Ġwindow State Ġ= Ġactivity . remember Window State () ĊĊĠĠĠ Ġis Single Pane Nav Ġ= Ġis Single Pane Layout ( window State . window Mode , Ġpane Mode ) ĊĊĠĠĠ Ġif Ġ( is Single Pane Nav ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSingle Pane Container ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest inations Ġ= Ġdest inations , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Destination Ġ= Ġsingle Pane Start Destination , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller Ġ= Ġnav Controller , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠTwo Pane Container ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow State Ġ= Ġwindow State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest inations Ġ= Ġdest inations , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane 1 Start Destination Ġ= Ġpane 1 Start Destination , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpane 2 Start Destination Ġ= Ġpane 2 Start Destination ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ