package com.evancharlton.mileage;
import com.evancharlton.mileage.adapters.FillupAdapter;
import com.evancharlton.mileage.dao.Vehicle;
import com.evancharlton.mileage.provider.tables.FillupsTable;
import com.evancharlton.mileage.services.RecalculateEconomyService;
import com.evancharlton.mileage.views.CursorSpinner;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
public class FillupListActivity extends Activity {
private static final String TAG = "FillupListActivity";
private CursorSpinner mVehicles;
private Vehicle mVehicle;
private FillupAdapter mAdapter;
private ListView mList;
private final BroadcastReceiver mCalculationFinishedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mAdapter.calculationFinished(intent.getDoubleExtra(
RecalculateEconomyService.EXTRA_AVERAGE_ECONOMY, 0D));
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fillup_list);
initUI();
}
@Override
protected void onResume() {
mAdapter.requery();
super.onResume();
registerReceiver(mCalculationFinishedReceiver, new IntentFilter(
RecalculateEconomyService.CALCULATION_FINISHED));
}
@Override
protected void onPause() {
unregisterReceiver(mCalculationFinishedReceiver);
super.onPause();
}
protected void initUI() {
mVehicles = (CursorSpinner) findViewById(R.id.vehicle);
mVehicles.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> list, View row, int position, long id) {
mVehicle = getVehicle();
// Change the adapter's vehicle
mAdapter.setVehicle(mVehicle);
// Start a new task
calculate();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
mVehicle = getVehicle();
mAdapter = new FillupAdapter(this, getVehicle());
mList = (ListView) findViewById(android.R.id.list);
mList.setAdapter(mAdapter);
registerForContextMenu(mList);
mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> row, View view, int position, long id) {
openFillup(id);
}
});
calculate();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, R.string.edit, Menu.NONE, R.string.edit);
menu.add(Menu.NONE, R.string.delete, Menu.NONE, R.string.delete);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.string.edit:
editFillup(info.id);
return true;
case R.string.delete:
showDeleteDialog(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
private void openFillup(long id) {
Intent intent = new Intent(this, FillupInfoActivity.class);
intent.putExtra(BaseFormActivity.EXTRA_ITEM_ID, id);
startActivity(intent);
}
private void editFillup(long id) {
Intent intent = new Intent(this, FillupActivity.class);
intent.putExtra(BaseFormActivity.EXTRA_ITEM_ID, id);
startActivity(intent);
}
private void showDeleteDialog(final long id) {
showDeleteDialog(new Runnable() {
@Override
public void run() {
Uri uri = ContentUris.withAppendedId(FillupsTable.BASE_URI, id);
getContentResolver().delete(uri, null, null);
}
});
}
protected void showDeleteDialog(final Runnable deleteAction) {
// TODO(3.1) - This dialog doesn't persist through rotations.
Dialog deleteDialog =
new AlertDialog.Builder(this)
.setTitle(R.string.dialog_title_delete)
.setMessage(R.string.dialog_message_delete)
.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
deleteAction.run();
dialog.dismiss();
}
})
.setNegativeButton(android.R.string.no,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
deleteDialog.show();
}
private void calculate() {
RecalculateEconomyService.run(this, mVehicle);
}
protected final Vehicle getVehicle() {
Vehicle vehicle = Vehicle.loadById(this, mVehicles.getSelectedItemId());
if (vehicle == null) {
Log.e(TAG, "Unable to load vehicle #" + mVehicles.getSelectedItemId());
throw new IllegalStateException("Unable to load vehicle #"
+ mVehicles.getSelectedItemId());
}
return vehicle;
}
}