|
|
@ -0,0 +1,968 @@ |
|
|
|
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; |