asistencia/attendance-ubb/src/main/java/cl/cromer/ubb/attendance/ClassReport.java

969 lines
39 KiB
Java

package cl.cromer.ubb.attendance;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.PowerManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.Toast;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import cl.cromer.ubb.attendance.Progress;
import cl.cromer.ubb.attendance.DBSchema.*;
public class ClassReport extends AppCompatActivity {
// SQLite database
private SQLParser sqlParser = null;
private SQLiteDatabase ubbDB = null;
// Background thread for the database
private Thread thread = null;
private Handler threadHandler = new Handler();
// Progress bar
private Progress progress = null;
private AlertDialog choiceDialog = null;
private AlertDialog confirmDialog = null;
private View reportView;
private List<Subject> subjects = new ArrayList<>();
private List<Course> courses = new ArrayList<>();
private List<Class> classes = new ArrayList<>();
private List<Attendance> students = new ArrayList<>();
private Class classObject = new Class();
private int disabledButtonColor;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_class_report);
this.context = this;
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
reportView = inflater.inflate(R.layout.view_class_report, new RelativeLayout(this), false);
// Build the add subject dialog window using the subject view
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(reportView);
builder.setPositiveButton(R.string.input_accept, null);
builder.setNegativeButton(R.string.input_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
choiceDialog = builder.create();
choiceDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
ColorStateList colorStateList = choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).getTextColors();
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setClickable(false);
choiceDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
if (colorStateList != null) {
disabledButtonColor = colorStateList.getColorForState(new int[] {-android.R.attr.state_enabled}, R.color.colorPrimary);
}
}
});
choiceDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
choiceDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
finish();
}
});
choiceDialog.setCanceledOnTouchOutside(false);
// Create a progress dialog for slow devices
progress = new Progress();
progress.show(this, 1);
progress.setCancelable(false);
// Load the SQLite database
sqlParser = new SQLParser(this);
thread = new Thread(new Runnable() {
public void run() {
ubbDB = sqlParser.getWritableDatabase();
threadHandler.post(new Runnable() {
public void run() {
databaseLoaded();
}
});
}
});
thread.start();
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
thread.interrupt();
finish();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// We need to get rid of the progressbar if it's showing
if (progress != null && progress.isShowing()) {
progress.dismiss();
}
if (choiceDialog != null && choiceDialog.isShowing()) {
choiceDialog.dismiss();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
private void databaseLoaded() {
final GetSubjects getSubjects = new GetSubjects(getApplicationContext());
getSubjects.execute();
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
getSubjects.cancel(true);
finish();
}
});
}
private AdapterView.OnItemSelectedListener subjectListener() {
return new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
courses = new ArrayList<>();
classes = new ArrayList<>();
if (position == 0) {
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(disabledButtonColor);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setClickable(false);
Spinner spinner = (Spinner) reportView.findViewById(R.id.course_spinner);
List<String> options = new ArrayList<>();
options.add(getResources().getString(R.string.report_course));
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), R.layout.view_spinner_selected_item, options);
arrayAdapter.setDropDownViewResource(R.layout.view_spinner_dropdown_item);
spinner.setAdapter(arrayAdapter);
spinner.setSelection(0);
spinner.setEnabled(false);
spinner.setClickable(false);
spinner.setOnItemSelectedListener(null);
spinner = (Spinner) reportView.findViewById(R.id.class_spinner);
options = new ArrayList<>();
options.add(getResources().getString(R.string.report_class));
arrayAdapter = new ArrayAdapter<>(getApplicationContext(), R.layout.view_spinner_selected_item, options);
arrayAdapter.setDropDownViewResource(R.layout.view_spinner_dropdown_item);
spinner.setAdapter(arrayAdapter);
spinner.setSelection(0);
spinner.setEnabled(false);
spinner.setClickable(false);
spinner.setOnItemSelectedListener(null);
}
else {
progress = new Progress();
progress.show(context, 1);
progress.setCancelable(false);
final int thePosition = position - 1;
classObject.setSubject(subjects.get(thePosition));
sqlParser = new SQLParser(getApplicationContext());
thread = new Thread(new Runnable() {
public void run() {
ubbDB = sqlParser.getWritableDatabase();
threadHandler.post(new Runnable() {
public void run() {
final GetCourses getCourses = new GetCourses(getApplicationContext());
getCourses.execute(thePosition);
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
getCourses.cancel(true);
finish();
}
});
}
});
}
});
thread.start();
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
thread.interrupt();
finish();
}
});
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
}
private AdapterView.OnItemSelectedListener courseListener() {
return new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
classes = new ArrayList<>();
if (position == 0) {
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(disabledButtonColor);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setClickable(false);
Spinner spinner = (Spinner) reportView.findViewById(R.id.class_spinner);
List<String> options = new ArrayList<>();
options.add(getResources().getString(R.string.report_class));
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), R.layout.view_spinner_selected_item, options);
arrayAdapter.setDropDownViewResource(R.layout.view_spinner_dropdown_item);
spinner.setAdapter(arrayAdapter);
spinner.setSelection(0);
spinner.setEnabled(false);
spinner.setClickable(false);
spinner.setOnItemSelectedListener(null);
}
else {
progress = new Progress();
progress.show(context, 1);
progress.setCancelable(false);
final int thePosition = position - 1;
classObject.setCourse(courses.get(thePosition));
sqlParser = new SQLParser(getApplicationContext());
thread = new Thread(new Runnable() {
public void run() {
ubbDB = sqlParser.getWritableDatabase();
threadHandler.post(new Runnable() {
public void run() {
final GetClasses getClasses = new GetClasses(getApplicationContext());
getClasses.execute(thePosition);
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
getClasses.cancel(true);
finish();
}
});
}
});
}
});
thread.start();
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
thread.interrupt();
finish();
}
});
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
}
private AdapterView.OnItemSelectedListener classListener() {
return new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position == 0) {
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(disabledButtonColor);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setClickable(false);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(null);
}
else {
classObject.setClass(classes.get(position - 1));
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setClickable(true);
choiceDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(acceptListener());
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
}
private View.OnClickListener acceptListener() {
return new View.OnClickListener() {
@Override
public void onClick(View view) {
progress = new Progress();
progress.show(context, 1);
progress.setCancelable(false);
choiceDialog.dismiss();
sqlParser = new SQLParser(getApplicationContext());
thread = new Thread(new Runnable() {
public void run() {
ubbDB = sqlParser.getWritableDatabase();
threadHandler.post(new Runnable() {
public void run() {
final GetAttendance getAttendance = new GetAttendance(getApplicationContext());
getAttendance.execute();
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
getAttendance.cancel(true);
finish();
}
});
}
});
}
});
thread.start();
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
thread.interrupt();
finish();
}
});
}
};
}
private class GetSubjects extends AsyncTask<Void, Void, Void> {
private Context context;
private PowerManager.WakeLock wakeLock;
protected GetSubjects(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// Let's make sure the CPU doesn't go to sleep
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
if (!wakeLock.isHeld()) {
wakeLock.acquire();
}
}
@Override
protected Void doInBackground(Void... voids) {
if (isCancelled()) {
return null;
}
// Get subjects by name in ascending order
String query = "SELECT " + sqlParser.combineColumnsStrings(DBSubjects.ALL_COLUMNS, DBMajors.ALL_COLUMNS) + " FROM " + DBSubjects.TABLE_NAME + " INNER JOIN (SELECT " + sqlParser.combineColumnsStrings(DBMajors.ALL_COLUMNS) +" FROM " + DBMajors.TABLE_NAME + ") " + DBMajors.TABLE_NAME + " ON " + DBSubjects.TABLE_NAME + "." + DBSubjects.COLUMN_MAJOR + "=" + DBMajors.TABLE_NAME + "." + DBMajors.COLUMN_ID + " ORDER BY " + DBSubjects.COLUMN_NAME + " ASC";
if (BuildConfig.DEBUG) {
Log.d("ClassReport", query);
}
Cursor cursor = ubbDB.rawQuery(query, null);
// Iterate through the database rows
while (cursor.moveToNext()) {
if (isCancelled()) {
return null;
}
Major major = new Major(
cursor.getInt(cursor.getColumnIndex(DBMajors.COLUMN_ID)),
cursor.getString(cursor.getColumnIndex(DBMajors.COLUMN_NAME)),
cursor.getInt(cursor.getColumnIndex(DBMajors.COLUMN_CODE)));
subjects.add(
new Subject(
major,
cursor.getInt(cursor.getColumnIndex(DBSubjects.COLUMN_ID)),
cursor.getString(cursor.getColumnIndex(DBSubjects.COLUMN_NAME)),
cursor.getInt(cursor.getColumnIndex(DBSubjects.COLUMN_CODE))
)
);
}
cursor.close();
// Close the database connection
ubbDB.close();
sqlParser.close();
return null;
}
@Override
protected void onPostExecute(Void result) {
// Release the kraken errr wakelock
List<String> options = new ArrayList<>();
options.add(getResources().getString(R.string.report_subject));
for (Subject subject : subjects) {
options.add(subject.getSubjectName());
}
Spinner spinner = (Spinner) reportView.findViewById(R.id.subject_spinner);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), R.layout.view_spinner_selected_item, options);
arrayAdapter.setDropDownViewResource(R.layout.view_spinner_dropdown_item);
spinner.setAdapter(arrayAdapter);
spinner.setSelection(0);
spinner.setOnItemSelectedListener(subjectListener());
progress.dismiss();
wakeLock.release();
choiceDialog.show();
}
}
private class GetCourses extends AsyncTask<Integer, Void, Void> {
private Context context;
private PowerManager.WakeLock wakeLock;
protected GetCourses(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// Let's make sure the CPU doesn't go to sleep
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
if (!wakeLock.isHeld()) {
wakeLock.acquire();
}
}
@Override
protected Void doInBackground(Integer... position) {
if (isCancelled()) {
return null;
}
Cursor cursor = ubbDB.query(
DBCourses.TABLE_NAME,
DBCourses.ALL_COLUMNS,
DBCourses.COLUMN_SUBJECT + "=" + subjects.get(position[0]).getSubjectId(),
null,
null,
null,
DBCourses.COLUMN_YEAR + " DESC, " + DBCourses.COLUMN_SEMESTER + " DESC, " + DBCourses.COLUMN_SECTION + " ASC",
null);
// Iterate through the database rows
while (cursor.moveToNext()) {
if (isCancelled()) {
return null;
}
courses.add(
new Course(
subjects.get(position[0]),
cursor.getInt(cursor.getColumnIndex(DBCourses.COLUMN_ID)),
cursor.getInt(cursor.getColumnIndex(DBCourses.COLUMN_SECTION)),
cursor.getInt(cursor.getColumnIndex(DBCourses.COLUMN_SEMESTER)),
cursor.getInt(cursor.getColumnIndex(DBCourses.COLUMN_YEAR))
)
);
}
cursor.close();
// Close the database connection
ubbDB.close();
sqlParser.close();
return null;
}
@Override
protected void onPostExecute(Void result) {
// Release the kraken errr wakelock
List<String> options = new ArrayList<>();
options.add(getResources().getString(R.string.report_course));
for (Course course : courses) {
options.add(course.getYear() + "-" + course.getCourseSemester() + " " + getResources().getString(R.string.report_section) + " " + course.getCourseSection());
}
Spinner spinner = (Spinner) reportView.findViewById(R.id.course_spinner);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), R.layout.view_spinner_selected_item, options);
arrayAdapter.setDropDownViewResource(R.layout.view_spinner_dropdown_item);
spinner.setAdapter(arrayAdapter);
spinner.setSelection(0);
spinner.setEnabled(true);
spinner.setClickable(true);
spinner.setOnItemSelectedListener(courseListener());
progress.dismiss();
wakeLock.release();
}
}
private class GetClasses extends AsyncTask<Integer, Void, Void> {
private Context context;
private PowerManager.WakeLock wakeLock;
protected GetClasses(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// Let's make sure the CPU doesn't go to sleep
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
if (!wakeLock.isHeld()) {
wakeLock.acquire();
}
}
@Override
protected Void doInBackground(Integer... position) {
if (isCancelled()) {
return null;
}
Cursor cursor = ubbDB.query(
DBClasses.TABLE_NAME,
DBClasses.ALL_COLUMNS,
DBClasses.COLUMN_COURSE + "=" + courses.get(position[0]).getCourseId(),
null,
null,
null,
DBClasses.COLUMN_DATE + " DESC",
null);
// Iterate through the database rows
while (cursor.moveToNext()) {
if (isCancelled()) {
return null;
}
classes.add(
new Class(
courses.get(position[0]),
cursor.getInt(cursor.getColumnIndex(DBClasses.COLUMN_ID)),
cursor.getLong(cursor.getColumnIndex(DBClasses.COLUMN_DATE))
)
);
}
cursor.close();
// Close the database connection
ubbDB.close();
sqlParser.close();
return null;
}
@Override
protected void onPostExecute(Void result) {
// Release the kraken errr wakelock
List<String> options = new ArrayList<>();
options.add(getResources().getString(R.string.report_class));
for (Class classObject : classes) {
options.add(classObject.getFormattedDate(getApplicationContext()));
}
Spinner spinner = (Spinner) reportView.findViewById(R.id.class_spinner);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), R.layout.view_spinner_selected_item, options);
arrayAdapter.setDropDownViewResource(R.layout.view_spinner_dropdown_item);
spinner.setAdapter(arrayAdapter);
spinner.setSelection(0);
spinner.setEnabled(true);
spinner.setClickable(true);
spinner.setOnItemSelectedListener(classListener());
progress.dismiss();
wakeLock.release();
}
}
private class GetAttendance extends AsyncTask<Void, Void, Boolean> {
private Context context;
private PowerManager.WakeLock wakeLock;
protected GetAttendance(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// Let's make sure the CPU doesn't go to sleep
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
if (!wakeLock.isHeld()) {
wakeLock.acquire();
}
}
@Override
protected Boolean doInBackground(Void... voids) {
if (isCancelled()) {
return false;
}
String query = "SELECT " + sqlParser.combineColumnsStrings(DBStudents.ALL_COLUMNS, DBAttendance.ALL_COLUMNS) + " FROM " + DBStudents.TABLE_NAME +
" INNER JOIN (SELECT " + sqlParser.combineColumnsStrings(DBCoursesStudents.ALL_COLUMNS) + " FROM " + DBCoursesStudents.TABLE_NAME + " WHERE " + DBCoursesStudents.COLUMN_COURSE + "=" + classObject.getCourseId() + ") AS " + DBCoursesStudents.TABLE_NAME + " ON " + DBStudents.TABLE_NAME + "." + DBStudents.COLUMN_ID + "=" + DBCoursesStudents.TABLE_NAME + "." + DBCoursesStudents.COLUMN_STUDENT +
" LEFT OUTER JOIN (SELECT " + sqlParser.combineColumnsStrings(DBAttendance.ALL_COLUMNS) + " FROM " + DBAttendance.TABLE_NAME + " WHERE " + DBAttendance.COLUMN_CLASS + "=" + classObject.getClassId() + ") AS " + DBAttendance.TABLE_NAME + " ON " + DBStudents.TABLE_NAME + "." + DBStudents.COLUMN_ID + "=" + DBAttendance.TABLE_NAME + "." + DBAttendance.COLUMN_STUDENT +
" ORDER BY " + DBStudents.COLUMN_FIRST_LAST_NAME + " ASC, " + DBStudents.COLUMN_FIRST_NAME + " ASC";
if (BuildConfig.DEBUG) {
Log.d("ClassReport", query);
}
Cursor cursor = ubbDB.rawQuery(query, null);
// Iterate through the database rows
while (cursor.moveToNext()) {
if (isCancelled()) {
return null;
}
students.add(new Attendance(
cursor.getInt(cursor.getColumnIndex(DBAttendance.COLUMN_ATTENDANCE)),
cursor.getInt(cursor.getColumnIndex(DBStudents.COLUMN_ID)),
cursor.getString(cursor.getColumnIndex(DBStudents.COLUMN_RUN)),
cursor.getString(cursor.getColumnIndex(DBStudents.COLUMN_FIRST_NAME)),
cursor.getString(cursor.getColumnIndex(DBStudents.COLUMN_SECOND_NAME)),
cursor.getString(cursor.getColumnIndex(DBStudents.COLUMN_FIRST_LAST_NAME)),
cursor.getString(cursor.getColumnIndex(DBStudents.COLUMN_SECOND_LAST_NAME)),
cursor.getInt(cursor.getColumnIndex(DBStudents.COLUMN_MAJOR)),
cursor.getInt(cursor.getColumnIndex(DBStudents.COLUMN_ENROLLED)),
cursor.getString(cursor.getColumnIndex(DBStudents.COLUMN_EMAIL)),
cursor.getBlob(cursor.getColumnIndex(DBStudents.COLUMN_PHOTO))
));
}
cursor.close();
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet(getResources().getString(R.string.app_name));
Excel excel = new Excel(workbook);
excel.createStyles();
Row row;
Cell cell;
// Major
row = sheet.createRow(0);
cell = row.createCell(0);
cell.setCellValue(classObject.getMajorName() + " - " + classObject.getMajorCode());
cell.setCellStyle(excel.getCellStyle("left"));
for (int i = 1; i < 7; i++) {
cell = row.createCell(i);
if (i == 6) {
cell.setCellStyle(excel.getCellStyle("right"));
}
else {
cell.setCellStyle(excel.getCellStyle("middle"));
}
}
// Subject
row = sheet.createRow(1);
cell = row.createCell(0);
cell.setCellValue(classObject.getSubjectName() + " - " + classObject.getSubjectCode());
cell.setCellStyle(excel.getCellStyle("left"));
for (int i = 1; i < 7; i++) {
cell = row.createCell(i);
if (i == 6) {
cell.setCellStyle(excel.getCellStyle("right"));
}
else {
cell.setCellStyle(excel.getCellStyle("middle"));
}
}
// Columns
row = sheet.createRow(2);
cell = row.createCell(0);
cell.setCellValue(getResources().getString(R.string.report_names));
cell.setCellStyle(excel.getCellStyle("blue"));
cell = row.createCell(1);
cell.setCellValue(getResources().getString(R.string.report_first_last_name));
cell.setCellStyle(excel.getCellStyle("blue"));
cell = row.createCell(2);
cell.setCellValue(getResources().getString(R.string.report_second_last_name));
cell.setCellStyle(excel.getCellStyle("blue"));
cell = row.createCell(3);
cell.setCellValue(getResources().getString(R.string.report_present));
cell.setCellStyle(excel.getCellStyle("green"));
cell = row.createCell(4);
cell.setCellValue(getResources().getString(R.string.report_late));
cell.setCellStyle(excel.getCellStyle("yellow"));
cell = row.createCell(5);
cell.setCellValue(getResources().getString(R.string.report_justified));
cell.setCellStyle(excel.getCellStyle("orange"));
cell = row.createCell(6);
cell.setCellValue(getResources().getString(R.string.report_absent));
cell.setCellStyle(excel.getCellStyle("red"));
int cellSize1 = getResources().getString(R.string.report_names).length();
int cellSize2 = getResources().getString(R.string.report_first_last_name).length();
int cellSize3 = getResources().getString(R.string.report_second_last_name).length();
int rowNumber = 3;
String value;
for (Attendance student : students) {
row = sheet.createRow(rowNumber);
// First and second name
cell = row.createCell(0);
value = student.getFirstName() + " " + student.getSecondName();
if (value.length() > cellSize1) {
cellSize1 = value.length();
}
cell.setCellValue(value);
cell.setCellStyle(excel.getCellStyle("main"));
// First last name
cell = row.createCell(1);
value = student.getFirstLastName();
if (value.length() > cellSize2) {
cellSize2 = value.length();
}
cell.setCellValue(value);
cell.setCellStyle(excel.getCellStyle("main"));
// Second last name
cell = row.createCell(2);
value = student.getSecondLastName();
if (value.length() > cellSize3) {
cellSize3 = value.length();
}
cell.setCellValue(value);
cell.setCellStyle(excel.getCellStyle("main"));
int status = student.getStatus();
int attendanceCell = 3;
if (status != 0) {
switch (status) {
case 1:
attendanceCell = 3;
break;
case 4:
attendanceCell = 4;
break;
case 2:
attendanceCell = 5;
break;
case 3:
attendanceCell = 6;
break;
}
}
CellStyle attendanceColor = null;
for (int i = 3; i < 7; i++) {
cell = row.createCell(i);
switch (i) {
case 3:
attendanceColor = excel.getCellStyle("green");
break;
case 4:
attendanceColor = excel.getCellStyle("yellow");
break;
case 5:
attendanceColor = excel.getCellStyle("orange");
break;
case 6:
attendanceColor = excel.getCellStyle("red");
break;
}
if (i == attendanceCell) {
cell.setCellValue("X");
}
cell.setCellStyle(attendanceColor);
}
rowNumber++;
}
sheet.setColumnWidth(0, (cellSize1 + 1) * 256);
sheet.setColumnWidth(1, (cellSize2 + 1) * 256);
sheet.setColumnWidth(2, (cellSize3 + 1) * 256);
final String filePath = StringFixer.removeInvalidFileCharacters(Environment.getExternalStorageDirectory() +
"/" + getResources().getString(R.string.app_name) +
"/" + classObject.getMajorName() +
"/" + classObject.getYear() + "-" + classObject.getCourseSemester() + "-" + classObject.getCourseSection());
final String fileName = "/" + getResources().getString(R.string.report_class) + "-" + classObject.getFormattedShortDate(context).replaceAll("/", "-") + ".xls";
try {
File file = new File(filePath);
if (!file.exists()) {
if (!file.mkdirs()) {
return false;
}
}
FileOutputStream fileOutputStream = new FileOutputStream(filePath + fileName);
workbook.write(fileOutputStream);
fileOutputStream.close();
}
catch (FileNotFoundException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
return false;
}
catch (IOException e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
return false;
}
// Close the database connection
ubbDB.close();
sqlParser.close();
return true;
}
@Override
protected void onPostExecute(Boolean result) {
// Release the kraken errr wakelock
if (result) {
confirmOpen();
}
else {
Toast.makeText(getApplicationContext(), R.string.report_fail, Toast.LENGTH_SHORT).show();
finish();
}
progress.dismiss();
wakeLock.release();
}
}
private void confirmOpen() {
final String filePath = StringFixer.removeInvalidFileCharacters(Environment.getExternalStorageDirectory() +
"/" + getResources().getString(R.string.app_name) +
"/" + classObject.getMajorName() +
"/" + classObject.getYear() + "-" + classObject.getCourseSemester() + "-" + classObject.getCourseSection());
final String fileName = "/" + getResources().getString(R.string.report_class) + "-" + classObject.getFormattedShortDate(context).replaceAll("/", "-") + ".xls";
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.report_created);
builder.setPositiveButton(R.string.input_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
File file = new File(filePath + fileName);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.ms-excel");
try {
startActivity(intent);
}
catch (ActivityNotFoundException e) {
Toast.makeText(ClassReport.this, "No Application Available to View Excel", Toast.LENGTH_SHORT).show();
}
confirmDialog.dismiss();
finish();
}
});
builder.setNegativeButton(R.string.input_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
confirmDialog.dismiss();
finish();
}
});
builder.setCancelable(true);
confirmDialog = builder.create();
confirmDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
confirmDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
confirmDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
}
});
confirmDialog.show();
}
}