package Ġcom . h ager group . sweet pot ato . appcompat . app Ċ Ċ import Ġandroid . content . pm . Activity Info Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġcom . h ager group . sweet pot ato . annotation . S weet Loading And Error Annotation Ċ import Ġcom . h ager group . sweet pot ato . app . S weet Application Ċ import Ġcom . h ager group . sweet pot ato . app . S weet Loading And Error Interceptor Ċ import Ġcom . h ager group . sweet pot ato . app . S weet able Ċ import Ġcom . h ager group . sweet pot ato . fragment . app . S weet Fragment Ċ import Ġcom . h ager group . sweet pot ato . fragment . app . S weet Fragment Aggregate Ċ import Ġcom . h ager group . sweet pot ato . lifecycle . Model Unavailable Exception Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠA Ġbasis Ġclass Ġfor Ġactivities Ġthat Ġimplements Ġthe Ġloading Ġand Ġthe Ġerror Ġmechanism . Ċ Ġ* Ċ Ġ* Ġ@ param ĠActivity Aggregate Class Ġthe Ġactivity Ġaggregate Ġclass Ġaccessible Ġthough Ġthe Ġ[ set Aggregate ] Ġand Ġ[ get Aggregate ] Ġmethods Ċ Ġ* Ġ@ param ĠFragment Aggregate Class Ġthe Ġfragment Ġaggregate Ġclass Ċ Ġ* Ċ Ġ* Ġ@ see ĠS weet AppCompatActivity Ċ Ġ* Ġ@ see ĠS weet Activity Aggregate Ċ Ġ* Ġ@ see ĠS weet Fragment Aggregate Ċ Ġ* Ġ@ see ĠS weet Loading And Error Interceptor . Model Unavailable Reporter Ċ Ġ* Ċ Ġ* Ġ@ author ĠL ud ov ic ĠRol and Ċ Ġ* Ġ@ since Ġ 2 0 1 8 . 1 2 . 0 5 Ċ Ġ*/ Ċ @ S weet Loading And Error Annotation ( enabled Ġ= Ġfalse , Ġloading Enabled Ġ= Ġfalse ) Ċ abstract Ġclass ĠS weet Loading And Error Activity < Activity Aggregate Class Ġ: ĠS weet Activity Aggregate , ĠFragment Aggregate Class Ġ: ĠS weet Fragment Aggregate > ĊĠ Ġ: ĠS weet AppCompatActivity < Activity Aggregate Class >(), ĊĠĠĠ ĠS weet Loading And Error Interceptor . Model Unavailable Reporter < Fragment Aggregate Class > Ċ { ĊĊĠ Ġprivate Ġval Ġmodel Unavailable Fragments Ġ= ĠCollections . synchronized Set ( HashSet < S weet able < Fragment Aggregate Class >> ()) ĊĊĠ Ġprivate Ġvar Ġhas Been Paused Ġ= Ġfalse ĊĊĠ Ġprivate Ġvar Ġset Back Main Fragment Required Ġ= Ġfalse ĊĊĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) ĊĠ Ġ{ ĊĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠ Ġif Ġ( get Aggregate ()?. activity Annotation ?. can Rotate Ġ== Ġfalse Ġ&& ĠS weet Application . getApplication Constants < S weet Application . Application Constants >(). can Rotate Ġ== Ġfalse ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġ// ĠThis ĠActivity Ġis Ġnot Ġauthorized Ġto Ġrotate ĊĠĠĠĠĠ Ġval Ġrequested Orientation Ġ= Ġrequested Orientation ĊĊĠĠĠĠĠ Ġif Ġ( requested Orientation Ġ!= ĠActivity Info . SCREEN _ OR IENTATION _ SENSOR _ POR TRA IT ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġset Requested Orientation ( Activity Info . SCREEN _ OR IENTATION _ SENSOR _ POR TRA IT ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean ĊĠ Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġandroid . R . id . home Ġ-> ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// In Ġorder Ġto Ġrespect Ġthe ĠAndroid Ġnavigation Ġguidelines , Ġwe Ġshould Ġuse Ġthe ĠNav Utils Ġclass Ġbut ... ĊĠĠĠĠĠĠĠ Ġ// ĠNav Utils . navigate Up From Same Task ( this ); ĊĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) ĊĠ Ġ{ ĊĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĊĠĠĠ Ġ// ĠThis Ġwork - around Ġis Ġthere Ġto Ġfix Ġthe Ġissue Ġwhen Ġthe Ġdevice Ġorientation Ġhas Ġbeen Ġchanged Ġon Ġa Ġstack ed ĠActivity , Ġand Ġthat Ġthe Ġhereby ĠActivity ĊĠĠĠ Ġ// Ġresume s Ġwith Ġthe Ġnew Ġorientation ĊĠĠĠ Ġif Ġ( has Been Paused Ġ== Ġtrue ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġset Back Main Fragment Required Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġset Back Main Fragment Following On Configuration Changed () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Back Pressed () ĊĠ Ġ{ ĊĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġget Aggregate ()?. opened Fragment ĊĊĠĠĠ Ġif Ġ( current Fragment Ġis ĠS weet Fragment Aggregate . On Back Pressed Listener ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( current Fragment . on Back Pressed () Ġ== Ġtrue ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( is Finish ing Ġ== Ġfalse ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( support FragmentManager . back Stack Entry Count Ġ== Ġ 1 ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ ĠActivity Compat . finish After Transition ( this @ S weet Loading And Error Activity ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġreport Model Unavailable Exception ( fragment : ĠS weet able < Fragment Aggregate Class >, Ġmodel Unavailable Exception : ĠModel Unavailable Exception ) ĊĠ Ġ{ ĊĠĠĠ Ġfragment . get Aggregate ()?. remember Model Unavailable Exception ( model Unavailable Exception ) ĊĠĠĠ Ġmodel Unavailable Fragments . add ( fragment ) ĊĠĠĠ Ġfragment . get Aggregate ()?. get Loading Error And Retry Aggregate ()?. show Exception ( this , Ġmodel Unavailable Exception , ĠRunnable Ġ{ ĊĠĠĠĠĠ Ġval Ġcopied Fragments Ġ= ĠHashSet ( model Unavailable Fragments ) ĊĠĠĠĠĠ Ġmodel Unavailable Fragments . clear () ĊĊĠĠĠĠĠ Ġcopied Fragments . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġit . get Aggregate ()?. forget Exception () ĊĠĠĠĠĠĠĠ Ġit . refresh Model And Bind ( true , Ġnull , Ġfalse ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Resume Fragments () ĊĠ Ġ{ ĊĠĠĠ Ġsuper . on Resume Fragments () ĊĊĠĠĠ Ġhas Been Paused Ġ= Ġfalse ĊĊĠĠĠ Ġif Ġ( set Back Main Fragment Required ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġset Back Main Fragment Required Ġ= Ġfalse ĊĠĠĠĠĠ Ġset Back Main Fragment Following On Configuration Changed () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Back Main Fragment Following On Configuration Changed () ĊĠ Ġ{ ĊĠĠĠ Ġval Ġopened Fragment Ġ= Ġget Aggregate ()?. opened Fragment ĊĊĠĠĠ Ġif Ġ( opened Fragment Ġis ĠS weet Fragment ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġtry ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(( opened Fragment . get Aggregate () Ġas ? ĠS weet Fragment Aggregate )?. get Fragment Sur v ive On Configuration Changed From Annotation () Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" The ĠFragment Ġfrom Ġclass Ġ'${ opened Fragment . java Class . name }' Ġwill Ġnot Ġbe Ġre created , Ġbecause Ġit Ġis Ġdeclared Ġas Ġable Ġto Ġsurv ive Ġa Ġconfiguration Ġchange ") ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( exception : ĠNullPointerException ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCatch Ġthe ĠNullPointerException Ġif Ġthe Ġopened Fragment Ġdoes Ġnot Ġcontain Ġa Ġsweet izer Ġobject Ġ! ĊĠĠĠĠĠĠĠ ĠTim ber . w ( exception , Ġ" Unable Ġto Ġget Ġthe Ġaggregate Ġattached Ġto Ġthe ĠFragment !") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( opened Fragment Ġ!= Ġnull ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠ Ġtry ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsaved State Ġ= Ġsupport FragmentManager . save Fragment InstanceState ( opened Fragment ) ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġopened Fragment . arguments ĊĠĠĠĠĠĠĠ Ġget Aggregate ()?. replace Fragment ( opened Fragment :: class , Ġsaved State , Ġarguments ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( exception : ĠIllegalStateException ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w ( exception , Ġ" Unable Ġto Ġretrieve Ġthe ĠFragment Manager Ġfrom Ġmain ĠFragment !") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ }