/*
* This file is part of WhereYouGo.
*
* WhereYouGo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* WhereYouGo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with WhereYouGo. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (C) 2012 Menion <whereyougo@asamm.cz>
*/
package menion.android.whereyougo.gui;
import java.util.ArrayList;
import java.util.Vector;
import locus.api.android.ActionTools;
import locus.api.android.utils.LocusUtils;
import locus.api.android.utils.RequiredVersionMissingException;
import locus.api.objects.extra.Location;
import locus.api.objects.extra.Waypoint;
import menion.android.whereyougo.Main;
import menion.android.whereyougo.R;
import menion.android.whereyougo.WUI;
import menion.android.whereyougo.gui.extension.CustomActivity;
import menion.android.whereyougo.gui.extension.CustomDialog;
import menion.android.whereyougo.hardware.location.LocationEventListener;
import menion.android.whereyougo.hardware.location.LocationState;
import menion.android.whereyougo.hardware.location.SatellitePosition;
import menion.android.whereyougo.settings.Loc;
import menion.android.whereyougo.utils.A;
import menion.android.whereyougo.utils.Logger;
import menion.android.whereyougo.utils.UtilsFormat;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import cz.matejcik.openwig.Action;
import cz.matejcik.openwig.Engine;
import cz.matejcik.openwig.EventTable;
import cz.matejcik.openwig.Media;
import cz.matejcik.openwig.Task;
import cz.matejcik.openwig.Thing;
import cz.matejcik.openwig.Zone;
// ADD locationListener to update UpdateNavi
public class Details extends CustomActivity implements Refreshable, LocationEventListener {
private static final String TAG = "Details";
public static EventTable et;
private static final String[] taskStates = {Loc.get(R.string.pending),
Loc.get(R.string.finished), Loc.get(R.string.failed)};
private TextView tvName;
private ImageView ivImage;
private TextView tvImageText;
private TextView tvDescription;
private TextView tvDistance;
private TextView tvState;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_details);
}
public void onResume() {
super.onResume();
Logger.d(TAG, "onResume(), et:" + et);
if (et != null) {
setTitle(et.name);
tvName = (TextView) findViewById(R.id.layoutDetailsTextViewName);
tvState = (TextView) findViewById(R.id.layoutDetailsTextViewState);
tvDescription = (TextView) findViewById(R.id.layoutDetailsTextViewDescription);
ivImage = (ImageView) findViewById(R.id.layoutDetailsImageViewImage);
tvImageText = (TextView) findViewById(R.id.layoutDetailsTextViewImageText);
tvDistance = (TextView) findViewById(R.id.layoutDetailsTextViewDistance);
} else {
Logger.i(TAG, "onCreate(), et == null, end!");
Details.this.finish();
}
refresh();
}
@Override
public void refresh() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!stillValid()) {
Logger.d(TAG, "refresh(), not valid anymore");
Details.this.finish();
return;
}
tvName.setText(et.name);
tvDescription.setText(et.description);
Media m = (Media) et.table.rawget("Media");
if (m != null) {
tvImageText.setText(m.altText);
//Logger.w(TAG, "SET: " + et.name + ", " + m.id);
try {
byte[] is = Engine.mediaFile(m);
Bitmap i = BitmapFactory.decodeByteArray(is, 0, is.length);
Main.setBitmapToImageView(i, ivImage);
} catch (Exception e) {
Logger.e(TAG, "refresh()", e);
}
} else {
ivImage.setImageBitmap(null);
ivImage.setMinimumWidth(0);
ivImage.setMinimumHeight(0);
}
updateNavi();
setBottomMenu();
}
});
}
public boolean stillValid() {
if (et != null) {
if (et instanceof Thing) {
return ((Thing) et).visibleToPlayer();
}
return et.isVisible();
} else
return false;
}
private void updateNavi() {
if (!(et instanceof Zone)) {
return;
}
Zone z = (Zone) et;
String ss = "(nothing)";
switch (z.contain) {
case Zone.DISTANT: ss = "distant"; break;
case Zone.PROXIMITY: ss = "near"; break;
case Zone.INSIDE: ss = "inside"; break;
}
tvState.setText("State: " + ss);
if (z.contain == Zone.INSIDE) {
tvDistance.setText("Distance: inside");
} else {
tvDistance.setText("Distance: " + UtilsFormat.formatDistance(z.distance, false));
}
}
private void setBottomMenu() {
String btn01 = null, btn02 = null, btn03 = null;
CustomDialog.OnClickListener btn01Click = null, btn02Click = null, btn03Click = null;
// get count of items
boolean location = et.isLocated();
int actions = 0;
Vector<Object> validActions = null;
if (et instanceof Thing) {
Thing t = (Thing) et;
actions = t.visibleActions() + Engine.instance.cartridge.visibleUniversalActions();
Logger.d(TAG, "actions:" + actions);
validActions = ListActions.getValidActions(t);
actions = validActions.size();
Logger.d(TAG, "validActions:" + actions);
}
Logger.d(TAG, "setBottomMenu(), loc:" + et.isLocated() + ", et:" + et + ", act:" + actions);
// set location on first two buttons
if (location) {
btn01 = getString(R.string.navigate);
btn01Click = new CustomDialog.OnClickListener() {
@Override
public boolean onClick(CustomDialog dialog, View v, int btn) {
try {
enableGuideOnEventTable();
Main.callGudingScreen(Details.this);
} catch (Exception e) {
Logger.w(TAG, "btn01.click() - unknown problem");
}
return true;
}
};
btn02 = getString(R.string.map);
btn02Click = new CustomDialog.OnClickListener() {
@Override
public boolean onClick(CustomDialog dialog, View v, int btn) {
try {
Waypoint wpt = getTargetWaypoint();
if (wpt != null) {
ActionTools.actionStartGuiding(Details.this, wpt);
} else {
Logger.d(TAG, "enableGuideOnEventTable(), waypoint 'null'");
}
} catch (RequiredVersionMissingException e) {
Logger.e(TAG, "btn02.click() - missing locus version", e);
LocusUtils.callInstallLocus(Details.this);
} catch (Exception e) {
Logger.e(TAG, "btn02.click() - unknown problem", e);
}
return true;
}
};
}
// set actions
if (actions > 0) {
if (location) {
// only one empty button, set actions on it
btn03 = "Actions (" + actions + ")";
btn03Click = new CustomDialog.OnClickListener() {
@Override
public boolean onClick(CustomDialog dialog, View v, int btn) {
ListActions.reset((Thing) et);
Main.wui.showScreen(WUI.SCREEN_ACTIONS, et);
Details.this.finish();
return true;
}
};
} else {
// all three buttons free
if (actions <= 3) {
if (actions > 0) {
final Action action = (Action) validActions.get(0);
btn01 = action.text;
btn01Click = new CustomDialog.OnClickListener() {
@Override
public boolean onClick(CustomDialog dialog, View v, int btn) {
ListActions.reset((Thing) et);
ListActions.callAction(action);
Details.this.finish();
return true;
}
};
}
if (actions > 1) {
final Action action = (Action) validActions.get(1);
btn02 = action.text;
btn02Click = new CustomDialog.OnClickListener() {
@Override
public boolean onClick(CustomDialog dialog, View v, int btn) {
ListActions.reset((Thing) et);
ListActions.callAction(action);
Details.this.finish();
return true;
}
};
}
if (actions > 2) {
final Action action = (Action) validActions.get(2);
btn03 = action.text;
btn03Click = new CustomDialog.OnClickListener() {
@Override
public boolean onClick(CustomDialog dialog, View v, int btn) {
ListActions.reset((Thing) et);
ListActions.callAction(action);
Details.this.finish();
return true;
}
};
}
} else {
btn03 = "Actions (" + actions + ")";
btn03Click = new CustomDialog.OnClickListener() {
@Override
public boolean onClick(CustomDialog dialog, View v, int btn) {
ListActions.reset((Thing) et);
Main.wui.showScreen(WUI.SCREEN_ACTIONS, et);
Details.this.finish();
return true;
}
};
}
}
}
// show bottom menu
CustomDialog.setBottom(this,
btn01, btn01Click,
btn02, btn02Click,
btn03, btn03Click);
// set title text
if (et instanceof Task) {
Task t = (Task) et;
tvState.setText(taskStates[t.state()]);
}
}
private void enableGuideOnEventTable() {
Waypoint wpt = getTargetWaypoint();
if (wpt != null) {
A.getGuidingContent().guideStart(wpt);
} else {
Logger.d(TAG, "enableGuideOnEventTable(), waypoint 'null'");
}
}
private Waypoint getTargetWaypoint() {
if (et == null || !et.isLocated())
return null;
if (et instanceof Zone) {
Zone z = ((Zone) et);
Location loc = new Location(TAG);
loc.setLatitude(z.nearestPoint.latitude);
loc.setLongitude(z.nearestPoint.longitude);
return new Waypoint(et.name, loc);
} else {
Location loc = new Location(TAG);
loc.setLatitude(et.position.latitude);
loc.setLongitude(et.position.longitude);
return new Waypoint(et.name, loc);
}
}
public void onStart() {
super.onStart();
if (et instanceof Zone)
LocationState.addLocationChangeListener(this);
}
public void onStop() {
super.onStop();
LocationState.removeLocationChangeListener(this);
}
public void onLocationChanged(Location location) {
refresh();
}
public void onStatusChanged(String provider, int state, Bundle extras) {}
public void onGpsStatusChanged(int event, ArrayList<SatellitePosition> sats) {
}
public int getPriority() {
return LocationEventListener.PRIORITY_MEDIUM;
}
@Override
public boolean isRequired() {
return false;
}
@Override
public String getName() {
return TAG;
}
}