package Ġde . j ep fa . y apm . database Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . room . Database Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . room . Room Database Ċ import Ġandroidx . room . Type Converters Ċ import Ġandroidx . room . migration . Migration Ċ import Ġandroidx . sqlite . db . Support SQLite Database Ċ import Ġde . j ep fa . y apm . database . converter . String Set Converter Ċ import Ġde . j ep fa . y apm . database . dao . Enc Credential Dao Ċ import Ġde . j ep fa . y apm . database . dao . Enc Label Dao Ċ import Ġde . j ep fa . y apm . database . entity . Enc Credential Entity Ċ import Ġde . j ep fa . y apm . database . entity . Enc Label Entity Ċ Ċ const Ġval ĠDB _ VERSION Ġ= Ġ 4 Ċ Ċ @ Database ( ĊĠĠĠ Ġentities Ġ= Ġ[ Enc Credential Entity :: class , ĠEn c Label Entity :: class ], ĊĠĠĠ Ġversion Ġ= ĠDB _ VERSION , ĊĠĠĠ Ġexport Schema Ġ= Ġfalse Ċ ) Ċ @ Type Converters ( String Set Converter :: class ) Ċ abstract Ġclass ĠY apm Database Ġ: ĠRoom Database () Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġcredential Dao (): ĠEn c Credential Dao ĊĠĠĠ Ġabstract Ġfun Ġlabel Dao (): ĠEn c Label Dao ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Version (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDB _ VERSION ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠY apm Database ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfun Ġget Database ( context : ĠContext ): ĠY apm Database ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( Y apm Database :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmigration 1 to 2 Ġ= Ġobject Ġ: ĠMigration ( 1 , Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmigrate ( database : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠEn c Credential Entity ĠADD ĠCOLUMN Ġlast Password ĠTEXT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmigration 2 to 3 Ġ= Ġobject Ġ: ĠMigration ( 2 , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmigrate ( database : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠEn c Credential Entity ĠADD ĠCOLUMN Ġis Obfuscated ĠINTEGER ĠNOT ĠNULL ĠDEFAULT Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠEn c Credential Entity ĠADD ĠCOLUMN Ġis Last Password Obfuscated ĠINTEGER ĠNOT ĠNULL ĠDEFAULT Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmigration 3 to 4 Ġ= Ġobject Ġ: ĠMigration ( 3 , Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmigrate ( database : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠEn c Credential Entity ĠADD ĠCOLUMN Ġmodify Timestamp ĠINTEGER ĠNOT ĠNULL ĠDEFAULT Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" UPDATE ĠEn c Credential Entity ĠSET Ġmodify Timestamp = id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= ĠRoom . database Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠY apm Database :: class . java , Ġ" y apm _ database " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( migration 1 to 2 , Ġmigration 2 to 3 , Ġmigration 3 to 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }