/* * Copyright (C) 2016 Ferid Cafer * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ferid.app.classroom.past_attendances; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.AppCompatCheckBox; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CompoundButton; import android.widget.TextView; import com.ferid.app.classroom.R; import com.ferid.app.classroom.adapters.TakeAttendanceAdapter; import com.ferid.app.classroom.database.DatabaseManager; import com.ferid.app.classroom.date_time_pickers.DatePickerFragment; import com.ferid.app.classroom.date_time_pickers.TimePickerFragment; import com.ferid.app.classroom.listeners.AdapterClickListener; import com.ferid.app.classroom.listeners.DateBackListener; import com.ferid.app.classroom.listeners.OnAlertClick; import com.ferid.app.classroom.material_dialog.CustomAlertDialog; import com.ferid.app.classroom.model.Classroom; import com.ferid.app.classroom.model.Student; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; /** * Created by ferid.cafer on 4/16/2015.<br /> * Alters a past attendance. */ public class PastAttendanceActivity extends AppCompatActivity implements DateBackListener { private Context context; private Toolbar toolbar; private RecyclerView list; private ArrayList<Student> arrayList = new ArrayList<>(); private TakeAttendanceAdapter adapter; private TextView emptyText; //empty list view text private Classroom classroom; private String dateTime = ""; //date and time pickers private DatePickerFragment datePickerFragment; private TimePickerFragment timePickerFragment; private Date changedDate; //save button private FloatingActionButton floatingActionButton; //select all - all students are present or absent private AppCompatCheckBox checkBoxSelectAll; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.selectable_list); Bundle args = getIntent().getExtras(); if (args != null) { classroom = args.getParcelable("classroom"); dateTime = args.getString("dateTime"); } context = this; //toolbar setToolbar(); list = (RecyclerView) findViewById(R.id.list); adapter = new TakeAttendanceAdapter(context, arrayList); list.setAdapter(adapter); list.setLayoutManager(new LinearLayoutManager(context)); list.setHasFixedSize(true); emptyText = (TextView) findViewById(R.id.emptyText); emptyText.setText(getString(R.string.emptyMessageSave)); addAdapterClickListener(); floatingActionButton = (FloatingActionButton) findViewById(R.id.floatingActionButton); startButtonAnimation(); checkBoxSelectAll = (AppCompatCheckBox) findViewById(R.id.checkBoxSelectAll); checkBoxSelectAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (!arrayList.isEmpty()) { //make all students present or absent for (Student stud : arrayList) { stud.setPresent(isChecked); } adapter.notifyDataSetChanged(); } } }); new SelectAttendingStudents().execute(); } /** * Create toolbar and set its attributes */ private void setToolbar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } if (toolbar != null && classroom != null && dateTime != null) { setTitle(classroom.getName()); toolbar.setSubtitle(dateTime); } } /** * Set empty list text */ private void setEmptyText() { if (emptyText != null) { if (arrayList.isEmpty()) { emptyText.setVisibility(View.VISIBLE); } else { emptyText.setVisibility(View.GONE); } } } /** * Set floating action button with its animation */ private void startButtonAnimation() { new Handler().post(new Runnable() { @Override public void run() { floatingActionButton.setImageResource(R.drawable.ic_action_save); floatingActionButton.show(); } }); floatingActionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new UpdateAttendance().execute(); } }); } /** * List item click event */ private void addAdapterClickListener() { adapter.setAdapterClickListener(new AdapterClickListener() { @Override public void OnItemClick(int position) { if (arrayList.size() > position) { Student student = arrayList.get(position); boolean isPresent = !student.isPresent(); arrayList.get(position).setPresent(isPresent); adapter.notifyDataSetChanged(); } } }); } /** * Shows date picker */ private void changeDate() { datePickerFragment = new DatePickerFragment(); datePickerFragment.show(getSupportFragmentManager(), "DatePickerFragment"); } /** * Shows time picker */ private void changeTime() { timePickerFragment = new TimePickerFragment(); timePickerFragment.show(getSupportFragmentManager(), "TimePickerFragment"); } /** * Makes the change both on variable that will be send to DB and on the toolbar subtitle */ private void changeDateTime() { SimpleDateFormat targetFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); dateTime = targetFormat.format(changedDate); toolbar.setSubtitle(dateTime); } @Override public void OnPress(int dayOfMonth, int month, int year) { changedDate.setYear(year - 1900); changedDate.setMonth(month); changedDate.setDate(dayOfMonth); changeTime(); } @Override public void OnPress(int minute, int hour) { changedDate.setHours(hour); changedDate.setMinutes(minute); changeDateTime(); } /** * Select attending and non-attending students from DB */ private class SelectAttendingStudents extends AsyncTask<Void, Void, ArrayList<Student>> { @Override protected ArrayList<Student> doInBackground(Void... params) { ArrayList<Student> tmpList = null; if (classroom != null) { DatabaseManager databaseManager = new DatabaseManager(context); tmpList = databaseManager.selectAttendingStudents(dateTime, classroom.getId()); } return tmpList; } @Override protected void onPostExecute(ArrayList<Student> tmpList) { arrayList.clear(); if (tmpList != null) { arrayList.addAll(tmpList); adapter.notifyDataSetChanged(); setEmptyText(); } } } /** * Update attendance */ private class UpdateAttendance extends AsyncTask<Void, Void, Integer> { @Override protected Integer doInBackground(Void... params) { DatabaseManager databaseManager = new DatabaseManager(context); int rowsAffected = databaseManager.updateAttendance(arrayList, dateTime); return rowsAffected; } @Override protected void onPostExecute(Integer rowsAffected) { if (rowsAffected > 0) { Intent intent = new Intent(); intent.putExtra("actionMessage", getString(R.string.saved)); setResult(RESULT_OK, intent); } closeWindow(); } } /** * Delete selected date's attendance item from DB */ private class DeleteAttendance extends AsyncTask<Void, Void, Boolean> { @Override protected Boolean doInBackground(Void... params) { DatabaseManager databaseManager = new DatabaseManager(context); boolean isSuccessful = databaseManager.deleteAttendance(dateTime, classroom.getId()); return isSuccessful; } @Override protected void onPostExecute(Boolean isSuccessful) { if (isSuccessful) { Intent intent = new Intent(); intent.putExtra("actionMessage", getString(R.string.deleted)); setResult(RESULT_OK, intent); closeWindow(); } } } /** * Delete attendance */ private void deleteAttendance() { //show alert before deleting CustomAlertDialog customAlertDialog = new CustomAlertDialog(context); customAlertDialog.setMessage(dateTime + getString(R.string.sureToDelete)); customAlertDialog.setPositiveButtonText(getString(R.string.delete)); customAlertDialog.setNegativeButtonText(getString(R.string.cancel)); customAlertDialog.setOnClickListener(new OnAlertClick() { @Override public void OnPositive() { new DeleteAttendance().execute(); } @Override public void OnNegative() { //do nothing } }); customAlertDialog.showDialog(); } private void closeWindow() { finish(); overridePendingTransition(R.anim.stand_still, R.anim.move_out_to_bottom); } @Override public void onBackPressed() { closeWindow(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_past_attendance, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar actions click switch (item.getItemId()) { case android.R.id.home: closeWindow(); return true; case R.id.changeDateTime: changedDate = new Date(); changeDate(); return true; case R.id.deleteAttendance: deleteAttendance(); return true; default: return super.onOptionsItemSelected(item); } } }