package edu.berkeley.cs.amplab.carat.android.protocol;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.codehaus.jackson.map.ObjectMapper;
import edu.berkeley.cs.amplab.carat.android.sampling.SamplingLibrary;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
public class ClickTracking {
private static final String TAG = "ClickTracking";
private static final String ADDRESS_OLD = "http://data-bakharzy.rhcloud.com/api/app/applications/70dff194-2871-4ad8-9795-3f27f0021713/actions";
private static final String ADDRESS_VM = "http://86.50.18.40:8080/data/app/applications/f233a990-0421-4d84-b333-d0c93e7f171f/actions";
public static void track(String user, String name, HashMap<String, String> options, Context c) {
/*Track only on WIFI for now. See TODO below. */
String networkType = SamplingLibrary.getNetworkType(c);
if (networkType != null && networkType.equals("WIFI")) {
HttpAsyncTask task = new HttpAsyncTask(user, name, options);
/* TODO: We need to store the click in this task, not send yet.
* SampleSender will then later get them from storage and send.
*/
task.execute(ADDRESS_OLD, ADDRESS_VM);
}
}
private static String POST(String url, Action action) {
InputStream inputStream = null;
String result = "";
try {
// 1. create HttpClient
HttpClient httpclient = new DefaultHttpClient();
// 2. make POST request to the given URL
HttpPost httpPost = new HttpPost(url);
// 3. build json String using Jacksin Library
String json = "";
ObjectMapper mapper = new ObjectMapper();
json = mapper.writeValueAsString(action);
Log.d(TAG, "JSON=\n" + json);
// 5. set json to StringEntity
StringEntity se = new StringEntity(json, HTTP.UTF_8);
// 6. set httpPost Entity
httpPost.setEntity(se);
// 7. Set some headers to inform server about the type of the content
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
// 8. Execute POST request to the given URL
HttpResponse httpResponse = httpclient.execute(httpPost);
// 9. receive response as inputStream
inputStream = httpResponse.getEntity().getContent();
// 10. convert inputstream to string
if (inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Did not work!";
} catch (Exception e) {
Log.e(TAG, e.getLocalizedMessage());
}
// 11. return result
return result;
}
static class HttpAsyncTask extends AsyncTask<String, Void, String> {
HashMap<String, String> options = null;
private String name = null;
private String user = null;
public HttpAsyncTask(String user, String name, HashMap<String, String> options) {
this.name = name;
this.user = user;
this.options = options;
// Every event should have time, so add it here.
options.put("time", System.currentTimeMillis() + "");
}
@Override
protected String doInBackground(String... urls) {
Action action = new Action();
/*
* Toast t = Toast.makeText(context, "execute for uuid="+user+" button="+name+" app="+options.get("app"), Toast.LENGTH_LONG);
* t.show();
*/
action.setName(name);
action.setUsername(user);
action.setOptions(options);
String ret = null;
for (String url : urls) {
ret = POST(url, action);
}
return ret;
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
//Log.e("InputStream", result);
}
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
StringBuilder result = new StringBuilder();
while ((line = bufferedReader.readLine()) != null)
result.append(line + "\n");
inputStream.close();
return result.toString();
}
}