package eu.tpmusielak.securephoto.communication;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Base64;
import android.widget.Toast;
import eu.tpmusielak.securephoto.R;
import eu.tpmusielak.securephoto.container.SPImageRoll;
import eu.tpmusielak.securephoto.container.wrapper.SPFileWrapper;
import eu.tpmusielak.securephoto.container.wrapper.SPRWrapper;
import eu.tpmusielak.securephoto.tools.FileHandling;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: Tomasz P. Musielak
* Date: 06.12.11
* Time: 00:37
*/
public class CommunicationService extends Service {
private SubmitHashTask submitHashTask;
private GetSPRTask getSPRTask;
private String baseStationAddress;
private String androidID;
private static final String HASH_SUBMIT_PATH = "hash_submit";
private static final String GET_SPR_PATH = "request_spr";
public class CommuncationServiceBinder extends Binder {
private WeakReference<CommunicationService> serviceReference;
public CommuncationServiceBinder(CommunicationService communicationService) {
serviceReference = new WeakReference<CommunicationService>(communicationService);
}
public CommunicationService getService() {
return serviceReference.get();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
androidID = Settings.Secure.getString(getApplicationContext().getContentResolver(),
Settings.Secure.ANDROID_ID);
submitHashTask = new SubmitHashTask();
updateBaseStationAddress();
}
@Override
public IBinder onBind(Intent intent) {
return new CommuncationServiceBinder(this);
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void updateBaseStationAddress() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
baseStationAddress = preferences.getString("base_station_address", null);
if (baseStationAddress == null) {
Toast.makeText(getBaseContext(), getString(R.string.base_station_address_not_set), Toast.LENGTH_SHORT).show();
}
}
public void notifyPictureTaken(SPFileWrapper wrapper) {
updateBaseStationAddress();
if (baseStationAddress == null) {
return;
}
submitHashTask = new SubmitHashTask();
submitHashTask.execute(wrapper);
}
public void getSPRoll() {
updateBaseStationAddress();
if (baseStationAddress == null) {
return;
}
getSPRTask = new GetSPRTask();
//noinspection unchecked
getSPRTask.execute();
}
private class SubmitHashTask extends AsyncTask<SPFileWrapper, Void, Void> {
HttpClient client;
@Override
protected void onPreExecute() {
client = AndroidHttpClient.newInstance("Android");
}
@Override
protected Void doInBackground(SPFileWrapper... wrappers) {
for (SPFileWrapper wrapper : wrappers) {
try {
HttpPost request = new HttpPost(String.format("%s/%s", baseStationAddress, HASH_SUBMIT_PATH));
List<NameValuePair> nameValuePairs = new LinkedList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("type", wrapper.getFileTypeName()));
nameValuePairs.add(new BasicNameValuePair("device_id", androidID));
if (wrapper instanceof SPRWrapper) {
SPImageRoll.Header header = ((SPRWrapper) wrapper).getHeader();
nameValuePairs.add(
new BasicNameValuePair("spr_id",
Base64.encodeToString(header.getUniqueID(), Base64.NO_WRAP)));
}
nameValuePairs.add(
new BasicNameValuePair("image_id",
Base64.encodeToString(wrapper.getUniqueFrameID(), Base64.NO_WRAP)));
nameValuePairs.add(
new BasicNameValuePair("image_hash",
Base64.encodeToString(wrapper.getFrameHash(), Base64.NO_WRAP)));
request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(request);
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
return null;
}
}
private class GetSPRTask extends AsyncTask<Void, Void, SPFileWrapper> {
HttpClient client;
@Override
protected void onPreExecute() {
client = AndroidHttpClient.newInstance("Android");
}
@Override
protected SPFileWrapper doInBackground(Void... voids) {
try {
HttpPost request = new HttpPost(String.format("%s/%s", baseStationAddress, GET_SPR_PATH));
List<NameValuePair> nameValuePairs = new LinkedList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("device_id", androidID));
request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(request);
Header[] headers = response.getHeaders("spr_id");
if (headers == null) {
return null;
}
String identifier = headers[0].getValue();
byte[] id = Base64.decode(identifier, Base64.NO_WRAP);
if (id.length != 20) { // For some reason identifier is invalid
return null;
}
File sprFile = FileHandling.getOutputFile(SPImageRoll.DEFAULT_EXTENSION);
SPImageRoll roll = new SPImageRoll(sprFile, id);
return SPRWrapper.wrapFile(sprFile);
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(SPFileWrapper wrapper) {
if (wrapper == null) {
Toast.makeText(getApplicationContext(), getString(R.string.spr_retrieval_failed), Toast.LENGTH_LONG).show();
return;
}
Toast.makeText(getApplicationContext(), getString(R.string.spr_retrieved, wrapper.getName()), Toast.LENGTH_LONG).show();
}
}
}