summaryrefslogtreecommitdiff
path: root/client/Piztor/src/com/macaroon/piztor/MapMaker.java
diff options
context:
space:
mode:
Diffstat (limited to 'client/Piztor/src/com/macaroon/piztor/MapMaker.java')
-rw-r--r--client/Piztor/src/com/macaroon/piztor/MapMaker.java358
1 files changed, 123 insertions, 235 deletions
diff --git a/client/Piztor/src/com/macaroon/piztor/MapMaker.java b/client/Piztor/src/com/macaroon/piztor/MapMaker.java
index 837df2b..18eb524 100644
--- a/client/Piztor/src/com/macaroon/piztor/MapMaker.java
+++ b/client/Piztor/src/com/macaroon/piztor/MapMaker.java
@@ -9,8 +9,10 @@ import java.util.Vector;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.location.LocationManager;
+import android.os.DropBoxManager.Entry;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -21,8 +23,6 @@ import android.widget.Toast;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKOLUpdateElement;
-import com.baidu.mapapi.map.MKOfflineMap;
-import com.baidu.mapapi.map.MKOfflineMapListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
@@ -36,7 +36,6 @@ public class MapMaker {
// MapView controlling component
MapView mMapView = null;
MapController mMapController = null;
- MKOfflineMap mOffline = null;
// Default center
private final static GeoPoint sjtuCenter = new GeoPoint(
@@ -47,24 +46,22 @@ public class MapMaker {
private OverlayItem curItem = null;
private LocationOverlay mLocationOverlay;
private ArrayList<OverlayItem> mItems = null;
- private MapInfo preMapInfo = null;
- private MapInfo nowMapInfo = null;
- private Vector<UserInfo> freshManInfo = null;
// hash from uid to overlay item
- private HashMap<Integer, OverlayItem> hash = null;
- private HashMap<OverlayItem, Integer> markerToInt = null;
+ private HashMap<Integer, OverlayItem> userToItem = null;
+ private HashMap<OverlayItem, Integer> itemToUser = null;
// marker layer
- OverlayItem nowMarker = null;
- static int nowMarkerHour;
- static int nowMarkerMinute;
- static long nowMarkerTimestamp;
- static int newMarkerHour;
- static int newMarkerMinute;
- static long newMarkerTimestamp;
- private int markerIndex;
- private int nowMarkerLevel;
+ /*
+ * OverlayItem nowMarker = null; static int nowMarkerHour; static int
+ * nowMarkerMinute; static long nowMarkerTimestamp; static int
+ * newMarkerHour; static int newMarkerMinute; static long
+ * newMarkerTimestamp; private int markerIndex; private int nowMarkerLevel;
+ */
+ HashMap<Integer, OverlayItem> markerToItem;
+ // from mid to item
+ HashMap<OverlayItem, Integer> itemToMarker;
+ // from item to mid
// Popup component
PopupOverlay popLay = null;
@@ -124,19 +121,24 @@ public class MapMaker {
@Override
public boolean onTap(int index) {
-
- if (nowMarker != null && index == markerIndex) {
+
+ if (app.mapInfo.markerInfo != null
+ && itemToMarker.containsKey(mOverlay.getItem(index))) {
+ Log.d("marker", "on tap" + index);
OverlayItem item = getItem(index);
- leftText.setText(nowMarkerHour + "点");
- popupText.setText(nowMarkerMinute + "分");
- Bitmap bitmap[] = { BMapUtil.getBitmapFromView(popupLeft),
- BMapUtil.getBitmapFromView(popupInfo),
- BMapUtil.getBitmapFromView(popupRight), };
+ MarkerInfo mInfo = app.mapInfo.getMarkerInfo(itemToMarker
+ .get(item));
+ leftText.setText("哈");
+ popupText.setText("分数:" + mInfo.score);
+ Bitmap bitmap = BMapUtil.getBitmapFromView(popupInfo);
popLay.showPopup(bitmap, item.getPoint(), 32);
- } else {
+ }
+ if (itemToUser.containsKey(mOverlay.getItem(index))){
OverlayItem item = getItem(index);
- UserInfo tmpInfo = app.mapInfo.getUserInfo(markerToInt.get(item));
- String itemInfo = tmpInfo.company + "连" + tmpInfo.section + "班 " + tmpInfo.nickname;
+ UserInfo tmpInfo = app.mapInfo.getUserInfo(itemToUser
+ .get(item));
+ String itemInfo = tmpInfo.company + "连" + tmpInfo.section
+ + "班 " + tmpInfo.nickname;
popupText.setText(itemInfo);
Bitmap bitmap = BMapUtil.getBitmapFromView(popupInfo);
popLay.showPopup(bitmap, item.getPoint(), 32);
@@ -155,42 +157,6 @@ public class MapMaker {
}
/**
- * Initialize offline map
- */
- public void InitOfflineMap() {
-
- mOffline = new MKOfflineMap();
- mOffline.init(mMapController, new MKOfflineMapListener() {
-
- @Override
- public void onGetOfflineMapState(int type, int state) {
- switch (type) {
- case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:
- MKOLUpdateElement update = mOffline.getUpdateInfo(state);
- break;
- case MKOfflineMap.TYPE_NEW_OFFLINE:
- Log.d("offline", String.format("add offline map %d", state));
- break;
- case MKOfflineMap.TYPE_VER_UPDATE:
- Log.d("offline", String.format("new offline map version"));
- break;
- }
- }
- });
- int num = mOffline.scan();
-
- if (num == 0) {
- // msg =
- // "No offline map found. It may have been loaded already or misplaced.";
- } else {
- Toast.makeText(context, String.format("加载了%d个离线地图包", num),
- Toast.LENGTH_SHORT).show();
- }
- Log.d("offline", "inited");
-
- }
-
- /**
* Initialize location layer
*/
public void InitLocationOverlay() {
@@ -210,8 +176,11 @@ public class MapMaker {
// TODO
// ///////////////////////////////////////////////////////////////
- hash = new HashMap<Integer, OverlayItem>();
- markerToInt = new HashMap<OverlayItem, Integer>();
+ userToItem = new HashMap<Integer, OverlayItem>();
+ markerToItem = new HashMap<Integer, OverlayItem>();
+ itemToMarker = new HashMap<OverlayItem, Integer>();
+ itemToUser = new HashMap<OverlayItem, Integer>();
+
mOverlay = new MyOverlay(context.getResources().getDrawable(
R.drawable.circle_red), mMapView);
mMapView.getOverlays().add(mOverlay);
@@ -240,13 +209,7 @@ public class MapMaker {
// do nothing
}
if (index == 2) {
- // remove current marker if is higher or equal level
- if (app.mapInfo.myInfo.level >= nowMarkerLevel) {
- AlertMaker removeAlert = new AlertMaker(context, MapMaker.this);
- removeAlert.showRemoveMarkerAlert();
- } else {
- Toast.makeText(context, "权限不足", Toast.LENGTH_SHORT).show();
- }
+ // do nothing
}
}
};
@@ -267,7 +230,6 @@ public class MapMaker {
InitLocationOverlay();
InitMyOverLay();
InitPopup();
- //InitOfflineMap();
myBM = new Drawable[20];
initMyIcons();
// InitTouchListenr();
@@ -286,22 +248,15 @@ public class MapMaker {
}
public Drawable getGroupIcon(UserInfo userInfo) {
- if (Main.colorMode == Main.show_by_team) {
- if (userInfo.section == app.mapInfo.myInfo.section)
- return myBM[0];
- else
- return myBM[userInfo.section % iconNum + 1];
- } else {
- if (userInfo.sex == app.mapInfo.myInfo.sex) return myBM[0];
- else return myBM[1];
- }
+ if (userInfo.section == app.mapInfo.myInfo.section)
+ return myBM[0];
+ else return myBM[1];
}
/**
* Update location layer when new location is received
*/
- public void UpdateLocationOverlay(LocationData locationData,
- boolean hasAnimation) {
+ public void UpdateLocationOverlay(LocationData locationData, boolean hasAnimation) {
mLocationOverlay.setData(locationData);
mMapView.refresh();
if (hasAnimation) {
@@ -309,72 +264,123 @@ public class MapMaker {
(int) (locationData.latitude * 1E6),
(int) (locationData.longitude * 1E6)));
}
- checkMarkerTime();
}
boolean isInvalidLocation(GeoPoint point) {
- if (point == null) return false;
- if (point.getLatitudeE6() / 1E6 > 180.0 || point.getLatitudeE6() / 1E6 < -180.0
- || point.getLongitudeE6() > 180.0 || point.getLongitudeE6() / 1E6 < -180.0)
+ if (point == null)
+ return false;
+ if (point.getLatitudeE6() / 1E6 > 180
+ || point.getLatitudeE6() / 1E6 < -180
+ || point.getLongitudeE6() > 180
+ || point.getLongitudeE6() / 1E6 < -180)
return false;
return true;
}
-
+
/**
* Update to draw other users
*/
public void UpdateMap(MapInfo mapInfo) {
+
if (mapInfo == null) {
if (mOverlay != null && mOverlay.getAllItem().size() != 0) {
mOverlay.removeAll();
}
return;
}
- freshManInfo = new Vector<UserInfo>();
+
// first remove all old users that are not here now
- if (preMapInfo != null) {
- for (UserInfo i : preMapInfo.getVector()) {
- if (i.uid == app.mapInfo.myInfo.uid)
- continue;
- if (mapInfo.getUserInfo(i.uid) == null) {
- mOverlay.removeItem(hash.get(i.uid));
- markerToInt.remove(hash.get(i.uid));
- hash.remove(i.uid);
- }
- if (mapInfo.getUserInfo(i.uid) != null && isInvalidLocation(mapInfo.getUserInfo(i.uid).location)) {
- mOverlay.removeItem(hash.get(i.uid));
- markerToInt.remove(hash.get(i.uid));
- hash.remove(i.uid);
- }
+
+ Vector<Integer> delList = new Vector<Integer>();
+
+ for (java.util.Map.Entry<Integer, OverlayItem> i : userToItem.entrySet()) {
+ if (mapInfo.getUserInfo(i.getKey()) == null) {
+ delList.add(i.getKey());
}
}
+ for (int i : delList) {
+ mOverlay.removeItem(userToItem.get(i));
+ itemToUser.remove(userToItem.get(i));
+ }
+ for (int i : delList) {
+ userToItem.remove(i);
+ }
mMapView.refresh();
- preMapInfo = mapInfo.copy();
+ delList = new Vector<Integer>();
+
+ for (java.util.Map.Entry<Integer, OverlayItem> i : markerToItem.entrySet()) {
+ if (mapInfo.getMarkerInfo(i.getKey()) == null) {
+ delList.add(i.getKey());
+ }
+ }
+ // i is mid
+ Log.d("kram", "before del overlay " + mOverlay.getAllItem().size());
+ for (int i : delList) {
+ mOverlay.removeItem(markerToItem.get(i));
+ itemToMarker.remove(markerToItem.get(i));
+ }
+ // i is mid
+ for (int i : delList) {
+ Log.d("kram", "remove id " + i);
+ markerToItem.remove(i);
+
+ }
+ for (java.util.Map.Entry<Integer, OverlayItem> i : markerToItem.entrySet()) {
+ Log.d("kram", "current marker " + i.getKey());
+ }
+ for (MarkerInfo i : mapInfo.markerInfo) {
+ Log.d("kram", "current makerInfo " + i.markerId);
+ }
+
+ Log.d("kram", "after del overlay " + mOverlay.getAllItem().size());
+ mMapView.refresh();
+
// then update and add items
+
+ Log.d("kram", "before update overlay " + mOverlay.getAllItem().size());
+ int cnt = 0;
+ for (MarkerInfo i : mapInfo.markerInfo) {
+ if (markerToItem.containsKey(i.markerId) == false) {
+ Log.d("kram", "add id " + i.markerId);
+ cnt ++;
+ curItem = new OverlayItem(i.markerPoint, "MARKERNAME_HERE",
+ "MARKER_SNIPPET_HERE");
+ Log.d("jingdu", "收到的坐标" + i.markerPoint.getLatitudeE6() / 1E6 + " " + i.markerPoint.getLongitudeE6() / 1E6);
+ Drawable d = context.getResources().getDrawable(R.drawable.marker_red);
+ //d.mutate().setAlpha(10);
+ curItem.setMarker(d);
+ mOverlay.addItem(curItem);
+ markerToItem.put(i.markerId, curItem);
+ itemToMarker.put(curItem, i.markerId);
+ }
+ }
+ Log.d("kram", "added " + cnt);
+ Log.d("kram", "after update overlay " + mOverlay.getAllItem().size());
+
for (UserInfo i : mapInfo.getVector()) {
if (i.uid == app.mapInfo.myInfo.uid)
continue;
- if (hash.containsKey(i.uid) == false) {
+ if (userToItem.containsKey(i.uid) == false) {
if (isInvalidLocation(i.location)) {
-
+
} else {
curItem = new OverlayItem(i.location, "USERNAME_HERE",
- "USER_SNIPPET_HERE");
+ "USER_SNIPPET_HERE");
// TODO getDrawable
// /////////////////////////////
curItem.setMarker(getGroupIcon(i));
mOverlay.addItem(curItem);
- hash.put(i.uid, curItem);
- markerToInt.put(curItem, i.uid);
+ userToItem.put(i.uid, curItem);
+ itemToUser.put(curItem, i.uid);
}
} else {
if (isInvalidLocation(i.location)) {
- mOverlay.removeItem(hash.get(i.uid));
- markerToInt.remove(hash.get(i.uid));
- hash.remove(i.uid);
+ mOverlay.removeItem(userToItem.get(i.uid));
+ itemToUser.remove(userToItem.get(i.uid));
+ userToItem.remove(i.uid);
} else {
- curItem = hash.get(i.uid);
+ curItem = userToItem.get(i.uid);
curItem.setGeoPoint(i.location);
mOverlay.updateItem(curItem);
}
@@ -383,131 +389,13 @@ public class MapMaker {
if (mMapView != null) {
mMapView.refresh();
}
- checkMarkerTime();
- }
-
- public void receiveMarker(MarkerInfo markerInfo) {
- if (nowMarker != null && markerInfo.level >= nowMarkerLevel) {
- Log.d("marker", "Old marker replaced by marker with higher level!");
- nowMarker.setGeoPoint(markerInfo.markerPoint);
-
- final Calendar cal = Calendar.getInstance();
- cal.setTimeInMillis(markerInfo.markerTimestamp * 1000);
- Date date = (Date) cal.getTime();
- nowMarkerHour = date.getHours();
- nowMarkerMinute = date.getMinutes();
- nowMarkerTimestamp = markerInfo.markerTimestamp;
- nowMarkerLevel = markerInfo.level;
-
- mOverlay.updateItem(nowMarker);
- mMapView.refresh();
- mMapController.animateTo(markerInfo.markerPoint);
- Toast toast = Toast.makeText(context,"收到新路标,集合时间:" + nowMarkerHour + ":" + nowMarkerMinute, 5000);
- toast.setGravity(Gravity.TOP, 0, 80);
- toast.show();
- return;
- }
- if (nowMarker == null) {
- Log.d("marker", "New marker created!");
- nowMarker = new OverlayItem(markerInfo.markerPoint, "MARKER_NAME",
- "");
- nowMarker.setMarker(context.getResources().getDrawable(
- R.drawable.marker_red));
- System.out.println(markerInfo.markerPoint.getLatitudeE6() + " "
- + markerInfo.markerPoint.getLongitudeE6());
- final Calendar cal = Calendar.getInstance();
- cal.setTimeInMillis(markerInfo.markerTimestamp * 1000);
- Date date = (Date) cal.getTime();
- nowMarkerHour = date.getHours();
- nowMarkerMinute = date.getMinutes();
- nowMarkerTimestamp = markerInfo.markerTimestamp;
- nowMarkerLevel = markerInfo.level;
-
- markerIndex = mOverlay.getAllItem().size();
- mOverlay.addItem(nowMarker);
- mMapView.refresh();
- mMapController.animateTo(markerInfo.markerPoint);
- Toast toast = Toast.makeText(context,"收到新路标,集合时间:" + nowMarkerHour + ":" + nowMarkerMinute, 5000);
- toast.setGravity(Gravity.TOP, 0, 80);
- toast.show();
- return;
- }
- }
-
- void sendMarker() {
- Log.d("marker", "Marker prepare! " + nowMarkerTimestamp);
- ReqSetMarker req = new ReqSetMarker(app.token, app.username, nowMarker
- .getPoint().getLatitudeE6() / 1e6, nowMarker.getPoint()
- .getLongitudeE6() / 1e6, (int)nowMarkerTimestamp,
- System.currentTimeMillis(), 3000l);
-
- Log.d("marker", "Marker sent! " + req.deadline);
- app.transam.send(req);
- }
-
- /**
- * Draw a marker
- */
- public void DrawMarker(GeoPoint markerPoint) {
-
- if (nowMarker != null && app.mapInfo.myInfo.level >= nowMarkerLevel) {
- nowMarker.setGeoPoint(markerPoint);
- nowMarkerHour = newMarkerHour;
- nowMarkerMinute = newMarkerMinute;
- nowMarkerTimestamp = newMarkerTimestamp;
- nowMarkerLevel = app.mapInfo.myInfo.level;
-
- sendMarker();
- Log.d("marker", "Sent and replace");
- mOverlay.updateItem(nowMarker);
- mMapView.refresh();
- mMapController.animateTo(markerPoint);
- return;
- } else if (nowMarker == null) {
- nowMarker = new OverlayItem(markerPoint, "MARKER_NAME", "");
- nowMarker.setMarker(context.getResources().getDrawable(
- R.drawable.marker_red));
- nowMarkerHour = newMarkerHour;
- nowMarkerMinute = newMarkerMinute;
- nowMarkerTimestamp = newMarkerTimestamp;
- nowMarkerLevel = app.mapInfo.myInfo.level;
-
- sendMarker();
- Log.d("marker", "Send and new");
- markerIndex = mOverlay.getAllItem().size();
- Log.d("marker", "my new marker created");
- mOverlay.addItem(nowMarker);
- mMapView.refresh();
- mMapController.animateTo(markerPoint);
- }
- Toast toast = Toast.makeText(context,"创建新路标,集合时间:" + nowMarkerHour + ":" + nowMarkerMinute, 5000);
- toast.setGravity(Gravity.TOP, 0, 80);
- toast.show();
}
- public GeoPoint getMakerLocation() {
- if (nowMarker == null)
- return null;
- else
- return nowMarker.getPoint();
- }
-
- public void removeMarker() {
- if (nowMarker == null)
- return;
- mOverlay.removeItem(nowMarker);
- nowMarker = null;
- mMapView.refresh();
+ public void receiveMarker(MarkerInfo markerInfo) {
+ app.mapInfo.addMarkerInfo(markerInfo);
+ UpdateMap(app.mapInfo);
}
- public void checkMarkerTime() {
- if (nowMarker != null && nowMarkerTimestamp <= System.currentTimeMillis() / 1000) {
- AlertMaker lateAlert = new AlertMaker(context, this);
- lateAlert.showLateAlert();
- removeMarker();
- }
- }
-
/**
* Remove all other users
*/