package com.dmc.callcrm.data import android.Manifest import android.content.Context import android.content.pm.PackageManager import android.os.Build import android.telecom.TelecomManager import android.telephony.SubscriptionManager import android.telephony.TelephonyManager import androidx.core.content.ContextCompat /** * Converts the SIM slot index chosen at registration (Prefs.simSlot: 0, 1, ... or * -1 if unset) into the CallLog.Calls.PHONE_ACCOUNT_ID string actually stored on * each call log row, so a dual-SIM phone can be filtered down to just the * registered SIM everywhere: server sync (Syncer.kt), recording matching * (RecordingScanner.kt), and the in-app Call History/Analytics/Contacts screens * (CallStats.kt). * * Returns null whenever it can't be resolved (no slot configured, permission * missing, older API level, OEM quirk, etc.) — every caller treats null as * "don't filter," so a resolution failure never hides every call on the phone. */ object SimUtil { fun resolvePhoneAccountId(ctx: Context, slot: Int): String? { if (slot < 0) return null if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) return null if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) return null return try { val subManager = ctx.getSystemService(SubscriptionManager::class.java) ?: return null val subs = subManager.activeSubscriptionInfoList ?: return null val match = subs.firstOrNull { it.simSlotIndex == slot } ?: return null val telecomManager = ctx.getSystemService(TelecomManager::class.java) ?: return null val accounts = telecomManager.callCapablePhoneAccounts ?: return null val baseTelephony = ctx.getSystemService(TelephonyManager::class.java) ?: return null for (handle in accounts) { val subId = try { baseTelephony.createForPhoneAccountHandle(handle)?.subscriptionId } catch (_: Exception) { null } if (subId != null && subId == match.subscriptionId) return handle.id } null } catch (_: Exception) { null } } }