/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// 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 . Ċ Ġ*/ Ċ Ċ @ file : Jvm Name (" SharedPreferences Migration ") Ċ Ċ package Ġandroidx . datastore . migrations Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . datastore . Data Migration Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠA ĠData Migration Ġwhich Ġmigr ates ĠSharedPreferences Ġto ĠData Store . Ċ Ġ* Ċ Ġ* ĠNote : Ġthis Ġaccesses Ġthe ĠSharedPreferences Ġusing ĠMODE _ PRIVATE . Ċ Ġ*/ Ċ internal Ġval ĠM IG RATE _ ALL _ KEYS Ġ= Ġnull Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġfactory Ġfunction Ġwhich Ġcreates Ġa ĠSharedPreferences ĠData ĠMigration . Ċ Ġ*/ Ċ fun Ġ< T > ĠSharedPreferences Migration ( ĊĠĠĠ Ġ/** ĠContext Ġused Ġfor Ġgetting ĠSharedPreferences . Ġ*/ ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġ/** ĠThe Ġname Ġof Ġthe ĠSharedPreferences . Ġ*/ ĊĠĠĠ Ġshared Preferences Name : ĠString , ĊĠĠĠ Ġ/** ĠThe Ġmapping Ġfunction Ġfor Ġthe Ġmigration . Ġ*/ ĊĠĠĠ Ġmigration : ĠMigration From SharedPreferences < T >, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlist Ġof Ġkeys Ġto Ġmigrate . ĠThe Ġkeys Ġwill Ġbe Ġmapped Ġto Ġdatastore . Preferences Ġwith ĊĠĠĠĠ Ġ* Ġtheir Ġsame Ġvalues . ĠIf Ġthe Ġkey Ġis Ġalready Ġpresent Ġin Ġthe Ġnew ĠPreferences , Ġthe Ġkey ĊĠĠĠĠ Ġ* Ġwill Ġnot Ġbe Ġmigrated Ġagain . ĠIf Ġthe Ġkey Ġis Ġnot Ġpresent Ġin Ġthe ĠSharedPreferences Ġit ĊĠĠĠĠ Ġ* Ġwill Ġnot Ġbe Ġmigrated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġkeys To Migrate Ġis Ġnull , Ġall Ġkeys Ġwill Ġbe Ġmigrated Ġfrom Ġthe Ġexisting ĊĠĠĠĠ Ġ* ĠSharedPreferences . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġkeys To Migrate : ĠSet < String >? Ġ= ĠM IG RATE _ ALL _ KEYS , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġenabled Ġand Ġthe ĠSharedPreferences Ġare Ġempty Ġ( i . e . Ġno Ġremaining Ġkeys ) Ġafter Ġthis ĊĠĠĠĠ Ġ* Ġmigration Ġruns , Ġthe Ġlef to ver ĠSharedPreferences Ġfile Ġis Ġdeleted . ĠNote Ġthat Ġthis ĊĠĠĠĠ Ġ* Ġcleanup Ġruns Ġonly Ġif Ġthe Ġmigration Ġitself Ġruns , Ġi . e ., Ġif Ġthe Ġkeys Ġwere Ġnever Ġin ĊĠĠĠĠ Ġ* ĠSharedPreferences Ġto Ġbegin Ġwith Ġthen Ġthe Ġ( pot entially ) Ġempty ĠSharedPreferences ĊĠĠĠĠ Ġ* Ġwon 't Ġbe Ġcleaned Ġup Ġby Ġthis Ġoption . ĠThis Ġfunctionality Ġis Ġbest Ġeffort Ġ- Ġif Ġthere ĊĠĠĠĠ Ġ* Ġis Ġan Ġissue Ġdeleting Ġthe ĠSharedPreferences Ġfile Ġit Ġwill Ġbe Ġsilently Ġignored . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdelete Empty Preferences : ĠBoolean Ġ= Ġtrue Ċ ): Ġ() Ġ-> ĠData Migration < T > Ġ= Ġ{ ĊĠĠĠ ĠSharedPreferences Data Migration ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġshared Preferences Name , ĊĠĠĠĠĠĠĠ Ġmigration , ĊĠĠĠĠĠĠĠ Ġkeys To Migrate ?. to Mutable Set (), ĊĠĠĠĠĠĠĠ Ġdelete Empty Preferences ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠUser Ġimplemented Ġmigration Ġinterface . ĠContains Ġlogic Ġfor Ġmapping ĠSharedPreferences Ġdata Ġto ĠT . Ċ Ġ*/ Ċ interface ĠMigration From SharedPreferences < T > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOptional Ġmethod Ġthat Ġshould Ġreturn Ġfalse Ġif Ġthe Ġmigration Ġshould Ġbe Ġskipped . ĠThis Ġcan ĊĠĠĠĠ Ġ* Ġbe Ġuseful Ġto Ġstop Ġunnecessary Ġcalls Ġinto ĠSharedPreferences . ĠThis Ġcan Ġbe Ġimplemented Ġby ĊĠĠĠĠ Ġ* Ġincluding Ġa Ġfield Ġin Ġyour Ġdata Ġthat Ġspecifies Ġwhether Ġyour Ġmigration Ġhas Ġalready Ġbeen ĊĠĠĠĠ Ġ* Ġrun . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent Data Ġthe Ġcurrent Ġdata Ġ( it Ġmight Ġalready Ġpopulated Ġfrom Ġthis Ġor Ġother ĊĠĠĠĠ Ġ* Ġmigrations ) ĊĠĠĠĠ Ġ* Ġ@ return ĠWhether Ġor Ġnot Ġthis Ġmigration Ġshould Ġrun . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġshould Migrate ( current Data : ĠT ): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerform Ġthe Ġmigration . ĠImplement ations Ġshould Ġbe Ġide mpot ent Ġsince Ġthis Ġmay Ġbe Ġcalled ĊĠĠĠĠ Ġ* Ġmultiple Ġtimes . ĠSee Ġ{@ code ĠData Migration # migrate } Ġfor Ġmore Ġinformation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprefs Ġthe Ġview Ġof Ġthe ĠSharedPreferences Ġto Ġmigrate Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent Data Ġthe Ġcurrent Ġdata Ġ( it Ġmight Ġbe Ġpopulated Ġfrom Ġother Ġmigrations Ġor Ġfrom ĊĠĠĠĠ Ġ* Ġmanual Ġchanges Ġbefore Ġthis Ġmigration Ġwas Ġadded Ġto Ġthe Ġapp ) ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġmigrated Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġmigrate ( prefs : ĠSharedPreferences View , Ġcurrent Data : ĠT ): ĠT Ċ } Ċ Ċ /** Ċ Ġ* Ġ ĠRead - only Ġwrapper Ġaround ĠSharedPreferences . ĠThis Ġwill Ġbe Ġpassed Ġin Ġto Ġyour Ġmigration . ĠThe Ċ Ġ* Ġ Ġconstructor Ġis Ġpublic Ġto Ġenable Ġeasier Ġtesting Ġof Ġmigrations . Ċ Ġ*/ Ċ class ĠSharedPreferences View ( ĊĠĠĠ Ġprivate Ġval Ġprefs : ĠSharedPreferences , ĊĠĠĠ Ġprivate Ġval Ġkey Set : ĠSet < String > Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġpreferences Ġcontains Ġa Ġpreference . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġname Ġof Ġthe Ġpreference Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` key ` Ġwasn 't Ġspecified Ġas Ġpart Ġof Ġthis Ġmigration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġcontains ( key : ĠString ): ĠBoolean Ġ= Ġprefs . contains ( check Key ( key )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġboolean Ġvalue Ġfrom Ġthe Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġname Ġof Ġthe Ġpreference Ġto Ġretrieve ĊĠĠĠĠ Ġ* Ġ@ param Ġdef Value Ġvalue Ġto Ġreturn Ġif Ġthis Ġpreference Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` key ` Ġwasn 't Ġspecified Ġas Ġpart Ġof Ġthis Ġmigration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Boolean ( key : ĠString , Ġdef Value : ĠBoolean ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġprefs . getBoolean ( check Key ( key ), Ġdef Value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġfloat Ġvalue Ġfrom Ġthe Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġname Ġof Ġthe Ġpreference Ġto Ġretrieve ĊĠĠĠĠ Ġ* Ġ@ param Ġdef Value Ġvalue Ġto Ġreturn Ġif Ġthis Ġpreference Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` key ` Ġwasn 't Ġspecified Ġas Ġpart Ġof Ġthis Ġmigration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Float ( key : ĠString , Ġdef Value : ĠFloat ): ĠFloat Ġ= Ġprefs . get Float ( check Key ( key ), Ġdef Value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġint Ġvalue Ġfrom Ġthe Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġname Ġof Ġthe Ġpreference Ġto Ġretrieve ĊĠĠĠĠ Ġ* Ġ@ param Ġdef Value Ġvalue Ġto Ġreturn Ġif Ġthis Ġpreference Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` key ` Ġwasn 't Ġspecified Ġas Ġpart Ġof Ġthis Ġmigration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Int ( key : ĠString , Ġdef Value : ĠInt ): ĠInt Ġ= Ġprefs . getInt ( check Key ( key ), Ġdef Value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġlong Ġvalue Ġfrom Ġthe Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġname Ġof Ġthe Ġpreference Ġto Ġretrieve ĊĠĠĠĠ Ġ* Ġ@ param Ġdef Value Ġvalue Ġto Ġreturn Ġif Ġthis Ġpreference Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` key ` Ġwasn 't Ġspecified Ġas Ġpart Ġof Ġthis Ġmigration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Long ( key : ĠString , Ġdef Value : ĠLong ): ĠLong Ġ= Ġprefs . getLong ( check Key ( key ), Ġdef Value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġstring Ġvalue Ġfrom Ġthe Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġname Ġof Ġthe Ġpreference Ġto Ġretrieve ĊĠĠĠĠ Ġ* Ġ@ param Ġdef Value Ġvalue Ġto Ġreturn Ġif Ġthis Ġpreference Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` key ` Ġwasn 't Ġspecified Ġas Ġpart Ġof Ġthis Ġmigration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetString ( key : ĠString , Ġdef Value : ĠString ? Ġ= Ġnull ): ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġprefs . getString ( check Key ( key ), Ġdef Value ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġa Ġstring Ġset Ġvalue Ġfrom Ġthe Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġname Ġof Ġthe Ġpreference Ġto Ġretrieve ĊĠĠĠĠ Ġ* Ġ@ param Ġdef Values Ġvalue Ġto Ġreturn Ġif Ġthis Ġpreference Ġdoes Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` key ` Ġwasn 't Ġspecified Ġas Ġpart Ġof Ġthis Ġmigration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetString Set ( key : ĠString , Ġdef Values : ĠSet < String >? Ġ= Ġnull ): ĠSet < String >? Ġ= ĊĠĠĠĠĠĠĠ Ġprefs . getString Set ( check Key ( key ), Ġdef Values )?. to Mutable Set () ĊĊĠĠĠ Ġ/** ĠRetrieve Ġall Ġvalues Ġfrom Ġthe Ġpreferences Ġthat Ġare Ġin Ġthe Ġspecified Ġkey Set . Ġ*/ ĊĠĠĠ Ġfun ĠgetAll (): ĠMap < String , ĠAny ?> Ġ= Ġprefs . all . filter Ġ{ Ġ( key , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠ Ġkey Ġin Ġkey Set ĊĠĠĠ Ġ}. map Values Ġ{ Ġ(_, Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠSet <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toSet () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Key ( key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( key Ġin Ġkey Set ) Ġ{ Ġ" Can 't Ġaccess Ġkey Ġoutside Ġmigration : Ġ$ key " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġkey ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠSharedPreferences Data Migration < T > Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġshared Preferences Name : ĠString , ĊĠĠĠ Ġprivate Ġval Ġmigration : ĠMigration From SharedPreferences < T >, ĊĠĠĠ Ġkeys To Migrate : ĠMutable Set < String > ?, ĊĠĠĠ Ġprivate Ġval Ġdelete Empty Preferences : ĠBoolean Ċ ) Ġ: ĠData Migration < T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġshared Prefs : ĠSharedPreferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( shared Preferences Name , ĠContext . MODE _ PRIVATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġkey Set : ĠMutable Set < String > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġkeys To Migrate Ġ?: Ġshared Prefs . all . keys . to Mutable Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġshould Migrate ( current Data : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! migration . should Migrate ( current Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkey Set . any ( shared Prefs :: contains ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġmigrate ( current Data : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġmigration . migrate ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSharedPreferences View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Prefs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġcurrent Data ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġclean Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshared Prefs Editor Ġ= Ġshared Prefs . edit () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġkey Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Prefs Editor . remove ( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! shared Prefs Editor . commit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġdelete Ġmigrated Ġkeys Ġfrom ĠSharedPreferences : Ġ$ shared Preferences Name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( delete Empty Preferences Ġ&& Ġshared Prefs . all . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete SharedPreferences ( context , Ġshared Preferences Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkey Set . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete SharedPreferences ( context : ĠContext , Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( android . os . Build . VERSION . SDK _ INT Ġ>= Ġ 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! context . delete SharedPreferences ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Unable Ġto Ġdelete ĠSharedPreferences : Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠContext . delete SharedPreferences Ġis ĠSDK Ġ 2 4 +, Ġso Ġwe Ġhave Ġto Ġreproduce Ġthe Ġdefinition ĊĠĠĠĠĠĠĠ Ġval Ġprefs File Ġ= Ġget Shared Prefs File ( context , Ġname ) ĊĠĠĠĠĠĠĠ Ġval Ġprefs Backup Ġ= Ġget Shared Prefs Backup ( prefs File ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSil ently Ġcontinue Ġif Ġwe Ġaren 't Ġable Ġto Ġdelete Ġthe ĠShared ĠPreferences ĠFile . ĊĠĠĠĠĠĠĠ Ġprefs File . delete () ĊĠĠĠĠĠĠĠ Ġprefs Backup . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠContext Impl . get SharedPreferences Path Ġis Ġprivate , Ġso Ġwe Ġhave Ġto Ġreproduce Ġthe Ġdefinition ĊĠĠĠ Ġprivate Ġfun Ġget Shared Prefs File ( context : ĠContext , Ġname : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefs Dir Ġ= ĠFile ( context . application Info . data Dir , Ġ" shared _ prefs ") ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( prefs Dir , Ġ"$ name . xml ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSharedPreferences Impl . make Backup File Ġis Ġprivate , Ġso Ġwe Ġhave Ġto Ġreproduce Ġthe Ġdefinition ĊĠĠĠ Ġprivate Ġfun Ġget Shared Prefs Backup ( prefs File : ĠFile ) Ġ= ĠFile ( prefs File . path Ġ+ Ġ". bak ") Ċ } Ċ