package com.dmc.callcrm.data import android.Manifest import android.content.Context import android.content.pm.PackageManager import android.provider.CallLog import androidx.core.content.ContextCompat import com.dmc.callcrm.network.CallDto class CallLogReader(private val ctx: Context) { data class Batch(val calls: List, val maxDate: Long) private fun hasCallLogPerm(): Boolean = ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED /** * Read calls with DATE strictly greater than [sinceMillis]. * If [phoneAccountId] is non-null we only return calls placed/received on that SIM, * so a dual-SIM phone only reports the registered company number. */ fun readSince(sinceMillis: Long, phoneAccountId: String?): Batch { if (!hasCallLogPerm()) return Batch(emptyList(), sinceMillis) val projection = arrayOf( CallLog.Calls._ID, CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE, CallLog.Calls.DATE, CallLog.Calls.DURATION, CallLog.Calls.PHONE_ACCOUNT_ID ) val selection = "${CallLog.Calls.DATE} > ?" val args = arrayOf(sinceMillis.toString()) val out = ArrayList() var maxDate = sinceMillis ctx.contentResolver.query( CallLog.Calls.CONTENT_URI, projection, selection, args, "${CallLog.Calls.DATE} ASC" )?.use { c -> val iId = c.getColumnIndex(CallLog.Calls._ID) val iNum = c.getColumnIndex(CallLog.Calls.NUMBER) val iName = c.getColumnIndex(CallLog.Calls.CACHED_NAME) val iType = c.getColumnIndex(CallLog.Calls.TYPE) val iDate = c.getColumnIndex(CallLog.Calls.DATE) val iDur = c.getColumnIndex(CallLog.Calls.DURATION) val iAcc = c.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID) while (c.moveToNext()) { val acc = if (iAcc >= 0) c.getString(iAcc) else null // SIM filter: keep only the registered SIM's calls when we know its account id if (phoneAccountId != null && acc != null && acc != phoneAccountId) continue val date = c.getLong(iDate) if (date > maxDate) maxDate = date out.add( CallDto( number = c.getString(iNum) ?: "unknown", name = if (iName >= 0) c.getString(iName) else null, type = c.getInt(iType), date = date, duration = c.getInt(iDur), simSlot = null, note = null, deviceCallId = c.getString(iId) ) ) } } return Batch(out, maxDate) } }