package com.rubika.aotalk.map;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.ImageView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.qozix.mapview.MapView;
import com.qozix.mapview.MapView.MapEventListener;
import com.qozix.mapview.tiles.MapTileDecoder;
import com.qozix.mapview.tiles.MapTileDecoderHttp;
import com.rubika.aotalk.Preferences;
import com.rubika.aotalk.R;
import com.rubika.aotalk.adapter.MapTypeAdapter;
import com.rubika.aotalk.item.MapType;
import com.rubika.aotalk.util.Logging;
import com.rubika.aotalk.util.RKNet;
import com.rubika.aotalk.util.Statics;
public class Map extends SherlockFragmentActivity {
private static final String APP_TAG = "--> The Leet :: Map";
private Context context;
private List<MarkerView> rk_markers;
private List<MarkerView> sl_markers;
private List<MarkerView> rk_markers_from_external;
private List<MarkerView> sl_markers_from_external;
private MapView mapView;
private FrameLayout frame;
private ActionBar bar;
private MapTileDecoder mapTileDecoder;
private FrameLayout.LayoutParams mapViewLayout = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);;
private Handler RKNLocationHandler = new Handler();
private long RKNLocationUpdateTime = 2000;
private boolean RKNLocationIsUpdating = false;
private boolean DoRKNLocationUpdates = false;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//super.setTheme(R.style.Theme_AOTalkTheme_Light);
context = this;
frame = new FrameLayout(this);
Logging.log(APP_TAG, "Setting content view");
setContentView(frame);
List<MapType> list = new ArrayList<MapType>();
list.add(new MapType("Atlas of Rubi-Ka", 0));
list.add(new MapType("Atlas of Shadowlands", 0));
MapTypeAdapter mapAdapter = new MapTypeAdapter(this, R.id.messagelist, list);
mapTileDecoder = new MapTileDecoderHttp();
bar = getSupportActionBar();
Intent intent = getIntent();
final Bundle extras = intent.getExtras();
rk_markers = new ArrayList<MarkerView>();
sl_markers = new ArrayList<MarkerView>();
rk_markers_from_external = new ArrayList<MarkerView>();
sl_markers_from_external = new ArrayList<MarkerView>();
if (extras != null) {
Logging.log(APP_TAG, "Got coordinates from extras");
Integer[] pos = ZoneTools.getRealPosition(context, extras.getString("zone"), extras.getInt("x"), extras.getInt("y"));
Marker marker = new Marker();
marker.setTitle(extras.getString("name"));
marker.setZone(extras.getString("zone"));
marker.setX(pos[0]);
marker.setY(pos[1]);
marker.setOnRK(pos[2] == 1);
if (marker.isOnRK())
{
rk_markers_from_external.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
}
else
{
sl_markers_from_external.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
}
}
if (getIntent().getData() != null) {
if(getIntent().getData().toString().startsWith("aomap")) {
Logging.log(APP_TAG, "Got coordinates from intent");
String values[] = Uri.decode(getIntent().getData().toString()).replace("aomap://", "").trim().split("/");
Integer[] pos = ZoneTools.getRealPosition(context, values[1], Integer.parseInt(values[2]), Integer.parseInt(values[3]));
Marker marker = new Marker();
marker.setTitle(values[0]);
marker.setZone(values[1]);
marker.setX(pos[0]);
marker.setY(pos[1]);
marker.setOnRK(pos[2] == 1);
if (marker.isOnRK())
{
rk_markers_from_external.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
}
else
{
sl_markers_from_external.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
}
}
}
bar.setDisplayShowTitleEnabled(false);
bar.setDisplayHomeAsUpEnabled(true);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(mapAdapter, new OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition , long itemId) {
removeMarkers();
updateMap();
return true;
}
});
if (rk_markers.size() > 0)
{
bar.setSelectedNavigationItem(0);
}
else if (sl_markers.size() > 0)
{
bar.setSelectedNavigationItem(1);
}
else
{
bar.setSelectedNavigationItem(0);
}
Logging.log(APP_TAG, "Loading mapview");
initializeMapView(context);
setRKZoomLevels();
setLowresImage();
frame.addView(mapView, mapViewLayout);
}
private void setRKZoomLevels() {
if (mapView != null) {
mapView.addZoomLevel(7168, 9216, "https://rubi-ka.net/LeetContent/maps/aork/5/map_%row%_%col%.jpg", 1024, 1024);
mapView.addZoomLevel(3584, 4608, "https://rubi-ka.net/LeetContent/maps/aork/4/map_%row%_%col%.jpg", 512, 512);
mapView.addZoomLevel(1792, 2304, "https://rubi-ka.net/LeetContent/maps/aork/3/map_%row%_%col%.jpg", 256, 256);
mapView.addZoomLevel(896, 1152, "https://rubi-ka.net/LeetContent/maps/aork/2/map_%row%_%col%.jpg", 128, 128);
mapView.addZoomLevel(448, 576, "https://rubi-ka.net/LeetContent/maps/aork/1/map_%row%_%col%.jpg", 64, 64);
}
}
private void setSLZoomLevels() {
if (mapView != null) {
mapView.addZoomLevel(6144, 24576, "https://rubi-ka.net/LeetContent/maps/aosl/5/map_%row%_%col%.jpg", 1024, 1024);
mapView.addZoomLevel(3072, 12288, "https://rubi-ka.net/LeetContent/maps/aosl/4/map_%row%_%col%.jpg", 512, 512);
mapView.addZoomLevel(1536, 6144, "https://rubi-ka.net/LeetContent/maps/aosl/3/map_%row%_%col%.jpg", 256, 256);
mapView.addZoomLevel(768, 3072, "https://rubi-ka.net/LeetContent/maps/aosl/2/map_%row%_%col%.jpg", 128, 128);
mapView.addZoomLevel(384, 1536, "https://rubi-ka.net/LeetContent/maps/aosl/1/map_%row%_%col%.jpg", 64, 64);
}
}
private void updateMap() {
int itemPosition = bar.getSelectedNavigationIndex();
mapView.resetZoomLevels();
if (itemPosition == 0)
{
setRKZoomLevels();
}
else if (itemPosition == 1)
{
setSLZoomLevels();
}
mapView.clear();
insertMarkers();
setLowresImage();
mapView.requestRender();
}
private void setLowresImage() {
int itemPosition = bar.getSelectedNavigationIndex();
int currentZoom = mapView.getZoom();
if (mapView != null) {
View child = mapView.getChildAt(0);
/*
if (itemPosition == 0)
{
child.setBackgroundResource(R.drawable.rk_lowres_2);
}
else if (itemPosition == 1)
{
child.setBackgroundResource(R.drawable.sl_lowres_2);
}
*/
if (child != null) {
if (itemPosition == 0)
{
switch (currentZoom) {
case 0:
child.setBackgroundResource(R.drawable.rk_lowres_1);
break;
case 1:
child.setBackgroundResource(R.drawable.rk_lowres_2);
break;
case 2:
child.setBackgroundResource(R.drawable.rk_lowres_3);
break;
case 3:
child.setBackgroundResource(R.drawable.rk_lowres_4);
break;
case 4:
child.setBackgroundResource(R.drawable.rk_lowres_4);
break;
default:
child.setBackgroundResource(R.drawable.rk_lowres_4);
break;
}
}
else if (itemPosition == 1)
{
switch (currentZoom) {
case 0:
child.setBackgroundResource(R.drawable.sl_lowres_1);
break;
case 1:
child.setBackgroundResource(R.drawable.sl_lowres_2);
break;
case 2:
child.setBackgroundResource(R.drawable.sl_lowres_3);
break;
case 3:
child.setBackgroundResource(R.drawable.sl_lowres_4);
break;
case 4:
child.setBackgroundResource(R.drawable.sl_lowres_4);
break;
default:
child.setBackgroundResource(R.drawable.sl_lowres_4);
break;
}
}
}
}
System.gc();
}
private void updateMarkers() {
for(MarkerView marker : rk_markers)
{
mapView.updateMarker(marker.view.getTag(), marker.X, marker.Y);
}
for(MarkerView marker : sl_markers)
{
mapView.updateMarker(marker.view.getTag(), marker.X, marker.Y);
}
for(MarkerView marker : rk_markers_from_external)
{
mapView.updateMarker(marker.view.getTag(), marker.X, marker.Y);
}
for(MarkerView marker : sl_markers_from_external)
{
mapView.updateMarker(marker.view.getTag(), marker.X, marker.Y);
}
}
private void removeMarkers() {
if (mapView != null) {
mapView.removeAllMarkers();
/*
for(MarkerView marker : rk_markers)
{
mapView.removeMarker(marker.view);
}
for(MarkerView marker : sl_markers)
{
mapView.removeMarker(marker.view);
}
for(MarkerView marker : rk_markers_from_external)
{
mapView.removeMarker(marker.view);
}
for(MarkerView marker : sl_markers_from_external)
{
mapView.removeMarker(marker.view);
}
*/
//mapView.clear();
//mapView.requestRender();
}
}
private void insertMarkers() {
int itemPosition = bar.getSelectedNavigationIndex();
if (mapView != null) {
int totalMarkers = 0;
if (itemPosition == 0)
{
for(MarkerView marker : rk_markers)
{
mapView.addMarker(marker.view, marker.X, marker.Y, true);
totalMarkers++;
}
for(MarkerView marker : rk_markers_from_external)
{
mapView.addMarker(marker.view, marker.X, marker.Y, true);
totalMarkers++;
}
if (totalMarkers == 1)
{
if (rk_markers.size() > 0) {
mapView.moveToAndCenter(rk_markers.get(0).X, rk_markers.get(0).Y);
} else {
mapView.moveToAndCenter(rk_markers_from_external.get(0).X, rk_markers_from_external.get(0).Y);
}
}
}
else if (itemPosition == 1)
{
for(MarkerView marker : sl_markers)
{
mapView.addMarker(marker.view, marker.X, marker.Y, true);
totalMarkers++;
}
for(MarkerView marker : sl_markers_from_external)
{
mapView.addMarker(marker.view, marker.X, marker.Y, true);
totalMarkers++;
}
if (totalMarkers == 1)
{
if (sl_markers.size() > 0) {
mapView.moveToAndCenter(sl_markers.get(0).X, sl_markers.get(0).Y);
} else {
mapView.moveToAndCenter(sl_markers_from_external.get(0).X, sl_markers_from_external.get(0).Y);
}
}
}
}
}
private ImageView createMarkerView(final Context context, final String title) {
ImageView imageView = new ImageView(context);
imageView.setImageResource(R.drawable.marker);
imageView.setTag(title);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Logging.toast(context, title);
}
});
return imageView;
}
private void initializeMapView(final Context context) {
mapView = new MapView(this);
mapView.setBackgroundColor(Color.BLACK);
mapView.setMarkerAnchorPoints(-0.5f, -0.5f);
mapView.setShouldIntercept(true);
mapView.setCacheEnabled(true);
mapView.setTileDecoder(mapTileDecoder);
//mapView.setScaleToFit(true);
//mapView.setZoom(1);
mapView.addMapEventListener(new MapEventListener() {
@Override
public void onFingerDown(int x, int y) {
}
@Override
public void onFingerUp(int x, int y) {
}
@Override
public void onDrag(int x, int y) {
}
@Override
public void onDoubleTap(int x, int y) {
}
@Override
public void onTap(int x, int y) {
}
@Override
public void onPinch(int x, int y) {
}
@Override
public void onPinchStart(int x, int y) {
}
@Override
public void onPinchComplete(int x, int y) {
}
@Override
public void onFling(int sx, int sy, int dx, int dy) {
}
@Override
public void onFlingComplete(int x, int y) {
}
@Override
public void onScaleChanged(double scale) {
}
@Override
public void onScrollChanged(int x, int y) {
}
@Override
public void onZoomStart(double scale) {
}
@Override
public void onZoomComplete(double scale) {
}
@Override
public void onZoomLevelChanged(int oldZoom, int currentZoom) {
mapView.clear();
setLowresImage();
}
@Override
public void onRenderStart() {
}
@Override
public void onRenderComplete() {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.menu_map, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
} else if (item.getItemId() == R.id.preferences) {
Intent intent = new Intent(this, Preferences.class);
startActivity(intent);
return true;
} else if (item.getItemId() == R.id.aoumarkers) {
new GetAOUPoints().execute();
return true;
} else if (item.getItemId() == R.id.rknmarkers) {
if (!DoRKNLocationUpdates) {
RKNLocationHandler.post(RKNLocationUpdateTask);
DoRKNLocationUpdates = true;
} else {
RKNLocationHandler.removeCallbacks(RKNLocationUpdateTask);
DoRKNLocationUpdates = false;
}
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
public class GetRKNPoints extends AsyncTask<Void, Void, String> {
private AccountManager accountManager;
private Account[] accounts;
@Override
protected void onPreExecute() {
rk_markers.clear();
sl_markers.clear();
//rk_markers_from_external.clear();
//sl_markers_from_external.clear();
}
@Override
protected void onPostExecute(String result) {
removeMarkers();
insertMarkers();
//updateMarkers();
}
@Override
protected String doInBackground(Void... params) {
accountManager = AccountManager.get(context);
accounts = accountManager.getAccountsByType(context.getString(R.string.account_type));
HttpClient httpclient;
HttpPost httppost;
HttpResponse response;
HttpEntity entity;
InputStream is;
BufferedReader reader;
StringBuilder sb;
String line;
JSONArray jArray;
JSONObject json_data;
String resultData;
if (accounts != null && accounts.length > 0) {
try {
JSONObject j = new JSONObject();
j.put("Username", accounts[0].name);
j.put("Password", accountManager.getPassword(accounts[0]));
Logging.log(APP_TAG, "Account: " + j.toString(1));
httpclient = new DefaultHttpClient();
httppost = new HttpPost(RKNet.getApiMapPath(RKNet.RKNET_MAP_ALLCHARS));
Logging.log(APP_TAG, "Connection: " + RKNet.getApiMapPath(RKNet.RKNET_MAP_ALLCHARS));
httppost.setEntity(new StringEntity(j.toString()));
httppost.setHeader("Accept", "application/json");
httppost.setHeader("Content-type", "application/json");
response = httpclient.execute(httppost);
entity = response.getEntity();
is = entity.getContent();
try {
reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
sb = new StringBuilder();
line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
resultData = sb.toString();
} catch(Exception e) {
Logging.log(APP_TAG, e.toString());
resultData = null;
}
} catch(Exception e) {
Logging.log(APP_TAG, e.toString());
resultData = null;
}
try {
if(resultData != null) {
resultData = resultData.substring(0, resultData.lastIndexOf("}")).replace("{\"d\":", "");
Logging.log(APP_TAG, resultData);
if((!resultData.startsWith("null"))) {
jArray = new JSONArray(resultData);
for(int i = 0; i < jArray.length(); i++){
json_data = jArray.getJSONObject(i);
Integer[] pos = ZoneTools.getRealPosition(
context,
json_data.getInt("Zone"),
(int) Math.round(Double.parseDouble(json_data.getString("X"))),
(int) Math.round(Double.parseDouble(json_data.getString("Y")))
);
Marker marker = new Marker();
marker.setTitle(json_data.getString("NickName"));
marker.setZoneId(json_data.getInt("Zone"));
marker.setX(pos[0]);
marker.setY(pos[1]);
marker.setOnRK(pos[2] == 1);
if (pos[2] == 1) {
rk_markers.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
} else {
sl_markers.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
}
}
}
}
} catch(JSONException e) {
Logging.log(APP_TAG, "Error parsing data " + e.toString());
}
} else {
Logging.log(APP_TAG, "No accounts!");
DoRKNLocationUpdates = false;
}
return null;
}
}
public class GetAOUPoints extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
rk_markers.clear();
sl_markers.clear();
}
@Override
protected void onPostExecute(String result) {
removeMarkers();
insertMarkers();
}
@Override
protected String doInBackground(Void... params) {
String xml = null;
Document doc = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(Statics.GUIDES_LOCATION_URL);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
Logging.log(APP_TAG, e.getMessage());
} catch (ClientProtocolException e) {
Logging.log(APP_TAG, e.getMessage());
} catch (IOException e) {
Logging.log(APP_TAG, e.getMessage());
}
if (xml != null) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Logging.log(APP_TAG, e.getMessage());
return null;
} catch (SAXException e) {
Logging.log(APP_TAG, e.getMessage());
return null;
} catch (IOException e) {
Logging.log(APP_TAG, e.getMessage());
return null;
}
}
if (doc != null) {
NodeList nl = doc.getElementsByTagName("waypoint");
for (int i = nl.getLength() - 1; i >= 0; i--) {
Element e = (Element) nl.item(i);
Integer[] pos = ZoneTools.getRealPosition(context, Integer.parseInt(getValue(e, "pfid")), (int) Math.round(Double.parseDouble(getValue(e, "xcoord"))), (int) Math.round(Double.parseDouble(getValue(e, "ycoord"))));
Marker marker = new Marker();
marker.setTitle(getValue(e, "coordname"));
marker.setZoneId(Integer.parseInt(getValue(e, "pfid")));
marker.setX(pos[0]);
marker.setY(pos[1]);
marker.setOnRK(pos[2] == 1);
if (pos[2] == 1) {
rk_markers.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
} else {
sl_markers.add(new MarkerView(createMarkerView(context, marker.getTitle()), marker.getX(), marker.getY()));
}
}
}
return null;
}
}
private static String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return getElementValue(n.item(0));
}
private static final String getElementValue( Node elem ) {
Node child;
if (elem != null) {
if (elem.hasChildNodes()) {
for (child = elem.getFirstChild(); child != null; child = child.getNextSibling()) {
if (child.getNodeType() == Node.TEXT_NODE) {
return child.getNodeValue();
}
}
}
}
return "";
}
private Runnable RKNLocationUpdateTask = new Runnable() {
public void run() {
if (!RKNLocationIsUpdating) {
new GetRKNPoints().execute();
}
if (DoRKNLocationUpdates) {
RKNLocationHandler.postDelayed(this, RKNLocationUpdateTime);
} else {
RKNLocationHandler.removeCallbacks(this);
}
}
};
@Override
public void onPause() {
super.onPause();
if (mapView != null)
{
mapView.clear();
}
}
@Override
public void onResume() {
super.onResume();
if (mapView != null)
{
mapView.requestRender();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mapView != null)
{
mapView.destroy();
mapView = null;
}
}
}