package Ġcom . dr ake et . pure writer Ċ Ċ import Ġandroid . app . Activity Manager Ċ import Ġandroid . app . Activity Manager . Memory Info Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Abstract Window ed Cursor Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . database . Cursor Window Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ Ċ /** Ċ Ġ* Ġ@ author ĠDr ake et ĠX u Ċ Ġ*/ Ċ object ĠCursor Window Fixer Ġ{ ĊĊĠ Ġvar Ġlogger : ĠLogger ? Ġ= Ġnull ĊĊĠ Ġprivate Ġval ĠInt . MB : ĠInt Ġget () Ġ= Ġthis Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĊĠ Ġvar Ġfixed Cursor Window Size Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġprivate Ġval Ġs Cursor Window Size Accessible Field Ġby Ġlazy Ġ{ ĊĠĠĠ ĠCursor Window :: class . java . getDeclared Field (" s Cursor Window Size "). apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġinit ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġfixed Cursor Window Size Ġ= Ġ- 1 ĊĠĠĠ Ġval Ġinfo Ġ= Ġrefresh ( context ) ĊĠĠĠ Ġlogger ?. log ( Log . INFO , Ġ" total Mem : Ġ${ info . total Mem Ġ/ Ġ 1 . MB } MB ") ĊĠĠĠ Ġlogger ?. log ( Log . INFO , Ġ" avail Mem : Ġ${ info . avail Mem Ġ/ Ġ 1 . MB } MB ") ĊĠ Ġ} ĊĊĠ Ġfun Ġrefresh ( context : ĠContext ): ĠMemory Info Ġ{ ĊĠĠĠ Ġval Ġinfo Ġ= Ġmemory Info ( context ) ĊĠĠĠ Ġval Ġavail Mem Ġ= Ġinfo . avail Mem ĊĠĠĠ Ġval Ġlast Value Ġ= Ġfixed Cursor Window Size ĊĠĠĠ Ġfixed Cursor Window Size Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġavail Mem Ġ> Ġ 2 0 0 0 . MB Ġ-> Ġ 1 1 2 . MB ĊĠĠĠĠĠ Ġavail Mem Ġ> Ġ 5 1 2 . MB Ġ-> Ġ 8 8 . MB ĊĠĠĠĠĠ Ġavail Mem Ġ> Ġ 2 5 6 . MB Ġ-> Ġ 5 0 . MB ĊĠĠĠĠĠ Ġavail Mem Ġ> Ġ 1 2 8 . MB Ġ-> Ġ 2 0 . MB ĊĠĠĠĠĠ Ġelse Ġ-> Ġ 1 0 . MB ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( last Value Ġ!= Ġfixed Cursor Window Size ) Ġ{ ĊĠĠĠĠĠ Ġfix ( logger Ġ!= Ġnull ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġinfo ĊĠ Ġ} ĊĊĠ Ġfun Ġfix Cursor ( context : ĠContext , Ġcursor : ĠCursor ?) Ġ{ ĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 8 Ġ&& Ġcursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ( cursor Ġas ? ĠAbstract Window ed Cursor )?. apply Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh ( context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( fixed Cursor Window Size Ġ!= Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠ Ġwindow Ġ= ĠCursor Window (" Compat Fixed ", Ġfixed Cursor Window Size . to Long ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfix ( log : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠ Ġfix ( fixed Cursor Window Size , Ġlog ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmemory Info ( context : ĠContext ): ĠMemory Info Ġ{ ĊĠĠĠ Ġval Ġinfo Ġ= ĠMemory Info () ĊĠĠĠ Ġ( context . getSystem Service ( Context . ACTIVITY _ SERVICE ) Ġas ĠActivity Manager ). get Memory Info ( info ) ĊĠĠĠ Ġreturn Ġinfo ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfix ( fixed Size : ĠInt , Ġlog : ĠBoolean ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġs Cursor Window Size Accessible Field . set ( null , Ġfixed Size ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġlogger ?. log ( Log . ERROR , Ġe ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ ĠCursor Window (" Fail Fast "). close () ĊĠĠĠĠĠ Ġif Ġ( log ) Ġlogger ?. log ( Log . INFO , Ġ" fixed Size : Ġ${ fixed Size Ġ/ Ġ 1 . MB } MB ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException Ġ/* Ġfor ĠCursor Window Allocation Exception Ġ*/) Ġ{ ĊĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġfix ( fixed Size Ġ/ Ġ 4 , Ġlog ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ