diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..504a29a2a779e1c1e55b3f82773e7864ae33a2db
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+AppuntiProgetto/
diff --git a/IcarusAndroid/.idea/caches/build_file_checksums.ser b/IcarusAndroid/.idea/caches/build_file_checksums.ser
index 636d3d3e8ded17ef6c605126952d8453a43e099c..ba777d47a33b1c13fa587329c5deccb710ae2ad1 100644
Binary files a/IcarusAndroid/.idea/caches/build_file_checksums.ser and b/IcarusAndroid/.idea/caches/build_file_checksums.ser differ
diff --git a/IcarusAndroid/app/build.gradle b/IcarusAndroid/app/build.gradle
index fc758cf207ead30aecc1e75418c66e31aa9d4909..33a60750ca39ccd022feb735ee90ba533fcde3c9 100644
--- a/IcarusAndroid/app/build.gradle
+++ b/IcarusAndroid/app/build.gradle
@@ -25,4 +25,6 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+
+ implementation project(':icarus')
}
diff --git a/IcarusAndroid/app/src/main/java/framework/everywaretechnologies/it/icarusandroid/MainActivity.java b/IcarusAndroid/app/src/main/java/framework/everywaretechnologies/it/icarusandroid/MainActivity.java
index 01f64d6a6674e17fb41d90e080b9d486834c67e0..57e2062040c5dacfe77ce035048e095f6bbc9637 100644
--- a/IcarusAndroid/app/src/main/java/framework/everywaretechnologies/it/icarusandroid/MainActivity.java
+++ b/IcarusAndroid/app/src/main/java/framework/everywaretechnologies/it/icarusandroid/MainActivity.java
@@ -2,14 +2,45 @@ package framework.everywaretechnologies.it.icarusandroid;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.Switch;
+
+import framework.everywaretechnologies.it.icarus.Icarus;
+
//classe di test Icarus framework
public class MainActivity extends AppCompatActivity {
+ private final static String CLASS_NAME="MainActivity";
+
+ private Switch enteredExitedScreenTrackSwitch;
+ private Icarus instance;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
+
+ instance=Icarus.getInstance(MainActivity.this);
+ instance.setApplicationContext(getApplicationContext());
+
+ enteredExitedScreenTrackSwitch=findViewById(R.id.entered_exited_screen_track_switch);
+ }
+
+ //------------------------- UI EVENT -----------------------
+ public void onBtnScreenEventTrack(View view){
+
+ Log.d(CLASS_NAME,"on btn screen event track");
+
+ String eventType=null;
+ if(enteredExitedScreenTrackSwitch.isChecked())
+ eventType=enteredExitedScreenTrackSwitch.getTextOn().toString();
+ else
+ eventType=enteredExitedScreenTrackSwitch.getTextOff().toString();
+
+ instance.trackScreen(MainActivity.this,eventType);
}
}
diff --git a/IcarusAndroid/app/src/main/res/layout/activity_main.xml b/IcarusAndroid/app/src/main/res/layout/activity_main.xml
index 84f19512d95eb36a2e875d2632042563963c83ad..3cc99b1a7e64876be5f81b71606e5c206f77cdd5 100644
--- a/IcarusAndroid/app/src/main/res/layout/activity_main.xml
+++ b/IcarusAndroid/app/src/main/res/layout/activity_main.xml
@@ -1,18 +1,38 @@
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/IcarusAndroid/icarus/build.gradle b/IcarusAndroid/icarus/build.gradle
index 5d9762ee9d42026ab0a9531d6e43fc5afe8d3be0..4bba02278983839eb0692dd5545b325e05b13090 100644
--- a/IcarusAndroid/icarus/build.gradle
+++ b/IcarusAndroid/icarus/build.gradle
@@ -33,4 +33,5 @@ dependencies {
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.volley:volley:1.1.0'
+ implementation 'com.google.code.gson:gson:2.8.3'
}
diff --git a/IcarusAndroid/icarus/src/main/AndroidManifest.xml b/IcarusAndroid/icarus/src/main/AndroidManifest.xml
index c6d9e166c2f407e0239bc1138d30f5df4655e3da..b663d9796acfb2cb2f92317470efca654f108a27 100644
--- a/IcarusAndroid/icarus/src/main/AndroidManifest.xml
+++ b/IcarusAndroid/icarus/src/main/AndroidManifest.xml
@@ -1,2 +1,5 @@
+ package="framework.everywaretechnologies.it.icarus" >
+
+
+
\ No newline at end of file
diff --git a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/EventTrackResource.java b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/EventTrackResource.java
index 73504c9167bdfc6c73e5392ae0a9865064ee7182..dccedcf1830fe9f69badcafc9af87549f04efccc 100644
--- a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/EventTrackResource.java
+++ b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/EventTrackResource.java
@@ -1,4 +1,9 @@
package framework.everywaretechnologies.it.icarus;
public class EventTrackResource extends IcarusResource {
+
+ public EventTrackResource(){
+
+ super();
+ }
}
diff --git a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/Icarus.java b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/Icarus.java
index 8650282d8c891679dc9e22ff26e573582942a830..62b011d6baa7a131c889310524de644197fd1c83 100644
--- a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/Icarus.java
+++ b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/Icarus.java
@@ -1,17 +1,49 @@
package framework.everywaretechnologies.it.icarus;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import com.android.volley.Request;
+import com.android.volley.RequestQueue;
+import com.android.volley.Response;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.JsonObjectRequest;
+import com.android.volley.toolbox.Volley;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-class Icarus {
+
+public class Icarus {
+
+ enum Categories{
+
+ APPLICATION,ACTION,NOTIFICATION;
+ }
+
+ private final static String ICARUS_URL="https://webdev.ewlab.di.unimi.it/icarus/str";
private static final Icarus ourInstance = new Icarus();
- private Queue pendingResources;
+ private Queue pendingResources; //FIFO
private Lock pendingResourceLock;
+ private Context appContext;// serve per istanziare un un'unica coda di richieste Volley (e non averne una per Activity)
+ private static Context curContext; //context dell'Activity corrente
+ private RequestQueue mVolleyRequestQueue;
+
+ public static Icarus getInstance(Context c) {
- public static Icarus getInstance() {
+ curContext=c;
return ourInstance;
}
@@ -21,8 +53,94 @@ class Icarus {
pendingResourceLock=new ReentrantLock();
}
- public void pushResource(IcarusResource icarusResource){
+ public void setApplicationContext(Context applicationContext){
+
+ appContext=applicationContext;
+
+ //adesso che ho l'applicationContext dell'app chiamante creo la coda di richieste per Volley
+ mVolleyRequestQueue= Volley.newRequestQueue(appContext);
+ }
+
+ //----------------- LOG PREFERENCE CHANGES -----------------------
+
+ public void logUserSettings(SharedPreferences mySharedPrefs){
+
+ Log.d(curContext.getString(R.string.icarus_class),"log pref changes");
+ }
+
+ //---------------------- LOG SCREEN TRACKING ------------------------------
+
+
+ public void trackScreen(Context c,String screenEventType){
+
+ Log.d(curContext.getString(R.string.icarus_class),"log screen track");
+
+ String screenName=c.getClass().getSimpleName();
+
+ if(screenEventType.equalsIgnoreCase(ScreenTrackResource.EVENT_ENTERED) || screenEventType.equalsIgnoreCase(ScreenTrackResource.EVENT_EXITED) ){
+
+ IcarusResource resource=new ScreenTrackResource(screenName,screenEventType);
+
+ Gson gson=new Gson();
+ String screenTrackJson=gson.toJson(resource);
+ try {
+
+ JSONObject icarusPayload=new JSONObject(screenTrackJson);
+ postIcarusHttpRequest(icarusPayload);
+
+ Log.d(curContext.getString(R.string.icarus_class),"log screen track -> Volley");
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+ //---------------------- LOG EVENT TRACKING --------------------------
+
+ public void logEvent(String eventName,String category,String label){
+
+ Log.d(curContext.getString(R.string.icarus_class),"log event");
+
+ }
+
+
+
+
+ //--------------------------- UTILITY ----------------------------------
+ private void postIcarusHttpRequest(final JSONObject icarusPayload){
+
+ final JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.POST, ICARUS_URL, icarusPayload, new Response.Listener() {
+ @Override
+ public void onResponse(JSONObject response) {
+
+ Log.d(curContext.getString(R.string.icarus_class),"onVolley response POSITIVE");
+
+ //controllo se ho qualche elemento che precedentemente non sono riuscito ad inviare e nel caso lo provo ad inviare
+ pendingResourceLock.lock();
+
+ if(pendingResources.peek() != null){ //se ho qualche elemento pendente da inviare
+
+ Log.d(curContext.getString(R.string.icarus_class),"messaggi pendenti");
+ JSONObject pendingResource=pendingResources.poll();
+ postIcarusHttpRequest(pendingResource);
+ }
+ pendingResourceLock.unlock();
+
+ }
+ }, new Response.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError error) {
+
+ Log.d(curContext.getString(R.string.icarus_class),"onVolley response NEGATIVE");
+ pendingResourceLock.lock();
+ pendingResources.add(icarusPayload);
+ pendingResourceLock.unlock();
+ }
+ });
+ mVolleyRequestQueue.add(jsonObjectRequest);//faccio effettivamente la richiesta
}
}
diff --git a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/IcarusResource.java b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/IcarusResource.java
index 214419529eb064c9d0131b8a514c230864bc0518..238449315ba6ed5a9b991a18d6e4c1f7210bc75a 100644
--- a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/IcarusResource.java
+++ b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/IcarusResource.java
@@ -1,4 +1,8 @@
package framework.everywaretechnologies.it.icarus;
public abstract class IcarusResource {
+
+ public IcarusResource(){}
}
+
+
diff --git a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/ScreenTrackResource.java b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/ScreenTrackResource.java
index 84252752eb956f5140753afa5a51d62c04b6196e..50c00490ec887ef52fa730125707b40e3ba2eb04 100644
--- a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/ScreenTrackResource.java
+++ b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/ScreenTrackResource.java
@@ -1,4 +1,17 @@
package framework.everywaretechnologies.it.icarus;
public class ScreenTrackResource extends IcarusResource {
+
+ public final static String EVENT_ENTERED="Entered";
+ public final static String EVENT_EXITED="Exited";
+
+ private String ScreenName; //è un attributo anche se inizia con la lettera maiuscola perchè il server vuole così il nome del campo JSON
+ private String Event;
+
+ public ScreenTrackResource(String _screenName,String _event){
+
+ super();
+ ScreenName=_screenName;
+ Event=_event;
+ }
}
diff --git a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/UserSettingsResource.java b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/UserSettingsResource.java
index bf4699036da8b0ebc0a236eae1813ba4c11bf458..4b2ba0ffa2cfbc57b23944f2fd98525095e1be59 100644
--- a/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/UserSettingsResource.java
+++ b/IcarusAndroid/icarus/src/main/java/framework/everywaretechnologies/it/icarus/UserSettingsResource.java
@@ -1,4 +1,9 @@
package framework.everywaretechnologies.it.icarus;
public class UserSettingsResource extends IcarusResource {
+
+ public UserSettingsResource(){
+
+ super();
+ }
}
diff --git a/IcarusAndroid/icarus/src/main/res/values/app_constants.xml b/IcarusAndroid/icarus/src/main/res/values/app_constants.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a53d545267c2ed0df6305c9ebe85dc35a3c67418
--- /dev/null
+++ b/IcarusAndroid/icarus/src/main/res/values/app_constants.xml
@@ -0,0 +1,5 @@
+
+
+
+ Icarus
+
\ No newline at end of file
diff --git a/IcarusAndroid/icarus/src/main/res/values/strings.xml b/IcarusAndroid/icarus/src/main/res/values/strings.xml
index 2a19be19c85ae7b0918f227e7697e4a17223b5af..f9753a1aac1e18f20142f4b7b6abc5efa69b6a14 100644
--- a/IcarusAndroid/icarus/src/main/res/values/strings.xml
+++ b/IcarusAndroid/icarus/src/main/res/values/strings.xml
@@ -1,3 +1,3 @@
- Icarus
+ Icarus