diff --git a/app/src/main/kotlin/org/fossify/contacts/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/contacts/activities/MainActivity.kt index d26b748f..302e0ccc 100644 --- a/app/src/main/kotlin/org/fossify/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/contacts/activities/MainActivity.kt @@ -4,10 +4,14 @@ import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Intent import android.content.pm.ShortcutInfo +import android.database.ContentObserver import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Icon import android.graphics.drawable.LayerDrawable import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.provider.ContactsContract import androidx.viewpager.widget.ViewPager import me.grantland.widget.AutofitHelper import org.fossify.commons.databases.ContactsDatabase @@ -143,12 +147,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { isFirstResume = false checkShortcuts() + registerContactObserver() } override fun onPause() { super.onPause() storeStateVariables() config.lastUsedViewPagerPage = binding.viewPager.currentItem + unregisterContactObserver() } override fun onDestroy() { @@ -158,6 +164,38 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } } + private val contactObserverHandler = Handler(Looper.getMainLooper()) + private val contactReloadRunnable = Runnable { + if (werePermissionsHandled) { + refreshContacts(ALL_TABS_MASK) + } + } + private var contactObserver: ContentObserver? = null + + private fun registerContactObserver() { + unregisterContactObserver() + val observer = object : ContentObserver(contactObserverHandler) { + override fun onChange(selfChange: Boolean) { + contactObserverHandler.removeCallbacks(contactReloadRunnable) + contactObserverHandler.postDelayed(contactReloadRunnable, 500) + } + } + runCatching { + contentResolver.registerContentObserver( + ContactsContract.Contacts.CONTENT_URI, true, observer + ) + contactObserver = observer + } + } + + private fun unregisterContactObserver() { + contactObserverHandler.removeCallbacks(contactReloadRunnable) + contactObserver?.let { observer -> + runCatching { contentResolver.unregisterContentObserver(observer) } + } + contactObserver = null + } + override fun onBackPressedCompat(): Boolean { return if (binding.mainMenu.isSearchOpen) { binding.mainMenu.closeSearch()