package Ġcom . b ren tp an ther . bitcoin widget . db Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġandroidx . room . Database Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . room . Room Database Ċ import Ġandroidx . room . migration . Migration Ċ import Ġandroidx . sqlite . db . Support SQLite Database Ċ import Ġcom . b ren tp an ther . bitcoin widget . exchange . Exchange Ċ Ċ @ Database ( version Ġ= Ġ 4 , Ġentities Ġ= Ġ[ Widget :: class , ĠConfiguration :: class ], Ġexport Schema Ġ= Ġtrue ) Ċ abstract Ġclass ĠWidget Database Ġ: ĠRoom Database () Ġ{ ĊĊĠĠĠ Ġabstract Ġfun Ġwidget Dao (): ĠWidget Dao ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠWidget Database :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠM IG RATION _ 1 _ 2 Ġ= Ġobject Ġ: ĠMigration ( 1 , Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmigrate ( database : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠWidget ĠADD ĠCOLUMN Ġwidget Type ĠTEXT ĠNOT ĠNULL ĠDEFAULT Ġ' PRICE '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠWidget ĠADD ĠCOLUMN Ġshow Amount Label ĠINTEGER ĠNOT ĠNULL ĠDEFAULT Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠWidget ĠADD ĠCOLUMN Ġamount Hel d ĠREAL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠM IG RATION _ 2 _ 3 Ġ= Ġobject Ġ: ĠMigration ( 2 , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmigrate ( database : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠWidget ĠADD ĠCOLUMN Ġuse Inverse ĠINTEGER ĠNOT ĠNULL ĠDEFAULT Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠM IG RATION _ 3 _ 4 Ġ= Ġobject Ġ: ĠMigration ( 3 , Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmigrate ( database : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġall Ġdevices Ġsupport Ġrename Ġcolumn Ġyet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCREATE ĠTABLE Ġ` Widget _ New ` Ġ(` id ` ĠINTEGER ĠPRIMARY ĠKEY ĠAUTO INCREMENT ĠNOT ĠNULL , Ġ` widget Id ` ĠINTEGER ĠNOT ĠNULL , Ġ` widget Type ` ĠTEXT ĠNOT ĠNULL , Ġ` exchange ` ĠTEXT ĠNOT ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` coin ` ĠTEXT ĠNOT ĠNULL , Ġ` currency ` ĠTEXT ĠNOT ĠNULL , Ġ` coin Custom Id ` ĠTEXT , Ġ` coin Custom Name ` ĠTEXT , Ġ` currency Custom Name ` ĠTEXT , Ġ` show Exchange Label ` ĠINTEGER ĠNOT ĠNULL , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` show Coin Label ` ĠINTEGER ĠNOT ĠNULL , Ġ` show Icon ` ĠINTEGER ĠNOT ĠNULL , Ġ` num Decimal s ` ĠINTEGER ĠNOT ĠNULL , Ġ` currency Symbol ` ĠTEXT , Ġ` theme ` ĠTEXT ĠNOT ĠNULL , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` night Mode ` ĠTEXT ĠNOT ĠNULL , Ġ` coin Unit ` ĠTEXT , Ġ` currency Unit ` ĠTEXT , Ġ` custom Icon ` ĠTEXT , Ġ` portrait Text Size ` ĠINTEGER , Ġ` land scape Text Size ` ĠINTEGER , Ġ` last Value ` ĠTEXT , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` amount Hel d ` ĠREAL , Ġ` show Amount Label ` ĠINTEGER ĠNOT ĠNULL , Ġ` use Inverse ` ĠINTEGER ĠNOT ĠNULL , Ġ` last Updated ` ĠINTEGER ĠNOT ĠNULL , Ġ` state ` ĠTEXT ĠNOT ĠNULL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSERT ĠINTO ĠWidget _ New Ġ( id , Ġwidget Id , Ġwidget Type , Ġexchange , Ġcoin , Ġcurrency , Ġcoin Custom Id , Ġcoin Custom Name , Ġcurrency Custom Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Exchange Label , Ġshow Coin Label , Ġshow Icon , Ġnum Decimal s , Ġcurrency Symbol , Ġtheme , Ġnight Mode , Ġcoin Unit , Ġcurrency Unit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Icon , Ġpor trait Text Size , Ġlandscape Text Size , Ġlast Value , Ġamount Hel d , Ġshow Amount Label , Ġuse Inverse , Ġlast Updated , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġid , Ġwidget Id , Ġwidget Type , Ġexchange , Ġcoin , Ġcurrency , Ġcoin Custom Id , Ġcoin Custom Name , Ġcurrency Custom Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Exchange Label , Ġshow Coin Label , Ġshow Icon , Ġ- 1 , Ġcurrency Symbol , Ġtheme , Ġnight Mode , Ġcoin Unit , Ġcurrency Unit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Icon , Ġpor trait Text Size , Ġlandscape Text Size , Ġlast Value , Ġamount Hel d , Ġshow Amount Label , Ġuse Inverse , Ġlast Updated , Ġstate ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM ĠWidget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" DROP ĠTABLE ĠWidget ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" ALTER ĠTABLE ĠWidget _ New ĠR ENAME ĠTO ĠWidget ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . exec SQL (" CREATE ĠUNIQUE ĠINDEX ĠIF ĠNOT ĠEXISTS Ġ` index _ Widget _ widget Id ` ĠON Ġ` Widget ` Ġ(` widget Id `) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠWidget Database ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( context : ĠContext ): ĠWidget Database Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġobject Ġ: ĠCallback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( db : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Initializer . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences (" bitcoin widget ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Open ( db : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfix Removed Exchange s ( db ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Open ( db ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE Ġ?: Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠRoom . database Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . application Context , ĠWidget Database :: class . java , Ġ" widget db " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). add Callback ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( M IG RATION _ 1 _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( M IG RATION _ 2 _ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Migrations ( M IG RATION _ 3 _ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfix Removed Exchange s ( db : ĠSupport SQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġdb . query (" SELECT Ġid , Ġexchange ĠFROM ĠWidget ĠORDER ĠBY Ġid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Exchange s Ġ= ĠExchange . values (). map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerro red Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexchange Ġ= Ġcursor . getString ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! all Exchange s . contains ( exchange )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getInt ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerro red . add ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Widget Ġ$ id : Ġhas Ġinvalid Ġexchange : Ġ$ exchange ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfallback Ġto Ġco inge cko Ġfor Ġany Ġbroken Ġexchange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġerro red ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . exec SQL (" UPDATE ĠWidget ĠSET Ġexchange Ġ= Ġ' CO INGE CK O ' ĠWHERE Ġid Ġ= Ġ$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ