Skip to content

Commit dc2798a

Browse files
authored
Merge pull request #47 from babraham123/typefilter
call-log: Filter by call type, include all possible types
2 parents 706c9e0 + 61d0977 commit dc2798a

File tree

10 files changed

+2367
-1894
lines changed

10 files changed

+2367
-1894
lines changed

Example/App.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import CallLogs from 'react-native-call-log';
1313

1414

1515
const filter = {
16-
phoneNumbers: '+1234567',
16+
phoneNumbers: '+11234567890',
1717
minTimestamp: 1571835032,
1818
maxTimestamp: 1583318721264,
19+
types: 'MISSED',
1920
}
2021

2122
const instructions = Platform.select({

Example/babel.config.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
module.exports = {
2-
presets: ['module:metro-react-native-babel-preset'],
2+
presets: [['module:metro-react-native-babel-preset', {
3+
unstable_disableES6Transforms: true
4+
}]],
35
};

Example/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "Example",
2+
"name": "example",
33
"version": "0.0.1",
44
"private": true,
55
"scripts": {
@@ -12,7 +12,7 @@
1212
"dependencies": {
1313
"react": "16.9.0",
1414
"react-native": "0.61.5",
15-
"react-native-call-log": "^2.1.2"
15+
"react-native-call-log": "../"
1616
},
1717
"devDependencies": {
1818
"@babel/core": "^7.6.2",
@@ -21,7 +21,7 @@
2121
"babel-jest": "^24.9.0",
2222
"eslint": "^6.5.1",
2323
"jest": "^24.9.0",
24-
"metro-react-native-babel-preset": "^0.56.0",
24+
"metro-react-native-babel-preset": "^0.59.0",
2525
"react-test-renderer": "16.9.0"
2626
},
2727
"jest": {

Example/yarn.lock

Lines changed: 2299 additions & 1875 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ const filter = {
9898
9999
phoneNumbers: '+1234567890', // (String or an Array of String)
100100
// if this filter is set, load(limit, filter) will only return call logs for this/these phone numbers
101+
102+
types: 'MISSED', // (Single value / Array of Strings / CallType enums)
103+
// if this filter is set, load(limit, filter) will only return call logs of a specific type
101104
}
102105
103106
const callLogs = await CallLogs.load(-1, filter) // applies filter with no limit (also works with a limit)

android/src/main/java/com/wscodelabs/callLogs/CallLogModule.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,13 @@ public void loadWithFilter(int limit, @Nullable ReadableMap filter, Promise prom
6666
boolean nullFilter = filter == null;
6767
String minTimestamp = !nullFilter && filter.hasKey("minTimestamp") ? filter.getString("minTimestamp") : "0";
6868
String maxTimestamp = !nullFilter && filter.hasKey("maxTimestamp") ? filter.getString("maxTimestamp") : "-1";
69+
70+
String types = !nullFilter && filter.hasKey("types") ? filter.getString("types") : "[]";
71+
JSONArray typesArray= new JSONArray(types);
72+
Set<String> typeSet = new HashSet<>(Arrays.asList(toStringArray(typesArray)));
73+
6974
String phoneNumbers = !nullFilter && filter.hasKey("phoneNumbers") ? filter.getString("phoneNumbers") : "[]";
7075
JSONArray phoneNumbersArray= new JSONArray(phoneNumbers);
71-
7276
Set<String> phoneNumberSet = new HashSet<>(Arrays.asList(toStringArray(phoneNumbersArray)));
7377

7478
int callLogCount = 0;
@@ -97,9 +101,10 @@ public void loadWithFilter(int limit, @Nullable ReadableMap filter, Promise prom
97101
String type = this.resolveCallType(cursor.getInt(TYPE_COLUMN_INDEX));
98102

99103
boolean passesPhoneFilter = phoneNumberSet == null || phoneNumberSet.isEmpty() || phoneNumberSet.contains(phoneNumber);
104+
boolean passesTypeFilter = typeSet == null || typeSet.isEmpty() || typeSet.contains(type);
100105
boolean passesMinTimestampFilter = minTimestamp == null || minTimestamp.equals("0") || Long.parseLong(timestampStr) >= Long.parseLong(minTimestamp);
101106
boolean passesMaxTimestampFilter = maxTimestamp == null || maxTimestamp.equals("-1") || Long.parseLong(timestampStr) <= Long.parseLong(maxTimestamp);
102-
boolean passesFilter = passesPhoneFilter&& passesMinTimestampFilter && passesMaxTimestampFilter;
107+
boolean passesFilter = passesPhoneFilter && passesTypeFilter && passesMinTimestampFilter && passesMaxTimestampFilter;
103108

104109
if (passesFilter) {
105110
WritableMap callLog = Arguments.createMap();
@@ -142,6 +147,14 @@ private String resolveCallType(int callTypeCode) {
142147
return "INCOMING";
143148
case Calls.MISSED_TYPE:
144149
return "MISSED";
150+
case Calls.VOICEMAIL_TYPE:
151+
return "VOICEMAIL";
152+
case Calls.REJECTED_TYPE:
153+
return "REJECTED";
154+
case Calls.BLOCKED_TYPE:
155+
return "BLOCKED";
156+
case Calls.ANSWERED_EXTERNALLY_TYPE:
157+
return "ANSWERED_EXTERNALLY";
145158
default:
146159
return "UNKNOWN";
147160
}

callLogs.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
import { NativeModules } from 'react-native';
22

3-
const {CallLogs: NativeCallLogs} = NativeModules
3+
const {CallLogs: NativeCallLogs} = NativeModules;
44

55
class CallLogs {
66
static async load(limit, filter) {
7-
if (!filter) return NativeCallLogs.load(limit)
8-
const {minTimestamp, maxTimestamp, phoneNumbers} = filter
9-
const phoneNumbersArray = Array.isArray(phoneNumbers) ? phoneNumbers : typeof phoneNumbers === 'string' ? [phoneNumbers] : []
7+
if (!filter) {
8+
return NativeCallLogs.load(limit);
9+
}
10+
const {minTimestamp, maxTimestamp, types, phoneNumbers} = filter;
11+
const phoneNumbersArray = Array.isArray(phoneNumbers) ?
12+
phoneNumbers :
13+
typeof phoneNumbers === 'string' ? [phoneNumbers] : [];
14+
15+
const typesArray = Array.isArray(types) ?
16+
types.map(x => x.toString()) :
17+
(typeof types === 'string' || typeof types === 'object') ? [types.toString()] : [];
18+
1019
return NativeCallLogs.loadWithFilter(
1120
limit,
1221
{
1322
minTimestamp: minTimestamp ? minTimestamp.toString() : undefined,
1423
maxTimestamp: maxTimestamp ? maxTimestamp.toString() : undefined,
15-
phoneNumbers: JSON.stringify(phoneNumbersArray)
24+
types: JSON.stringify(typesArray),
25+
phoneNumbers: JSON.stringify(phoneNumbersArray),
1626
}
17-
)
27+
);
1828
}
1929

2030
static async loadAll() {
21-
return NativeCallLogs.loadAll()
31+
return NativeCallLogs.loadAll();
2232
}
2333
}
2434

index.d.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
declare namespace CallLogs {
2+
export enum callType {
3+
OUTGOING = 'OUTGOING',
4+
INCOMING = 'INCOMING',
5+
MISSED = 'MISSED',
6+
VOICEMAIL = 'VOICEMAIL',
7+
REJECTED = 'REJECTED',
8+
BLOCKED = 'BLOCKED',
9+
ANSWERED_EXTERNALLY = 'ANSWERED_EXTERNALLY',
10+
UNKNOWN = 'UNKNOWN',
11+
}
12+
213
export interface CallFilter {
314
minTimestamp?: number;
415
maxTimestamp?: number;
5-
phoneNumbers?: string;
16+
types?: CallType | CallType[];
17+
phoneNumbers?: string | string[];
618
}
719

820
export interface CallLog {
@@ -11,7 +23,7 @@ declare namespace CallLogs {
1123
name: string;
1224
timestamp: string;
1325
dateTime: string;
14-
type: 'OUTGOING' | 'INCOMING' | 'MISSED' | 'UNKNOWN';
26+
type: CallType;
1527
rawType: number;
1628
}
1729

package-lock.json

Lines changed: 10 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-call-log",
3-
"version": "2.1.2",
3+
"version": "2.1.3",
44
"description": "fetch call log",
55
"main": "index.js",
66
"types": "index.d.ts",

0 commit comments

Comments
 (0)