/* Ċ ĠThis Ġis Ġfree Ġand Ġun enc umber ed Ġsoftware Ġreleased Ġinto Ġthe Ġpublic Ġdomain . Ċ ĠSee ĠLICENSE Ġfile Ġfor Ġdetails . Ċ Ġ*/ Ċ Ċ package Ġre . indigo . ep ist ola ire Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio . charset . Charset ĊĊ Ċ class ĠM ms Dump er ( val Ġcontent Resolver : ĠContent Resolver ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Ep ist ola ire M ms Dump er " ĊĊĠĠĠ Ġval Ġerrors Ġ= ĠJSONArray () ĊĊĠĠĠ Ġprivate Ġfun Ġcount Rows ( uri String : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( uri String ) ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri , Ġnull , Ġnull , Ġnull , Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcursor . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor . count ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount All Messages (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcount Rows (" content :// sms /") Ġ+ Ġcount Rows (" content :// m ms /") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconversations (): ĠArrayList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠArrayList < Int >() ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse (" content :// m ms - sms / con versations ? simple = true ") ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĠarrayOf ("_ id "), Ġnull , Ġnull , Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" failed Ġto Ġlist Ġconversations Ġ$ uri " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġerrors ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Id Ġ= Ġcursor . getInt ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . add ( thread Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġforeach Message ByType ( uri String : ĠString , Ġid : ĠInt , Ġblock : Ġ( JSONObject ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( uri String ) ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" thread _ id =$ id ", Ġnull , Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" failed Ġto Ġlist Ġm ms Ġin Ġthread Ġ$ uri Ġ$ id " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj obj Ġ= ĠUtils (). row ToJson ( cursor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Millis Date ( j obj , Ġ" date ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Millis Date ( j obj , Ġ" date _ sent ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( j obj ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġforeach Thread Message ( id : ĠInt , Ġblock : Ġ( JSONObject ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġforeach Message ByType (" content :// sms /", Ġid , Ġblock ) ĊĠĠĠĠĠĠĠ Ġforeach Message ByType (" content :// m ms /", Ġid ) Ġ{ Ġj m ms Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart Id Ġ= Ġj m ms . getInt ("_ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj m ms . put (" parts ", Ġget Parts ( part Id )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġj m ms . put (" addresses ", Ġget M MS Addresses ( jm ms . getInt ("_ id "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( jm ms ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġforce Millis Date ( message : ĠJSONObject , Ġfield : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġsometimes Ġthe Ġsms Ġare Ġin Ġmillis Ġand Ġthe Ġm ms Ġin Ġsecs ... Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmessage . opt Long ( field ) ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ 0 L Ġ&& Ġvalue Ġ< Ġ 5 0 0 0 0 0 0 0 0 0 0 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . put ( field , Ġvalue Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Parts ( m ms Id : ĠInt ): ĠJSONArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj array Ġ= ĠJSONArray () ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse (" content :// m ms / part ") ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mid =$ m ms Id ", Ġnull , Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" failed Ġlisting Ġparts Ġof Ġm ms Ġ$ uri Ġ$ m ms Id " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . put ( msg ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj part Ġ= ĠUtils (). row ToJson ( cursor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Text Value Ġ= Ġ( j part . has (" text ") Ġ&& Ġj part . get (" text ") Ġis ĠString ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Text Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj part . put (" my _ content ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( j part . getString (" ct "). startsWith (" text / ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj part . put (" my _ content ", Ġuse Part ( j part . getInt ("_ id ")) Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . read Bytes (). toString ( Charset . forName (" UTF - 8 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj part . put (" my _ content ", Ġuse Part ( j part . getInt ("_ id ")) Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . encode ToString ( stream . read Bytes (), ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj array . put ( j part ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġj array ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġuse Part ( id : ĠInt , Ġblock : Ġ( InputStream ) Ġ-> ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpart URI Ġ= ĠUri . parse (" content :// m ms / part /$ id ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġcontent Resolver . open InputStream ( part URI ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" failed Ġopening Ġstream Ġfor Ġm ms Ġpart Ġ$ part URI " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . put ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" failed Ġto Ġread ĠM MS Ġpart Ġon Ġ$ part URI " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġmsg , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . put ("$ msg : Ġ$ e ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget M MS Addresses ( id : ĠInt ): ĠJSONArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj array Ġ= ĠJSONArray () ĊĊĠĠĠĠĠĠĠ Ġ/* Ġvalues Ġcome Ġfrom ĠP du Headers Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġtype _ from Ġ= Ġ 1 3 7 ĊĠĠĠĠĠĠĠ Ġval Ġtype _ to Ġ= Ġ 1 5 1 ĊĠĠĠĠĠĠĠ Ġval Ġtype _ cc Ġ= Ġ 1 3 0 ĊĠĠĠĠĠĠĠ Ġval Ġtype _ bcc Ġ= Ġ 1 2 9 ĊĊĠĠĠĠĠĠĠ Ġval Ġaddr URI Ġ= ĠUri . parse (" content :// m ms /$ id / addr ") ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddr URI , ĠarrayOf (" address ", Ġ" type "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" msg _ id =$ id ", Ġnull , Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" failed Ġgetting Ġaddresses Ġon Ġ$ addr URI " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . put ( msg ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( cursor . getInt ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype _ from , Ġtype _ to , Ġtype _ cc , Ġtype _ bcc Ġ-> Ġj array . put ( cursor . getString ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġj array ĊĠĠĠ Ġ} Ċ Ċ } Ċ