package de.andlabs.teleporter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Handler;
import android.os.Parcelable;
import android.util.Log;
import de.andlabs.teleporter.plugin.ITeleporterPlugIn;
public class QueryMultiplexer {
private static final String TAG = "Multiplexer";
private Place orig;
private Place dest;
public ArrayList<Ride> rides;
public ArrayList<ITeleporterPlugIn> plugIns;
private ArrayList<Ride> nextRides;
private Map<String, Integer> priorities;
private long mLastSearchTimestamp;
private BroadcastReceiver mPluginResponseReceiver;
private final Context ctx;
private Handler mUpdateHandler;
private Thread worker;
public QueryMultiplexer(Context ctx, Place o, Place d) {
this.ctx = ctx;
orig = o;
dest = d;
nextRides = new ArrayList<Ride>();
rides = new ArrayList<Ride>() {
@Override
public boolean add(Ride object) {
if(!contains(object))
return super.add(object);
else
return false;
}
@Override
public boolean addAll(Collection<? extends Ride> collection) {
for(Ride r : collection)
if(!contains(r))
super.add(r);
return true;
}
@Override
public void add(int index, Ride object) {
if(!contains(object))
super.add(index, object);
}
};
plugIns = new ArrayList<ITeleporterPlugIn>();
SharedPreferences plugInSettings = ctx.getSharedPreferences("plugIns", ctx.MODE_PRIVATE);
try {
for (String p : plugInSettings.getAll().keySet()) {
Log.d(TAG, "plugin "+p);
if (plugInSettings.getBoolean(p, false)){
Log.d(TAG, "add plugin "+p);
plugIns.add((ITeleporterPlugIn) Class.forName("de.andlabs.teleporter.plugin."+p).newInstance());
}
}
} catch (Exception e) {
Log.e(TAG, "Schade!");
e.printStackTrace();
}
priorities = (Map<String, Integer>) ctx.getSharedPreferences("priorities", ctx.MODE_PRIVATE).getAll();
this.mUpdateHandler = new Handler();
this.mPluginResponseReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Plugin Response Received.");
final int duration = intent.getIntExtra("dur", -1);
final Ride ride = new Ride();
ride.duration = duration;
ride.orig = orig;
ride.dest = dest;
ride.mode = Ride.MODE_DRIVE;
ride.fun = 1;
ride.eco = 1;
ride.fast = 5;
ride.social = 1;
ride.green = 1;
mUpdateHandler.post(new Runnable() {
@Override
public void run() {
nextRides.add(ride);
}
});
}
};
this.ctx.registerReceiver(this.mPluginResponseReceiver, new IntentFilter("org.teleporter.intent.action.RECEIVE_RESPONSE"));
}
public boolean searchLater() {
// TODO just query just plugins that ...
// TODO use ThreadPoolExecutor ...
if (worker != null && worker.isAlive())
return false;
worker = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (ITeleporterPlugIn p : plugIns) {
Log.d(TAG, "query plugin "+p);
final long requestTimestamp;
if(mLastSearchTimestamp == 0 ) {
requestTimestamp = System.currentTimeMillis();
} else {
requestTimestamp = mLastSearchTimestamp + 300000; // 5 Minutes
}
nextRides.addAll(p.find(orig, dest, new Date(requestTimestamp)));
mLastSearchTimestamp = requestTimestamp;
mUpdateHandler.post(new Runnable() {
@Override
public void run() {
rides.addAll(nextRides);
nextRides.clear();
((RidesActivity)ctx).datasetChanged();
}
});
}
Intent requestIntent = new Intent("org.teleporter.intent.action.RECEIVE_REQUEST");
requestIntent.putExtra("origLatitude", orig.lat);
requestIntent.putExtra("origLongitude", orig.lon);
requestIntent.putExtra("destLatitude", dest.lat);
requestIntent.putExtra("destLongitude", dest.lon);
ctx.sendBroadcast(requestIntent);
}
});
worker.start();
return true;
}
public void sort() {
priorities = (Map<String, Integer>) ctx.getSharedPreferences("priorities", ctx.MODE_PRIVATE).getAll();
// Collections.sort(rides, new Comparator<Ride>() {
//
// @Override
// public int compare(Ride r1, Ride r2) {
// // TODO Neue Faktor für Score: "Quickness" (Abfahrtszeit minus Jetzt)
// // TODO Faktoren normalisieren
// int score1= r1.fun * priorities.get("fun") +
// r1.eco * priorities.get("eco") +
// r1.fast * priorities.get("fast") +
// r1.green * priorities.get("green") +
// r1.social * priorities.get("social");
// int score2= r2.fun * priorities.get("fun") +
// r2.eco * priorities.get("eco") +
// r2.fast * priorities.get("fast") +
// r2.green * priorities.get("green") +
// r2.social * priorities.get("social");
// // Log.d("aha", "score1: "+score1 + ", score2: "+score2);
// if (score1 < score2)
// return 1;
// else if (score1 > score2)
// return -1;
// else {
// if (r1.dep.after(r2.dep))
// return 1;
// if (r1.dep.before(r2.dep))
// return -1;
// return 0;
// }
// }
// });
}
}