/* Ċ * ĠCreated Ġby ĠM ikel Ġ( m ikel @ 4 rt studio . com ) Ġon Ġ 1 2 / 1 0 / 2 0 1 9 . Ċ */ Ċ package Ġcom . ak ait a . encrypted shared preferences Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . security . crypto . Encrypted SharedPreferences Ċ import Ġandroidx . security . crypto . Master Keys Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . io . File ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpreferences Name Ġ= Ġ" SharedPreferences " ĊĊĠĠĠ Ġ// ĠStep Ġ 0 : ĠEn crypted SharedPreferences Ġtake Ġlong Ġto Ġinitialize / open , Ġthere for Ġit 's Ġbetter Ġto Ġdo Ġit Ġonly Ġonce Ġand Ġkeep Ġan Ġinstance ĊĠĠĠ Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġinit Encrypted . setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Ġ-> Ġinit SharedPreferences ( checked ) Ġ} ĊĠĠĠĠĠĠĠ Ġsave Button . setOnClickListener Ġ{ Ġsave Value () Ġ} ĊĠĠĠĠĠĠĠ Ġread Button . setOnClickListener Ġ{ Ġread Value () Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Encrypted . isChecked Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit SharedPreferences ( checked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset SharedPreferences () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( checked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Encrypted SharedPreferences () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Cle art ext SharedPreferences () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠĠĠĠĠ Ġshow Raw File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Apply Shared Pref ") ĊĠĠĠ Ġprivate Ġfun Ġreset SharedPreferences () Ġ{ ĊĠĠĠĠĠĠĠ Ġget SharedPreferences ( preferences Name , ĠMODE _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () Ġ// note : ĠI Ġuse Ġ` commit ` Ġin Ġorder Ġto Ġmeasure Ġraw Ġperformance . ĠPlease Ġuse Ġ` apply ` Ġin Ġyour Ġapps ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Encrypted SharedPreferences () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ts Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 1 : ĠCreate Ġor Ġretrieve Ġthe ĠMaster ĠKey Ġfor Ġencryption / de cryption ĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Alias Ġ= ĠMaster Keys . get OrCreate ( Master Keys . AES 2 5 6 _ GCM _ SPEC ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 2 : ĠInitialize / open Ġan Ġinstance Ġof ĠEn crypted SharedPreferences ĊĠĠĠĠĠĠĠ Ġshared Preferences Ġ= ĠEn crypted SharedPreferences . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaster Key Alias , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn crypted SharedPreferences . Pref Key Encryption Scheme . AES 2 5 6 _ SI V , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn crypted SharedPreferences . Pref Value Encryption Scheme . AES 2 5 6 _ GCM ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġend Ts Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġinit Timestamp . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġinit Timestamp . text Ġ= ĠgetString ( R . string . timestamp ). format ( end Ts Ġ- Ġstart Ts ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinit Cle art ext SharedPreferences () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ts Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġshared Preferences Ġ= Ġget SharedPreferences ( preferences Name , ĠMODE _ PRIVATE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġend Ts Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġinit Timestamp . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġinit Timestamp . text Ġ= ĠgetString ( R . string . timestamp ). format ( end Ts Ġ- Ġstart Ts ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Apply Shared Pref ") ĊĠĠĠ Ġprivate Ġfun Ġsave Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ts Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 3 : ĠSave Ġdata Ġto Ġthe ĠEn crypted SharedPreferences Ġas Ġusual ĊĠĠĠĠĠĠĠ Ġshared Preferences . edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString (" DATA ", Ġsave Text . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () Ġ// note : ĠI Ġuse Ġ` commit ` Ġin Ġorder Ġto Ġmeasure Ġraw Ġperformance . ĠPlease Ġuse Ġ` apply ` Ġin Ġyour Ġapps ĊĊĠĠĠĠĠĠĠ Ġval Ġend Ts Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġsave Timestamp . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġsave Timestamp . text Ġ= ĠgetString ( R . string . timestamp ). format ( end Ts Ġ- Ġstart Ts ) ĊĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠĠĠĠĠ Ġshow Raw File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ts Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 3 : ĠRead Ġdata Ġfrom ĠEn crypted SharedPreferences Ġas Ġusual ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġshared Preferences . getString (" DATA ", Ġ"") ĊĠĠĠĠĠĠĠ Ġread Text . setText ( value ) ĊĊĠĠĠĠĠĠĠ Ġval Ġend Ts Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġread Timestamp . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġread Timestamp . text Ġ= ĠgetString ( R . string . timestamp ). format ( end Ts Ġ- Ġstart Ts ) ĊĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠĠĠĠĠ Ġshow Raw File () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Raw File () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences File Ġ= ĠFile ("${ application Info . data Dir }/ shared _ prefs /$ preferences Name . xml ") ĊĠĠĠĠĠĠĠ Ġif Ġ( preferences File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Text . text Ġ= Ġpreferences File . read Text (). highlight () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Text . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// region Ġinfo Ġdialog ĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ about Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow About Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow About Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Icon ( R . mip map . ic _ launcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset View ( layout Inflater . inflate ( R . layout . about , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button (" OK ") Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . create (). show () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion Ċ } Ċ