Android Open Source - timesheet Export Activity






From Project

Back to project page timesheet.

License

The source code is released under:

GNU General Public License

If you think the Android project timesheet listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (c) 2010 Tasty Cactus Software, LLC
 * //from www.  j  a v  a2 s  .  c  o m
 * 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 2
 * 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.
 *
 * Aaron Brice <aaron@tastycactus.com>
 *
 */

package com.tastycactus.timesheet;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;
import android.os.Environment;

import android.preference.PreferenceManager;

import android.util.Log;

import android.view.View;

import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import java.util.Calendar;

import com.tastycactus.timesheet.TimesheetDatabase;

public class ExportActivity extends Activity {
    class ExportData {
        String m_start_date, m_end_date;

        public ExportData() {
            final Calendar c = Calendar.getInstance();
            m_start_date = formatDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
            m_end_date = m_start_date;
        }

        public ExportData(Cursor c, long row_id) {
            m_start_date = c.getString(c.getColumnIndex("start_date"));
            m_end_date = c.getString(c.getColumnIndex("end_date"));
        }

        /**
         *
         */
        public void set_start_date(int year, int month, int day) {
            m_start_date = formatDate(year, month, day);
        }

        public void set_end_date(int year, int month, int day) {
            m_end_date = formatDate(year, month, day);
        }

        public String start_date() {
            return m_start_date;
        }

        public String end_date() {
            return m_end_date;
        }

        private String formatDate(int year, int month, int day)
        {
            return String.format("%04d-%02d-%02d", year, month+1, day);
        }
    }

    ExportData m_data;
    Button m_start_date_button, m_end_date_button;
    String m_type, m_default_email;
    boolean m_export_billable_only;

    TimesheetDatabase m_db;

    static final int START_DATE_DIALOG_ID = 0;
    static final int END_DATE_DIALOG_ID   = 1;

    private DatePickerDialog.OnDateSetListener m_start_date_listener =
        new DatePickerDialog.OnDateSetListener() {
            public void onDateSet(DatePicker view, int year, int month, int day) {
                m_data.set_start_date(year, month, day);
                updateDisplay();
            }
        };

    private DatePickerDialog.OnDateSetListener m_end_date_listener =
        new DatePickerDialog.OnDateSetListener() {
            public void onDateSet(DatePicker view, int year, int month, int day) {
                m_data.set_end_date(year, month, day);
                updateDisplay();
            }
        };

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        m_db = new TimesheetDatabase(this);
        m_data = new ExportData();

        Bundle b = getIntent().getExtras();
        m_type = b.getString("type");

        setContentView(R.layout.export);

        SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this);
        m_export_billable_only = prefs.getBoolean("weekly_billable_only", true);
        m_default_email = prefs.getString("default_email", "");

        TextView title = (TextView) findViewById(R.id.export_title);
        if (m_type.equals("csv")) {
            title.setText("Export Time Entries to CSV");
        } else if (m_type.equals("email")) {
            title.setText("Email Time Report");
        }

        m_start_date_button = (Button) findViewById(R.id.export_start_date);
        m_start_date_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(START_DATE_DIALOG_ID);
            }
        });

        m_end_date_button = (Button) findViewById(R.id.export_end_date);
        m_end_date_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(END_DATE_DIALOG_ID);
            }
        });

        updateDisplay();

        Button exportButton = (Button) findViewById(R.id.export_button);
        final Context ctx = this;
        if (m_type.equals("csv")) {
            exportButton.setText("Export");
            exportButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    if (exportCSV(ctx) != null) {
                        setResult(RESULT_OK);
                        finish();
                    }
                }
            });
        } else if (m_type.equals("email")) {
            exportButton.setText("Email");
            exportButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    sendEmail(ctx);
                    setResult(RESULT_OK);
                    finish();
                }
            });
        }

        Button cancelButton = (Button) findViewById(R.id.cancel_button);
        cancelButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                setResult(RESULT_CANCELED);
                finish();
            }
        });
    }

    @Override
    protected void onDestroy()
    {
        m_db.close();
        super.onDestroy();
    }

    @Override
    protected Dialog onCreateDialog(int id) 
    {
        String[] items;
        switch (id) {
            case START_DATE_DIALOG_ID:
                items = m_data.start_date().split("-");
                return new DatePickerDialog(this, m_start_date_listener, 
                        Integer.parseInt(items[0]), Integer.parseInt(items[1]) - 1, Integer.parseInt(items[2]));
            case END_DATE_DIALOG_ID:
                items = m_data.end_date().split("-");
                return new DatePickerDialog(this, m_end_date_listener, 
                        Integer.parseInt(items[0]), Integer.parseInt(items[1]) - 1, Integer.parseInt(items[2]));
        }
        return null;
    }

    private void updateDisplay() 
    {
        m_start_date_button.setText(m_data.start_date());
        m_end_date_button.setText(m_data.end_date());
    }

    private String exportCSV(Context ctx)
    {
        Cursor c = m_db.getTimeEntries(m_data.start_date(), m_data.end_date());
        try {
            File root = Environment.getExternalStorageDirectory();
            if (root.canWrite()) {
                File tdir = new File(root, "timesheets");
                if (!tdir.exists()) {
                    tdir.mkdir();
                }
                String filename = "timesheet " + m_data.start_date() + " to " + m_data.end_date() + ".csv";
                File csvfile = new File(tdir, filename);
                FileWriter csvwriter = new FileWriter(csvfile);
                BufferedWriter out = new BufferedWriter(csvwriter);
                out.write("Task,Comment,Start Time,End Time,Duration\n");
                while (!c.isAfterLast()) {
                    int billable = c.getInt(c.getColumnIndex("billable"));
                    if (billable == 1 || !m_export_billable_only) {
                        out.write(c.getString(c.getColumnIndex("title")) + ",");
                        out.write(c.getString(c.getColumnIndex("comment")) + ",");
                        out.write(c.getString(c.getColumnIndex("start_time")) + ",");
                        out.write(c.getString(c.getColumnIndex("end_time")) + ",");
                        out.write(c.getString(c.getColumnIndex("duration")) + "\n");
                    }
                    c.moveToNext();
                }
                Toast.makeText(ctx, "Exported time entries to file timesheets/" + filename, Toast.LENGTH_LONG).show();
                out.close();
                return csvfile.getAbsolutePath();
            } else {
                Toast.makeText(ctx, "Could not write CSV file to SD Card", Toast.LENGTH_LONG).show();
                return null;
            }
        } catch (IOException e) {
            Log.e("Timesheet", "Could not write CSV file: " + e.getMessage());
            Toast.makeText(ctx, "Could not write CSV file to SD Card", Toast.LENGTH_LONG).show();
            return null;
        }
    }

    private String getSummaryData() {
        Cursor c = m_db.getTimeEntries(m_data.start_date(), m_data.end_date());
        StringBuilder b = new StringBuilder();

        HashMap<String, Float> total_map = new HashMap<String, Float>();
        while (!c.isAfterLast()) {
            int billable = c.getInt(c.getColumnIndex("billable"));
            if (billable == 1 || !m_export_billable_only) {
                String title = c.getString(c.getColumnIndex("title"));
                float duration = c.getFloat(c.getColumnIndex("duration"));

                // Track the total durations
                if (total_map.containsKey(title)) {
                    total_map.put(title, total_map.get(title) + duration);
                } else {
                    total_map.put(title, duration);
                }
            }

            c.moveToNext();
        }
        for (Map.Entry<String, Float> entry : total_map.entrySet()) {
            b.append(entry.getKey()).append(": ").append(String.format("%1.2f", entry.getValue())).append(" hours\n");
        }
        c.close();

        return b.toString();
    }

    private void sendEmail(Context ctx)
    {
        final String filename = exportCSV(ctx);

        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

        String subject = "Time Summary " + m_data.start_date() + " to " + m_data.end_date();

        emailIntent.setType("text/csv");
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{m_default_email});
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, getSummaryData());
        emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse("file://" + filename));
        ctx.startActivity(Intent.createChooser(emailIntent, "Send email..."));
    }
}




Java Source Code List

com.tastycactus.timesheet.ExportActivity.java
com.tastycactus.timesheet.MergeAdapter.java
com.tastycactus.timesheet.TaskEditActivity.java
com.tastycactus.timesheet.TimeEntriesActivity.java
com.tastycactus.timesheet.TimeEntryEditActivity.java
com.tastycactus.timesheet.TimesheetActivity.java
com.tastycactus.timesheet.TimesheetAppWidgetProvider.java
com.tastycactus.timesheet.TimesheetDatabase.java
com.tastycactus.timesheet.TimesheetPreferences.java