@@ -6,6 +6,7 @@ import android.net.Uri
66import android.provider.CallLog
77import android.provider.ContactsContract
88import android.provider.Telephony
9+ import android.telecom.Call
910import android.telephony.TelephonyManager
1011
1112import com.google.i18n.phonenumbers.PhoneNumberUtil
@@ -18,12 +19,12 @@ class CallScreeningHelper(private val ctx: Context) {
1819 private val phoneNumberUtil = PhoneNumberUtil .getInstance()
1920 private val db = AppDatabase .getInstance(ctx).allowNumberDao()
2021
21- fun check (number : Phonenumber .PhoneNumber ): Boolean {
22+ fun check (number : Phonenumber .PhoneNumber , callDetails : Call . Details ): Boolean {
2223 return (
2324 (prefs.isContactsChecked && checkContacts(number)) ||
2425 (prefs.isContactedChecked && checkContacted(number)) ||
2526 (prefs.isGroupsChecked && checkGroups(number)) ||
26- (prefs.isRepeatedChecked && checkRepeated(number)) ||
27+ (prefs.isRepeatedChecked && checkRepeated(number, callDetails )) ||
2728 (prefs.isMessagesChecked && checkMessages(number))
2829 )
2930 }
@@ -54,7 +55,7 @@ class CallScreeningHelper(private val ctx: Context) {
5455 )
5556 } catch (exc: SecurityException ) {}
5657 cursor?.apply {
57- if (moveToFirst()) { result = true }
58+ if (moveToFirst()) result = true
5859 close()
5960 }
6061 return result
@@ -76,7 +77,7 @@ class CallScreeningHelper(private val ctx: Context) {
7677 )
7778 } catch (exc: SecurityException ) {}
7879 cursor?.apply {
79- if (moveToFirst()) { result = true }
80+ if (moveToFirst()) result = true
8081 close()
8182 }
8283 return result
@@ -104,23 +105,37 @@ class CallScreeningHelper(private val ctx: Context) {
104105 return result
105106 }
106107
107- private fun checkRepeated (number : Phonenumber .PhoneNumber ): Boolean {
108+ private fun checkRepeated (number : Phonenumber .PhoneNumber , callDetails : Call . Details ): Boolean {
108109 val cursor: Cursor ?
109110 try {
110111 cursor = ctx.contentResolver.query(
111112 makeContentUri(CallLog .Calls .CONTENT_FILTER_URI , number),
112- arrayOf(CallLog .Calls ._ID ),
113+ arrayOf(CallLog .Calls ._ID , CallLog . Calls . DATE ),
113114 " ${CallLog .Calls .TYPE } = ? AND ${CallLog .Calls .DATE } > ?" ,
114115 arrayOf(
115116 CallLog .Calls .BLOCKED_TYPE .toString(),
116117 (System .currentTimeMillis() - prefs.repeatedMinutes * 60 * 1000 ).toString(),
117118 ),
118- null ,
119+ CallLog . Calls . DEFAULT_SORT_ORDER ,
119120 )
120121 } catch (exc: SecurityException ) { return false }
121122 var result = false
122123 cursor?.apply {
123- if (count >= prefs.repeatedCount - 1 ) { result = true }
124+ val i: Int
125+ val burstTimeout = prefs.repeatedBurstTimeout * 1000L
126+ if (burstTimeout == 0L ) {
127+ i = count
128+ } else {
129+ var j = 0
130+ var tm = callDetails.creationTimeMillis
131+ while (moveToNext()) {
132+ val date = getLong(getColumnIndexOrThrow(CallLog .Calls .DATE ))
133+ if (tm - date >= burstTimeout) j++
134+ tm = date
135+ }
136+ i = j
137+ }
138+ if (i >= prefs.repeatedCount - 1 ) result = true
124139 close()
125140 }
126141 return result
@@ -157,7 +172,7 @@ class CallScreeningHelper(private val ctx: Context) {
157172 )
158173 } catch (exc: SecurityException ) {}
159174 cursor?.apply {
160- if (moveToFirst()) { result = true }
175+ if (moveToFirst()) result = true
161176 close()
162177 }
163178 return result
@@ -187,7 +202,7 @@ class CallScreeningHelper(private val ctx: Context) {
187202 } catch (exc: SecurityException ) { return false }
188203 var result = false
189204 cursor?.apply {
190- if (moveToFirst()) { result = true }
205+ if (moveToFirst()) result = true
191206 close()
192207 }
193208 return result
0 commit comments