1585 lines
72 KiB
Java
1585 lines
72 KiB
Java
package cl.cromer.ubb.attendance;
|
|
|
|
import android.Manifest;
|
|
import android.content.ActivityNotFoundException;
|
|
import android.content.ContentResolver;
|
|
import android.content.ContentValues;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.content.Intent;
|
|
import android.content.pm.PackageManager;
|
|
import android.content.pm.ResolveInfo;
|
|
import android.database.Cursor;
|
|
import android.database.sqlite.SQLiteDatabase;
|
|
import android.net.Uri;
|
|
import android.os.AsyncTask;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.os.PowerManager;
|
|
import android.support.annotation.NonNull;
|
|
import android.support.design.widget.FloatingActionButton;
|
|
import android.support.design.widget.NavigationView;
|
|
import android.support.v4.app.ActivityCompat;
|
|
import android.support.v4.content.ContextCompat;
|
|
import android.support.v4.view.GravityCompat;
|
|
import android.support.v4.widget.DrawerLayout;
|
|
import android.support.v7.app.ActionBarDrawerToggle;
|
|
import android.support.v7.app.AlertDialog;
|
|
import android.support.v7.app.AppCompatActivity;
|
|
import android.support.v7.widget.CardView;
|
|
import android.support.v7.widget.LinearLayoutManager;
|
|
import android.support.v7.widget.RecyclerView;
|
|
import android.support.v7.widget.Toolbar;
|
|
import android.util.Log;
|
|
import android.view.KeyEvent;
|
|
import android.view.LayoutInflater;
|
|
import android.view.Menu;
|
|
import android.view.MenuItem;
|
|
import android.view.View;
|
|
import android.widget.RelativeLayout;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
|
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
|
import org.apache.poi.ss.usermodel.Cell;
|
|
import org.apache.poi.ss.usermodel.Row;
|
|
import org.apache.poi.ss.usermodel.Sheet;
|
|
import org.apache.poi.ss.usermodel.Workbook;
|
|
|
|
import java.io.FileInputStream;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import cl.cromer.ubb.attendance.FileSystem;
|
|
import cl.cromer.ubb.attendance.Progress;
|
|
import cl.cromer.ubb.attendance.DBSchema.*;
|
|
|
|
public class SubjectList extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
|
|
|
|
// 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;
|
|
|
|
// Add subject dialog window
|
|
private AlertDialog addEditSubjectDialog = null;
|
|
private View addEditSubjectView;
|
|
|
|
private AlertDialog permissionDialog = null;
|
|
private AlertDialog confirmDialog = null;
|
|
|
|
// Floating action button
|
|
private FloatingActionButton fab = null;
|
|
|
|
// Multi select
|
|
private boolean optionsSelected[] = null;
|
|
|
|
// RecyclerView
|
|
private RecyclerView recyclerView = null;
|
|
private SubjectListAdapter subjectListAdapter = null;
|
|
|
|
// Permission to read and write files?
|
|
private int filePermission = 0;
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
|
|
filePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
|
|
|
// Set the main view
|
|
setContentView(R.layout.activity_subject_list);
|
|
|
|
// Create and show the toolbar
|
|
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
|
|
toolbar.setSubtitle(getResources().getString(R.string.subjects_title));
|
|
setSupportActionBar(toolbar);
|
|
|
|
// Inflate the add subject view
|
|
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
|
addEditSubjectView = inflater.inflate(R.layout.view_subject_add_edit, new RelativeLayout(this), false);
|
|
|
|
// Build the add subject dialog window using the subject view
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
builder.setView(addEditSubjectView);
|
|
builder.setPositiveButton(R.string.input_accept, null);
|
|
builder.setNegativeButton(R.string.input_cancel, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
eraseAddEditSubjects();
|
|
}
|
|
});
|
|
|
|
builder.setCancelable(false);
|
|
addEditSubjectDialog = builder.create();
|
|
|
|
addEditSubjectDialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
|
@Override
|
|
public void onShow(DialogInterface dialogInterface) {
|
|
addEditSubjectDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
addEditSubjectDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
}
|
|
});
|
|
|
|
addEditSubjectDialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
|
|
|
|
// Floating action button for add subject
|
|
fab = (FloatingActionButton) findViewById(R.id.fab);
|
|
fab.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
addEditSubjectDialog.setTitle(R.string.subjects_add_subject);
|
|
addEditSubjectDialog.show();
|
|
addSubjectListeners(); // Override the accept button!
|
|
}
|
|
});
|
|
|
|
// Add the navigation drawer
|
|
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
|
|
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
|
|
drawer.setDrawerListener(toggle);
|
|
toggle.syncState();
|
|
|
|
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
|
|
navigationView.setNavigationItemSelectedListener(this);
|
|
|
|
// 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();
|
|
}
|
|
});
|
|
}
|
|
|
|
// After the view is added to the screen check to see if it needs to be selected
|
|
@Override
|
|
public void onWindowFocusChanged(boolean hasFocus) {
|
|
if(hasFocus){
|
|
// Restore the recycler view after recreation
|
|
if (optionsSelected != null) {
|
|
fab.hide();
|
|
for (int i = 0; i < optionsSelected.length; i++) {
|
|
if (optionsSelected[i]) {
|
|
CardView cardView = (CardView) recyclerView.getChildAt(i);
|
|
cardView.setCardBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimarySelected));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onSaveInstanceState(Bundle state) {
|
|
super.onSaveInstanceState(state);
|
|
|
|
// Save the state of the dialog
|
|
if (addEditSubjectDialog != null && addEditSubjectDialog.isShowing()) {
|
|
state.putBoolean("add_dialog_showing", addEditSubjectDialog.isShowing());
|
|
TextView textView = (TextView) addEditSubjectDialog.findViewById(R.id.edit_subject_name);
|
|
state.putString("add_dialog_subject_name", textView.getText().toString());
|
|
textView = (TextView) addEditSubjectDialog.findViewById(R.id.edit_subject_code);
|
|
state.putString("add_dialog_subject_code", textView.getText().toString());
|
|
textView = (TextView) addEditSubjectDialog.findViewById(R.id.edit_major_name);
|
|
state.putString("add_dialog_major_name", textView.getText().toString());
|
|
textView = (TextView) addEditSubjectDialog.findViewById(R.id.edit_major_code);
|
|
state.putString("add_dialog_major_code", textView.getText().toString());
|
|
}
|
|
// Save the state of the adapter
|
|
state.putBooleanArray("options_selected", optionsSelected);
|
|
}
|
|
|
|
@Override
|
|
public void onRestoreInstanceState(Bundle savedInstanceState) {
|
|
super.onRestoreInstanceState(savedInstanceState);
|
|
|
|
// Restore the dialog if it was on screen
|
|
optionsSelected = savedInstanceState.getBooleanArray("options_selected");
|
|
if (savedInstanceState.getBoolean("add_dialog_showing", false)) {
|
|
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
|
addEditSubjectView = inflater.inflate(R.layout.view_subject_add_edit, new RelativeLayout(this), false);
|
|
TextView textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_name);
|
|
textView.setText(savedInstanceState.getString("add_dialog_subject_name"));
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_code);
|
|
textView.setText(savedInstanceState.getString("add_dialog_subject_code"));
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_name);
|
|
textView.setText(savedInstanceState.getString("add_dialog_major_name"));
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_code);
|
|
textView.setText(savedInstanceState.getString("add_dialog_major_code"));
|
|
addEditSubjectDialog.setView(addEditSubjectView);
|
|
if (optionsSelected == null) {
|
|
addEditSubjectDialog.setTitle(R.string.subjects_add_subject);
|
|
addEditSubjectDialog.show();
|
|
addSubjectListeners(); // Override the accept button!
|
|
}
|
|
else {
|
|
addEditSubjectDialog.setTitle(R.string.subjects_edit_subject);
|
|
addEditSubjectDialog.show();
|
|
editSubjectListeners(); // Override the accept button!
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onDestroy() {
|
|
super.onDestroy();
|
|
// We need to get rid of the progress bar if it's showing
|
|
if (progress != null && progress.isShowing()) {
|
|
progress.dismiss();
|
|
}
|
|
// Same for the add subject dialog
|
|
if (addEditSubjectDialog != null && addEditSubjectDialog.isShowing()) {
|
|
addEditSubjectDialog.dismiss();
|
|
}
|
|
if (permissionDialog != null && permissionDialog.isShowing()) {
|
|
permissionDialog.dismiss();
|
|
}
|
|
if (confirmDialog != null && confirmDialog.isShowing()) {
|
|
confirmDialog.dismiss();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onBackPressed() {
|
|
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
|
|
if (drawer.isDrawerOpen(GravityCompat.START)) {
|
|
drawer.closeDrawer(GravityCompat.START);
|
|
}
|
|
else if (optionsSelected != null) {
|
|
fab.show();
|
|
for (int i = 0; i < optionsSelected.length; i++) {
|
|
if (optionsSelected[i]) {
|
|
CardView cardView = (CardView) recyclerView.getChildAt(i);
|
|
cardView.setCardBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
supportInvalidateOptionsMenu();
|
|
}
|
|
}
|
|
optionsSelected = null;
|
|
}
|
|
else {
|
|
super.onBackPressed();
|
|
//overridePendingTransition(R.anim.expand, R.anim.fade_out);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean onCreateOptionsMenu(Menu menu) {
|
|
getMenuInflater().inflate(R.menu.subject_list, menu);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onPrepareOptionsMenu(Menu menu) {
|
|
menu.clear();
|
|
int selectedCount = 0;
|
|
if (optionsSelected != null) {
|
|
for (boolean selected : optionsSelected) {
|
|
if (selected) {
|
|
selectedCount++;
|
|
if (selectedCount > 1) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
getMenuInflater().inflate(R.menu.subject_list, menu);
|
|
if (optionsSelected == null) {
|
|
menu.removeItem(R.id.action_delete);
|
|
menu.removeItem(R.id.action_edit);
|
|
}
|
|
else if (optionsSelected != null && selectedCount > 1) {
|
|
menu.removeItem(R.id.action_edit);
|
|
}
|
|
|
|
return super.onPrepareOptionsMenu(menu);
|
|
}
|
|
|
|
@Override
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
int id = item.getItemId();
|
|
|
|
if (id == R.id.action_edit) {
|
|
// Load the database then run the new thread
|
|
sqlParser = new SQLParser(getApplicationContext());
|
|
thread = new Thread(new Runnable() {
|
|
public void run() {
|
|
ubbDB = sqlParser.getWritableDatabase();
|
|
threadHandler.post(new Runnable() {
|
|
public void run() {
|
|
final EditSubject editSubject = new EditSubject(getApplicationContext());
|
|
editSubject.execute();
|
|
|
|
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
|
@Override
|
|
public void onCancel(DialogInterface dialog) {
|
|
editSubject.cancel(true);
|
|
addEditSubjectDialog.dismiss();
|
|
finish();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
thread.start();
|
|
return true;
|
|
}
|
|
else if (id == R.id.action_delete) {
|
|
deleteSubjectsConfirm();
|
|
return true;
|
|
}
|
|
|
|
return super.onOptionsItemSelected(item);
|
|
}
|
|
|
|
@Override
|
|
public boolean onNavigationItemSelected(MenuItem item) {
|
|
int id = item.getItemId();
|
|
|
|
if (id == R.id.nav_import_excel) {
|
|
if (filePermission != PackageManager.PERMISSION_GRANTED) {
|
|
//Show an explanation if they previously denied the permission
|
|
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
|
|
// Show an explanation to the user *asynchronously*
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
builder.setMessage(R.string.permission_file);
|
|
builder.setPositiveButton(R.string.input_accept, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_EXCEL);
|
|
}
|
|
});
|
|
builder.setCancelable(true);
|
|
permissionDialog = builder.create();
|
|
|
|
permissionDialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
|
@Override
|
|
public void onShow(DialogInterface dialogInterface) {
|
|
permissionDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
permissionDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
}
|
|
});
|
|
|
|
permissionDialog.show();
|
|
}
|
|
else {
|
|
// No explanation needed, we can request the permission.
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_EXCEL);
|
|
}
|
|
}
|
|
else {
|
|
// We have permission, open the file manager.
|
|
openFileManager("application/vnd.ms-excel", StaticVariables.IMPORT_EXCEL_SELECTOR);
|
|
}
|
|
}
|
|
else if (id == R.id.nav_import_photo_zip) {
|
|
if (filePermission != PackageManager.PERMISSION_GRANTED) {
|
|
//Show an explanation if they previously denied the permission
|
|
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
|
|
// Show an explanation to the user *asynchronously*
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
builder.setMessage(R.string.permission_file);
|
|
builder.setPositiveButton(R.string.input_accept, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_PHOTO_ZIP);
|
|
}
|
|
});
|
|
builder.setCancelable(true);
|
|
permissionDialog = builder.create();
|
|
|
|
permissionDialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
|
@Override
|
|
public void onShow(DialogInterface dialogInterface) {
|
|
permissionDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
permissionDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
}
|
|
});
|
|
|
|
permissionDialog.show();
|
|
}
|
|
else {
|
|
// No explanation needed, we can request the permission.
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_PHOTO_ZIP);
|
|
}
|
|
}
|
|
else {
|
|
// We have permission, open the file manager.
|
|
openFileManager("application/zip", StaticVariables.IMPORT_PHOTO_ZIP_SELECTOR);
|
|
}
|
|
}
|
|
else if (id == R.id.nav_report_class) {
|
|
if (filePermission != PackageManager.PERMISSION_GRANTED) {
|
|
//Show an explanation if they previously denied the permission
|
|
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
|
|
// Show an explanation to the user *asynchronously*
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
builder.setMessage(R.string.permission_file);
|
|
builder.setPositiveButton(R.string.input_accept, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_CLASS_REPORT);
|
|
}
|
|
});
|
|
builder.setCancelable(true);
|
|
permissionDialog = builder.create();
|
|
|
|
permissionDialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
|
@Override
|
|
public void onShow(DialogInterface dialogInterface) {
|
|
permissionDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
permissionDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
}
|
|
});
|
|
|
|
permissionDialog.show();
|
|
}
|
|
else {
|
|
// No explanation needed, we can request the permission.
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_CLASS_REPORT);
|
|
}
|
|
}
|
|
else {
|
|
// We have permission, export the report
|
|
Intent classReportIntent = new Intent(getApplicationContext(), ClassReport.class);
|
|
startActivity(classReportIntent);
|
|
}
|
|
}
|
|
else if (id == R.id.nav_report_course) {
|
|
if (filePermission != PackageManager.PERMISSION_GRANTED) {
|
|
//Show an explanation if they previously denied the permission
|
|
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
|
|
// Show an explanation to the user *asynchronously*
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
builder.setMessage(R.string.permission_file);
|
|
builder.setPositiveButton(R.string.input_accept, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_COURSE_REPORT);
|
|
}
|
|
});
|
|
builder.setCancelable(true);
|
|
permissionDialog = builder.create();
|
|
|
|
permissionDialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
|
@Override
|
|
public void onShow(DialogInterface dialogInterface) {
|
|
permissionDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
permissionDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
}
|
|
});
|
|
|
|
permissionDialog.show();
|
|
}
|
|
else {
|
|
// No explanation needed, we can request the permission.
|
|
requestPermission(StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_COURSE_REPORT);
|
|
}
|
|
}
|
|
else {
|
|
// We have permission, export the report
|
|
Intent courseReportIntent = new Intent(getApplicationContext(), CourseReport.class);
|
|
startActivity(courseReportIntent);
|
|
}
|
|
}
|
|
else if (id == R.id.nav_about) {
|
|
Intent aboutIntent = new Intent(getApplicationContext(), About.class);
|
|
startActivity(aboutIntent);
|
|
}
|
|
|
|
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
|
|
drawer.closeDrawer(GravityCompat.START);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
switch (requestCode) {
|
|
case StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_EXCEL: {
|
|
// If request is cancelled, the result arrays are empty.
|
|
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
filePermission = PackageManager.PERMISSION_GRANTED;
|
|
openFileManager("application/vnd.ms-excel", StaticVariables.IMPORT_EXCEL_SELECTOR);
|
|
}
|
|
else {
|
|
Toast.makeText(this, R.string.permission_failed, Toast.LENGTH_SHORT).show();
|
|
}
|
|
break;
|
|
}
|
|
case StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_PHOTO_ZIP: {
|
|
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
filePermission = PackageManager.PERMISSION_GRANTED;
|
|
openFileManager("application/zip", StaticVariables.IMPORT_PHOTO_ZIP_SELECTOR);
|
|
}
|
|
else {
|
|
Toast.makeText(this, R.string.permission_failed, Toast.LENGTH_SHORT).show();
|
|
}
|
|
break;
|
|
}
|
|
case StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_CLASS_REPORT: {
|
|
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
Intent classReportIntent = new Intent(getApplicationContext(), ClassReport.class);
|
|
startActivity(classReportIntent);
|
|
}
|
|
else {
|
|
Toast.makeText(this, R.string.permission_failed, Toast.LENGTH_SHORT).show();
|
|
}
|
|
break;
|
|
}
|
|
case StaticVariables.PERMISSIONS_WRITE_EXTERNAL_STORAGE_COURSE_REPORT: {
|
|
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
Intent courseReportIntent = new Intent(getApplicationContext(), CourseReport.class);
|
|
startActivity(courseReportIntent);
|
|
}
|
|
else {
|
|
Toast.makeText(this, R.string.permission_failed, Toast.LENGTH_SHORT).show();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
|
|
if (requestCode == StaticVariables.IMPORT_EXCEL_SELECTOR) {
|
|
if (resultCode == RESULT_OK) {
|
|
Uri uri = intent.getData();
|
|
String filePath;
|
|
String mimeType;
|
|
InputStream inputStream = null;
|
|
ContentResolver contentResolver = getContentResolver();
|
|
Cursor cursor = contentResolver.query(intent.getData(),
|
|
null,
|
|
null,
|
|
null,
|
|
null);
|
|
|
|
if (cursor != null) {
|
|
cursor.moveToFirst();
|
|
filePath = uri.toString();
|
|
try {
|
|
inputStream = contentResolver.openInputStream(uri);
|
|
}
|
|
catch (FileNotFoundException e) {
|
|
if (BuildConfig.DEBUG) {
|
|
e.printStackTrace();
|
|
Toast.makeText(this, R.string.import_not_valid_excel, Toast.LENGTH_SHORT).show();
|
|
}
|
|
}
|
|
mimeType = cursor.getString(cursor.getColumnIndex("mime_type"));
|
|
cursor.close();
|
|
}
|
|
else {
|
|
filePath = uri.getPath();
|
|
mimeType = FileSystem.getMimeType(filePath);
|
|
}
|
|
|
|
if (mimeType == null || !mimeType.equals("application/vnd.ms-excel")) {
|
|
// Not an xls file
|
|
Toast.makeText(this, R.string.import_not_valid_excel, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else {
|
|
try {
|
|
POIFSFileSystem fs;
|
|
if (inputStream != null) {
|
|
fs = new POIFSFileSystem(inputStream);
|
|
}
|
|
else {
|
|
fs = new POIFSFileSystem(new FileInputStream(filePath));
|
|
}
|
|
Workbook wb = new HSSFWorkbook(fs);
|
|
Sheet sheet = wb.getSheetAt(0);
|
|
|
|
Row row = sheet.getRow(0);
|
|
int cols = row.getPhysicalNumberOfCells();
|
|
if (cols >= 1 && row.getFirstCellNum() == 2) {
|
|
Cell cell = row.getCell(2);
|
|
if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
|
|
if (cell.getRichStringCellValue().getString().trim().equals("Listado de Alumnos")) {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.d("SubjectList", "The xls file is valid");
|
|
}
|
|
Intent importExcelIntent = new Intent(getApplicationContext(), ImportExcel.class);
|
|
importExcelIntent.putExtra(StaticVariables.IMPORT_EXCEL_FILE_TYPE, (inputStream != null)?0:1);
|
|
importExcelIntent.putExtra(StaticVariables.IMPORT_EXCEL_FILE, filePath);
|
|
startActivityForResult(importExcelIntent, StaticVariables.IMPORT_EXCEL_ACTIVITY);
|
|
}
|
|
else {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.d("SubjectList", "Does not have the right cell");
|
|
Toast.makeText(this, R.string.import_not_valid_excel, Toast.LENGTH_SHORT).show();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.d("SubjectList", "Wrong cell data type");
|
|
Toast.makeText(this, R.string.import_not_valid_excel, Toast.LENGTH_SHORT).show();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.d("SubjectList", "Has too few columns");
|
|
Toast.makeText(this, R.string.import_not_valid_excel, Toast.LENGTH_SHORT).show();
|
|
}
|
|
}
|
|
fs.close();
|
|
if (inputStream != null) {
|
|
inputStream.close();
|
|
}
|
|
}
|
|
catch (IOException e) {
|
|
if (BuildConfig.DEBUG) {
|
|
e.printStackTrace();
|
|
Toast.makeText(this, R.string.import_not_valid_excel, Toast.LENGTH_SHORT).show();
|
|
Log.d("SubjectList", "The file is either corrupt or isn't really an excel file");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.wtf("SubjectList", "Somehow the file selection failed?");
|
|
}
|
|
}
|
|
}
|
|
else if (requestCode == StaticVariables.IMPORT_EXCEL_ACTIVITY) {
|
|
if (resultCode == RESULT_OK) {
|
|
// Add the imported info from the excel if necessary
|
|
Subject subject = intent.getParcelableExtra(StaticVariables.SUBJECT_OBJECT);
|
|
if (!subjectListAdapter.hasSubject(subject)) {
|
|
subjectListAdapter.addSubject(subject);
|
|
}
|
|
recyclerView.swapAdapter(subjectListAdapter, true);
|
|
Toast.makeText(this, R.string.import_success, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.wtf("SubjectList", "Reading the excel file failed!");
|
|
}
|
|
}
|
|
}
|
|
else if (requestCode == StaticVariables.IMPORT_PHOTO_ZIP_SELECTOR) {
|
|
if (resultCode == RESULT_OK) {
|
|
Uri uri = intent.getData();
|
|
String filePath;
|
|
String mimeType;
|
|
InputStream inputStream = null;
|
|
ContentResolver contentResolver = getContentResolver();
|
|
Cursor cursor = contentResolver.query(intent.getData(),
|
|
null,
|
|
null,
|
|
null,
|
|
null);
|
|
|
|
if (cursor != null) {
|
|
cursor.moveToFirst();
|
|
filePath = uri.toString();
|
|
try {
|
|
inputStream = contentResolver.openInputStream(uri);
|
|
}
|
|
catch (FileNotFoundException e) {
|
|
if (BuildConfig.DEBUG) {
|
|
e.printStackTrace();
|
|
Toast.makeText(this, R.string.import_not_valid_zip, Toast.LENGTH_SHORT).show();
|
|
}
|
|
}
|
|
mimeType = cursor.getString(cursor.getColumnIndex("mime_type"));
|
|
cursor.close();
|
|
}
|
|
else {
|
|
filePath = uri.getPath();
|
|
mimeType = FileSystem.getMimeType(filePath);
|
|
}
|
|
|
|
if (mimeType == null || !mimeType.equals("application/zip")) {
|
|
// Not a zip file
|
|
Toast.makeText(this, R.string.import_not_valid_zip, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else {
|
|
Intent importZipIntent = new Intent(getApplicationContext(), ImportPhotos.class);
|
|
importZipIntent.putExtra(StaticVariables.IMPORT_PHOTO_ZIP_FILE_TYPE, (inputStream != null)?0:1);
|
|
importZipIntent.putExtra(StaticVariables.IMPORT_PHOTO_ZIP_FILE, filePath);
|
|
startActivityForResult(importZipIntent, StaticVariables.IMPORT_PHOTO_ZIP_ACTIVITY);
|
|
}
|
|
}
|
|
else {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.wtf("SubjectList", "Somehow the file selection failed?");
|
|
}
|
|
}
|
|
}
|
|
else if (requestCode == StaticVariables.IMPORT_PHOTO_ZIP_ACTIVITY) {
|
|
if (resultCode == RESULT_OK) {
|
|
Toast.makeText(this, R.string.import_success, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else {
|
|
if (BuildConfig.DEBUG) {
|
|
Log.wtf("SubjectList", "Reading the zip file failed!");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void requestPermission(int requestCode) {
|
|
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, requestCode);
|
|
}
|
|
|
|
private void openFileManager(String intentType, int requestCode) {
|
|
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
|
intent.setType(intentType);
|
|
|
|
PackageManager packageManager = this.getPackageManager();
|
|
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
|
|
|
|
if (list.size() > 0) {
|
|
// Open the file chooser
|
|
startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.import_choose_file)), requestCode);
|
|
}
|
|
else {
|
|
// Give the user the option to install a file manager since they don't have one installed
|
|
try {
|
|
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.estrongs.android.pop")));
|
|
}
|
|
catch (ActivityNotFoundException e) {
|
|
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.estrongs.android.pop")));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void databaseLoaded() {
|
|
// The database has finished loading show the content
|
|
final ShowContent showContent = new ShowContent(getApplicationContext());
|
|
showContent.execute();
|
|
|
|
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
|
@Override
|
|
public void onCancel(DialogInterface dialog) {
|
|
showContent.cancel(true);
|
|
finish();
|
|
}
|
|
});
|
|
}
|
|
|
|
private class ShowContent extends AsyncTask<Void, Void, Void> {
|
|
private Context context;
|
|
private PowerManager.WakeLock wakeLock;
|
|
|
|
private List<Subject> subjects = new ArrayList<>();
|
|
|
|
protected ShowContent(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("SubjectList", 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
|
|
progress.dismiss();
|
|
wakeLock.release();
|
|
// Create the recycler and add it to a layout manager, then add the content to it
|
|
recyclerView = (RecyclerView) findViewById(R.id.subject_list_recycler);
|
|
recyclerView.setHasFixedSize(false);
|
|
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
|
|
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
|
|
recyclerView.setLayoutManager(linearLayoutManager);
|
|
subjectListAdapter = new SubjectListAdapter(subjects);
|
|
recyclerView.setAdapter(subjectListAdapter);
|
|
recyclerView.addOnItemTouchListener(new RecyclerClickListener(context, recyclerView, new RecyclerClickListener.OnClickListener() {
|
|
|
|
@Override
|
|
public void onClick(View view, int position) {
|
|
if (optionsSelected == null) {
|
|
// Open the subject
|
|
Intent courseListIntent = new Intent(getApplicationContext(), CourseList.class);
|
|
courseListIntent.putExtra(StaticVariables.SUBJECT_OBJECT, subjectListAdapter.getSubject(position));
|
|
courseListIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
|
startActivity(courseListIntent);
|
|
overridePendingTransition(R.anim.push_down_in, R.anim.hold_back);
|
|
}
|
|
else {
|
|
CardView cardView = (CardView) view;
|
|
// Swap the selection
|
|
if (optionsSelected[position]) {
|
|
optionsSelected[position] = false;
|
|
cardView.setCardBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
}
|
|
else {
|
|
optionsSelected[position] = true;
|
|
cardView.setCardBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimarySelected));
|
|
}
|
|
|
|
// If none of the options are selected turn off multi select
|
|
boolean somethingSelected = false;
|
|
for (boolean selected : optionsSelected) {
|
|
if (selected) {
|
|
somethingSelected = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!somethingSelected) {
|
|
optionsSelected = null;
|
|
fab.show();
|
|
}
|
|
supportInvalidateOptionsMenu();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onLongClick(View view, int position) {
|
|
if (optionsSelected == null) {
|
|
CardView cardView = (CardView) view;
|
|
cardView.setCardBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimarySelected));
|
|
optionsSelected = new boolean[recyclerView.getChildCount()];
|
|
optionsSelected[position] = true;
|
|
fab.hide();
|
|
supportInvalidateOptionsMenu();
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
}
|
|
|
|
private void deleteSubjectsConfirm() {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
builder.setMessage(R.string.input_confirm);
|
|
builder.setPositiveButton(R.string.input_accept, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
sqlParser = new SQLParser(getApplicationContext());
|
|
thread = new Thread(new Runnable() {
|
|
public void run() {
|
|
ubbDB = sqlParser.getWritableDatabase();
|
|
threadHandler.post(new Runnable() {
|
|
public void run() {
|
|
deleteSubject();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
thread.start();
|
|
}
|
|
});
|
|
builder.setNegativeButton(R.string.input_cancel, null);
|
|
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();
|
|
}
|
|
|
|
private void deleteSubject() {
|
|
int options = optionsSelected.length;
|
|
List<Subject> subjects = new ArrayList<>();
|
|
for (int i = 0; i < options; i++) {
|
|
if (optionsSelected[i]) {
|
|
subjects.add(subjectListAdapter.getSubject(i));
|
|
}
|
|
}
|
|
options = subjects.size();
|
|
for (int i = 0; i < options; i++) {
|
|
Cursor cursor = ubbDB.query(DBMajors.TABLE_NAME, DBMajors.ALL_COLUMNS, DBMajors.COLUMN_ID + "=" + subjects.get(i).getMajorId(), null, null, null, null);
|
|
|
|
// If only one subject uses the major delete the major
|
|
if (cursor.getCount() == 1) {
|
|
ubbDB.delete(
|
|
DBMajors.TABLE_NAME,
|
|
DBMajors.COLUMN_ID + "=" + subjects.get(i).getMajorId(),
|
|
null
|
|
);
|
|
}
|
|
cursor.close();
|
|
|
|
// Remove recursive
|
|
cursor = ubbDB.query(DBCourses.TABLE_NAME, DBCourses.ALL_COLUMNS, DBCourses.COLUMN_SUBJECT + "=" + subjects.get(i).getSubjectId(), null, null, null, null);
|
|
if (cursor.getCount() > 0) {
|
|
while (cursor.moveToNext()) {
|
|
int course = cursor.getInt(cursor.getColumnIndex(DBCourses.COLUMN_ID));
|
|
Cursor cursor2 = ubbDB.query(DBClasses.TABLE_NAME, DBClasses.ALL_COLUMNS, DBClasses.COLUMN_COURSE + "=" + course, null, null, null, null);
|
|
if (cursor2.getCount() > 0) {
|
|
while (cursor2.moveToNext()) {
|
|
int classId = cursor2.getInt(cursor2.getColumnIndex(DBClasses.COLUMN_ID));
|
|
|
|
// Delete the attendance
|
|
ubbDB.delete(
|
|
DBAttendance.TABLE_NAME,
|
|
DBAttendance.COLUMN_CLASS + "=" + classId,
|
|
null
|
|
);
|
|
}
|
|
cursor2.close();
|
|
|
|
// Delete the classes
|
|
ubbDB.delete(
|
|
DBClasses.TABLE_NAME,
|
|
DBClasses.COLUMN_COURSE + "=" + course,
|
|
null
|
|
);
|
|
}
|
|
|
|
// Delete course
|
|
ubbDB.delete(
|
|
DBCourses.TABLE_NAME,
|
|
DBCourses.COLUMN_ID + "=" + course,
|
|
null
|
|
);
|
|
|
|
// Delete the students that were connected to the course
|
|
ubbDB.delete(
|
|
DBCoursesStudents.TABLE_NAME,
|
|
DBCoursesStudents.COLUMN_COURSE + "=" + course,
|
|
null
|
|
);
|
|
}
|
|
}
|
|
|
|
// Delete it from the database
|
|
ubbDB.delete(
|
|
DBSubjects.TABLE_NAME,
|
|
DBSubjects.COLUMN_ID + "=" + subjects.get(i).getSubjectId(),
|
|
null
|
|
);
|
|
// Delete it from the adapter
|
|
subjectListAdapter.deleteSubject(subjects.get(i));
|
|
}
|
|
ubbDB.close();
|
|
sqlParser.close();
|
|
recyclerView.setAdapter(subjectListAdapter);
|
|
optionsSelected = null;
|
|
fab.show();
|
|
supportInvalidateOptionsMenu();
|
|
}
|
|
|
|
private void addSubjectListeners() {
|
|
// Override the back button so it closes the dialog
|
|
addEditSubjectDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
|
|
@Override
|
|
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
|
|
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled()) {
|
|
dialog.cancel();
|
|
eraseAddEditSubjects();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
|
|
// Override the back button
|
|
addEditSubjectDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
// Override the standard dismiss onClick to make sure that the window does not close
|
|
|
|
TextView textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_name);
|
|
String subjectName = textView.getText().toString();
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_code);
|
|
int subjectCode = (textView.getText().toString().equals("")) ? 0 : Integer.parseInt(textView.getText().toString());
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_name);
|
|
String majorName = textView.getText().toString();
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_code);
|
|
int majorCode = (textView.getText().toString().equals("")) ? 0 : Integer.parseInt(textView.getText().toString());
|
|
|
|
if (subjectName.trim().equals("")) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_subject_name, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (majorName.trim().equals("")) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_major_name, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (subjectCode == 0) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_subject_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (String.valueOf(subjectCode).length() < 6) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_invalid_subject_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (majorCode == 0) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_major_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (String.valueOf(majorCode).length() < 4) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_invalid_major_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else {
|
|
Major major = new Major(majorName, majorCode);
|
|
final Subject subject = new Subject(major, subjectName, subjectCode);
|
|
|
|
sqlParser = new SQLParser(getApplicationContext());
|
|
thread = new Thread(new Runnable() {
|
|
public void run() {
|
|
ubbDB = sqlParser.getWritableDatabase();
|
|
threadHandler.post(new Runnable() {
|
|
public void run() {
|
|
final AddSubject addSubject = new AddSubject(getApplicationContext());
|
|
addSubject.execute(subject);
|
|
|
|
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
|
@Override
|
|
public void onCancel(DialogInterface dialog) {
|
|
addSubject.cancel(true);
|
|
addEditSubjectDialog.dismiss();
|
|
finish();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
thread.start();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
private void editSubjectListeners() {
|
|
// Override the back button so it closes the dialog
|
|
addEditSubjectDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
|
|
@Override
|
|
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
|
|
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled()) {
|
|
dialog.cancel();
|
|
eraseAddEditSubjects();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
|
|
// Override the back button
|
|
addEditSubjectDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
// Override the standard dismiss onClick to make sure that the window does not close
|
|
|
|
TextView textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_name);
|
|
String subjectName = textView.getText().toString();
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_code);
|
|
int subjectCode = (textView.getText().toString().equals("")) ? 0 : Integer.parseInt(textView.getText().toString());
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_name);
|
|
String majorName = textView.getText().toString();
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_code);
|
|
int majorCode = (textView.getText().toString().equals("")) ? 0 : Integer.parseInt(textView.getText().toString());
|
|
|
|
int subjectId = 0;
|
|
int majorId = 0;
|
|
for (int i = 0; i < optionsSelected.length; i++) {
|
|
if (optionsSelected[i]) {
|
|
subjectId = subjectListAdapter.getSubject(i).getSubjectId();
|
|
majorId = subjectListAdapter.getSubject(i).getMajorId();
|
|
}
|
|
}
|
|
|
|
if (subjectName.trim().equals("")) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_subject_name, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (majorName.trim().equals("")) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_major_name, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (subjectCode == 0) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_subject_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (String.valueOf(subjectCode).length() < 6) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_invalid_subject_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (majorCode == 0) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_blank_major_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if (String.valueOf(majorCode).length() < 4) {
|
|
Toast.makeText(getApplicationContext(), R.string.subjects_invalid_major_code, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else {
|
|
Major major = new Major(majorId, majorName, majorCode);
|
|
final Subject subject = new Subject(major, subjectId, subjectName, subjectCode);
|
|
|
|
sqlParser = new SQLParser(getApplicationContext());
|
|
thread = new Thread(new Runnable() {
|
|
public void run() {
|
|
ubbDB = sqlParser.getWritableDatabase();
|
|
threadHandler.post(new Runnable() {
|
|
public void run() {
|
|
final SaveEditSubject saveEditSubject = new SaveEditSubject(getApplicationContext());
|
|
saveEditSubject.execute(subject);
|
|
|
|
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
|
@Override
|
|
public void onCancel(DialogInterface dialog) {
|
|
saveEditSubject.cancel(true);
|
|
addEditSubjectDialog.dismiss();
|
|
finish();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
thread.start();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
private void eraseAddEditSubjects() {
|
|
TextView textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_name);
|
|
textView.setText("");
|
|
textView.requestFocus();
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_code);
|
|
textView.setText("");
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_name);
|
|
textView.setText("");
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_code);
|
|
textView.setText("");
|
|
}
|
|
|
|
private class EditSubject extends AsyncTask<Void, Void, Subject> {
|
|
private Context context;
|
|
private PowerManager.WakeLock wakeLock;
|
|
|
|
protected EditSubject(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 Subject doInBackground(Void... variable) {
|
|
if (isCancelled()) {
|
|
return null;
|
|
}
|
|
|
|
Subject subject = new Subject();
|
|
|
|
for (int i = 0; i < optionsSelected.length; i++) {
|
|
if (optionsSelected[i]) {
|
|
subject = subjectListAdapter.getSubject(i);
|
|
}
|
|
}
|
|
|
|
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 + " WHERE " + DBSubjects.COLUMN_CODE + "=" + subject.getSubjectCode() + " LIMIT 1";
|
|
if (BuildConfig.DEBUG) {
|
|
Log.d("SubjectList", query);
|
|
}
|
|
Cursor cursor = ubbDB.rawQuery(query, null);
|
|
|
|
cursor.moveToFirst();
|
|
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)));
|
|
subject = 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 subject;
|
|
}
|
|
|
|
@Override
|
|
protected void onPostExecute(Subject subject) {
|
|
// Release the kraken errr wakelock
|
|
wakeLock.release();
|
|
addEditSubjectDialog.setTitle(R.string.subjects_edit_subject);
|
|
|
|
TextView textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_name);
|
|
textView.setText(subject.getSubjectName());
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_subject_code);
|
|
textView.setText(String.valueOf(subject.getSubjectCode()));
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_name);
|
|
textView.setText(subject.getMajorName());
|
|
textView = (TextView) addEditSubjectView.findViewById(R.id.edit_major_code);
|
|
textView.setText(String.valueOf(subject.getMajorCode()));
|
|
|
|
addEditSubjectDialog.show();
|
|
editSubjectListeners();
|
|
}
|
|
}
|
|
|
|
private class SaveEditSubject extends AsyncTask<Subject, Subject, Void> {
|
|
private Context context;
|
|
private PowerManager.WakeLock wakeLock;
|
|
|
|
protected SaveEditSubject(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(Subject... subjects) {
|
|
for (Subject subject : subjects) {
|
|
if (isCancelled()) {
|
|
return null;
|
|
}
|
|
|
|
// Get the major id from the subject
|
|
Cursor cursor = ubbDB.query(
|
|
DBSubjects.TABLE_NAME,
|
|
new String[] {DBSubjects.COLUMN_MAJOR},
|
|
DBSubjects.COLUMN_ID+ "=" + subject.getSubjectId(),
|
|
null,
|
|
null,
|
|
null,
|
|
"1");
|
|
|
|
cursor.moveToFirst();
|
|
int oldMajorId = cursor.getInt(cursor.getColumnIndex(DBSubjects.COLUMN_MAJOR));
|
|
cursor.close();
|
|
|
|
// Get the old major code and name based on the old id
|
|
cursor = ubbDB.query(
|
|
DBMajors.TABLE_NAME,
|
|
DBMajors.ALL_COLUMNS,
|
|
DBMajors.COLUMN_ID+ "=" + oldMajorId,
|
|
null,
|
|
null,
|
|
null,
|
|
"1");
|
|
|
|
cursor.moveToFirst();
|
|
int oldMajorCode = cursor.getInt(cursor.getColumnIndex(DBMajors.COLUMN_CODE));
|
|
cursor.close();
|
|
|
|
// Get a count of how many subjects use this major code
|
|
cursor = ubbDB.query(
|
|
DBSubjects.TABLE_NAME,
|
|
new String[] {DBSubjects.COLUMN_ID},
|
|
DBSubjects.COLUMN_MAJOR+ "=" + oldMajorId,
|
|
null,
|
|
null,
|
|
null,
|
|
null);
|
|
|
|
// Did they change the major code?
|
|
if (oldMajorCode != subject.getMajorCode()) {
|
|
if (cursor.getCount() > 1) {
|
|
cursor.close();
|
|
|
|
// Check if a code already exists that we are changing to
|
|
cursor = ubbDB.query(
|
|
DBMajors.TABLE_NAME,
|
|
new String[]{DBMajors.COLUMN_ID},
|
|
DBMajors.COLUMN_CODE + "=" + subject.getMajorCode() + " AND " + DBMajors.COLUMN_ID + "!=" + subject.getMajorId(),
|
|
null,
|
|
null,
|
|
null,
|
|
"1");
|
|
|
|
if (cursor.getCount() > 0) {
|
|
cursor.moveToFirst();
|
|
subject.setMajorId(cursor.getInt(cursor.getColumnIndex(DBMajors.COLUMN_ID)));
|
|
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBMajors.COLUMN_NAME, subject.getMajorName());
|
|
ubbDB.update(DBMajors.TABLE_NAME,
|
|
values,
|
|
DBMajors.COLUMN_CODE + "=" + subject.getMajorCode(),
|
|
null);
|
|
}
|
|
else {
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBMajors.COLUMN_CODE, subject.getMajorCode());
|
|
values.put(DBMajors.COLUMN_NAME, subject.getMajorName());
|
|
subject.setMajorId((int) ubbDB.insert(DBMajors.TABLE_NAME, null, values));
|
|
}
|
|
cursor.close();
|
|
}
|
|
else {
|
|
cursor.close();
|
|
|
|
// Check if a code already exists that we are changing to
|
|
cursor = ubbDB.query(
|
|
DBMajors.TABLE_NAME,
|
|
new String[] {DBMajors.COLUMN_ID},
|
|
DBMajors.COLUMN_CODE + "=" + subject.getMajorCode() + " AND " + DBMajors.COLUMN_ID + "!=" + subject.getMajorId(),
|
|
null,
|
|
null,
|
|
null,
|
|
"1");
|
|
|
|
ubbDB.delete(DBMajors.TABLE_NAME, DBMajors.COLUMN_CODE + "=" + oldMajorCode, null);
|
|
|
|
if (cursor.getCount() > 0) {
|
|
cursor.moveToFirst();
|
|
subject.setMajorId(cursor.getInt(cursor.getColumnIndex(DBMajors.COLUMN_ID)));
|
|
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBMajors.COLUMN_CODE, subject.getMajorCode());
|
|
values.put(DBMajors.COLUMN_NAME, subject.getMajorName());
|
|
ubbDB.update(DBMajors.TABLE_NAME,
|
|
values,
|
|
DBMajors.COLUMN_ID + "=" + subject.getMajorId(),
|
|
null);
|
|
}
|
|
else {
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBMajors.COLUMN_CODE, subject.getMajorCode());
|
|
values.put(DBMajors.COLUMN_NAME, subject.getMajorName());
|
|
subject.setMajorId((int) ubbDB.insert(DBMajors.TABLE_NAME, null, values));
|
|
}
|
|
cursor.close();
|
|
}
|
|
}
|
|
else {
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBMajors.COLUMN_NAME, subject.getMajorName());
|
|
ubbDB.update(DBMajors.TABLE_NAME,
|
|
values,
|
|
DBMajors.COLUMN_ID + "=" + subject.getMajorId(),
|
|
null);
|
|
}
|
|
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBSubjects.COLUMN_CODE, subject.getSubjectCode());
|
|
values.put(DBSubjects.COLUMN_NAME, subject.getSubjectName());
|
|
values.put(DBSubjects.COLUMN_MAJOR, subject.getMajorId());
|
|
ubbDB.update(DBSubjects.TABLE_NAME,
|
|
values,
|
|
DBSubjects.COLUMN_CODE + "=" + subject.getSubjectCode(),
|
|
null);
|
|
|
|
ubbDB.close();
|
|
sqlParser.close();
|
|
}
|
|
publishProgress(subjects);
|
|
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
protected void onProgressUpdate(Subject... subjects) {
|
|
// Add the subject to the adapter
|
|
for (Subject subject : subjects) {
|
|
int index;
|
|
for (index = 0; index < optionsSelected.length; index++) {
|
|
if (optionsSelected[index]) {
|
|
break;
|
|
}
|
|
}
|
|
subjectListAdapter.updateSubject(index, subject);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPostExecute(Void result) {
|
|
// Release the kraken errr wakelock
|
|
Toast.makeText(context, R.string.subjects_edited, Toast.LENGTH_SHORT).show();
|
|
wakeLock.release();
|
|
addEditSubjectDialog.dismiss();
|
|
// Update the adapter list to show
|
|
for (int i = 0; i < optionsSelected.length; i++) {
|
|
if (optionsSelected[i]) {
|
|
CardView cardView = (CardView) recyclerView.getChildAt(i);
|
|
cardView.setCardBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimaryDark));
|
|
}
|
|
}
|
|
recyclerView.swapAdapter(subjectListAdapter, true);
|
|
optionsSelected = null;
|
|
invalidateOptionsMenu();
|
|
fab.show();
|
|
eraseAddEditSubjects();
|
|
}
|
|
}
|
|
|
|
private class AddSubject extends AsyncTask<Subject, Subject, Integer> {
|
|
private Context context;
|
|
private PowerManager.WakeLock wakeLock;
|
|
|
|
protected AddSubject(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 Integer doInBackground(Subject... subjects) {
|
|
for (Subject subject : subjects) {
|
|
if (isCancelled()) {
|
|
return 0;
|
|
}
|
|
|
|
Cursor cursor = ubbDB.query(DBMajors.TABLE_NAME, new String[] {DBMajors.COLUMN_ID}, DBMajors.COLUMN_CODE + "=" + subject.getMajorCode(), null, null, null, "1");
|
|
|
|
boolean majorExists = (cursor.getCount() > 0);
|
|
if (majorExists) {
|
|
cursor.moveToFirst();
|
|
subject.setMajorId(cursor.getInt(cursor.getColumnIndex(DBMajors.COLUMN_ID)));
|
|
}
|
|
cursor.close();
|
|
|
|
cursor = ubbDB.query(DBSubjects.TABLE_NAME, new String[] {DBSubjects.COLUMN_ID}, DBSubjects.COLUMN_CODE + "=" + subject.getSubjectCode(), null, null, null, "1");
|
|
|
|
if (cursor.getCount() > 0) {
|
|
cursor.close();
|
|
return -1;
|
|
}
|
|
cursor.close();
|
|
|
|
if (majorExists) {
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBMajors.COLUMN_CODE, subject.getMajorCode());
|
|
values.put(DBMajors.COLUMN_NAME, subject.getMajorName());
|
|
ubbDB.update(DBMajors.TABLE_NAME, values, DBMajors.COLUMN_ID + "=" + subject.getMajorId(), null);
|
|
}
|
|
else {
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBMajors.COLUMN_CODE, subject.getMajorCode());
|
|
values.put(DBMajors.COLUMN_NAME, subject.getMajorName());
|
|
subject.setMajorId((int) ubbDB.insert(DBMajors.TABLE_NAME, null, values));
|
|
}
|
|
|
|
ContentValues values = new ContentValues();
|
|
values.put(DBSubjects.COLUMN_CODE, subject.getSubjectCode());
|
|
values.put(DBSubjects.COLUMN_NAME, subject.getSubjectName());
|
|
values.put(DBSubjects.COLUMN_MAJOR, subject.getMajorId());
|
|
subject.setSubjectId((int) ubbDB.insert(DBSubjects.TABLE_NAME, null, values));
|
|
|
|
ubbDB.close();
|
|
sqlParser.close();
|
|
}
|
|
publishProgress(subjects);
|
|
|
|
return 1;
|
|
}
|
|
|
|
@Override
|
|
protected void onProgressUpdate(Subject... subjects) {
|
|
// Add the subject to the adapter
|
|
for (Subject subject : subjects) {
|
|
subjectListAdapter.addSubject(subject);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPostExecute(Integer result) {
|
|
// Release the kraken errr wakelock
|
|
wakeLock.release();
|
|
addEditSubjectDialog.dismiss();
|
|
// Update the adapter list to show
|
|
if (result == 1) {
|
|
recyclerView.swapAdapter(subjectListAdapter, true);
|
|
Toast.makeText(context, R.string.subjects_added, Toast.LENGTH_SHORT).show();
|
|
}
|
|
else if(result == -1) {
|
|
Toast.makeText(context, R.string.subjects_subject_exists, Toast.LENGTH_SHORT).show();
|
|
}
|
|
eraseAddEditSubjects();
|
|
}
|
|
}
|
|
}
|