/* Ċ Ġ* ĠVo IP . ms ĠSMS Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 - 2 0 1 8 ĠMichael ĠK our las Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġnet . k our las . vo ip ms _ sms . con versations Ċ Ċ import Ġandroid . content .* Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . design . widget . Floating ActionButton Ċ import Ġandroid . support . v 4 . app . Activity Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 4 . view . View Compat Ċ import Ġandroid . support . v 4 . widget . Swipe Refresh Layout Ċ import Ġandroid . support . v 7 . app . AlertDialog Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . support . v 7 . view . Action Mode Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . support . v 7 . widget . Search View Ċ import Ġandroid . support . v 7 . widget . Toolbar Ċ import Ġandroid . text . InputType Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġnet . k our las . vo ip ms _ sms . Custom Application Ċ import Ġnet . k our las . vo ip ms _ sms . R Ċ import Ġnet . k our las . vo ip ms _ sms . conversation . Conversation Activity Ċ import Ġnet . k our las . vo ip ms _ sms . new conversation . New Conversation Activity Ċ import Ġnet . k our las . vo ip ms _ sms . notifications . Notifications Ċ import Ġnet . k our las . vo ip ms _ sms . preferences . activities . Preferences Activity Ċ import Ġnet . k our las . vo ip ms _ sms . preferences . get Setup Completed For Version Ċ import Ġnet . k our las . vo ip ms _ sms . preferences . is Account Active Ċ import Ġnet . k our las . vo ip ms _ sms . preferences . set Setup Completed For Version Ċ import Ġnet . k our las . vo ip ms _ sms . sms . Database Ċ import Ġnet . k our las . vo ip ms _ sms . sms . services . Sync Service Ċ import Ġnet . k our las . vo ip ms _ sms . utils .* Ċ Ċ /** Ċ Ġ* ĠActivity Ġthat Ġcontains Ġa Ġgeneric Ġlist Ġof Ġconversations . Ċ Ġ*/ Ċ open Ġclass ĠCon versations Activity Ġ: ĠAppCompatActivity (), ĊĠĠĠ ĠAction Mode . Callback , ĠView . OnClickListener , ĊĠĠĠ ĠView . On Long ClickListener , ĊĠĠĠ ĠActivity Compat . On Request Permissions Result Callback Ġ{ ĊĠĠĠ Ġ// ĠUI Ġelements ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġadapter : ĠCon versations RecyclerView Adapter < ĊĠĠĠĠĠĠĠ ĠCon versations Activity > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmenu : ĠMenu ĊĠĠĠ Ġprivate Ġvar Ġaction Mode : ĠAction Mode ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠDialog Ġto Ġshow Ġon Ġfirst Ġrun Ġof Ġapplication ĊĠĠĠ Ġprivate Ġvar Ġfirst Run Dialog : ĠAlertDialog ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠBroadcast Ġreceiv ers ĊĠĠĠ Ġprivate Ġval Ġsync Complete Receiver Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġintent ?. getString Extra ( getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sync _ complete _ error )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġerror Ġin Ġsn ackbar Ġif Ġone Ġoccurred ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( this @ Con versations Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . coordinator _ layout , Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent ?. getBoolean Extra ( getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sync _ complete _ full ), Ġfalse ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTurn Ġoff Ġrefresh Ġicon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswipe Refresh Layout Ġ= ĠfindViewById < Swipe Refresh Layout >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . swipe _ refresh _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Refresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġpush Notifications Registration Complete Receiver Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailed D ids Ġ= Ġintent ?. getString ArrayList Extra ( getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . push _ notifications _ reg _ complete _ vo ip _ ms _ api _ callback _ failed _ d ids )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( failed D ids Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnknown Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Info Dialog ( this @ Con versations Activity , ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . push _ notifications _ fail _ unknown )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! failed D ids . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSome ĠD IDs Ġfailed Ġregistration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Info Dialog ( this @ Con versations Activity , ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . push _ notifications _ fail _ register )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReg ard less Ġof Ġwhether Ġan Ġerror Ġoccurred , Ġmark Ġsetup Ġas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcomplete ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Setup Completed For Version ( this @ Con versations Activity , Ġ 1 1 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . con versations ) ĊĠĠĠĠĠĠĠ Ġon New Intent ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Intent ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on New Intent ( intent ) ĊĊĠĠĠĠĠĠĠ Ġsetup Toolbar () ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView And Swipe Refresh Layout () ĊĠĠĠĠĠĠĠ Ġsetup New Conversation Button () ĊĊĠĠĠĠĠĠĠ Ġ// ĠContact s Ġpermission Ġis Ġrequired Ġto Ġget Ġcontact Ġnames Ġand Ġphotos ĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġandroid . Manifest . permission . READ _ CONTACT S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠarrayOf ( android . Manifest . permission . READ _ CONTACT S ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPermission Index . CONTACT S . ordinal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġup Ġthe Ġactivity Ġtoolbar . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsetup Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġup Ġtoolbar ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar Ġ= ĠfindViewById < Toolbar >( R . id . toolbar ) ĊĠĠĠĠĠĠĠ ĠView Compat . set Elevation ( toolbar , Ġresources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Dimension ( R . dim en . toolbar _ elevation )) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġup Ġthe Ġactivity Ġre cycler Ġview Ġand Ġswipe Ġrefresh Ġlayout . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView And Swipe Refresh Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġlayout Manager . orientation Ġ= ĠLinearLayoutManager . VERTICAL ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= ĠfindViewById ( R . id . list ) ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠCon versations RecyclerView Adapter ( this , Ġre cyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ Ġval Ġswipe Refresh Layout Ġ= ĠfindViewById < Swipe Refresh Layout >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . swipe _ refresh _ layout ) ĊĠĠĠĠĠĠĠ Ġswipe Refresh Layout . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSync Service . start Service ( this , Ġforce Recent Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġswipe Refresh Layout . setColor Scheme Resources ( R . color . accent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġup Ġthe Ġnew Ġconversation Ġfloating Ġaction Ġbutton . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsetup New Conversation Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbutton Ġ= ĠfindViewById < Floating ActionButton >( R . id . new _ button ) ĊĠĠĠĠĠĠĠ Ġbutton . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Account Active ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Conversation Intent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠNew Conversation Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( new Conversation Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTrack Ġnumber Ġof Ġactivities ĊĠĠĠĠĠĠĠ Ġ( application Ġas ĠCustom Application ). con versations Activity Increment Count () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġdynamic Ġreceiv ers Ġfor Ġthis Ġactivity ĊĠĠĠĠĠĠĠ Ġregister Receiver ( sync Complete Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( getString ( R . string . sync _ complete _ action ))) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( push Notifications Registration Complete Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . push _ notifications _ reg _ complete _ action ))) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPerform Ġspecial Ġsetup Ġfor Ġthe Ġfirst Ġtime Ġrunning Ġthis Ġapp ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Account Active ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon First Run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPerform Ġspecial Ġsetup Ġfor Ġversion Ġ 1 1 4 ĊĠĠĠĠĠĠĠ Ġif Ġ( get Setup Completed For Version ( this ) Ġ< Ġ 1 1 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotifications . getInstance ( application ). enable Push Notifications ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġand Ġperform Ġlimited Ġsynchronization ĊĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠ ĠSync Service . start Service ( this , Ġforce Recent Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġon Ġresume Ġjust Ġin Ġcase Ġthe Ġcontacts Ġpermission Ġwas Ġnewly ĊĠĠĠĠĠĠĠ Ġ// Ġgranted Ġand Ġwe Ġneed Ġto Ġadd Ġthe Ġcontact Ġnames Ġand Ġphotos ĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġandroid . Manifest . permission . READ _ CONTACT S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( 0 , Ġadapter . item Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġany Ġnotification Ġchannels Ġand Ġgroups Ġthat Ġare Ġno Ġlonger ĊĠĠĠĠĠĠĠ Ġ// Ġneeded Ġand Ġrename Ġexisting Ġchannels Ġif Ġnecessary ĊĠĠĠĠĠĠĠ ĠNotifications . getInstance ( application ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Default Notification Channel () ĊĠĠĠĠĠĠĠ ĠNotifications . getInstance ( application ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete Notification Channels And Groups () ĊĠĠĠĠĠĠĠ ĠNotifications . getInstance ( application ). rename Notification Channels () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShow Ġa Ġdialog Ġwith Ġhelp Ġinformation Ġwhen Ġthe Ġapp Ġis Ġrunning Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġfirst Ġtime . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon First Run () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġa Ġdialog Ġwith Ġhelp Ġinformation Ġon Ġfirst Ġrun Ġof Ġthe Ġapp ĊĠĠĠĠĠĠĠ Ġfirst Run Dialog Ġ= Ġshow AlertDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . con versations _ first _ run _ dialog _ title ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . con versations _ first _ run _ dialog _ text ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . con versations _ action _ settings ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠPreferences Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . con versations _ action _ help ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( Intent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( getString ( R . string . help _ url )))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDis miss Ġfirst Ġrun Ġdialog Ġif Ġit Ġis Ġvisible ĊĠĠĠĠĠĠĠ Ġfirst Run Dialog ?. dismiss () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUn register Ġall Ġdynamic Ġreceiv ers Ġfor Ġthis Ġactivity ĊĠĠĠĠĠĠĠ Ġsafe Unregister Receiver ( this , Ġsync Complete Receiver ) ĊĠĠĠĠĠĠĠ Ġsafe Unregister Receiver ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Notifications Registration Complete Receiver ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTrack Ġnumber Ġof Ġactivities ĊĠĠĠĠĠĠĠ Ġ( application Ġas ĠCustom Application ). con versations Activity De crement Count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġstandard Ġoptions Ġmenu ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . con versations , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġthis . menu Ġ= Ġmenu ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġthe Ġsearch Ġbox Ġto Ġtrigger Ġadapter Ġfiltering Ġwhen Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġtext Ġchanges ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġmenu . find Item ( R . id . search _ button ). action View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas ĠSearch View ĊĠĠĠĠĠĠĠ Ġsearch View . input Type Ġ= ĠInput Type . TYPE _ TEXT _ FLAG _ NO _ SU G GEST IONS ĊĠĠĠĠĠĠĠ Ġsearch View . setOn Query Text Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSearch View . On Query Text Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh ( new Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . arch ived _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon versations Arch ived Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . preferences _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠPreferences Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . help _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( getString ( R . string . help _ url ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . privacy _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( getString ( R . string . privacy _ url ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . license _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( getString ( R . string . license _ url ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . credits _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( getString ( R . string . credits _ url ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . don ate _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( getString ( R . string . don ate _ url ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Action Mode ( mode : ĠAction Mode , Ġmenu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġmode . menu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . con versations _ secondary , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Action Item Clicked ( mode : ĠAction Mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . archive _ button Ġ-> Ġreturn Ġon Archive Button Click ( mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . mark _ read _ button Ġ-> Ġreturn Ġon Mark Read Button Click ( mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . mark _ unread _ button Ġ-> Ġreturn Ġon Mark Un read Button Click ( mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . delete _ button Ġ-> Ġreturn ĠonDelete Button Click ( mode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Prepare Action Mode ( mode : ĠAction Mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu : ĠMenu ): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy Action Mode ( mode : ĠAction Mode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġadapter . item Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter [ i ]. setChecked ( i , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġthe Ġarchive Ġbutton . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe Ġaction Ġmode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ return ĠAlways Ġreturns Ġtrue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Archive Button Click ( mode : ĠAction Mode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMark Ġall Ġselected Ġconversations Ġas Ġarchived ĊĠĠĠĠĠĠĠ Ġrun On New Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . checked Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . message Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mark Conversation Arch ived ( it . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode . finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġthe Ġmark Ġread Ġbutton . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe Ġaction Ġmode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ return ĠAlways Ġreturns Ġtrue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Mark Read Button Click ( mode : ĠAction Mode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMark Ġall Ġselected Ġconversations Ġas Ġread ĊĠĠĠĠĠĠĠ Ġrun On New Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . checked Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . message Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mark Conversation Read ( it . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode . finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġthe Ġmark Ġunread Ġbutton . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe Ġaction Ġmode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ return ĠAlways Ġreturns Ġtrue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Mark Un read Button Click ( mode : ĠAction Mode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMark Ġall Ġselected Ġconversations Ġas Ġunread ĊĠĠĠĠĠĠĠ Ġrun On New Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . checked Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . message Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mark Conversation Un read ( it . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode . finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġthe Ġdelete Ġbutton . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmode ĠThe Ġaction Ġmode Ġto Ġuse . ĊĠĠĠĠ Ġ* Ġ@ return ĠAlways Ġreturns Ġtrue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠonDelete Button Click ( mode : ĠAction Mode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . checked Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . message Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRequest Ġconfirmation Ġbefore Ġdeleting ĊĠĠĠĠĠĠĠ Ġshow AlertDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . con versations _ delete _ confirm _ title ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . con versations _ delete _ confirm _ message ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . delete ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( message Ġin Ġmessages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete Messages ( message . conversation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode . finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . cancel ), Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Mode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġor Ġun check Ġitem Ġwhen Ġaction Ġmode Ġis Ġenabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Item ( view ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOpen Ġthe Ġconversation Ġactivity Ġfor Ġthe Ġselected Ġconversation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġre cyclerView . getChild Adapter Position ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversation Item Ġ= Ġadapter [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠCon versation Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( getString ( R . string . conversation _ did ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Item . message . did ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( getString ( R . string . conversation _ contact ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Item . message . contact ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Long Click ( view : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOn Ġlong Ġclick , Ġtoggle Ġselected Ġitem ĊĠĠĠĠĠĠĠ Ġtoggle Item ( view ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠClose Ġaction Ġmode Ġif Ġvisible ĊĠĠĠĠĠĠĠ Ġif Ġ( action Mode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠClose Ġthe Ġsearch Ġbox Ġif Ġvisible ĊĠĠĠĠĠĠĠ Ġval Ġsearch Item Ġ= Ġmenu . find Item ( R . id . search _ button ) ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġsearch Item . action View Ġas ĠSearch View ĊĠĠĠĠĠĠĠ Ġif Ġ(! search View . is Icon ified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Item . collapse Action View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġdo Ġnormal Ġback Ġbutton Ġbehaviour ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPermission Index . CONTACT S . ordinal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . indices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions [ it ] Ġ== Ġandroid . Manifest . permission . READ _ CONTACT S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ it ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġpermission Ġrequest Ġwas Ġgranted , Ġtry Ġrefresh ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġloading Ġthe Ġcontact Ġname Ġand Ġphoto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( 0 , Ġadapter . item Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġshow Ġa Ġwarning ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Permission Snackbar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . new _ button , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . con versations _ perm _ den ied _ contacts )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠToggle s Ġthe Ġitem Ġassociated Ġwith Ġthe Ġspecified Ġview . ĠActiv ates Ġand ĊĠĠĠĠ Ġ* Ġde activ ates Ġthe Ġaction Ġmode Ġdepending Ġon Ġthe Ġchecked Ġitem Ġcount . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġview ĠThe Ġspecified Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtoggle Item ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInform Ġthe Ġadapter Ġthat Ġthe Ġitem Ġshould Ġbe Ġchecked ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġre cyclerView . getChild Adapter Position ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter [ index ]. toggle ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTurn Ġon Ġor Ġoff Ġthe Ġaction Ġmode Ġdepending Ġon Ġhow Ġmany Ġitems Ġare ĊĠĠĠĠĠĠĠ Ġ// Ġchecked ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter . get Checked ItemCount () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( action Mode Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġstart Support Action Mode ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġaction Ġmode Ġis Ġenabled , Ġupdate Ġthe Ġvisible Ġbuttons Ġto Ġmatch ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġkind Ġof Ġchecked Ġitems ĊĠĠĠĠĠĠĠ Ġupdate Action Mode Buttons () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSw itches Ġbetween Ġ" mark Ġas Ġread " Ġand Ġ" mark Ġas Ġunread " Ġbuttons Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġaction Ġmode Ġdepending Ġon Ġwhich Ġitems Ġin Ġthe ĠRecyclerView Ġare Ġselected . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Action Mode Buttons () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġunread Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . checked Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . message . is Un read ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunread ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Mode Ġ= Ġaction Mode Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġmark Read Button Ġ= Ġaction Mode . menu . find Item ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . mark _ read _ button ) ĊĠĠĠĠĠĠĠ Ġval Ġmark Un read Button Ġ= Ġaction Mode . menu . find Item ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . mark _ unread _ button ) ĊĠĠĠĠĠĠĠ Ġif Ġ( read Ġ> Ġunread ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġmark Ġunread Ġbutton Ġif Ġthere Ġare Ġmore Ġread Ġbuttons Ġthan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunread Ġbuttons ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Read Button . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Un read Button . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġshow Ġmark Ġread Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Read Button . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Un read Button . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠUsed Ġto Ġdis amb igu ate Ġbetween Ġdifferent Ġpermission Ġrequests . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġenum Ġclass ĠPermission Index Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ACT S ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ