From 6031436cc82b8b1799393812bdd1c3b21c395b47 Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Thu, 16 Dec 2021 20:37:11 +0000 Subject: [PATCH] Edded function to create new event in remote database --- .../AuthenticateActivity.java | 8 +- .../EventCallbackInterface.java | 6 + .../openseizuredetector/WebApiConnection.java | 123 ++++++++++++++++-- 3 files changed, 127 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/uk/org/openseizuredetector/EventCallbackInterface.java diff --git a/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java b/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java index 86745b3..a9f76e5 100644 --- a/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/AuthenticateActivity.java @@ -14,6 +14,8 @@ import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; +import java.util.Date; + public class AuthenticateActivity extends AppCompatActivity implements AuthCallbackInterface { private String TAG = "AuthenticateActivity"; private Context mContext; @@ -52,6 +54,7 @@ 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...."); } private void updateUi() { @@ -60,8 +63,9 @@ public class AuthenticateActivity extends AppCompatActivity implements AuthCallb LinearLayout loginLl = (LinearLayout)findViewById(R.id.login_ui); LinearLayout logoutLl = (LinearLayout)findViewById(R.id.logout_ui); Log.i(TAG, "switchUi()"); - prefs = PreferenceManager.getDefaultSharedPreferences(this); - storedAuthToken = (prefs.getString("webApiAuthToken", null)); + storedAuthToken = mWac.getStoredToken(); + //prefs = PreferenceManager.getDefaultSharedPreferences(this); + //storedAuthToken = (prefs.getString("webApiAuthToken", null)); Log.v(TAG, "storedAuthToken=" + storedAuthToken); // Check if we are already logged in diff --git a/app/src/main/java/uk/org/openseizuredetector/EventCallbackInterface.java b/app/src/main/java/uk/org/openseizuredetector/EventCallbackInterface.java new file mode 100644 index 0000000..01735a9 --- /dev/null +++ b/app/src/main/java/uk/org/openseizuredetector/EventCallbackInterface.java @@ -0,0 +1,6 @@ +package uk.org.openseizuredetector; + +public interface EventCallbackInterface { + // Interface is called when a new event is created in the database. + void eventCallback(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 0c76f66..819edd2 100644 --- a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java +++ b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java @@ -7,10 +7,12 @@ import android.preference.PreferenceManager; import android.util.Log; +import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; +import com.android.volley.VolleyLog; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; @@ -18,6 +20,10 @@ import com.android.volley.toolbox.Volley; import org.json.JSONException; import org.json.JSONObject; +import java.io.UnsupportedEncodingException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -29,12 +35,15 @@ public class WebApiConnection { private String mUrlBase = "https://osdApi.ddns.net"; private String TAG = "WebApiConnection"; private AuthCallbackInterface mAuthCallback; + private EventCallbackInterface mEventCallback; private Context mContext; + private String TOKEN_ID = "webApiAuthToken"; RequestQueue mQueue; - public WebApiConnection(Context context, AuthCallbackInterface authCallback) { + public WebApiConnection(Context context, AuthCallbackInterface authCallback, EventCallbackInterface eventCallback) { mContext = context; mAuthCallback = authCallback; + mEventCallback = eventCallback; mQueue = Volley.newRequestQueue(context); } @@ -59,8 +68,7 @@ public class WebApiConnection { } catch (JSONException e) { tokenStr = "Error Parsing Rsponse"; } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); - prefs.edit().putString("webApiAuthToken", tokenStr).commit(); + saveStoredToken(tokenStr); mAuthCallback.authCallback(true, response); } }, @@ -69,8 +77,7 @@ public class WebApiConnection { 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); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); - prefs.edit().putString("webApiAuthToken", null).commit(); + saveStoredToken(null); mAuthCallback.authCallback(false,new String(error.networkResponse.data)); } }) { @@ -92,20 +99,120 @@ public class WebApiConnection { // Remove the stored token so future calls are not authemticated. public void logout() { Log.v(TAG, "logout()"); + saveStoredToken(null); + } + + + private void saveStoredToken(String tokenStr) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); - prefs.edit().putString("webApiAuthToken", null).commit(); + prefs.edit().putString(TOKEN_ID, tokenStr).commit(); + + } + + public String getStoredToken() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); + String authToken = prefs.getString(TOKEN_ID, null); + return authToken; + } + + private boolean isLoggedIn() { + String authToken = getStoredToken(); + Log.v(TAG,"isLoggedIn(): token="+authToken); + if (authToken == null || authToken.length() == 0) { + Log.v(TAG,"isLogged in - not logged in"); + return(false); + } else { + return(true); + } + } // Create a new event in the remote database, based on the provided parameters. - public boolean createEvent() { + public boolean createEvent(final int eventType, final Date eventDate, final String eventDesc) { 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); + } + + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss"); + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("eventType", String.valueOf(eventType)); + jsonObject.put("dataTime", dateFormat.format(eventDate)); + jsonObject.put("desc", eventDesc); + } catch (JSONException e) { + Log.e(TAG,"Error generating event JSON string"); + } + final String dataStr = jsonObject.toString(); + Log.v(TAG,"createEvent - 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); + mEventCallback.eventCallback(true, response); + } + }, + new Response.ErrorListener() { + @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)); + } + }) { + // 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 { + 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() { Log.v(TAG,"createDatapoint() - FIXME - This does not do anything!"); - + return(true); } }