package com.boombuler.piraten.map;
import com.boombuler.piraten.map.data.DBAdapter;
import com.boombuler.piraten.map.data.PlakatOverlayItem;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.res.Resources;
import android.database.DataSetObserver;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
public class PlakatDetailsActivity extends Activity
implements OnClickListener {
class MarkerTypeAdapter implements SpinnerAdapter {
class ViewHolder {
public TextView textView;
public ImageView imageView;
}
private String[] mTitles;
private Drawable[] mIcons;
private LayoutInflater mInflater;
public MarkerTypeAdapter() {
Resources res = PlakatDetailsActivity.this.getResources();
mInflater = PlakatDetailsActivity.this.getLayoutInflater();
mTitles = res.getStringArray(R.array.markertypes);
mIcons = new Drawable[] {
res.getDrawable(R.drawable.plakat_default),
res.getDrawable(R.drawable.plakat_ok),
res.getDrawable(R.drawable.plakat_dieb),
res.getDrawable(R.drawable.plakat_niceplace),
res.getDrawable(R.drawable.wand),
res.getDrawable(R.drawable.wand_ok),
res.getDrawable(R.drawable.plakat_wrecked),
res.getDrawable(R.drawable.plakat_a0)};
}
public int getCount() {
return mTitles.length;
}
public Object getItem(int position) {
return mTitles[position];
}
public long getItemId(int position) {
return position;
}
public int getItemViewType(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.textandicon, parent, false);
ViewHolder vh = new ViewHolder();
vh.textView = (TextView)convertView.findViewById(R.id.textView);
vh.imageView = (ImageView)convertView.findViewById(R.id.imageView);
convertView.setTag(vh);
}
ViewHolder holder = (ViewHolder)convertView.getTag();
holder.textView.setText(mTitles[position]);
holder.imageView.setImageDrawable(mIcons[position]);
return convertView;
}
public int getViewTypeCount() {
return 1;
}
public boolean hasStableIds() {
return true;
}
public boolean isEmpty() {
return false;
}
public void registerDataSetObserver(DataSetObserver observer) {
}
public void unregisterDataSetObserver(DataSetObserver observer) {
}
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
return getView(position, convertView, parent);
}
}
public static final String EXTRA_PLAKAT_ID = "com.boombuler.piraten.map.EXTRA_PLAKAT_ID";
public static final String EXTRA_NEW_PLAKAT = "com.boombuler.piraten.map.EXTRA_NEW_PLAKAT";
private Button mSaveButton;
private MenuItem mSaveItem;
private Spinner mMarkerTypeSpinner;
private EditText mComment;
private boolean mIsNew;
private int mId;
private float mMinAccuracy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setResult(RESULT_CANCELED);
Intent intent = getIntent();
mId = intent.getIntExtra(EXTRA_PLAKAT_ID, -1);
mIsNew = intent.getBooleanExtra(EXTRA_NEW_PLAKAT, false);
if (mId < 0 && !mIsNew)
finish();
setContentView(R.layout.details);
mSaveButton = (Button)findViewById(R.id.btSave);
if (mSaveButton != null)
mSaveButton.setOnClickListener(this);
mMarkerTypeSpinner = (Spinner)findViewById(R.id.spMarkerType);
mMarkerTypeSpinner.setAdapter(new MarkerTypeAdapter());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
getActionBar().setDisplayHomeAsUpEnabled(true);
}
mComment = (EditText)findViewById(R.id.tvComment);
if (!mIsNew) {
PlakatOverlayItem item = null;
DBAdapter adapter = new DBAdapter(this);
try {
adapter.open();
item = adapter.getOverlayItem(mId);
} finally {
adapter.close();
}
if (item != null) {
mMarkerTypeSpinner.setSelection(item.getType());
mComment.setText(item.getComment());
}
}else {
mMinAccuracy = ((float)PreferenceManager.getDefaultSharedPreferences(this).getInt(SettingsActivity.KEY_ACCURACY, 70)) / 10f;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.plakate_details, menu);
menu.findItem(R.id.menu_delete).setVisible(!mIsNew);
mSaveItem = menu.findItem(R.id.menu_accept).setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_delete:
Delete();
return true;
case R.id.menu_accept:
Save();
return true;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
if (item.getItemId() == android.R.id.home)
this.finish();
}
return super.onOptionsItemSelected(item);
}
private void Delete() {
final AlertDialog.Builder ab = new AlertDialog.Builder(this);
ab.setTitle(R.string.menu_delete);
ab.setMessage(R.string.ask_marker_delete);
ab.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
DBAdapter adapter = new DBAdapter(PlakatDetailsActivity.this);
try {
adapter.open();
adapter.delete(mId);
} finally {
adapter.close();
}
PlakatDetailsActivity.this.setResult(RESULT_OK);
PlakatDetailsActivity.this.finish();
}
});
ab.setNegativeButton(android.R.string.no, null);
ab.show();
}
private void Save() {
if (mSaveButton != null)
mSaveButton.setEnabled(false);
if (mSaveItem != null)
mSaveItem.setEnabled(false);
if (mIsNew)
Insert();
else
Update();
}
public void onClick(View v) {
if (v == null)
return;
if (v == mSaveButton) {
Save();
}
}
private void Update() {
DBAdapter adapter = new DBAdapter(this);
try {
adapter.open();
String comment = mComment.getText().toString();
adapter.Update(mId, mMarkerTypeSpinner.getSelectedItemPosition(), comment);
} finally {
adapter.close();
}
setResult(RESULT_OK);
finish();
}
private ProgressDialog mProgressDlg = null;
private void Insert() {
final LocationListener ll = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
public void onLocationChanged(Location location) {
CompleteInsert(location);
}
};
final LocationManager lm = (LocationManager)getSystemService(LOCATION_SERVICE);
mProgressDlg = new ProgressDialog(this);
mProgressDlg.setOwnerActivity(this);
mProgressDlg.setCancelable(true);
mProgressDlg.setCanceledOnTouchOutside(false);
mProgressDlg.setIndeterminate(true);
mProgressDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDlg.setMessage(getString(R.string.get_position));
mProgressDlg.setButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mProgressDlg.cancel();
}
});
mProgressDlg.setOnCancelListener(new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
lm.removeUpdates(ll);
if (mSaveButton != null)
mSaveButton.setEnabled(true);
if (mSaveItem != null)
mSaveItem.setEnabled(true);
}
});
mProgressDlg.setOnDismissListener(new OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
lm.removeUpdates(ll);
}
});
mProgressDlg.show();
if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER))
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);
}
private void CompleteInsert(Location loc) {
if (loc.getAccuracy() <= mMinAccuracy) {
mProgressDlg.dismiss();
DBAdapter adapter = new DBAdapter(this);
try {
adapter.open();
adapter.InsertNew(
(int)(loc.getLatitude() * 1E6),
(int)(loc.getLongitude() * 1E6),
mMarkerTypeSpinner.getSelectedItemPosition(),
mComment.getText().toString());
} finally {
adapter.close();
}
setResult(RESULT_OK);
finish();
} else {
String msg = getString(R.string.get_position) + "\n";
msg += getString(R.string.current_accuracy, loc.getAccuracy());
mProgressDlg.setMessage(msg);
}
}
}