package Ġcom . github . ash ut osh g ng wr . no ice Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . drawable . Anim atable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . app . AppCompat Delegate Ċ import Ġandroidx . browser . custom tabs . Custom Tab Color Scheme Params Ċ import Ġandroidx . browser . custom tabs . Custom Tabs Intent Ċ import Ġandroidx . core . content . edit Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġcom . github . ash ut osh g ng wr . no ice . cast . Cast API Wrapper Ċ import Ġcom . github . ash ut osh g ng wr . no ice . databinding . MainActivity Binding Ċ import Ġcom . github . ash ut osh g ng wr . no ice . fragment . About Fragment Ċ import Ġcom . github . ash ut osh g ng wr . no ice . fragment . Dialog Fragment Ċ import Ġcom . github . ash ut osh g ng wr . no ice . fragment . Preset Fragment Ċ import Ġcom . github . ash ut osh g ng wr . no ice . fragment . Sleep Timer Fragment Ċ import Ġcom . github . ash ut osh g ng wr . no ice . fragment . Sound Library Fragment Ċ import Ġcom . github . ash ut osh g ng wr . no ice . fragment . Support Development Fragment Ċ import Ġcom . github . ash ut osh g ng wr . no ice . fragment . Wake Up Timer Fragment Ċ import Ġcom . github . ash ut osh g ng wr . no ice . sound . player . Player Manager Ċ import Ġcom . google . android . material . navigation . Navigation View Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġorg . green robot . event bus . Subscribe Ċ import Ġorg . green robot . event bus . Thread Mode Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠNavigation View . On Navigation ItemSelected Listener Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ EXTRA _ CURRENT _ NAV IG ATED _ FRAGMENT ] Ġdecl ares Ġthe Ġkey Ġfor Ġintent Ġextra Ġvalue Ġthat Ġis Ġpassed Ġto ĊĠĠĠĠ Ġ* Ġ[ MainActivity ] Ġfor Ġsetting Ġthe Ġgiven Ġfragment Ġto Ġthe Ġtop . ĠThe Ġrequired Ġvalue Ġfor Ġthis Ġextra ĊĠĠĠĠ Ġ* Ġshould Ġbe Ġan Ġinteger Ġrepresenting Ġthe Ġmenu Ġitem 's Ġid Ġin Ġthe Ġnavigation Ġview Ġcorresponding Ġto ĊĠĠĠĠ Ġ* Ġthe Ġfragment Ġbeing Ġrequested . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconst Ġval ĠEX TRA _ CURRENT _ NAV IG ATED _ FRAGMENT Ġ= Ġ" current _ fragment " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ APP _ THEME Ġ= Ġ" app _ theme " ĊĠĠĠ Ġprivate Ġconst Ġval ĠAPP _ THEME _ LIGHT Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠAPP _ THEME _ DARK Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġconst Ġval ĠAPP _ THEME _ SYSTEM _ DEFAULT Ġ= Ġ 2 ĊĊĠĠĠ Ġ// Ġmaps Ġfragments Ġthat Ġhave Ġa Ġone - to - one Ġmapping Ġwith Ġa Ġmenu Ġitem Ġin Ġthe Ġnavigation Ġdrawer . ĊĠĠĠ Ġ// Ġthis Ġmap Ġhelps Ġin Ġreducing Ġboilerplate Ġfor Ġlaunch ing Ġthese Ġfragments Ġwhen Ġappropriate ĊĠĠĠ Ġ// Ġmenu Ġitem Ġis Ġclicked Ġin Ġthe Ġnavigation Ġdrawer . ĊĠĠĠ Ġprivate Ġval ĠNAV IG ATED _ FRAG MENTS Ġ= Ġmap Of ( ĊĠĠĠĠĠ ĠR . id . library Ġto ĠSound Library Fragment :: class . java , ĊĠĠĠĠĠ ĠR . id . saved _ presets Ġto ĠP reset Fragment :: class . java , ĊĠĠĠĠĠ ĠR . id . sleep _ timer Ġto ĠSleep Timer Fragment :: class . java , ĊĠĠĠĠĠ ĠR . id . wake _ up _ timer Ġto ĠW ake Up Timer Fragment :: class . java , ĊĠĠĠĠĠ ĠR . id . about Ġto ĠAbout Fragment :: class . java , ĊĠĠĠĠĠ ĠR . id . support _ development Ġto ĠSupport Development Fragment :: class . java ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠMainActivity Binding ĊĠ Ġprivate Ġlateinit Ġvar Ġaction Bar Drawer Toggle : ĠAction Bar Drawer Toggle ĊĠ Ġprivate Ġlateinit Ġvar Ġcast API Wrapper : ĠCast API Wrapper ĊĠ Ġprivate Ġlateinit Ġvar Ġcustom Tabs Intent : ĠCustom Tabs Intent ĊĠ Ġprivate Ġvar Ġplayer Manager State Ġ= ĠPlayer Manager . State . STOP PED ĊĊĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġ// Ġbecause Ġcast Ġcontext Ġis Ġlazy Ġinitialized , Ġcast Ġmenu Ġitem Ġwouldn 't Ġshow Ġup Ġuntil ĊĠĠĠ Ġ// Ġre - res uming Ġthe Ġactivity . Ġadding Ġthis Ġto Ġprevent Ġthat . ĊĠĠĠ Ġ// ĠThis Ġshould Ġimplicitly Ġinit ĠCast Context . ĊĠĠĠ Ġcast API Wrapper Ġ= ĠCast API Wrapper . from ( this , Ġfalse ) ĊĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠ ĠAppCompat Delegate . setDefault Night Mode ( get Night Mode From Prefs ()) ĊĊĠĠĠ Ġbinding Ġ= ĠMainActivity Binding . inflate ( layout Inflater ) ĊĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠ Ġ// Ġsetup Ġtoolbar Ġto Ġdisplay Ġanimated Ġdrawer Ġtoggle Ġbutton ĊĠĠĠ Ġaction Bar Drawer Toggle Ġ= ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠ Ġbinding . layout Main , ĊĠĠĠĠĠ ĠR . string . open _ drawer , ĊĠĠĠĠĠ ĠR . string . close _ drawer ĊĠĠĠ Ġ) ĊĠĠĠ Ġbinding . layout Main . add Drawer Listener ( action Bar Drawer Toggle ) ĊĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠ Ġaction Bar Drawer Toggle . sync State () ĊĊĠĠĠ Ġ// Ġsetup Ġlistener Ġfor Ġnavigation Ġitem Ġclicks ĊĠĠĠ Ġbinding . navigation Drawer . set Navigation ItemSelected Listener ( this ) ĊĠĠĠ Ġbinding . navigation Drawer . menu . find Item ( R . id . rate _ on _ play _ store ). isVisible Ġ= ĊĠĠĠĠĠ ĠBuild Config . IS _ PLAY _ STORE _ BUILD ĊĊĠĠĠ Ġ// Ġbind Ġnavigation Ġdrawer Ġmenu Ġitems Ġchecked Ġstate Ġwith Ġfragment Ġback Ġstack ĊĠĠĠ Ġsupport FragmentManager . add On Back Stack Changed Listener Ġ{ ĊĠĠĠĠĠ Ġval Ġindex Ġ= Ġsupport FragmentManager . back Stack Entry Count Ġ- Ġ 1 ĊĠĠĠĠĠ Ġval Ġcurrent Fragment Name Ġ= Ġsupport FragmentManager . get Back Stack Entry At ( index ). name ĊĠĠĠĠĠ Ġfor Ġ(( id , Ġfragment ) Ġin ĠNAV IG ATED _ FRAG MENTS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fragment . simple Name Ġ== Ġcurrent Fragment Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbinding . navigation Drawer . setChecked Item ( id ) ĊĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. setTitle ( R . string . app _ name ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= Ġbinding . navigation Drawer . checked Item ?. title ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġset Ġsound Ġlibrary Ġfragment Ġwhen Ġactivity Ġis Ġcreated Ġinitially Ġ( screen - orientation Ġchange ĊĠĠĠ Ġ// Ġwill Ġrecall ĠonCreate Ġwhich Ġwill Ġcause Ġweird Ġand Ġunexpected Ġfragment Ġchanges Ġotherwise ). ĊĠĠĠ Ġif Ġ( support FragmentManager . back Stack Entry Count Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġdefault Fragment ID Ġ= ĠR . id . library ĊĠĠĠĠĠ Ġif Ġ( Preset Fragment . should Display As Home Screen ( this )) Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Fragment ID Ġ= ĠR . id . saved _ presets ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġset Fragment ( intent . getInt Extra ( EXTRA _ CURRENT _ NAV IG ATED _ FRAGMENT , Ġdefault Fragment ID )) ĊĊĠĠĠĠĠ Ġ// Ġshow Ġapp Ġintro Ġif Ġuser Ġhasn 't Ġalready Ġseen Ġit ĊĠĠĠĠĠ ĠApp Intro Activity . maybe Start ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠIn App Review Flow Manager . init ( this ) ĊĊĠĠĠ Ġcustom Tabs Intent Ġ= ĠCustom Tabs Intent . Builder () ĊĠĠĠĠĠ Ġ. setDefault Color Scheme Params ( ĊĠĠĠĠĠĠĠ ĠCustom Tab Color Scheme Params . Builder () ĊĠĠĠĠĠĠĠĠĠ Ġ. set Toolbar Color ( Resources Compat . getColor ( resources , ĠR . color . color ActionBar , Ġtheme )) ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. build () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠ Ġsuper . on Resume () ĊĠĠĠ ĠEvent Bus . getDefault (). register ( this ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠ ĠEvent Bus . getDefault (). unregister ( this ) ĊĠĠĠ Ġsuper . on Pause () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠ Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠ Ġcast API Wrapper . setUp MenuItem ( menu , ĠR . string . cast _ media ) ĊĠĠĠ Ġmenu . add ( 0 , ĠR . id . action _ play _ pause _ toggle , Ġ 0 , ĠR . string . play _ pause ). also Ġ{ ĊĠĠĠĠĠ Ġit . set Show As Action ( MenuItem . SHOW _ AS _ ACTION _ ALWAYS ) ĊĠĠĠĠĠ Ġit . isVisible Ġ= ĠPlayer Manager . State . STOP PED Ġ!= Ġplayer Manager State ĊĠĠĠĠĠ Ġif Ġ( Player Manager . State . PLAY ING Ġ== Ġplayer Manager State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . setIcon ( R . drawable . ic _ action _ play _ to _ pause ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġit . setIcon ( R . drawable . ic _ action _ pause _ to _ play ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ( it . icon Ġas ĠAnim atable ). start () ĊĠĠĠĠĠ Ġit . setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Player Manager . State . PLAY ING Ġ== Ġplayer Manager State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠMedia Player Service . pause Playback ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠMedia Player Service . resume Playback ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( action Bar Drawer Toggle . on Options ItemSelected ( item )) ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Navigation ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠ Ġin ĠNAV IG ATED _ FRAG MENTS Ġ-> Ġset Fragment ( item . itemId ) ĊĠĠĠĠĠ ĠR . id . app _ theme Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠDialog Fragment . show ( support FragmentManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtitle ( R . string . app _ theme ) ĊĠĠĠĠĠĠĠĠĠ Ġsingle Choice Items ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġresources . getString Array ( R . array . app _ themes ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Choice Ġ= Ġget App Theme (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ItemSelected Ġ= Ġ{ Ġset App Theme ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠR . id . help Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠApp Intro Activity :: class . java )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠR . id . report _ issue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġcustom Tabs Intent . launch Url ( this , ĠUri . parse ( getString ( R . string . app _ issues _ url ))) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠR . id . submit _ feedback Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġcustom Tabs Intent . launch Url ( this , ĠUri . parse ( getString ( R . string . feedback _ form _ url ))) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠR . id . rate _ on _ play _ store Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠ ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse ( getString ( R . string . rate _ us _ on _ play _ store _ url ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhack Ġto Ġavoid Ġst utter ing Ġin Ġanimations ĊĠĠĠ Ġbinding . layout Main . post Delayed ({ Ġbinding . layout Main . close Drawer ( Gravity Compat . START ) Ġ}, Ġ 1 5 0 ) ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠ Ġif Ġ( binding . layout Main . is Drawer Open ( Gravity Compat . START )) Ġ{ ĊĠĠĠĠĠ Ġbinding . layout Main . close Drawer ( Gravity Compat . START ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// Ġlast Ġfragment Ġneed Ġnot Ġbe Ġremoved , Ġactivity Ġshould Ġbe Ġfinished Ġinstead ĊĠĠĠĠĠ Ġif Ġ( support FragmentManager . back Stack Entry Count Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . pop Back Stack Immediate () ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Subscribe ( sticky Ġ= Ġtrue , Ġthread Mode Ġ= ĠThread Mode . MAIN ) ĊĠ Ġfun Ġon Player Manager Update ( event : ĠMedia Player Service . On Player Manager Update Event ) Ġ{ ĊĠĠĠ Ġif Ġ( player Manager State Ġ== Ġevent . state ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġplayer Manager State Ġ= Ġevent . state ĊĠĠĠ Ġinvalidate Options Menu () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGets Ġuser Ġsetting Ġfor Ġapp Ġtheme Ġand Ġconverts Ġit Ġinto Ġits Ġcorresponding Ġvalue Ġfrom ĊĠĠ Ġ* Ġarray Ġ([ AppCompat Delegate . MODE _ N IGHT _ NO ], Ġ[ AppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ], ĊĠĠ Ġ* Ġ[ AppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ]). ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget Night Mode From Prefs (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( getApp Theme ()) Ġ{ ĊĠĠĠĠĠ ĠAPP _ THEME _ LIGHT Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ NO ĊĠĠĠĠĠ ĠAPP _ THEME _ DARK Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ YES ĊĠĠĠĠĠ ĠAPP _ THEME _ SYSTEM _ DEFAULT Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ĊĠĠĠĠĠ Ġelse Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ UNSPECIFIED ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGets Ġuser Ġsetting Ġfor Ġcurrent Ġapp Ġtheme . ĊĠĠ Ġ* ĠReturns Ġone Ġof Ġ[ APP _ THEME _ LIGHT ], Ġ[ APP _ THEME _ DARK ] Ġor Ġ[ APP _ THEME _ SYSTEM _ DEFAULT ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget App Theme (): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠ Ġ. getInt ( PRE F _ APP _ THEME , ĠAPP _ THEME _ SYSTEM _ DEFAULT ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġuser Ġsetting Ġfor Ġcurrent Ġapp Ġtheme . ĊĠĠ Ġ* Ġ@ param Ġnew Theme Ġshould Ġbe Ġone Ġof Ġ[ APP _ THEME _ LIGHT ], Ġ[ APP _ THEME _ DARK ] Ġor Ġ[ APP _ THEME _ SYSTEM _ DEFAULT ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġset App Theme ( new Theme : ĠInt ) Ġ{ ĊĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( this ). edit Ġ{ ĊĠĠĠĠĠ Ġput Int ( PRE F _ APP _ THEME , Ġnew Theme ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrecreate () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Fragment (@ Id Res Ġnav Item ID : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġfragment Class Ġ= ĠNAV IG ATED _ FRAG MENTS [ nav Item ID ] Ġ?: Ġreturn ĊĠĠĠ Ġval Ġtag Ġ= Ġfragment Class . simple Name ĊĊĠĠĠ Ġ// Ġshow Ġfragment Ġif Ġit Ġisn 't Ġpresent Ġin Ġback Ġstack . ĊĠĠĠ Ġ// Ġif Ġit Ġis Ġpresent , Ġpop Ġback Ġstack Ġto Ġbring Ġit Ġto Ġfront ĊĠĠĠ Ġ// Ġthis Ġseems Ġto Ġbe Ġthe Ġonly Ġway Ġto Ġavoid Ġduplicate Ġfragments ĊĠĠĠ Ġ// Ġin Ġback Ġstack Ġwithout Ġfight ing Ġthe Ġf reak ing Ġframework ĊĠĠĠ Ġif Ġ( ĊĠĠĠĠĠ Ġ! support FragmentManager . pop Back Stack Immediate ( tag , Ġ 0 ) ĊĠĠĠĠĠ Ġ&& Ġsupport FragmentManager . find Fragment By Tag ( tag ) Ġ== Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠ Ġ. set Custom Animations ( ĊĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ right , ĊĠĠĠĠĠĠĠĠĠ ĠR . anim . exit _ left , ĊĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ left , ĊĠĠĠĠĠĠĠĠĠ ĠR . anim . exit _ right ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. replace ( R . id . fragment _ container , Ġfragment Class . newInstance (), Ġtag ) ĊĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( tag ) ĊĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ