es.usc.citius.servando.calendula.activities.PatientsActivity.java Source code

Java tutorial

Introduction

Here is the source code for es.usc.citius.servando.calendula.activities.PatientsActivity.java

Source

/*
 *    Calendula - An assistant for personal medication management.
 *    Copyright (C) 2016 CITIUS - USC
 *
 *    Calendula 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.
 *
 *    This program 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 this software.  If not, see <http://www.gnu.org/licenses/>.
 */

package es.usc.citius.servando.calendula.activities;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.util.Pair;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

import com.getbase.floatingactionbutton.FloatingActionButton;
import com.mikepenz.community_material_typeface_library.CommunityMaterial;
import com.mikepenz.iconics.IconicsDrawable;

import java.util.Collections;
import java.util.List;

import es.usc.citius.servando.calendula.CalendulaActivity;
import es.usc.citius.servando.calendula.R;
import es.usc.citius.servando.calendula.database.DB;
import es.usc.citius.servando.calendula.events.PersistenceEvents;
import es.usc.citius.servando.calendula.persistence.Patient;
import es.usc.citius.servando.calendula.util.AvatarMgr;
import es.usc.citius.servando.calendula.util.ScreenUtils;
import es.usc.citius.servando.calendula.util.Snack;

public class PatientsActivity extends CalendulaActivity implements GridView.OnItemClickListener {

    GridView gridView;
    PatientAdapter adapter;
    FloatingActionButton fab;

    List<Patient> patients = Collections.emptyList();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patients);
        setupStatusBar(getResources().getColor(R.color.dark_grey_home));
        setupToolbar("Pacientes", getResources().getColor(R.color.dark_grey_home));
        subscribeToEvents();

        //patients = DB.patients().findAll();
        fab = (FloatingActionButton) findViewById(R.id.add_button);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(PatientsActivity.this, PatientDetailActivity.class);
                startActivity(intent);
            }
        });

        gridView = (GridView) findViewById(R.id.grid);
        adapter = new PatientAdapter(this);
        gridView.setAdapter(adapter);
        gridView.setOnItemClickListener(this);
        gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Patient p = (Patient) parent.getItemAtPosition(position);
                if (!p.isDefault())
                    showRemovePatientDialog(p);
                else
                    showRemoveDefaultPatientMsgDialog(p);
                return true;
            }
        });
    }

    private void showRemoveDefaultPatientMsgDialog(final Patient p) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(
                "Este es el paciente por defecto, y por lo tanto no puede ser eliminado. Deseas eliminar todas sus pautas, medicamentos y rutinas?")
                .setCancelable(true).setPositiveButton("Si, eliminar todo", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        DB.patients().removeAllStuff(p);
                        Snack.show("Hecho!", PatientsActivity.this);
                    }
                }).setNegativeButton(getString(R.string.dialog_no_option), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }

    private void showRemovePatientDialog(final Patient p) {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Deseas eliminar el paciente " + p.name() + "?").setCancelable(true)
                .setPositiveButton(getString(R.string.dialog_yes_option), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        if (DB.patients().isActive(p, getApplicationContext())) {
                            DB.patients().setActive(DB.patients().getDefault(), getApplicationContext());
                        }
                        DB.patients().removeCascade(p);
                        notifyDataChange();
                    }
                }).setNegativeButton(getString(R.string.dialog_no_option), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();

    }

    @Override
    protected void onResume() {
        super.onResume();
        notifyDataChange();
    }

    private void notifyDataChange() {
        patients = DB.patients().findAll();
        adapter.notifyDataSetChanged();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unsubscribeFromEvents();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_patients, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Patient item = (Patient) parent.getItemAtPosition(position);

        Intent intent = new Intent(this, PatientDetailActivity.class);
        intent.putExtra("patient_id", item.id());

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(this,
                    new Pair<>(view.findViewById(R.id.patient_avatar), "transition"),
                    new Pair<>(findViewById(R.id.add_button), "fab"));
            ActivityCompat.startActivity(this, intent, activityOptions.toBundle());
        } else
            startActivity(intent);
    }

    // Method called from the event bus
    @SuppressWarnings("unused")
    public void onEvent(PersistenceEvents.UserCreateEvent event) {
        this.patients = DB.patients().findAll();
        this.adapter.notifyDataSetChanged();
    }

    // Method called from the event bus
    @SuppressWarnings("unused")
    public void onEvent(PersistenceEvents.ActiveUserChangeEvent event) {
        this.adapter.notifyDataSetChanged();
    }

    private class PatientAdapter extends BaseAdapter {

        private Context context;

        public PatientAdapter(Context context) {
            this.context = context;
        }

        @Override
        public int getCount() {
            return patients.size();
        }

        @Override
        public Object getItem(int position) {
            return patients.get(position);
        }

        @Override
        public long getItemId(int position) {
            return patients.get(position).id();
        }

        @Override
        public View getView(int position, View view, ViewGroup viewGroup) {

            if (view == null) {
                LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.activity_patients_item, viewGroup, false);
            }

            final Patient p = (Patient) getItem(position);

            Log.d("Patients", p.toString());

            boolean isActive = DB.patients().isActive(p, context);

            ImageView patientAvatar = (ImageView) view.findViewById(R.id.patient_avatar);
            ImageView patientAvatarBg = (ImageView) view.findViewById(R.id.patient_avatar_bg);
            TextView patientName = (TextView) view.findViewById(R.id.patient_name);
            ImageView lockIcon = (ImageView) view.findViewById(R.id.lock_icon);
            View activeIndicator = view.findViewById(R.id.active_indicator);
            int color = p.color();

            patientName.setText(p.name());
            patientName.setBackgroundColor(color);
            patientAvatar.setImageResource(AvatarMgr.res(p.avatar()));

            if (isActive) {
                activeIndicator.setVisibility(View.VISIBLE);
            } else {
                activeIndicator.setVisibility(View.GONE);
            }

            if (p.isDefault()) {
                lockIcon.setImageDrawable(
                        new IconicsDrawable(getApplicationContext(), CommunityMaterial.Icon.cmd_lock).sizeDp(20)
                                .paddingDp(5).color(Color.WHITE));
            } else {
                lockIcon.setVisibility(View.GONE);
            }

            int colorAlpha = ScreenUtils.equivalentNoAlpha(color, 0.4f);
            patientAvatarBg.setBackgroundColor(colorAlpha);
            return view;

        }
    }

}