/*
LogMyNight - Android app for logging night activities.
Copyright (c) 2010 Michael Greifeneder <mikegr@gmx.net>, Oliver Selinger <oliver.selinger@gmail.com>
This program 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.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package at.madexperts.logmynight;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import at.madexperts.logmynight.chart.BarChartView;
import at.madexperts.logmynight.chart.BarItem;
import at.madexperts.logmynight.facebook.FacebookActivity;
public class HistoryActivity extends Activity implements OnClickListener,
OnItemClickListener {
private static final String TAG = HistoryActivity.class.getName();
private SQLiteDatabase db;
private ListView listView;
private ListView sumView;
private Button button;
private TextView checkLabel;
private BarChartView barChartView;
private static final int MESSAGE_PUBLISHED = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
db = new DatabaseHelper(this).getReadableDatabase();
/* First, get the Display from the WindowManager */
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay();
/* Now we can retrieve all display-related infos */
int orientation = display.getOrientation();
Log.d(TAG, "Orientation: " + orientation);
if (orientation == 0) {
setContentView(R.layout.history);
listView = (ListView) findViewById(R.id.historyListView);
View view = getLayoutInflater().inflate(R.layout.historyheader,
null);
((TextView) view.findViewById(R.id.historyRowName))
.setText("Drink");
((TextView) view.findViewById(R.id.historyRowSum)).setText("Summe");
((TextView) view.findViewById(R.id.historyRowAmount))
.setText("Menge");
listView.addHeaderView(view);
checkLabel = (TextView) findViewById(R.id.checkText);
checkLabel.setText("letzten 24h");
sumView = (ListView) findViewById(R.id.historySum);
button = (Button) findViewById(R.id.historyTimeButton);
button.setOnClickListener(this);
showHistory(1);
} else {
setContentView(R.layout.barchart);
days = (Integer) getLastNonConfigurationInstance();
if (days == null)
days = 1;
createBarChartDataList(days);
barChartView = (BarChartView) findViewById(R.id.barChartView);
barChartView.setData(barChartData);
}
}
Integer days;
@Override
public Object onRetainNonConfigurationInstance() {
Log.d(TAG, "onRetainNonConfigurationInstance");
return days;
}
public void onConfigurationChanged(Configuration configuration) {
super.onConfigurationChanged(configuration);
Log.d(TAG, "onConfigurationChanged");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.historymenu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.shareMenuItem:
share("Message from Android!");
return true;
}
// TODO Auto-generated method stub
return super.onOptionsItemSelected(item);
}
private void share(String txt) {
Intent intent = new Intent(this, FacebookActivity.class);
intent.putExtra("message", txt);
startActivity(intent);
}
private Dialog dlg;
private ListView timeView;
public void onClick(View v) {
Log.d(TAG, "onClick from ID: " + v.getId());
ArrayAdapter<String> a = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
new String[] { "letzten 24h", "letzte Woche", "letzter Monat",
"Alle" });
timeView = new ListView(this);
timeView.setAdapter(a);
timeView.setOnItemClickListener(this);
dlg = new Dialog(this);
dlg.setContentView(timeView);
dlg.setTitle("Zeitraum ändern");
dlg.show();
}
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
dlg.dismiss();
Log.d(TAG, "id:" + id);
switch ((int) id) {
case 0:
showHistory(1);
checkLabel.setText("letzten 24h");
break;
case 1:
showHistory(7);
checkLabel.setText("letzte Woche");
break;
case 2:
showHistory(30);
checkLabel.setText("letzten Monat");
break;
case 3:
showHistoryAll();
checkLabel.setText("gesamter Zeitraum");
break;
default:
}
}
private void showHistoryAll() {
// TODO: implement correctly
showHistory(365);
}
private List<BarItem> barChartData;
private void createBarChartDataList(int days) {
/*******************************************************************************
* create list for chart view
*/
barChartData = new ArrayList<BarItem>();
Cursor cursor2 = db
.rawQuery(
"SELECT d._id as _id, d.name as name, COUNT(l._id) as counter, SUM(l.price) as itemsum "
+ "FROM drinks d JOIN drinklog l ON d._id = l.drink_id "
+ "WHERE l.log_time >= datetime('now', '-"
+ days + " day') " + "GROUP BY d._id, d.name",
null);
/* Get the indices of the Columns we will need */
int nameColumn = cursor2.getColumnIndex("name");
int amountColumn = cursor2.getColumnIndex("counter");
/* Check if our result was valid. */
if (cursor2 != null) {
/* Check if at least one Result was returned. */
if (cursor2.moveToFirst()) {
int i = 0;
/* Loop through all Results */
do {
i++;
/*
* Retrieve the values of the Entry the Cursor is pointing
* to.
*/
String name = cursor2.getString(nameColumn);
int amount = cursor2.getInt(amountColumn);
/*
* We can also receive the Name of a Column by its Index.
* Makes no sense, as we already know the Name, but just to
* shwo we can Wink String ageColumName =
* c.getColumnName(ageColumn);
*/
/* Add current Entry to results. */
barChartData.add(new BarItem(name, amount));
} while (cursor2.moveToNext());
}
cursor2.close();
}
}
private void showHistory(int days) {
this.days = days;
// SELECT d._id, d.name as name, COUNT(l._id) as counter, SUM(l.price)
// as itemsum FROM drinks d JOIN drinklog l ON d._id = l.drink_id WHERE
// l.log_time >= datetime('now', '-2 day') GROUP BY d._id, d.name;
Cursor cursor = db
.rawQuery(
"SELECT d._id as _id, d.name as name, d.category as category, COUNT(l._id) as counter, SUM(l.price) as itemsum "
+ "FROM drinks d JOIN drinklog l ON d._id = l.drink_id "
+ "WHERE l.log_time >= datetime('now', '-"
+ days + " day') " + "GROUP BY d._id, d.name",
null); // new String[] {Integer.toString(days)});
// SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
// R.layout.historyrow, cursor, new String[] { "name", "counter",
// "itemsum" }, new int[] { R.id.historyRowName,
// R.id.historyRowAmount, R.id.historyRowSum });
Cursor sumCursor = db
.rawQuery(
"SELECT '0' as _id, 'Summe:' as name, COUNT(l._id) as counter, SUM(l.price) as itemsum "
+ "FROM drinks d JOIN drinklog l ON d._id = l.drink_id "
+ "WHERE l.log_time >= datetime('now', '-"
+ days + " day') ", null); // new String[]
// {Integer.toString(days)});
SimpleCursorAdapter sumAdapter = new I18NSimpleCursorAdapter(this,
R.layout.historysum, sumCursor, new String[] { "name",
"counter", "itemsum" }, new int[] {
R.id.historyRowName, R.id.historyRowAmount,
R.id.historyRowSum }, new int[]{0}) {
NumberFormat format = NumberFormat.getNumberInstance();
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text = (TextView) view.findViewById(R.id.historyRowSum);
Cursor c = getCursor();
text.setText(format.format(c.getInt(c.getColumnIndex("itemsum"))/100d));
return view;
}
};
sumView.setAdapter(sumAdapter);
listView.setAdapter(new ImageAdapter(this, cursor));
}
class ImageAdapter extends I18NSimpleCursorAdapter {
private String header;
private NumberFormat format;
public ImageAdapter(Context ctx, Cursor cursor) {
super(ctx, R.layout.historyrow, cursor, new String[] { "category", "name",
"counter", "itemsum" }, new int[] { R.id.historyRowImage,
R.id.historyRowName, R.id.historyRowAmount,
R.id.historyRowSum }, new int[] {1});
format = NumberFormat.getNumberInstance();
format.setMinimumFractionDigits(2);
}
/*
* @Override
*
* public void setViewImage(ImageView v, String value) { Log.d(TAG,
* "setImageView: " + value); super.setViewImage(v, getIcon(value)); }
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d(TAG, "Requested in Gradient " + header + ":" + position);
View view = super.getView(position, convertView, parent);
// setBackgroundResource(R.drawable.entry);
//view.setBackgroundResource(R.drawable.entry);
ImageView imageView = (ImageView) view.findViewById(R.id.historyRowImage);
Cursor cursor = getCursor();
int category = cursor.getInt(cursor.getColumnIndex("category"));
imageView.setImageResource(Utilities.getIcon(category));
TextView text = (TextView) view.findViewById(R.id.historyRowSum);
text.setText(format.format(cursor.getLong(cursor.getColumnIndex("itemsum"))/100d));
/*
* TextView sumText = (TextView) view.findViewById(R.id.historyRowSum);
* sumText.setText(format.format(cursor.getLong(cursor.getColumnIndex("itemsum"))/100d));
*/
return view;
}
}
@Override
protected void onDestroy() {
db.close();
super.onDestroy();
}
}