From e8313907048491f7a6e5781272f2e9b9bf0d746b Mon Sep 17 00:00:00 2001 From: Katie Dektar Date: Thu, 5 Feb 2026 20:50:40 -0800 Subject: [PATCH 1/2] Use enum when reporting call; add via to search logs Using enum instead of string when reporting call just adds a bit of type safety. Adds via to search reporting. --- .../android/a5calls/net/FiveCallsApiTest.java | 23 +++++++++++++++---- .../a5calls/controller/RepCallActivity.java | 2 +- .../android/a5calls/net/FiveCallsApi.java | 23 ++++++------------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java b/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java index 83a2b890..79869dad 100644 --- a/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java +++ b/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java @@ -8,6 +8,7 @@ import org.a5calls.android.a5calls.model.Contact; import org.a5calls.android.a5calls.model.Issue; +import org.a5calls.android.a5calls.model.Outcome; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -352,7 +353,21 @@ public void testGetContacts_malformedJson() { } @Test - public void testReportCall() { + public void testReportCallUnavailable() { + testReportCallStatus(Outcome.Status.UNAVAILABLE, "unavailable"); + } + + @Test + public void testReportCallVoicemail() { + testReportCallStatus(Outcome.Status.VOICEMAIL, "voicemail"); + } + + @Test + public void testReportCallContact() { + testReportCallStatus(Outcome.Status.CONTACT, "contact"); + } + + private void testReportCallStatus(Outcome.Status status, String outcomeString) { byte[] bytes = "{\"ok\":true}".getBytes(); ArrayList
headers = new ArrayList<>(); headers.add(new Header("Content-Type", "text/json")); @@ -362,7 +377,7 @@ public void testReportCall() { TestCallListener testCallListener = new TestCallListener(); mApi.registerCallRequestListener(testCallListener); - mApi.reportCall("myIssue", "myRep", "unavailable", "myLocation"); + mApi.reportCall("myIssue", "myRep", status); waitForHttpRequestComplete(); assertEquals(1, testCallListener.mCallReported); @@ -370,7 +385,7 @@ public void testReportCall() { assertEquals(0, testCallListener.mCallJsonError); assertEquals(new String(mHttpStack.getLastPostBody()), - "result=unavailable&issueid=myIssue&contactid=myRep&callerid=itMe&via=" + + "result=" + outcomeString + "&issueid=myIssue&contactid=myRep&callerid=itMe&via=" + (FiveCallsApi.TESTING ? "test&" : "android&")); mApi.unregisterCallRequestListener(testCallListener); @@ -383,7 +398,7 @@ public void testReportCall_serverError() { TestCallListener testCallListener = new TestCallListener(); mApi.registerCallRequestListener(testCallListener); - mApi.reportCall("myIssue", "myRep", "unavailable", "myLocation"); + mApi.reportCall("myIssue", "myRep", Outcome.Status.UNAVAILABLE); waitForHttpRequestComplete(); assertEquals(0, testCallListener.mCallReported); diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java index a8df61bb..61044f6b 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/controller/RepCallActivity.java @@ -202,7 +202,7 @@ private void reportCall(Outcome outcome, String address) { mIssue.name, mIssue.contacts.get(mActiveContactIndex).id, mIssue.contacts.get(mActiveContactIndex).name, outcome.status.toString(), address); AppSingleton.getInstance(getApplicationContext()).getJsonController().reportCall( - mIssue.id, mIssue.contacts.get(mActiveContactIndex).id, outcome.label, address); + mIssue.id, mIssue.contacts.get(mActiveContactIndex).id, outcome.status); } private void setupContactUi(int index, boolean expandLocalSection) { diff --git a/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java b/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java index 4d03d3f0..a1f195c0 100644 --- a/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java +++ b/5calls/app/src/main/java/org/a5calls/android/a5calls/net/FiveCallsApi.java @@ -407,10 +407,7 @@ public void onErrorResponse(VolleyError error) { mRequestQueue.add(reportRequest); } - // Result is "VOICEMAIL", "unavailable", or "contacted" - // https://github.com/5calls/5calls/blob/master/static/js/main.js#L221 - public void reportCall(final String issueId, final String contactId, final String result, - final String zip) { + public void reportCall(final String issueId, final String contactId, final Outcome.Status result) { String getReport = GET_REPORT; StringRequest request = new StringRequest(Request.Method.POST, getReport, new Response.Listener() { @@ -430,7 +427,7 @@ public void onErrorResponse(VolleyError error) { protected Map getParams() { Map params = new HashMap(); params.put("issueid", issueId); - params.put("result", result); + params.put("result", result.toString()); params.put("contactid", contactId); params.put("via", (BuildConfig.DEBUG && TESTING) ? "test" : "android"); params.put("callerid", mCallerId); @@ -486,18 +483,12 @@ public void reportSearch(String searchTerm) { try { JSONObject jsonBody = new JSONObject(); jsonBody.put("query", searchTerm); + jsonBody.put("via", "android"); - JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, SEARCH_TRACKING, jsonBody, new Response.Listener() { - @Override - public void onResponse(JSONObject response) { - // Search report successful - no action needed - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - Log.w(TAG, "Search tracking failed: " + error.getMessage()); - } - }); + JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, SEARCH_TRACKING, + jsonBody, response -> { + // Search report successful - no action needed + }, error -> Log.w(TAG, "Search tracking failed: " + error.getMessage())); request.setTag(TAG); // Add the request to the RequestQueue. mRequestQueue.add(request); From 1144a3b13c5c042dba978a59acb1d757031962c3 Mon Sep 17 00:00:00 2001 From: Katie Dektar Date: Thu, 5 Feb 2026 21:02:29 -0800 Subject: [PATCH 2/2] Add test for issue search, improve report call test --- .../android/a5calls/net/FiveCallsApiTest.java | 70 ++++++++++++------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java b/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java index 79869dad..8f712a6d 100644 --- a/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java +++ b/5calls/app/src/androidTest/java/org/a5calls/android/a5calls/net/FiveCallsApiTest.java @@ -9,6 +9,8 @@ import org.a5calls.android.a5calls.model.Contact; import org.a5calls.android.a5calls.model.Issue; import org.a5calls.android.a5calls.model.Outcome; +import org.json.JSONException; +import org.json.JSONObject; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -367,30 +369,6 @@ public void testReportCallContact() { testReportCallStatus(Outcome.Status.CONTACT, "contact"); } - private void testReportCallStatus(Outcome.Status status, String outcomeString) { - byte[] bytes = "{\"ok\":true}".getBytes(); - ArrayList
headers = new ArrayList<>(); - headers.add(new Header("Content-Type", "text/json")); - HttpResponse response = new HttpResponse(200, headers); - mHttpStack.setResponseToReturn(response); - - TestCallListener testCallListener = new TestCallListener(); - mApi.registerCallRequestListener(testCallListener); - - mApi.reportCall("myIssue", "myRep", status); - waitForHttpRequestComplete(); - - assertEquals(1, testCallListener.mCallReported); - assertEquals(0, testCallListener.mCallError); - assertEquals(0, testCallListener.mCallJsonError); - - assertEquals(new String(mHttpStack.getLastPostBody()), - "result=" + outcomeString + "&issueid=myIssue&contactid=myRep&callerid=itMe&via=" + - (FiveCallsApi.TESTING ? "test&" : "android&")); - - mApi.unregisterCallRequestListener(testCallListener); - } - @Test public void testReportCall_serverError() { mHttpStack.setExceptionToThrow(new IOException("Kids these days")); @@ -440,6 +418,50 @@ public void newsletterSubscribe_serverError() { assertFalse(testNewsletterListener.mSubscribeSuccess); } + @Test + public void reportSearch() { + ArrayList
headers = new ArrayList<>(); + headers.add(new Header("Content-Type", "text/json")); + HttpResponse response = new HttpResponse(200, headers); + mHttpStack.setResponseToReturn(response); + + mApi.reportSearch("Banana phone"); + waitForHttpRequestComplete(); + + assertEquals("https://api.5calls.org/v1/users/search", mHttpStack.getLastUrl()); + try { + JSONObject params = new JSONObject(new String(mHttpStack.getLastPostBody())); + assertEquals("Banana phone", params.get("query")); + assertEquals("android", params.get("via")); + } catch (JSONException e) { + fail(e.getMessage()); + } + } + + private void testReportCallStatus(Outcome.Status status, String outcomeString) { + ArrayList
headers = new ArrayList<>(); + headers.add(new Header("Content-Type", "text/json")); + HttpResponse response = new HttpResponse(200, headers); + mHttpStack.setResponseToReturn(response); + + TestCallListener testCallListener = new TestCallListener(); + mApi.registerCallRequestListener(testCallListener); + + mApi.reportCall("myIssue", "myRep", status); + waitForHttpRequestComplete(); + + assertEquals(1, testCallListener.mCallReported); + assertEquals(0, testCallListener.mCallError); + assertEquals(0, testCallListener.mCallJsonError); + + assertEquals("https://api.5calls.org/v1/report", mHttpStack.getLastUrl()); + assertEquals(new String(mHttpStack.getLastPostBody()), + "result=" + outcomeString + "&issueid=myIssue&contactid=myRep&callerid=itMe&via=" + + (FiveCallsApi.TESTING ? "test&" : "android&")); + + mApi.unregisterCallRequestListener(testCallListener); + } + private void waitForHttpRequestComplete() { assertNotNull(mRequestQueue.mRequest); mRequestQueue.start();