@@ -89,12 +89,18 @@ class SpamRepository(
8989 checkerDependencies : CheckerDependencies = CheckerDependencies (),
9090 settingsDataStore : DataStore <Preferences >? = null ,
9191 privateSettingsDataStore : DataStore <Preferences >? = null ,
92- private val phoneIdentityCanonicalizer : PhoneIdentityCanonicalizer =
93- PhoneIdentityCanonicalizer .fromContext(context.applicationContext) ,
92+ /* * A fixed canonicalizer, for tests; null follows the phone's current region. */
93+ phoneIdentityCanonicalizer : PhoneIdentityCanonicalizer ? = null ,
9494 externalBlocklistDataSource : ExternalBlocklistDataSource = OkHttpExternalBlocklistDataSource (),
9595 wallClock : () -> Long = System : :currentTimeMillis,
9696) {
9797 private val appContext: Context = context.applicationContext
98+
99+ // Read through the short-lived region cache, not once per process: a SIM
100+ // still locked at boot reports no country, and the network's or the
101+ // locale's region would otherwise stand in until the app restarted.
102+ private val canonicalizer: () -> PhoneIdentityCanonicalizer =
103+ phoneIdentityCanonicalizer?.let { fixed -> { fixed } } ? : { PhoneIdentityCanonicalizer .cachedFromContext(appContext) }
98104 private val db: AppDatabase = database
99105 private val dao: SpamDao = database.spamDao()
100106 private val settingsRepository =
@@ -109,10 +115,10 @@ class SpamRepository(
109115 dao = dao,
110116 settingsRepository = settingsRepository,
111117 checkerDependencies = checkerDependencies,
112- normalizePhone = phoneIdentityCanonicalizer:: canonicalizePhone,
113- normalizeSenderIdentity = phoneIdentityCanonicalizer:: canonicalizeIdentity,
114- senderRegionIso = phoneIdentityCanonicalizer .homeRegionIso,
115- equivalentForms = phoneIdentityCanonicalizer:: equivalentForms,
118+ normalizePhone = { canonicalizer(). canonicalizePhone(it) } ,
119+ normalizeSenderIdentity = { canonicalizer(). canonicalizeIdentity(it) } ,
120+ senderRegionIso = { canonicalizer() .homeRegionIso } ,
121+ equivalentForms = { canonicalizer(). equivalentForms(it) } ,
116122 wallClock = wallClock,
117123 )
118124 private val syncRepository =
@@ -121,7 +127,7 @@ class SpamRepository(
121127 dao = dao,
122128 remote = remote,
123129 settingsRepository = settingsRepository,
124- normalizeNumber = phoneIdentityCanonicalizer:: canonicalizePhone,
130+ normalizeNumber = { canonicalizer(). canonicalizePhone(it) } ,
125131 invalidateAllCaches = spamRepositoryImpl::invalidateAllCaches,
126132 externalBlocklistDataSource = externalBlocklistDataSource,
127133 clock = wallClock,
@@ -131,9 +137,9 @@ class SpamRepository(
131137 context = appContext,
132138 dao = dao,
133139 settingsRepository = settingsRepository,
134- normalizeNumber = phoneIdentityCanonicalizer:: canonicalizePhone,
135- normalizeLogIdentity = phoneIdentityCanonicalizer:: canonicalizeIdentity,
136- equivalentForms = phoneIdentityCanonicalizer:: equivalentForms,
140+ normalizeNumber = { canonicalizer(). canonicalizePhone(it) } ,
141+ normalizeLogIdentity = { canonicalizer(). canonicalizeIdentity(it) } ,
142+ equivalentForms = { canonicalizer(). equivalentForms(it) } ,
137143 invalidateWildcardCache = spamRepositoryImpl::invalidateWildcardCache,
138144 invalidateKeywordCache = spamRepositoryImpl::invalidateKeywordCache,
139145 invalidateHashWildcardCache = spamRepositoryImpl::invalidateHashWildcardCache,
@@ -695,7 +701,7 @@ class SpamRepository(
695701 internal suspend fun findExactSpamNumber (normalized : String ) = spamRepositoryImpl.findByNumberInternal(normalized)
696702
697703 /* * Forms of a normalized number to match stored rows against, as the screening pipeline does. */
698- internal fun lookupForms (normalized : String ): List <String > = phoneIdentityCanonicalizer .equivalentForms(normalized)
704+ internal fun lookupForms (normalized : String ): List <String > = canonicalizer() .equivalentForms(normalized)
699705
700706 /* * When [normalized] last appeared in a text CallShield flagged, within the last 30 days, or null. */
701707 internal suspend fun lastFlaggedTextSighting (
@@ -1219,9 +1225,9 @@ class SpamRepository(
12191225 // ── Search log ───────────────────────────────────────────────────
12201226 fun searchLog (query : String ): Flow <List <BlockedCall >> = blocklistRepository.searchLog(query)
12211227
1222- fun normalizeNumber (number : String ): String = phoneIdentityCanonicalizer .canonicalizePhone(number)
1228+ fun normalizeNumber (number : String ): String = canonicalizer() .canonicalizePhone(number)
12231229
1224- fun normalizeSenderIdentity (sender : String ): String = phoneIdentityCanonicalizer .canonicalizeIdentity(sender)
1230+ fun normalizeSenderIdentity (sender : String ): String = canonicalizer() .canonicalizeIdentity(sender)
12251231}
12261232
12271233/* *
0 commit comments