es.ugr.swad.swadroid.modules.rollcall.UsersActivity.java Source code

Java tutorial

Introduction

Here is the source code for es.ugr.swad.swadroid.modules.rollcall.UsersActivity.java

Source

/*
 *
 *  *  This file is part of SWADroid.
 *  *
 *  *  Copyright (C) 2010 Juan Miguel Boyero Corral <juanmi1982@gmail.com>
 *  *
 *  *  SWADroid is free software: you can redistribute it and/or modify
 *  *  it under the terms of the GNU General Public License as published by
 *  *  the Free Software Foundation, either version 3 of the License, or
 *  *  (at your option) any later version.
 *  *
 *  *  SWADroid is distributed in the hope that it will be useful,
 *  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  *  GNU General Public License for more details.
 *  *
 *  *  You should have received a copy of the GNU General Public License
 *  *  along with SWADroid.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package es.ugr.swad.swadroid.modules.rollcall;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.TextView;

import com.google.zxing.client.android.Intents;

import java.util.List;

import es.ugr.swad.swadroid.Constants;
import es.ugr.swad.swadroid.R;
import es.ugr.swad.swadroid.analytics.SWADroidTracker;
import es.ugr.swad.swadroid.database.DataBaseHelper;
import es.ugr.swad.swadroid.gui.DialogFactory;
import es.ugr.swad.swadroid.gui.MenuExpandableListActivity;
import es.ugr.swad.swadroid.model.UserAttendance;
import es.ugr.swad.swadroid.modules.courses.Courses;

/**
 * UsersActivity module.
 *
 * @author Juan Miguel Boyero Corral <juanmi1982@gmail.com>
 */
public class UsersActivity extends MenuExpandableListActivity implements SwipeRefreshLayout.OnRefreshListener {
    /**
     * Rollcall tag name for Logcat
     */
    public static final String TAG = Constants.APP_TAG + " UsersActivity";
    /**
     * Code of event associated to the users list
     */
    private static int eventCode;
    /**
     * ListView of users
     */
    private static ListView lvUsers;
    /**
     * Adapter for ListView of users
     */
    UsersCursorAdapter adapter;
    /**
     * Database cursor for Adapter of users
     */
    Cursor dbCursor;
    /**
     * Layout with "Pull to refresh" function
     */
    private SwipeRefreshLayout refreshLayout;
    /**
     * TextView for the empty users message
     */
    TextView emptyUsersTextView;
    /**
     * Flag for indicate if device has a rear camera available
     */
    boolean hasRearCam;

    /* (non-Javadoc)
     * @see es.ugr.swad.swadroid.MenuExpandableListActivity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_items_pulltorefresh);

        refreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container_list);
        emptyUsersTextView = (TextView) findViewById(R.id.list_item_title);
        lvUsers = (ListView) findViewById(R.id.list_pulltorefresh);

        lvUsers.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int scrollState) {
            }

            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount,
                    int totalItemCount) {

                /*boolean enable = true;
                if ((lvUsers != null) && (lvUsers.getChildCount() > 0)) {
                    
                // check if the first item of the list is visible
                boolean firstItemVisible = lvUsers.getFirstVisiblePosition() == 0;
                // check if the top of the first item is visible
                boolean topOfFirstItemVisible = lvUsers.getChildAt(0).getTop() == 0;
                // enabling or disabling the refresh layout
                enable = firstItemVisible && topOfFirstItemVisible;
                }*/
                boolean enable = (lvUsers != null) && (lvUsers.getChildCount() == 0);
                refreshLayout.setEnabled(enable);
            }
        });

        refreshLayout.setOnRefreshListener(this);
        setAppearance();

        getSupportActionBar().setSubtitle(Courses.getSelectedCourseShortName());
        getSupportActionBar().setIcon(R.drawable.roll_call);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }

        eventCode = this.getIntent().getIntExtra("attendanceEventCode", 0);
        hasRearCam = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
    }

    /* (non-Javadoc)
     * @see es.ugr.swad.swadroid.MenuExpandableListActivity#Override(android.os.Bundle)
     */
    @Override
    protected void onStart() {
        super.onStart();
        SWADroidTracker.sendScreenView(getApplicationContext(), TAG);

        //Refresh ListView of users
        refreshAdapter();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        switch (requestCode) {
        case Constants.ROLLCALL_USERS_DOWNLOAD_REQUEST_CODE:
            refreshAdapter();
            break;
        case Constants.ROLLCALL_USERS_SEND_REQUEST_CODE:
            refreshAdapter();
            break;
        case Constants.SCAN_QR_REQUEST_CODE:
            refreshAdapter();
            break;
        }
    }

    private void refreshAdapter() {
        /*
         * Database query can be a time consuming task ..
         * so its safe to call database query in another thread
         * Handler, will handle this stuff for you
         */
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                dbCursor = dbHelper.getUsersEventCursor(eventCode);
                startManagingCursor(dbCursor);

                /*
                 * If there aren't users to show, hide the users lvUsers
                 * and show the empty users message
                 */
                if ((dbCursor == null) || (dbCursor.getCount() == 0)) {
                    Log.d(TAG, "Users lvUsers is empty");

                    emptyUsersTextView.setText(R.string.usersEmptyListMsg);
                    emptyUsersTextView.setVisibility(View.VISIBLE);

                    lvUsers.setVisibility(View.GONE);

                    refreshLayout.setEnabled(true);
                } else {
                    Log.d(TAG, "Users lvUsers is not empty");

                    emptyUsersTextView.setVisibility(View.GONE);
                    lvUsers.setVisibility(View.VISIBLE);
                }

                adapter = new UsersCursorAdapter(getBaseContext(), dbCursor, dbHelper, eventCode);
                lvUsers.setAdapter(adapter);

                showProgress(false);
            }
        });
    }

    private void refreshUsers() {
        showProgress(true);

        Intent activity = new Intent(this, UsersDownload.class);
        activity.putExtra("attendanceEventCode", eventCode);
        startActivityForResult(activity, Constants.ROLLCALL_USERS_DOWNLOAD_REQUEST_CODE);
    }

    public void showProgress(boolean show) {
        DialogFactory.showProgress(this, show, R.id.swipe_container_list, R.id.loading_status);
    }

    /**
     * It shows the SwipeRefreshLayout progress
     */
    public void showSwipeProgress() {
        refreshLayout.setRefreshing(true);
    }

    /**
     * It shows the SwipeRefreshLayout progress
     */
    public void hideSwipeProgress() {
        refreshLayout.setRefreshing(false);
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    private void setAppearance() {
        refreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
                android.R.color.holo_orange_light, android.R.color.holo_red_light);
    }

    /**
     * It must be overriden by parent classes if manual swipe is enabled.
     */
    @Override
    public void onRefresh() {
        showSwipeProgress();

        refreshUsers();

        hideSwipeProgress();
    }

    private String getUsersCodes() {
        String usersCodes = "";
        List<UserAttendance> usersList = dbHelper.getUsersEvent(eventCode);

        //Concatenate the user code of all users checked as present and separate them with commas
        for (UserAttendance user : usersList) {
            if (user.isUserPresent()) {
                usersCodes += user.getId() + ",";
            }
        }

        //Remove final comma
        if (!usersCodes.isEmpty()) {
            usersCodes = usersCodes.substring(0, usersCodes.length() - 1);
        }

        return usersCodes;
    }

    private void scanQRCode() {
        Intent activity = new Intent(Intents.Scan.ACTION);
        activity.putExtra("SCAN_MODE", "QR_CODE_MODE,ONE_D_MODE");
        activity.putExtra("SCAN_FORMATS", "QR_CODE,ONE_D_FORMATS");
        startActivityForResult(activity, Constants.SCAN_QR_REQUEST_CODE);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.rollcall_activity_actions, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.action_scanQR:
            // Check if device has a rear camera
            if (hasRearCam) {
                // check Android 6 permission
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA },
                            Constants.PERMISSIONS_REQUEST_CAMERA);
                } else {
                    scanQRCode();
                }
            } else {
                //If the device has no rear camera available show error message
                error(TAG, getString(R.string.noCameraFound), null, false);
            }

            return true;

        case R.id.action_sendMsg:
            String usersCodes = getUsersCodes();

            Intent activity = new Intent(getApplicationContext(), UsersSend.class);
            activity.putExtra("attendanceEventCode", eventCode);
            //Set unmarked users as absent
            activity.putExtra("setOthersAsAbsent", 1);
            activity.putExtra("usersCodes", usersCodes);
            startActivityForResult(activity, Constants.ROLLCALL_USERS_SEND_REQUEST_CODE);

            return true;

        case R.id.action_cleanUsers:
            AlertDialog cleanDBDialog = DialogFactory.createWarningDialog(this, -1, R.string.areYouSure,
                    R.string.cleanUsersDialogMsg, R.string.yesMsg, R.string.noMsg, true,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();

                            dbHelper.beginTransaction();
                            dbHelper.removeAllRows(DataBaseHelper.DB_TABLE_USERS_ATTENDANCES, "eventCode",
                                    eventCode);
                            dbHelper.updateEventStatus(eventCode, "OK");
                            dbHelper.endTransaction(true);

                            refreshAdapter();
                        }
                    }, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    }, null);

            cleanDBDialog.show();

            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }

    public static int getEventCode() {
        return eventCode;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
            @NonNull int[] grantResults) {
        switch (requestCode) {
        case Constants.PERMISSIONS_REQUEST_CAMERA: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                scanQRCode();
            }
        }
        }
    }
}