/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġcom . material st udies . reply . ui . home Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . activity . On Back Pressed Callback Ċ import Ġandroidx . core . view . do On Pre Draw Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . observe Ċ import Ġandroidx . navigation . fragment . Fragment Navigator Extras Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġcom . google . android . material . transition . Material Elevation Scale Ċ import Ġcom . google . android . material . transition . Material Fade Through Ċ import Ġcom . material st udies . reply . R Ċ import Ġcom . material st udies . reply . data . Email Ċ import Ġcom . material st udies . reply . data . Email Store Ċ import Ġcom . material st udies . reply . databinding . Fragment Home Binding Ċ import Ġcom . material st udies . reply . ui . MainActivity Ċ import Ġcom . material st udies . reply . ui . Menu Bottom Sheet Dialog Fragment Ċ import Ġcom . material st udies . reply . ui . nav . Navigation Model Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Fragment ] Ġthat Ġdisplays Ġa Ġlist Ġof Ġemails . Ċ Ġ*/ Ċ class ĠHome Fragment Ġ: ĠFragment (), ĠEmail Adapter . Email Adapter Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġargs : ĠHome Fragment Args Ġby Ġnav Args () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Home Binding ĊĊĠĠĠ Ġprivate Ġval Ġemail Adapter Ġ= ĠEmail Adapter ( this ) ĊĊĠĠĠ Ġ// ĠAn Ġon Ġback Ġpressed Ġcallback Ġthat Ġhandles Ġreplacing Ġany Ġnon - Inbox ĠHome Fragment Ġwith Ġin box ĊĠĠĠ Ġ// Ġon Ġback Ġpressed . ĊĠĠĠ Ġprivate Ġval Ġnon Inbox On Back Callback Ġ= Ġobject Ġ: ĠOn Back Pressed Callback ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle On Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Model . set Navigation MenuItem Checked ( Navigation Model . IN BOX _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigate To Home ( R . string . navigation _ inbox , ĠMail box . IN BOX ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 9 . ĠSet Ġup ĠMaterial Fade Through Ġenter Transition . ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġabove Ġsetup Ġdiffers Ġslightly Ġfrom Ġprevious Ġsteps Ġdue Ġto Ġthe Ġway Ġmail boxes Ġwork . ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġmailbox Ġis Ġsimply Ġa ĠHome Fragment Ġplus Ġan Ġargument Ġthat Ġtells Ġthe Ġfragment Ġwhich Ġlist ĊĠĠĠĠĠĠĠĠ Ġ* Ġof Ġemails Ġto Ġdisplay . ĠThis , Ġin Ġaddition Ġto Ġthe Ġfact Ġthat ĠHome Fragment Ġis Ġset Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġsingle Top = true Ġin Ġour Ġnavigation Ġgraph , Ġmeans Ġyou Ġalways Ġnavigate Ġforward Ġto Ġnew ĊĠĠĠĠĠĠĠĠ Ġ* Ġmail boxes Ġand Ġdon 't Ġneed Ġto Ġdeal Ġwith Ġreturn Ġor Ġre enter Ġtransitions Ġ( transitions Ġthat ĊĠĠĠĠĠĠĠĠ Ġ* Ġrun Ġwhen Ġa Ġfragment Ġis Ġpop ped ). ĠFor Ġthis Ġreason , Ġall Ġyou Ġneed Ġto Ġworry Ġabout Ġis Ġsetting ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe ĠHome Fragment Ġenter Ġand Ġexit Ġtransitions . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġan Ġexample Ġof Ġan Ġarchitect ural Ġscenario Ġwhich Ġaffects Ġthe Ġway Ġtransitions Ġare ĊĠĠĠĠĠĠĠĠ Ġ* Ġconfigured . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġenter Transition Ġ= ĠMaterial Fade Through (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġresources . getInteger ( R . integer . reply _ motion _ duration _ large ). to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Home Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPost p one Ġexplanation Ġ( 3 ): ĊĠĠĠĠ Ġ* Ġ---------------- ----- ĊĠĠĠĠ Ġ* ĠTypically , Ġthis Ġfirst Ġissue Ġof Ġthe Ġcollapse Ġnot Ġworking Ġis Ġbecause Ġwhen Ġthe ĠAndroid ĊĠĠĠĠ Ġ* ĠTransition Ġsystem Ġis Ġtrying Ġto Ġrun Ġyour Ġreturn Ġtransition , Ġthe Ġlist Ġof Ġemails Ġhasn 't Ġbeen ĊĠĠĠĠ Ġ* Ġinfl ated Ġand Ġpopulated Ġinto Ġthe ĠRecyclerView Ġyet . ĠWe Ġneed Ġa Ġway Ġto Ġwait Ġuntil Ġour ĊĠĠĠĠ Ġ* ĠHome Fragment Ġl ays Ġout Ġour Ġlist Ġbefore Ġwe Ġstart Ġour Ġtransitions . The ĠAndroid ĠTransition Ġsystem ĊĠĠĠĠ Ġ* Ġprovides Ġmethods Ġto Ġdo Ġjust Ġthat Ġ- Ġpost p one Enter Transition Ġand Ġstart Post p oned Enter Transition . ĊĠĠĠĠ Ġ* ĠIf Ġpost p one Enter Transition Ġis Ġcalled , Ġany Ġentering Ġtransition Ġto Ġbe Ġrun Ġwill Ġbe Ġheld Ġuntil Ġa ĊĠĠĠĠ Ġ* Ġclosing Ġcall Ġto Ġstart Post p oned Enter Transition Ġis Ġcalled . ĠThis Ġgives Ġus Ġthe Ġopportunity Ġto ĊĠĠĠĠ Ġ* Ġ" schedule " Ġour Ġtransitions Ġuntil Ġafter Ġthe ĠRecyclerView Ġhas Ġbeen Ġpopulated Ġwith Ġemails Ġand ĊĠĠĠĠ Ġ* Ġthe Ġtransition Ġis Ġable Ġto Ġfind Ġthe Ġmappings Ġyou Ġconfigured . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 . ĠSet Ġup Ġpost p oned Ġenter Ġtransition . ĊĠĠĠĠĠĠĠ Ġpost p one Enter Transition () ĊĠĠĠĠĠĠĠ Ġview . do On Pre Draw Ġ{ Ġstart Post p oned Enter Transition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġenable Ġthe Ġon Ġback Ġcallback Ġif Ġthis Ġhome Ġfragment Ġis Ġa Ġmailbox Ġother Ġthan ĠIn box . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġto Ġmake Ġsure Ġwe Ġalways Ġnavigate Ġback Ġto ĠIn box Ġbefore Ġexiting Ġthe Ġapp . ĊĠĠĠĠĠĠĠ Ġnon Inbox On Back Callback . isEnabled Ġ= Ġargs . mailbox Ġ!= ĠMail box . IN BOX ĊĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed Dispatcher . add Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnon Inbox On Back Callback ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Touch Helper Ġ= ĠItem Touch Helper ( Re bounding Swipe Action Callback ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Touch Helper . attach To RecyclerView ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġemail Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . re cyclerView . adapter Ġ= Ġemail Adapter ĊĊĠĠĠĠĠĠĠ ĠEmail Store . get Emails ( args . mailbox ). observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Adapter . submit List ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ 1 . ĠThe Ġkey Ġpart Ġof Ġthe Ġabove Ġsnippet Ġis Ġthe ĠFragment Navigator Extras . ĠThe ĠAndroid ĠTransition ĊĠĠĠĠ Ġ* Ġsystem Ġwill Ġget Ġthe Ġtransition Ġname Ġset Ġon Ġthe Ġfirst Ġparameter Ġ( card View ), Ġand Ġcreate Ġa ĊĠĠĠĠ Ġ* Ġmapping Ġbetween Ġthat Ġtransition Ġname Ġand Ġthe Ġtransition Ġname Ġstring Ġpassed Ġin Ġas Ġthe Ġsecond ĊĠĠĠĠ Ġ* Ġparameter Ġ( email Card Detail Transition Name ). ĠThis Ġis Ġhow Ġthe Ġsystem Ġknows Ġwhich Ġviews Ġto Ġfind ĊĠĠĠĠ Ġ* Ġand Ġprovide Ġto Ġthe ĠMaterial Container Transform Ġinstance Ġas Ġthe Ġ" start " Ġand Ġ" end " Ġviews Ġto ĊĠĠĠĠ Ġ* Ġtransform Ġbetween . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 4 . ĠEmail Ġlist Ġdis appear ing Ġafter Ġclick Ġon Ġitem ĊĠĠĠĠ Ġ* ĠThe Ġissue Ġof Ġthe Ġemail Ġlist Ġdis appear ing Ġis Ġbecause Ġwhen Ġnavig ating Ġto Ġa Ġnew ĠFragment Ġusing ĊĠĠĠĠ Ġ* Ġthe ĠNavigation ĠComponent , Ġthe Ġcurrent ĠFragment Ġis Ġimmediately Ġremoved Ġand Ġreplaced Ġwith Ġour ĊĠĠĠĠ Ġ* Ġnew , Ġincoming ĠFragment . ĠTo Ġkeep Ġthe Ġemail Ġlist Ġvisible Ġeven Ġafter Ġbeing Ġreplaced , Ġyou Ġcan ĊĠĠĠĠ Ġ* Ġadd Ġan Ġexit Ġtransition Ġto ĠHome Fragment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠM DC - Android Ġprovides Ġtwo Ġtransitions Ġto Ġdo Ġthis Ġfor Ġyou Ġ- ĠHold Ġand ĠMaterial Elevation Scale . ĊĠĠĠĠ Ġ* ĠThe ĠHold Ġtransition Ġsimply Ġkeeps Ġits Ġtarget Ġin Ġits Ġcurrent Ġposition Ġwhile ĊĠĠĠĠ Ġ* ĠMaterial Elevation Scale Ġruns Ġa Ġsub tle Ġscale Ġanimation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Email Clicked ( card View : ĠView , Ġemail : ĠEmail ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . ĠMaterial Elevation Scale ĊĠĠĠĠĠĠĠ Ġexit Transition Ġ= ĠMaterial Elevation Scale ( false ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġresources . getInteger ( R . integer . reply _ motion _ duration _ large ). to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA ĠFragment Ġis Ġre enter ing Ġwhen Ġit Ġis Ġcoming Ġback Ġinto Ġview Ġafter Ġthe Ġcurrent ĠFragment Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġpop ped Ġoff Ġthe Ġback Ġstack . ĠFor ĠHome Fragment , Ġthis Ġhappens Ġwhen Ġpressing Ġback Ġfrom ĊĠĠĠĠĠĠĠĠ Ġ* ĠEmail Fragment . ĠHere , Ġthis Ġwill Ġcause Ġour Ġlist Ġof Ġemails Ġto Ġsub t ly Ġscale Ġin Ġwhen Ġwe ĊĠĠĠĠĠĠĠĠ Ġ* Ġreturn Ġto Ġthe Ġlist . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 5 . ĠNext , Ġin Ġorder Ġto Ġensure Ġthat Ġthe ĠMaterial Elevation Scale Ġtransition Ġis Ġapplied Ġto Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġhome Ġscreen Ġas Ġa Ġwhole , Ġinstead Ġof Ġto Ġeach Ġof Ġthe Ġindividual Ġviews Ġin Ġthe Ġhierarchy , Ġmark ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe ĠRecyclerView Ġin Ġfragment _ home . xml Ġas Ġa Ġtransition Ġgroup . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġre enter Transition Ġ= ĠMaterial Elevation Scale ( true ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġresources . getInteger ( R . integer . reply _ motion _ duration _ large ). to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠSet Ġup ĠMaterial Elevation Scale Ġtransition Ġas Ġexit Ġand Ġre enter Ġtransitions . ĊĠĠĠĠĠĠĠ Ġval Ġemail Card Detail Transition Name Ġ= ĠgetString ( R . string . email _ card _ detail _ transition _ name ) ĊĠĠĠĠĠĠĠ Ġval Ġextras Ġ= ĠFragment Navigator Extras ( card View Ġto Ġemail Card Detail Transition Name ) ĊĠĠĠĠĠĠĠ Ġval Ġdirections Ġ= ĠHome Fragment Directions . action Home Fragment To Email Fragment ( email . id ) ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( directions , Ġextras ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Email Long Pressed ( email : ĠEmail ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠMenu Bottom Sheet Dialog Fragment ĊĠĠĠĠĠĠĠĠĠ Ġ. newInstance ( R . menu . email _ bottom _ sheet _ menu ) ĊĠĠĠĠĠĠĠĠĠ Ġ. show ( parent FragmentManager , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Email Star Changed ( email : ĠEmail , ĠnewValue : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEmail Store . update ( email . id ) Ġ{ Ġis Star red Ġ= ĠnewValue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Email Arch ived ( email : ĠEmail ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEmail Store . delete ( email . id ) ĊĠĠĠ Ġ} Ċ } Ċ