Added restoreRecentCalls in RecentsHelper.kt and changed getRecents sort to Calls.DATE

This commit is contained in:
merkost
2023-07-01 11:24:36 +10:00
parent 7b80aa1b9f
commit eeaa073d55

View File

@ -1,6 +1,7 @@
package com.simplemobiletools.dialer.helpers package com.simplemobiletools.dialer.helpers
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.ContentValues
import android.content.Context import android.content.Context
import android.provider.CallLog.Calls import android.provider.CallLog.Calls
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
@ -14,8 +15,8 @@ import com.simplemobiletools.dialer.models.RecentCall
class RecentsHelper(private val context: Context) { class RecentsHelper(private val context: Context) {
private val COMPARABLE_PHONE_NUMBER_LENGTH = 9 private val COMPARABLE_PHONE_NUMBER_LENGTH = 9
private val QUERY_LIMIT = 200 private val QUERY_LIMIT = 200
private val contentUri = Calls.CONTENT_URI
@SuppressLint("MissingPermission")
fun getRecentCalls(groupSubsequentCalls: Boolean, maxSize: Int = QUERY_LIMIT, callback: (ArrayList<RecentCall>) -> Unit) { fun getRecentCalls(groupSubsequentCalls: Boolean, maxSize: Int = QUERY_LIMIT, callback: (ArrayList<RecentCall>) -> Unit) {
val privateCursor = context.getMyContactsCursor(false, true) val privateCursor = context.getMyContactsCursor(false, true)
ensureBackgroundThread { ensureBackgroundThread {
@ -38,13 +39,12 @@ class RecentsHelper(private val context: Context) {
@SuppressLint("NewApi") @SuppressLint("NewApi")
private fun getRecents(contacts: ArrayList<Contact>, groupSubsequentCalls: Boolean, maxSize: Int, callback: (ArrayList<RecentCall>) -> Unit) { private fun getRecents(contacts: ArrayList<Contact>, groupSubsequentCalls: Boolean, maxSize: Int, callback: (ArrayList<RecentCall>) -> Unit) {
var recentCalls = ArrayList<RecentCall>() val recentCalls = mutableListOf<RecentCall>()
var previousRecentCallFrom = "" var previousRecentCallFrom = ""
var previousStartTS = 0 var previousStartTS = 0
val contactsNumbersMap = HashMap<String, String>() val contactsNumbersMap = HashMap<String, String>()
val contactPhotosMap = HashMap<String, String>() val contactPhotosMap = HashMap<String, String>()
val uri = Calls.CONTENT_URI
val projection = arrayOf( val projection = arrayOf(
Calls._ID, Calls._ID,
Calls.NUMBER, Calls.NUMBER,
@ -63,14 +63,14 @@ class RecentsHelper(private val context: Context) {
val cursor = if (isNougatPlus()) { val cursor = if (isNougatPlus()) {
// https://issuetracker.google.com/issues/175198972?pli=1#comment6 // https://issuetracker.google.com/issues/175198972?pli=1#comment6
val limitedUri = uri.buildUpon() val limitedUri = contentUri.buildUpon()
.appendQueryParameter(Calls.LIMIT_PARAM_KEY, QUERY_LIMIT.toString()) .appendQueryParameter(Calls.LIMIT_PARAM_KEY, QUERY_LIMIT.toString())
.build() .build()
val sortOrder = "${Calls._ID} DESC" val sortOrder = "${Calls.DATE} DESC"
context.contentResolver.query(limitedUri, projection, null, null, sortOrder) context.contentResolver.query(limitedUri, projection, null, null, sortOrder)
} else { } else {
val sortOrder = "${Calls._ID} DESC LIMIT $QUERY_LIMIT" val sortOrder = "${Calls.DATE} DESC LIMIT $QUERY_LIMIT"
context.contentResolver.query(uri, projection, null, null, sortOrder) context.contentResolver.query(contentUri, projection, null, null, sortOrder)
} }
val contactsWithMultipleNumbers = contacts.filter { it.phoneNumbers.size > 1 } val contactsWithMultipleNumbers = contacts.filter { it.phoneNumbers.size > 1 }
@ -89,15 +89,14 @@ class RecentsHelper(private val context: Context) {
do { do {
val id = cursor.getIntValue(Calls._ID) val id = cursor.getIntValue(Calls._ID)
var isUnknownNumber = false var isUnknownNumber = false
var number = cursor.getStringValueOrNull(Calls.NUMBER) val number = cursor.getStringValueOrNull(Calls.NUMBER)
if (number == null) { if (number == null) {
number = context.getString(R.string.unknown)
isUnknownNumber = true isUnknownNumber = true
} }
var name = cursor.getStringValueOrNull(Calls.CACHED_NAME) var name = cursor.getStringValueOrNull(Calls.CACHED_NAME)
if (name.isNullOrEmpty()) { if (name.isNullOrEmpty()) {
name = number name = number.orEmpty()
} }
if (name == number && !isUnknownNumber) { if (name == number && !isUnknownNumber) {
@ -128,7 +127,7 @@ class RecentsHelper(private val context: Context) {
} }
var photoUri = cursor.getStringValue(Calls.CACHED_PHOTO_URI) ?: "" var photoUri = cursor.getStringValue(Calls.CACHED_PHOTO_URI) ?: ""
if (photoUri.isEmpty()) { if (photoUri.isEmpty() && !number.isNullOrEmpty()) {
if (contactPhotosMap.containsKey(number)) { if (contactPhotosMap.containsKey(number)) {
photoUri = contactPhotosMap[number]!! photoUri = contactPhotosMap[number]!!
} else { } else {
@ -167,7 +166,7 @@ class RecentsHelper(private val context: Context) {
val recentCall = RecentCall( val recentCall = RecentCall(
id = id, id = id,
phoneNumber = number, phoneNumber = number.orEmpty(),
name = name, name = name,
photoUri = photoUri, photoUri = photoUri,
startTS = startTS, startTS = startTS,
@ -192,18 +191,19 @@ class RecentsHelper(private val context: Context) {
} }
val blockedNumbers = context.getBlockedNumbers() val blockedNumbers = context.getBlockedNumbers()
recentCalls = recentCalls.filter { !context.isNumberBlocked(it.phoneNumber, blockedNumbers) }.toMutableList() as ArrayList<RecentCall>
callback(recentCalls) val recentResult = recentCalls
.filter { !context.isNumberBlocked(it.phoneNumber, blockedNumbers) }
callback(ArrayList(recentResult))
} }
@SuppressLint("MissingPermission")
fun removeRecentCalls(ids: ArrayList<Int>, callback: () -> Unit) { fun removeRecentCalls(ids: ArrayList<Int>, callback: () -> Unit) {
ensureBackgroundThread { ensureBackgroundThread {
val uri = Calls.CONTENT_URI
ids.chunked(30).forEach { chunk -> ids.chunked(30).forEach { chunk ->
val selection = "${Calls._ID} IN (${getQuestionMarks(chunk.size)})" val selection = "${Calls._ID} IN (${getQuestionMarks(chunk.size)})"
val selectionArgs = chunk.map { it.toString() }.toTypedArray() val selectionArgs = chunk.map { it.toString() }.toTypedArray()
context.contentResolver.delete(uri, selection, selectionArgs) context.contentResolver.delete(contentUri, selection, selectionArgs)
} }
callback() callback()
} }
@ -214,8 +214,29 @@ class RecentsHelper(private val context: Context) {
activity.handlePermission(PERMISSION_WRITE_CALL_LOG) { activity.handlePermission(PERMISSION_WRITE_CALL_LOG) {
if (it) { if (it) {
ensureBackgroundThread { ensureBackgroundThread {
val uri = Calls.CONTENT_URI context.contentResolver.delete(contentUri, null, null)
context.contentResolver.delete(uri, null, null) callback()
}
}
}
}
fun restoreRecentCalls(activity: SimpleActivity, objects: List<RecentCall>, callback: () -> Unit) {
activity.handlePermission(PERMISSION_WRITE_CALL_LOG) {
if (it) {
ensureBackgroundThread {
val values = objects.map {
ContentValues().apply {
put(Calls.NUMBER, it.phoneNumber)
put(Calls.TYPE, it.type)
put(Calls.DATE, it.startTS.toLong() * 1000L)
put(Calls.DURATION, it.duration)
put(Calls.CACHED_NAME, it.name)
}
}.toTypedArray()
context.contentResolver.bulkInsert(contentUri, values)
callback() callback()
} }
} }