/* Ċ Ġ* ĠCopyright Ġ( c ) ĠMicrosoft ĠCorporation . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠLicensed Ġunder Ġthe ĠMIT ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . microsoft . device . display . wm _ samples . source editor Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . appcompat . app . ActionBar Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . constraint layout . widget . Reactive Guide Ċ import Ġandroidx . fragment . app . Fragment Container View Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . lifecycle . repeat On Lifecycle Ċ import Ġandroidx . window . layout . Fold ing Feature Ċ import Ġandroidx . window . layout . Window Info Tracker Ċ import Ġcom . microsoft . device . display . wm _ samples . source editor . includes . File Handler Ċ import Ġcom . microsoft . device . display . wm _ samples . source editor . view model . Dual Screen ViewModel Ċ import Ġcom . microsoft . device . display . wm _ samples . source editor . view model . Web ViewModel Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfile Btn : ĠImageView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsave Btn : ĠImageView ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfile Handler : ĠFile Handler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġweb VM : ĠWeb ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdual Screen VM : ĠDual Screen ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠApp Ġbased Ġsetup ĊĠĠĠĠĠĠĠ Ġweb VM Ġ= ĠViewModel Provider ( this ). get ( Web ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġfile Handler Ġ= ĠFile Handler ( this , Ġweb VM , Ġcontent Resolver ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLayout Ġbased Ġsetup ĊĠĠĠĠĠĠĠ Ġdual Screen VM Ġ= ĠViewModel Provider ( this ). get ( Dual Screen ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġdual Screen VM . setIs Dual Screen ( false ) Ġ// Ġassume Ġsingle Ġscreen Ġon Ġstartup ĊĊĠĠĠĠĠĠĠ Ġ// Ġdisplay Ġaction Ġtoolbar ĊĠĠĠĠĠĠĠ Ġthis . support ActionBar ?. display Options Ġ= ĠAction Bar . DISPLAY _ SHOW _ CUSTOM ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Show Custom Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Custom View ( R . layout . component _ action _ toolbar ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġaction Ġtoolbar Ġfunctionality ĊĠĠĠĠĠĠĠ Ġfile Btn Ġ= ĠfindViewById ( R . id . btn _ file ) ĊĠĠĠĠĠĠĠ Ġfile Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Handler . open File ( Uri . EMPTY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsave Btn Ġ= ĠfindViewById ( R . id . btn _ save ) ĊĠĠĠĠĠĠĠ Ġsave Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Handler . create File ( Uri . EMPTY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew Ġcoroutine Ġsince Ġrepeat On Lifecycle Ġis Ġa Ġsuspend Ġfunction ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġblock Ġpassed Ġto Ġrepeat On Lifecycle Ġis Ġexecuted Ġwhen Ġthe Ġlifecycle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġat Ġleast ĠSTART ED Ġand Ġis Ġcancelled Ġwhen Ġthe Ġlifecycle Ġis ĠSTOP PED . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġautomatically Ġrestart s Ġthe Ġblock Ġwhen Ġthe Ġlifecycle Ġis ĠSTART ED Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle . repeat On Lifecycle ( Lifecycle . State . STARTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS af ely Ġcollect Ġfrom Ġwindow Info Tracker Ġwhen Ġthe Ġlifecycle Ġis ĠSTART ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġstops Ġcollection Ġwhen Ġthe Ġlifecycle Ġis ĠSTOP PED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Info Tracker . get OrCreate ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. window Layout Info ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġnew Layout Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Dual Screen Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġdisplay Ġfeatures Ġfor Ġan Ġactive Ġh inge / fold ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( display Feature Ġin Ġnew Layout Info . display Features ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfold ing Feature Ġ= Ġdisplay Feature Ġas ? ĠFold ing Feature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fold ing Feature Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġh inge Ġfound , Ġcheck Ġto Ġsee Ġif Ġit Ġshould Ġbe Ġsplit Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh inge Bounds Ġ= Ġfold ing Feature . bounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dual Screen Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fold ing Feature . orientation Ġ== ĠFold ing Feature . Orientation . VERTICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bounds Vertical H inge ( h inge Bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bounds Horizontal H inge ( h inge Bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Dual Screen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bounds No H inge () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdual Screen VM . setIs Dual Screen ( is Dual Screen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġresult Data : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġresult Data ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġrequest Ġto Ġsave Ġa Ġfile Ġhas Ġbeen Ġmade , Ġadd Ġdata Ġto Ġnewly Ġcreated Ġfile ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠFile Handler . CREATE _ FILE Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Data ?. data ?. also Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Handler . alter Document ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġrequest Ġto Ġload Ġfile Ġcontents Ġhas Ġbeen Ġmade , Ġprocess Ġthe Ġfile 's Ġcontents ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( request Code Ġ== ĠFile Handler . P ICK _ TXT _ FILE Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Data ?. data ?. also Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Handler . process File Data ( uri , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġtotal Ġheight Ġtaken Ġup Ġby Ġupper Ġtool bars ĊĠĠĠĠ Ġ* ĠAdd Ġmeasurements Ġhere Ġif Ġadditional Ġstatus / tool bars Ġare Ġused ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupper Toolbar Spacing (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar : ĠToolbar Ġ= ĠfindViewById ( R . id . list _ toolbar ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtoolbar . height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġthe Ġcenter Ġoffset Ġbetween Ġthe Ġguide line Ġand Ġthe Ġbounding Ġbox ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbounding Offset ( height : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġheight Ġ/ Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġbounding Ġrectangle Ġfor Ġa Ġconfiguration Ġwith Ġa Ġvertical Ġh inge ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Bounds Vertical H inge ( h inge Bounds : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh inge Width Ġ= Ġh inge Bounds . right Ġ- Ġh inge Bounds . left ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Rect : ĠView Ġ= ĠfindViewById ( R . id . bounding _ rect ) ĊĠĠĠĠĠĠĠ Ġval Ġparams : ĠViewGroup . LayoutParams Ġ= Ġbounding Rect . layout Params ĊĠĠĠĠĠĠĠ Ġparams . width Ġ= Ġh inge Width ĊĠĠĠĠĠĠĠ Ġbounding Rect . layout Params Ġ= Ġparams ĊĊĠĠĠĠĠĠĠ Ġ// Ġleft Ġfragment Ġis Ġaligned Ġwith Ġthe Ġright Ġside Ġof Ġthe Ġh inge Ġand Ġvice - ver sa ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġpadding Ġto Ġensure Ġfragments Ġdo Ġnot Ġoverlap Ġthe Ġh inge ĊĠĠĠĠĠĠĠ Ġval Ġleft Fragment : ĠFragment Container View Ġ= ĠfindViewById ( R . id . primary _ fragment _ container ) ĊĠĠĠĠĠĠĠ Ġleft Fragment . set Padding ( 0 , Ġ 0 , Ġh inge Width , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġright Fragment : ĠFragment Container View Ġ= ĠfindViewById ( R . id . secondary _ fragment _ container ) ĊĠĠĠĠĠĠĠ Ġright Fragment . set Padding ( h inge Width , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġbounding Ġrectangle Ġfor Ġa Ġconfiguration Ġwith Ġa Ġhorizontal Ġh inge ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Bounds Horizontal H inge ( h inge Bounds : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġh inge Height Ġ= Ġh inge Bounds . bottom Ġ- Ġh inge Bounds . top ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Rect : ĠView Ġ= ĠfindViewById ( R . id . bounding _ rect ) ĊĠĠĠĠĠĠĠ Ġval Ġparams : ĠViewGroup . LayoutParams Ġ= Ġbounding Rect . layout Params ĊĠĠĠĠĠĠĠ Ġparams . height Ġ= Ġh inge Height ĊĠĠĠĠĠĠĠ Ġbounding Rect . layout Params Ġ= Ġparams ĊĊĠĠĠĠĠĠĠ Ġval Ġguide : ĠReactive Guide Ġ= ĠfindViewById ( R . id . h oriz _ guide ) ĊĠĠĠĠĠĠĠ Ġguide . set Guide line Begin ( h inge Bounds . top Ġ+ Ġbounding Offset ( h inge Height ) Ġ- Ġupper Toolbar Spacing ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġtop Ġfragment Ġis Ġaligned Ġwith Ġthe Ġbottom Ġside Ġof Ġthe Ġh inge Ġand Ġvice - ver sa ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġpadding Ġto Ġensure Ġfragments Ġdo Ġnot Ġoverlap Ġthe Ġh inge ĊĠĠĠĠĠĠĠ Ġval Ġtop Fragment : ĠFragment Container View Ġ= ĠfindViewById ( R . id . primary _ fragment _ container ) ĊĠĠĠĠĠĠĠ Ġtop Fragment . set Padding ( 0 , Ġ 0 , Ġ 0 , Ġh inge Height ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbottom Fragment : ĠFragment Container View Ġ= ĠfindViewById ( R . id . secondary _ fragment _ container ) ĊĠĠĠĠĠĠĠ Ġbottom Fragment . set Padding ( 0 , Ġh inge Height , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġbounding Ġrectangle Ġfor Ġa Ġconfiguration Ġwith Ġno Ġh inge Ġ( single Ġscreen ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Bounds No H inge () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbounding Rect : ĠView Ġ= ĠfindViewById ( R . id . bounding _ rect ) ĊĠĠĠĠĠĠĠ Ġval Ġparams : ĠViewGroup . LayoutParams Ġ= Ġbounding Rect . layout Params ĊĊĠĠĠĠĠĠĠ Ġ// Ġfill Ġparent ĊĠĠĠĠĠĠĠ Ġparams . height Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġparams . width Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġbounding Rect . layout Params Ġ= Ġparams ĊĊĠĠĠĠĠĠĠ Ġval Ġguide : ĠReactive Guide Ġ= ĠfindViewById ( R . id . h oriz _ guide ) ĊĠĠĠĠĠĠĠ Ġguide . set Guide line End ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠH ACK Ġjust Ġto Ġhelp Ġwith Ġtesting Ġon ĠSurface ĠD uo ĠAND Ġfold able Ġem ulators Ġuntil ĠWM Ġis Ġstable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Device Surface D uo (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsurface D uo Specific Feature Ġ= Ġ" com . microsoft . device . display . display mask " ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġthis @ MainActivity . package Manager ĊĠĠĠĠĠĠĠ Ġreturn Ġpm . has System Feature ( surface D uo Specific Feature ) ĊĠĠĠ Ġ} Ċ } Ċ