From 0e687f12bd2653adb55ea002b39292678366c525 Mon Sep 17 00:00:00 2001
From: goblin911 <goblinliu@gmail.com>
Date: Sun, 25 Aug 2013 21:18:19 +0800
Subject: ...

---
 .../Piztor/src/com/macaroon/piztor/GPSTracker.java | 241 +++++++++++++++++++++
 .../Piztor/src/com/macaroon/piztor/Infomation.java |  30 +++
 client/Piztor/src/com/macaroon/piztor/Login.java   | 106 +++++++++
 client/Piztor/src/com/macaroon/piztor/Main.java    | 205 ++++++++++++++++++
 .../src/com/macaroon/piztor/PiztorExcepiton.java   |  10 +
 client/Piztor/src/com/macaroon/piztor/Req.java     |  14 ++
 .../src/com/macaroon/piztor/ReqLocation.java       |  14 ++
 .../Piztor/src/com/macaroon/piztor/ReqLogin.java   |  16 ++
 .../Piztor/src/com/macaroon/piztor/ReqUpdate.java  |  16 ++
 client/Piztor/src/com/macaroon/piztor/Res.java     |  11 +
 .../src/com/macaroon/piztor/ResLocation.java       |  18 ++
 .../Piztor/src/com/macaroon/piztor/ResLogin.java   |  15 ++
 .../Piztor/src/com/macaroon/piztor/ResUpdate.java  |  13 ++
 .../Piztor/src/com/macaroon/piztor/Rlocation.java  |  13 ++
 client/Piztor/src/com/macaroon/piztor/Setting.java |  22 ++
 .../src/com/macaroon/piztor/SocketClient.java      | 107 +++++++++
 client/Piztor/src/com/macaroon/piztor/Tracker.java |  66 ++++++
 client/Piztor/src/com/macaroon/piztor/Transam.java | 139 ++++++++++++
 18 files changed, 1056 insertions(+)
 create mode 100644 client/Piztor/src/com/macaroon/piztor/GPSTracker.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Infomation.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Login.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Main.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/PiztorExcepiton.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Req.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/ReqLocation.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/ReqLogin.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/ReqUpdate.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Res.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/ResLocation.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/ResLogin.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/ResUpdate.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Rlocation.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Setting.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/SocketClient.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Tracker.java
 create mode 100644 client/Piztor/src/com/macaroon/piztor/Transam.java

(limited to 'client/Piztor/src')

diff --git a/client/Piztor/src/com/macaroon/piztor/GPSTracker.java b/client/Piztor/src/com/macaroon/piztor/GPSTracker.java
new file mode 100644
index 0000000..7e89d21
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/GPSTracker.java
@@ -0,0 +1,241 @@
+package com.macaroon.piztor;
+
+import android.app.AlertDialog;
+import android.app.Service;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.location.Location;
+import android.location.LocationListener;
+import android.location.LocationManager;
+import android.location.GpsStatus;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.util.Log;
+
+public class GPSTracker extends Service implements LocationListener, GpsStatus.Listener {
+
+	private final Context mContext;
+
+	// flag for GPS status
+	boolean isGPSEnabled = false;
+
+	// flag for network status
+	boolean isNetworkEnabled = false;
+
+	// flag for GPS status
+	boolean canGetLocation = false;
+
+	Location location; // location
+	double latitude; // latitude
+	double longitude; // longitude
+
+	// The minimum distance to change Updates in meters
+	private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
+
+	// The minimum time between updates in milliseconds
+	private static final long MIN_TIME_BW_UPDATES = 1000 * 3; // 10 seconds
+
+	// Declaring a Location Manager
+	protected LocationManager locationManager;
+
+	// for GPS satellite status listener
+	Location mLastLocation;
+	long mLastLocationMillis;
+	boolean isGPSFix;
+
+
+	public GPSTracker(Context context) {
+		this.mContext = context;
+		isGPSFix = false;
+		getLocation();
+	}
+
+	public Location getLocation() {
+		try {
+			Log.d("getLocation", "Start getting location......");
+
+			locationManager = (LocationManager) mContext
+				.getSystemService(LOCATION_SERVICE);
+
+			// getting GPS status
+			isGPSEnabled = locationManager
+				.isProviderEnabled(LocationManager.GPS_PROVIDER);
+
+			// getting network status
+			isNetworkEnabled = locationManager
+				.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
+
+			if (!isGPSEnabled) {
+				// no network provider is enabled
+			} else {
+				this.canGetLocation = true;
+				if (isNetworkEnabled) {
+					locationManager.requestLocationUpdates(
+							LocationManager.NETWORK_PROVIDER,
+							MIN_TIME_BW_UPDATES,
+							MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
+
+					Log.d("Network", "Network Updated");
+
+					if (locationManager != null) {
+						location = locationManager
+							.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
+						if (location != null) {
+							latitude = location.getLatitude();
+							longitude = location.getLongitude();
+
+							Log.d("Network", "Received Network Data");
+							System.out.println("***From Network: "+latitude + "  " + longitude);
+						}
+					}
+				}// end of network section
+				// if GPS Enabled get lat/long using GPS Services
+				if (isGPSEnabled) {
+					if (true) {
+						locationManager.requestLocationUpdates(
+								LocationManager.GPS_PROVIDER,
+								MIN_TIME_BW_UPDATES,
+								MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
+						Log.d("GPS", "GPS Updated");
+						if (locationManager != null) {
+							location = locationManager
+								.getLastKnownLocation(LocationManager.GPS_PROVIDER);
+							if (location != null) {
+								latitude = location.getLatitude();
+								longitude = location.getLongitude();
+
+								Log.d("GPS", "Received GPS Data");
+								System.out.println("***From GPS: "+latitude + "  " + longitude);
+
+							}
+						}
+					}
+				}// end of GPS section
+			}// end of fetching data
+			return location;
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * Stop using GPS listener Calling this function will stop using GPS in your
+	 * app
+	 * */
+	public void stopUsingGPS() {
+		if (locationManager != null) {
+			locationManager.removeUpdates(GPSTracker.this);
+		}
+	}
+
+	/**
+	 * Function to get latitude
+	 * */
+	public double getLatitude() {
+		if (location != null) {
+			latitude = location.getLatitude();
+		}
+		return latitude;
+	}
+
+	/**
+	 * Function to get longitude
+	 * */
+	public double getLongitude() {
+		if (location != null) {
+			longitude = location.getLongitude();
+		}
+		return longitude;
+	}
+
+	/**
+	 * Function to check GPS/wifi enabled
+	 * 
+	 * @return boolean
+	 * */
+	public boolean canGetLocation() {
+		return this.canGetLocation;
+	}
+
+	public boolean isGPSFix() {
+		return (this.isGPSFix && location != null);
+	}
+
+	/**
+	 * Function to show settings alert dialog On pressing Settings button will
+	 * lauch Settings Options
+	 * */
+	public void showSettingsAlert() {
+		AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
+
+		// Setting Dialog Title
+		alertDialog.setTitle("GPS is settings");
+
+		// Setting Dialog Message
+		alertDialog
+			.setMessage("GPS is not enabled. Do you want to go to settings menu?");
+
+		// On pressing Settings button
+		alertDialog.setPositiveButton("Settings",
+				new DialogInterface.OnClickListener() {
+					public void onClick(DialogInterface dialog, int which) {
+						Intent intent = new Intent(
+							Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+						mContext.startActivity(intent);
+					}
+				});
+
+		// on pressing cancel button
+		alertDialog.setNegativeButton("Cancel",
+				new DialogInterface.OnClickListener() {
+					public void onClick(DialogInterface dialog, int which) {
+						dialog.cancel();
+					}
+				});
+
+		// Showing Alert Message
+		alertDialog.show();
+	}
+
+	@Override
+	public void onLocationChanged(Location location) {
+		if (location == null) return;
+		mLastLocationMillis = SystemClock.elapsedRealtime();
+		mLastLocation = location;
+	}
+
+	@Override
+	public void onProviderDisabled(String provider) {
+	}
+
+	@Override
+	public void onProviderEnabled(String provider) {
+	}
+
+	@Override
+	public void onStatusChanged(String provider, int status, Bundle extras) {
+	}
+
+	@Override
+	public IBinder onBind(Intent arg0) {
+		return null;
+	}
+
+	@Override
+	public void onGpsStatusChanged(int event) {
+		switch (event) {
+			case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
+				if(mLastLocation != null)
+					isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;
+				break;
+
+			case GpsStatus.GPS_EVENT_FIRST_FIX:
+				isGPSFix = true;
+				break;
+		}
+	}
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/Infomation.java b/client/Piztor/src/com/macaroon/piztor/Infomation.java
new file mode 100644
index 0000000..d989280
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Infomation.java
@@ -0,0 +1,30 @@
+package com.macaroon.piztor;
+
+import android.annotation.SuppressLint;
+import java.util.HashMap;
+import java.util.Vector;
+
+public class Infomation {
+	static String ip = "69.85.86.42";
+	static int port = 9990;
+	static int token = -1;
+	static int myId = -1;
+	static int myGroup = -1;
+	class UserInfo {
+		int id;
+		double lat, lot;
+	}
+
+	class Group {
+		int id;
+		Vector<UserInfo> v;
+	}
+	
+	static HashMap<Integer, Group> mp;
+	
+	@SuppressLint("UseSparseArrays")
+	static void init() {
+		mp = new HashMap<Integer, Group>();
+	}
+	
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/Login.java b/client/Piztor/src/com/macaroon/piztor/Login.java
new file mode 100644
index 0000000..a92b9c7
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Login.java
@@ -0,0 +1,106 @@
+package com.macaroon.piztor;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.Menu;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+public class Login extends PiztorAct {
+	
+	
+	ActMgr actMgr;
+	Button btnLogin;
+	EditText edtUser, edtPass;
+
+	int loginButtonClick = 1, retryButtonClick = 2, loginFailed = 3;
+	
+	@SuppressLint("HandlerLeak")
+	Handler hand = new Handler() {
+		@Override
+		public void handleMessage(Message m) {
+			System.out.println(m.what);
+			if (m.what == 0) {
+				ResLogin res = (ResLogin) m.obj;
+				Infomation.token = res.t;
+				actMgr.trigger(AppMgr.loginSuccess);
+			} else if (m.what == 101) {
+				actMgr.trigger(loginFailed);
+			}
+		}
+	};
+	
+	class StartStatus extends ActStatus {
+
+		@Override
+		void enter(int e) {
+		}
+
+		@Override
+		void leave(int e) {
+		}
+	}
+	
+	class LoginStatus extends ActStatus {
+
+		@Override
+		void enter(int e) {
+			String user = edtUser.getText().toString();
+			String pass = edtPass.getText().toString();
+			long nowtime = System.currentTimeMillis();
+			System.out.println(user + " : " + pass + "\n");
+			AppMgr.transam.send(new ReqLogin(user, pass, nowtime, 1000));
+		}
+
+		@Override
+		void leave(int e) {
+			//TODO log out failed!
+		}
+		
+	}
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState) {
+		id = "login";
+		super.onCreate(savedInstanceState);
+		ActStatus[] r = new ActStatus[2];
+		AppMgr.transam.setHandler(hand);
+		r[0] = new StartStatus();
+		r[1] = new LoginStatus();
+		actMgr = new ActMgr(this, r[0], r);
+		actMgr.add(r[0], loginButtonClick, r[1]);
+		actMgr.add(r[1], loginFailed, r[0]);
+		setContentView(R.layout.activity_login);
+	}
+
+	@Override
+	protected void onStart() {
+		super.onStart();
+		btnLogin = (Button) findViewById(R.id.login_btn_login);
+		edtUser = (EditText) findViewById(R.id.user_id);
+		edtPass = (EditText) findViewById(R.id.user_pass);
+		btnLogin.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View arg0) {
+				actMgr.trigger(loginButtonClick);
+			}
+		});
+	}
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+	
+	}
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		// Inflate the menu; this adds items to the action bar if it is present.
+		getMenuInflater().inflate(R.menu.login, menu);
+		return true;
+	}
+
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/Main.java b/client/Piztor/src/com/macaroon/piztor/Main.java
new file mode 100644
index 0000000..d111711
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Main.java
@@ -0,0 +1,205 @@
+package com.macaroon.piztor;
+
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.Vector;
+
+import android.annotation.SuppressLint;
+import android.location.Location;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.Menu;
+import android.view.View;
+import android.widget.ImageButton;
+
+public class Main extends PiztorAct {
+	final static int SearchButtonPress = 1;
+	final static int FetchButtonPress = 2;
+	final static int FocuseButtonPress = 3;
+	final static int SuccessFetch = 4;
+	final static int FailedFetch = 5;
+	final static int TimerFlush = 6;
+	ActMgr actMgr;
+	ImageButton btnSearch, btnFetch, btnFocus, btnSettings;
+	Timer autodate;
+	@SuppressLint("HandlerLeak")
+	Handler fromGPS = new Handler() {
+		@Override
+		public void handleMessage(Message m) {
+			if (m.what != 0) {
+				Location l = (Location) m.obj;
+				if (l == null)
+					System.out.println("fuck!!!");
+				else {
+					ReqUpdate r = new ReqUpdate(Infomation.token,
+							l.getLatitude(), l.getLongitude(),
+							System.currentTimeMillis(), 1000);
+					AppMgr.transam.send(r);
+				}
+			}
+		}
+	};
+
+	Handler fromTransam = new Handler() {
+		@Override
+		public void handleMessage(Message m) {
+			switch (m.what) {
+			case 3:
+				ResLocation location = (ResLocation) m.obj;
+				for (int i = 0; i < location.n; i++) {
+					System.out.println(location.l.get(i).lat + " "
+							+ location.l.get(i).lot);
+				}
+				actMgr.trigger(SuccessFetch);
+				break;
+			case 2:
+				ResUpdate update = (ResUpdate) m.obj;
+				if (update.t == 0)
+					System.out.println("update success");
+				else
+					System.out.println("update failed");
+				break;
+			default:
+				break;
+			}
+
+		}
+	};
+
+	String cause(int t) {
+		switch (t) {
+		case SearchButtonPress:
+			return "Search Button Press";
+		case FetchButtonPress:
+			return "Fetch Button Press";
+		case FocuseButtonPress:
+			return "Focuse Button Press";
+		case SuccessFetch:
+			return "Success Fetch";
+		case FailedFetch:
+			return "Failed Fetch";
+		case TimerFlush:
+			return "TimerFlush";
+		default:
+			return "Fuck!!!";
+		}
+	}
+
+	class StartStatus extends ActStatus {
+
+		@Override
+		void enter(int e) {
+			System.out.println("enter start status!!!!");
+			if (e == TimerFlush) {
+				ReqLocation r = new ReqLocation(Infomation.token, 1,
+						System.currentTimeMillis(), 1000);
+				AppMgr.transam.send(r);
+			}
+		}
+
+		@Override
+		void leave(int e) {
+			System.out.println("leave start status!!!! because" + cause(e));
+		}
+
+	}
+
+	class FetchStatus extends ActStatus {
+
+		@Override
+		void enter(int e) {
+			System.out.println("enter Fetch status!!!!");
+			if (e == FetchButtonPress) {
+				ReqLocation r = new ReqLocation(Infomation.token, 1,
+						System.currentTimeMillis(), 1000);
+				AppMgr.transam.send(r);
+			}
+		}
+
+		@Override
+		void leave(int e) {
+			System.out.println("leave fetch status!!!! because" + cause(e));
+		}
+
+	}
+
+	class FocusStatus extends ActStatus {
+
+		@Override
+		void enter(int e) {
+			System.out.println("enter focus status!!!!");
+
+		}
+
+		@Override
+		void leave(int e) {
+			System.out.println("leave focus status!!!! because" + cause(e));
+
+		}
+
+	}
+
+	class AutoUpdate extends TimerTask {
+
+		@Override
+		public void run() {
+			actMgr.trigger(Main.TimerFlush);
+		}
+
+	}
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState) {
+		id = "Main";
+		super.onCreate(savedInstanceState);
+		AppMgr.tracker.setHandler(fromGPS);
+		ActStatus[] r = new ActStatus[3];
+		r[0] = new StartStatus();
+		r[1] = new FetchStatus();
+		r[2] = new FocusStatus();
+		actMgr = new ActMgr(this, r[0], r);
+		actMgr.add(r[0], FocuseButtonPress, r[2]);
+		actMgr.add(r[0], FetchButtonPress, r[1]);
+		actMgr.add(r[0], SuccessFetch, r[0]);
+		actMgr.add(r[1], FetchButtonPress, r[0]);
+		actMgr.add(r[1], FailedFetch, r[0]);
+		actMgr.add(r[1], SuccessFetch, r[0]);
+		actMgr.add(r[2], FocuseButtonPress, r[0]);
+		actMgr.add(r[0], TimerFlush, r[0]);
+		actMgr.add(r[2], TimerFlush, r[2]);
+		autodate = new Timer();
+		AppMgr.transam.setHandler(fromTransam);
+		setContentView(R.layout.activity_main);
+	}
+
+	@Override
+	protected void onStart() {
+		super.onStart();
+		btnFetch = (ImageButton) findViewById(R.id.footbar_btn_fetch);
+		btnFocus = (ImageButton) findViewById(R.id.footbar_btn_focus);
+		btnSearch = (ImageButton) findViewById(R.id.footbar_btn_search);
+		btnSettings = (ImageButton) findViewById(R.id.footbar_btn_settings);
+		btnFetch.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View arg0) {
+				actMgr.trigger(FetchButtonPress);
+			}
+		});
+		btnFocus.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				actMgr.trigger(FocuseButtonPress);
+			}
+		});
+		autodate.schedule(new AutoUpdate(), 0, 5000);
+	}
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		// Inflate the menu; this adds items to the action bar if it is present.
+		getMenuInflater().inflate(R.menu.main, menu);
+		return true;
+	}
+
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/PiztorExcepiton.java b/client/Piztor/src/com/macaroon/piztor/PiztorExcepiton.java
new file mode 100644
index 0000000..6d1861a
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/PiztorExcepiton.java
@@ -0,0 +1,10 @@
+package com.macaroon.piztor;
+
+class PiztorExcepiton extends Exception{
+	private static final long serialVersionUID = -7147530695009854988L;
+
+}
+
+class ClassCannotFind extends PiztorExcepiton {
+	//private class 
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/Req.java b/client/Piztor/src/com/macaroon/piztor/Req.java
new file mode 100644
index 0000000..32988b8
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Req.java
@@ -0,0 +1,14 @@
+package com.macaroon.piztor;
+
+public class Req{
+	int type;		//request type
+	int token;		//authentciation
+	long time;		//current time
+	long alive;		//alive time
+	Req(int t,int k,long tm,long av){
+		type = t;
+		token = k;
+		time = tm;
+		alive = av;
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/ReqLocation.java b/client/Piztor/src/com/macaroon/piztor/ReqLocation.java
new file mode 100644
index 0000000..000f373
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/ReqLocation.java
@@ -0,0 +1,14 @@
+package com.macaroon.piztor;
+
+//--------------------------------------//
+//			Ask Location				//
+//--------------------------------------//
+
+public class ReqLocation extends Req{
+	int gid;	//group id;
+	
+	ReqLocation(int token,int groupid,long time,long alive){
+		super(3,token,time,alive);	//for type 3
+		gid = groupid;
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/ReqLogin.java b/client/Piztor/src/com/macaroon/piztor/ReqLogin.java
new file mode 100644
index 0000000..294cae3
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/ReqLogin.java
@@ -0,0 +1,16 @@
+package com.macaroon.piztor;
+
+//--------------------------------------//
+//			authentication				//
+//--------------------------------------//
+
+public class ReqLogin extends Req{
+	String user;	//username
+	String pass;	//password
+	
+	ReqLogin(String u,String p,long time,long alive){
+		super(0,0,time,alive);	//for type 0
+		user = u;
+		pass = p;
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/ReqUpdate.java b/client/Piztor/src/com/macaroon/piztor/ReqUpdate.java
new file mode 100644
index 0000000..e4b1497
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/ReqUpdate.java
@@ -0,0 +1,16 @@
+package com.macaroon.piztor;
+
+//--------------------------------------//
+//			Update Location				//
+//--------------------------------------//
+
+public class ReqUpdate extends Req{
+	double lat;	//latitude
+	double lot; //longitude
+	
+	ReqUpdate(int token,double latitude,double longitude,long time,long alive){
+		super(2,token,time,alive);	//for type 2
+		lat = latitude;
+		lot = longitude;
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/Res.java b/client/Piztor/src/com/macaroon/piztor/Res.java
new file mode 100644
index 0000000..98af108
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Res.java
@@ -0,0 +1,11 @@
+package com.macaroon.piztor;
+
+public class Res{
+	int t;
+	int s;
+	Res(int type,int status){
+		t = type;
+		s = status;
+	}
+}
+
diff --git a/client/Piztor/src/com/macaroon/piztor/ResLocation.java b/client/Piztor/src/com/macaroon/piztor/ResLocation.java
new file mode 100644
index 0000000..eb90840
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/ResLocation.java
@@ -0,0 +1,18 @@
+package com.macaroon.piztor;
+
+import java.util.Vector;
+
+//--------------------------------------//
+//			  Location Info			    //
+//--------------------------------------//
+
+public class ResLocation extends Res{
+	Vector<Rlocation> l;	//vector for location info
+	int n;					//number of location info
+	
+	ResLocation(int num,Vector<Rlocation> locationvec){
+		super(3,255);	//for type 3
+		l = locationvec;
+		n = num;
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/ResLogin.java b/client/Piztor/src/com/macaroon/piztor/ResLogin.java
new file mode 100644
index 0000000..5b597a4
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/ResLogin.java
@@ -0,0 +1,15 @@
+package com.macaroon.piztor;
+
+
+//--------------------------------------//
+//	         Respond to login			//
+//--------------------------------------//
+
+public class ResLogin extends Res{
+	int t;	//user token
+	
+	ResLogin(int token,int status){
+		super(0,status);	//for type 0
+		t = token;
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/ResUpdate.java b/client/Piztor/src/com/macaroon/piztor/ResUpdate.java
new file mode 100644
index 0000000..727eaa3
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/ResUpdate.java
@@ -0,0 +1,13 @@
+package com.macaroon.piztor;
+
+
+//--------------------------------------//
+//	   Respond to update location		//
+//--------------------------------------//
+
+public class ResUpdate extends Res{
+	
+	ResUpdate(int status){
+		super(2,status);	//for type 2
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/Rlocation.java b/client/Piztor/src/com/macaroon/piztor/Rlocation.java
new file mode 100644
index 0000000..142cc9b
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Rlocation.java
@@ -0,0 +1,13 @@
+package com.macaroon.piztor;
+
+class Rlocation{
+	int i;		//id
+	double lat;	//latitude
+	double lot; //longitude
+	
+	Rlocation(int id,double latitude,double longitude){
+		i = id;
+		lat = latitude;
+		lot = longitude;
+	}
+}
\ No newline at end of file
diff --git a/client/Piztor/src/com/macaroon/piztor/Setting.java b/client/Piztor/src/com/macaroon/piztor/Setting.java
new file mode 100644
index 0000000..610333f
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Setting.java
@@ -0,0 +1,22 @@
+package com.macaroon.piztor;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.view.Menu;
+
+public class Setting extends Activity {
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.activity_setting);
+	}
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		// Inflate the menu; this adds items to the action bar if it is present.
+		getMenuInflater().inflate(R.menu.setting, menu);
+		return true;
+	}
+
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/SocketClient.java b/client/Piztor/src/com/macaroon/piztor/SocketClient.java
new file mode 100644
index 0000000..18c19da
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/SocketClient.java
@@ -0,0 +1,107 @@
+package com.macaroon.piztor;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.util.Vector;
+
+import android.os.Handler;
+import android.os.Message;
+
+public class SocketClient {
+	static Socket client;
+
+	public SocketClient(String site, int port) throws UnknownHostException,
+			IOException {
+		try {
+			client = new Socket(site, port);
+		} catch (UnknownHostException e) {
+			throw e;
+		} catch (IOException e) {
+			throw e;
+		}
+	}
+
+	public void sendMsg(Req req,Handler recall) throws IOException {
+		try {
+			DataOutputStream out = new DataOutputStream(
+					client.getOutputStream());
+			int tmp = req.type;
+			out.writeByte(tmp);
+			switch (tmp) {
+			case 0:
+				ReqLogin rau = (ReqLogin) req;
+				String id = rau.user;
+				String pa = rau.pass;
+				out.writeBytes(id + "\0" + pa);
+				break;
+			case 2:
+				ReqUpdate rup = (ReqUpdate) req;
+				int tk2 = rup.token;
+				double slat = rup.lat;
+				double slot = rup.lot;
+				out.writeInt(tk2);
+				out.writeDouble(slat);
+				out.writeDouble(slot);
+				break;
+			case 3:
+				ReqLocation ras = (ReqLocation) req;
+				int tk3 = ras.token;
+				int gid = ras.gid;
+				out.writeInt(tk3);
+				out.writeInt(gid);
+				break;
+			}
+			out.flush();
+			client.shutdownOutput();
+			DataInputStream in = new DataInputStream(client.getInputStream());
+			Message msg = new Message();
+			int type = in.readUnsignedByte();
+			switch (type) {
+			case 0:
+				int id = in.readInt();
+				int status = in.readUnsignedByte();
+				ResLogin rchklogin = new ResLogin(id,status);
+				msg.obj = rchklogin;
+				msg.what = 0;
+				recall.sendMessage(msg);
+				break;
+			case 2:
+				int status1 = in.readUnsignedByte();
+				ResUpdate rchkupd = new ResUpdate(status1);
+				msg.obj = rchkupd;
+				msg.what = 1;
+				recall.sendMessage(msg);
+				break;
+			case 3:
+				int n = in.readInt();
+				Vector<Rlocation> tmpv = new Vector<Rlocation>();
+				for (int i = 1; i <= n; i++) {
+					int tid = in.readInt();
+					double lat = in.readDouble();
+					double lot = in.readDouble();
+					tmpv.add(new Rlocation(tid,lat,lot));
+				}
+				ResLocation rlocin = new ResLocation(n,tmpv);
+				msg.obj = rlocin;
+				msg.what = 3;
+				recall.sendMessage(msg);
+				break;
+			}
+
+		} catch (IOException e) {
+			throw e;
+		}
+	}
+
+	public void closeSocket() {
+		try {
+			client.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/Tracker.java b/client/Piztor/src/com/macaroon/piztor/Tracker.java
new file mode 100644
index 0000000..db9c151
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Tracker.java
@@ -0,0 +1,66 @@
+package com.macaroon.piztor;
+
+import android.content.Context;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import android.location.Location;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+
+public class Tracker implements Runnable {
+
+	private static final long TIME_DELTA = 1000 * 3; // 3 second
+	public Timer timer;
+	private final Context mContext;
+	GPSTracker myTracker;
+	Handler mHandler;
+	Message message;
+
+	public Tracker(Context context, Handler yHandler) {
+		timer = new Timer();
+		mContext = context;
+		myTracker = new GPSTracker(mContext);
+		mHandler = yHandler;
+	}
+	
+	void setHandler(Handler hand) {
+		mHandler = hand;
+	}
+	
+
+	public void run() {
+		GPSTask myTask = new GPSTask();
+		timer.schedule(myTask, 0, TIME_DELTA);
+	}	
+	
+	class GPSTask extends TimerTask {
+		@Override
+		public void run() {
+			Location location = myTracker.getLocation();
+			Log.d("Location", "Fetching location.....");
+			if (myTracker.canGetLocation()) {
+				
+//				Log.d("TTTTTTTTTTTTTTTTTTTTTTTime","TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTime");
+//				System.out.println("GPSTIME" + myTracker.location.getTime());
+//				System.out.println("SYSTIME" + SystemClock.elapsedRealtime());
+				
+				message = new Message();
+				message.what = 0;
+				message.obj = location;
+				if(myTracker.isGPSFix()) {
+					message.what = 1;
+				} else {
+					message.what = 2;
+				}
+				mHandler.sendMessage(message);
+			} else {
+				message = new Message();
+				message.what = 0;
+				mHandler.sendMessage(message);
+			}
+		}
+	}
+}
diff --git a/client/Piztor/src/com/macaroon/piztor/Transam.java b/client/Piztor/src/com/macaroon/piztor/Transam.java
new file mode 100644
index 0000000..3410502
--- /dev/null
+++ b/client/Piztor/src/com/macaroon/piztor/Transam.java
@@ -0,0 +1,139 @@
+package com.macaroon.piztor;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import android.annotation.SuppressLint;
+import android.os.Handler;
+import android.os.Message;
+
+public class Transam implements Runnable {
+	
+	public Timer timer;
+	public Timer mtimer;
+	public boolean running = false;
+	public boolean flag = true;
+	public int cnt = 4;
+	Res res;
+	Req req;
+	public int p; // port
+	public String i; // ip
+	Thread thread;
+	Handler core;
+	Handler recall; // recall
+	Queue<Req> reqtask; // request task
+
+	Transam(String ip, int port, Handler Recall) {
+		p = port;
+		i = ip;
+		recall = Recall;
+		reqtask = new LinkedList<Req>();
+	}
+
+	public void send(Req r) {
+		reqtask.offer(r);
+
+	}
+	
+	public void setHandler(Handler Recall) {
+		recall = Recall;
+		reqtask.clear();
+	}
+
+	public void run() { // start the main timer
+		// TimerTask tmain = new Timertk();
+		// mtimer = new Timer();
+		// mtimer.schedule(tmain, 100, 100); //check the queue for every 100
+		// msec
+
+		while (true) {
+			if (running == false) {
+
+				if (!reqtask.isEmpty()) { // poll the head request
+					req = reqtask.poll();
+					if (req.time + req.alive < System.currentTimeMillis()) { // time
+																				// out!
+						Message ret = new Message();
+						ret.obj = "Time out!";
+						ret.what = 100;
+						recall.sendMessage(ret);
+					} else { // run the request
+						final thd t = new thd();
+						flag = false;
+						thread = new Thread(t);
+						cnt = 4;
+						running = true;
+						thread.start();
+						timer = new Timer();
+						TimerTask task = new Timertk();
+						timer.schedule(task, 2000, 2000);
+					}
+				}
+			}
+		}
+	}
+
+	class tmain extends TimerTask {
+		public void run() {
+
+		}
+	};
+
+	class thd implements Runnable {
+		public void run() {
+			try {
+				SocketClient client = new SocketClient(i, p);
+				client.sendMsg(req, recall);
+				Message msg = new Message();
+				msg.what = 1;
+				handler.sendMessage(msg);
+				client.closeSocket();
+			} catch (UnknownHostException e) {
+				e.printStackTrace();
+				System.out.println("UnknownHostException");
+			} catch (IOException e) {
+				e.printStackTrace();
+				System.out.println("IOException");
+			}
+
+		}
+	}
+
+	@SuppressLint("HandlerLeak")
+	Handler handler = new Handler() {
+		public void handleMessage(Message msg) {
+			switch (msg.what) {
+			case 1:
+				flag = true;
+				break;
+			case 2:
+				final thd t = new thd();
+				thread = new Thread(t);
+				thread.start();
+				break;
+			}
+			super.handleMessage(msg);
+		}
+	};
+
+	class Timertk extends TimerTask {
+		public void run() {
+			if (flag == false && cnt > 0) {
+				cnt--;
+			} else if (cnt == 0) {
+				Message msg = new Message();
+				msg.obj = "connecting failed";
+				msg.what = 101;
+				recall.sendMessage(msg);
+				timer.cancel();
+			} else if (flag == true) {
+				timer.cancel();
+				running = false;
+			}
+		}
+	};
+}
\ No newline at end of file
-- 
cgit v1.2.3-70-g09d2