From bec437e8582f34d1ff5233fe338355cb4d7280e6 Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Thu, 16 Dec 2021 21:45:08 +0000 Subject: [PATCH] Started adding code to create a datapoint - getting error 405 "POST Not Allowed", which might be an issue with the API --- .../AuthenticateActivity.java | 53 +++++++- .../DatapointCallbackInterface.java | 7 + .../openseizuredetector/WebApiConnection.java | 126 ++++++++++++++---- .../main/res/layout/activity_authenticate.xml | 20 +++ 4 files changed, 176 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/uk/org/openseizuredetector/DatapointCallbackInterface.java diff --git a/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java b/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java index a9f76e5..1faa248 100644 --- a/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java @@ -14,9 +14,13 @@ import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; +import org.json.JSONException; +import org.json.JSONObject; + import java.util.Date; -public class AuthenticateActivity extends AppCompatActivity implements AuthCallbackInterface { +public class AuthenticateActivity extends AppCompatActivity + implements AuthCallbackInterface, EventCallbackInterface, DatapointCallbackInterface { private String TAG = "AuthenticateActivity"; private Context mContext; private EditText mUnameEt; @@ -40,9 +44,14 @@ public class AuthenticateActivity extends AppCompatActivity implements AuthCallb Button logoutBtn = (Button)findViewById(R.id.logoutBtn); logoutBtn.setOnClickListener(onLogout); + Button createEventBtn = (Button)findViewById(R.id.createEventBtn); + createEventBtn.setOnClickListener(onCreateEvent); + Button createDatapointBtn = (Button)findViewById(R.id.createDatapointBtn); + createDatapointBtn.setOnClickListener(onCreateDatapoint); + mUnameEt = (EditText) findViewById(R.id.username); mPasswdEt = (EditText) findViewById(R.id.password); - mWac = new WebApiConnection(this, this); + mWac = new WebApiConnection(this, this, this, this); } @Override @@ -54,7 +63,14 @@ public class AuthenticateActivity extends AppCompatActivity implements AuthCallb public void authCallback(boolean authSuccess, String tokenStr) { Log.v(TAG,"authCallback"); updateUi(); - mWac.createEvent(10,new Date(),"eventDescription...."); + } + + public void eventCallback(boolean success, String eventStr) { + Log.v(TAG,"eventCallback"); + } + + public void datapointCallback(boolean success, String datapointStr) { + Log.v(TAG,"datapointCallback"); } private void updateUi() { @@ -117,5 +133,36 @@ public class AuthenticateActivity extends AppCompatActivity implements AuthCallb updateUi(); } }; + View.OnClickListener onCreateEvent = + new View.OnClickListener() { + @Override + public void onClick(View view) { + Log.v(TAG, "onCreateEvent"); + mWac.createEvent(10,new Date(),"eventDescription...."); + } + }; + + View.OnClickListener onCreateDatapoint = + new View.OnClickListener() { + @Override + public void onClick(View view) { + Log.v(TAG, "onCreateDatapoint"); + String jsonStr = ""; + JSONObject dataObj; + try { + jsonStr = "{HR:70}"; + dataObj = new JSONObject(jsonStr); + Log.v(TAG, "Creating Datapoint..."+dataObj.toString()); + mWac.createDatapoint(dataObj,10); + } catch (JSONException e) { + Log.v(TAG,"Error Creating JSON Object from string "+jsonStr); + dataObj = null; + jsonStr = null; + } + //m_status=false; + // mWac.logout(); + //updateUi(); + } + }; } \ No newline at end of file diff --git a/app/src/main/java/uk/org/openseizuredetector/DatapointCallbackInterface.java b/app/src/main/java/uk/org/openseizuredetector/DatapointCallbackInterface.java new file mode 100644 index 0000000..de4fddc --- /dev/null +++ b/app/src/main/java/uk/org/openseizuredetector/DatapointCallbackInterface.java @@ -0,0 +1,7 @@ +package uk.org.openseizuredetector; + +public interface DatapointCallbackInterface { + // Interface is called when a new datapoint is created in the database. + void datapointCallback(boolean success, String eventStr); + } + diff --git a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java index 819edd2..d17e0e3 100644 --- a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java +++ b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java @@ -36,14 +36,17 @@ public class WebApiConnection { private String TAG = "WebApiConnection"; private AuthCallbackInterface mAuthCallback; private EventCallbackInterface mEventCallback; + private DatapointCallbackInterface mDatapointCallback; private Context mContext; private String TOKEN_ID = "webApiAuthToken"; RequestQueue mQueue; - public WebApiConnection(Context context, AuthCallbackInterface authCallback, EventCallbackInterface eventCallback) { + public WebApiConnection(Context context, AuthCallbackInterface authCallback, EventCallbackInterface eventCallback, + DatapointCallbackInterface datapointCallback) { mContext = context; mAuthCallback = authCallback; mEventCallback = eventCallback; + mDatapointCallback = datapointCallback; mQueue = Volley.newRequestQueue(context); } @@ -76,9 +79,9 @@ public class WebApiConnection { @Override public void onErrorResponse(VolleyError error) { String responseBody = new String(error.networkResponse.data); - Log.v(TAG, "Login Error: " + error.toString() + ", message:" + error.getMessage()+", Response Code:" + error.networkResponse.statusCode + ", Response: " + responseBody); + Log.v(TAG, "Login Error: " + error.toString() + ", message:" + error.getMessage() + ", Response Code:" + error.networkResponse.statusCode + ", Response: " + responseBody); saveStoredToken(null); - mAuthCallback.authCallback(false,new String(error.networkResponse.data)); + mAuthCallback.authCallback(false, new String(error.networkResponse.data)); } }) { // Note, this is overriding part of StringRequest, not one of the sub-classes above! @@ -117,12 +120,12 @@ public class WebApiConnection { private boolean isLoggedIn() { String authToken = getStoredToken(); - Log.v(TAG,"isLoggedIn(): token="+authToken); + Log.v(TAG, "isLoggedIn(): token=" + authToken); if (authToken == null || authToken.length() == 0) { - Log.v(TAG,"isLogged in - not logged in"); - return(false); + Log.v(TAG, "isLogged in - not logged in"); + return (false); } else { - return(true); + return (true); } } @@ -130,14 +133,14 @@ public class WebApiConnection { // Create a new event in the remote database, based on the provided parameters. public boolean createEvent(final int eventType, final Date eventDate, final String eventDesc) { - Log.v(TAG,"createEvent() - FIXME - This does not do anything!"); + Log.v(TAG, "createEvent() - FIXME - This does not do anything!"); String urlStr = mUrlBase + "/api/events/"; Log.v(TAG, "urlStr=" + urlStr); final String authtoken = getStoredToken(); if (!isLoggedIn()) { - Log.v(TAG,"not logged in - doing nothing"); - return(false); + Log.v(TAG, "not logged in - doing nothing"); + return (false); } DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss"); @@ -147,10 +150,10 @@ public class WebApiConnection { jsonObject.put("dataTime", dateFormat.format(eventDate)); jsonObject.put("desc", eventDesc); } catch (JSONException e) { - Log.e(TAG,"Error generating event JSON string"); + Log.e(TAG, "Error generating event JSON string"); } final String dataStr = jsonObject.toString(); - Log.v(TAG,"createEvent - data="+dataStr); + Log.v(TAG, "createEvent - data=" + dataStr); StringRequest req = new StringRequest(Request.Method.POST, urlStr, @@ -165,8 +168,8 @@ public class WebApiConnection { @Override public void onErrorResponse(VolleyError error) { String responseBody = new String(error.networkResponse.data); - Log.v(TAG, "Create Event Error: " + error.toString() + ", message:" + error.getMessage()+", Response Code:" + error.networkResponse.statusCode + ", Response: " + responseBody); - mEventCallback.eventCallback(false,new String(error.networkResponse.data)); + Log.v(TAG, "Create Event Error: " + error.toString() + ", message:" + error.getMessage() + ", Response Code:" + error.networkResponse.statusCode + ", Response: " + responseBody); + mEventCallback.eventCallback(false, new String(error.networkResponse.data)); } }) { // Note, this is overriding part of StringRequest, not one of the sub-classes above! @@ -175,20 +178,99 @@ public class WebApiConnection { Map params = new HashMap<>(); // params.put("name",sname); // passing parameters to server String authToken = getStoredToken(); - params.put("Authorization: Token "+authToken, authToken); - Log.v(TAG,"getParams: params="+params.toString()); + params.put("Authorization: Token " + authToken, authToken); + Log.v(TAG, "getParams: params=" + params.toString()); //params.put("eventType", String.valueOf(eventType)); //params.put("dataTime", dateFormat.format(eventDate)); //params.put("desc", eventDesc); return params; } + @Override public Map getHeaders() throws AuthFailureError { Map params = new HashMap(); params.put("Content-Type", "application/json; charset=UTF-8"); - params.put("Authorization", "Token "+getStoredToken()); + params.put("Authorization", "Token " + getStoredToken()); return params; } + + @Override + public byte[] getBody() throws AuthFailureError { + try { + return dataStr == null ? null : dataStr.getBytes("utf-8"); + } catch (UnsupportedEncodingException uee) { + VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", dataStr, "utf-8"); + return null; + } + } + }; + + mQueue.add(req); + return (true); + } + + public boolean createDatapoint(JSONObject dataObj, int eventId) { + Log.v(TAG, "createDatapoint() - FIXME - This does not do anything!"); + // Create a new event in the remote database, based on the provided parameters. + String urlStr = mUrlBase + "/api/datapoints/"; + Log.v(TAG, "urlStr=" + urlStr); + final String authtoken = getStoredToken(); + + if (!isLoggedIn()) { + Log.v(TAG, "not logged in - doing nothing"); + return (false); + } + + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss"); + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("eventId", String.valueOf(eventId)); + jsonObject.put("dataJSON", dataObj.toString()); + } catch (JSONException e) { + Log.e(TAG, "Error generating event JSON string"); + } + final String dataStr = jsonObject.toString(); + Log.v(TAG, "createDatapoint - data=" + dataStr); + + + StringRequest req = new StringRequest(Request.Method.POST, urlStr, + new Response.Listener() { + @Override + public void onResponse(String response) { + Log.v(TAG, "Response is: " + response); + mDatapointCallback.datapointCallback(true, response); + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + String responseBody = new String(error.networkResponse.data); + Log.v(TAG, "Create Datapoint Error: " + error.toString() + ", message:" + error.getMessage() + ", Response Code:" + error.networkResponse.statusCode + ", Response: " + responseBody); + mDatapointCallback.datapointCallback(false, new String(error.networkResponse.data)); + } + }) { + // Note, this is overriding part of StringRequest, not one of the sub-classes above! + @Override + protected Map getParams() { + Map params = new HashMap<>(); + // params.put("name",sname); // passing parameters to server + String authToken = getStoredToken(); + params.put("Authorization: Token " + authToken, authToken); + Log.v(TAG, "getParams: params=" + params.toString()); + //params.put("eventType", String.valueOf(eventType)); + //params.put("dataTime", dateFormat.format(eventDate)); + //params.put("desc", eventDesc); + return params; + } + + @Override + public Map getHeaders() throws AuthFailureError { + Map params = new HashMap(); + params.put("Content-Type", "application/json; charset=UTF-8"); + params.put("Authorization", "Token " + getStoredToken()); + return params; + } + @Override public byte[] getBody() throws AuthFailureError { try { @@ -203,16 +285,6 @@ public class WebApiConnection { mQueue.add(req); return (true); - - - - - - } - - public boolean createDatapoint() { - Log.v(TAG,"createDatapoint() - FIXME - This does not do anything!"); - return(true); } } diff --git a/app/src/main/res/layout/activity_authenticate.xml b/app/src/main/res/layout/activity_authenticate.xml index d7b5149..aafb640 100644 --- a/app/src/main/res/layout/activity_authenticate.xml +++ b/app/src/main/res/layout/activity_authenticate.xml @@ -93,6 +93,26 @@ android:layout_weight="1" android:text="@string/logout" /> + + +