com.plnyyanks.frcnotebook.background.GetNotesForMatch.java Source code

Java tutorial

Introduction

Here is the source code for com.plnyyanks.frcnotebook.background.GetNotesForMatch.java

Source

package com.plnyyanks.frcnotebook.background;

import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.AsyncTask;
import android.util.Log;
import android.util.SparseArray;
import android.view.ActionMode;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.plnyyanks.frcnotebook.Constants;
import com.plnyyanks.frcnotebook.R;
import com.plnyyanks.frcnotebook.activities.StartActivity;
import com.plnyyanks.frcnotebook.adapters.ActionBarCallback;
import com.plnyyanks.frcnotebook.adapters.AllianceExpandableListAdapter;
import com.plnyyanks.frcnotebook.adapters.ListViewArrayAdapter;
import com.plnyyanks.frcnotebook.database.PreferenceHandler;
import com.plnyyanks.frcnotebook.datatypes.Event;
import com.plnyyanks.frcnotebook.datatypes.ListElement;
import com.plnyyanks.frcnotebook.datatypes.ListGroup;
import com.plnyyanks.frcnotebook.datatypes.ListItem;
import com.plnyyanks.frcnotebook.datatypes.Match;
import com.plnyyanks.frcnotebook.datatypes.Note;
import com.plnyyanks.frcnotebook.dialogs.DeleteDialog;
import com.plnyyanks.frcnotebook.dialogs.EditNoteDialog;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

/**
 * File created by phil on 3/1/14.
 * Copyright 2014, Phil Lopreiato
 * This file is part of FRC Notebook.
 * FRC Notebook 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.
 * FRC Notebook 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 FRC Notebook. If not, see http://www.gnu.org/licenses/.
 */
public class GetNotesForMatch extends AsyncTask<String, String, String> {

    private static final String TIME_FORMAT = "hh:mm a";

    private static Activity activity;
    private static String previousMatchKey, nextMatchKey;
    private static SparseArray<ListGroup> redGroups = new SparseArray<ListGroup>(),
            blueGroups = new SparseArray<ListGroup>();
    public static Object mActionMode;
    private static ListView genericList;
    public static String selectedNote = "";
    private static AllianceExpandableListAdapter redAdaper, blueAdapter;
    private static ExpandableListView redAlliance, blueAlliance;
    private static ListViewArrayAdapter genericAdapter;

    public GetNotesForMatch(Activity activity) {
        super();
        GetNotesForMatch.activity = activity;
    }

    @Override
    protected String doInBackground(String... strings) {
        String thisMatchKey, eventKey;
        previousMatchKey = strings[0];
        thisMatchKey = strings[1];
        nextMatchKey = strings[2];
        eventKey = strings[3];
        selectedNote = "";

        Match match = StartActivity.db.getMatch(thisMatchKey);
        Event parentEvent = match.getParentEvent();
        TextView matchTitle = (TextView) activity.findViewById(R.id.match_title);
        String titleString = Match.LONG_TYPES.get(match.getMatchType())
                + (match.getMatchType() == Match.MATCH_TYPES.QUAL ? " " : (" " + match.getSetNumber() + " Match "))
                + match.getMatchNumber();
        matchTitle.setText(titleString);
        if (PreferenceHandler.getTimesEnabled() && parentEvent.isHappeningNow()) {
            String matchTime = match.getMatchTime();
            if (matchTime != null && !matchTime.equals("")) {
                TextView timeOffset = (TextView) activity.findViewById(R.id.match_time);
                SimpleDateFormat df = new SimpleDateFormat(TIME_FORMAT);
                Log.d(Constants.LOG_TAG, "Showing match time");
                try {
                    Date matchStart = df.parse(matchTime);
                    Date currentTime = new Date();
                    int hourdif = currentTime.getHours() - matchStart.getHours();
                    int mindif = currentTime.getMinutes() - matchStart.getMinutes();
                    String timeString = Math.abs(hourdif) + ":" + String.format("%02d", Math.abs(mindif));
                    boolean ahead;
                    if (hourdif > 0 || (hourdif == 0 && mindif > 0)) {
                        timeString += " behind";
                        ahead = false;
                    } else {
                        timeString += " ahead";
                        ahead = true;
                    }
                    timeOffset.setText(timeString);
                    timeOffset.setTextColor(ahead ? Color.GREEN : Color.RED);
                    timeOffset.setVisibility(View.VISIBLE);
                } catch (ParseException e) {
                    Log.w(Constants.LOG_TAG, "Error parsing match time");
                }
            }
        }

        TextView redHeader = (TextView) activity.findViewById(R.id.red_score);
        if (match.getRedScore() >= 0 && PreferenceHandler.showMatchScores()) {
            redHeader.setText(Integer.toString(match.getRedScore()) + " Points");
        } else {
            redHeader.setVisibility(View.GONE);
        }

        TextView blueHeader = (TextView) activity.findViewById(R.id.blue_score);
        if (match.getBlueScore() >= 0 && PreferenceHandler.showMatchScores()) {
            blueHeader.setText(Integer.toString(match.getBlueScore()) + " Points");
        } else {
            blueHeader.setVisibility(View.GONE);
        }

        JsonArray redTeams = match.getRedAllianceTeams(), blueTeams = match.getBlueAllianceTeams();

        if (redTeams.size() > 0) {
            Iterator<JsonElement> iterator = redTeams.iterator();
            String teamKey;
            for (int i = 0; iterator.hasNext(); i++) {
                teamKey = iterator.next().getAsString();
                ArrayList<Note> notes = new ArrayList<Note>();
                if (PreferenceHandler.showGeneralNotes()) {
                    notes.addAll(StartActivity.db.getAllNotes(
                            StartActivity.db.KEY_EVENTKEY + "=? AND " + StartActivity.db.KEY_MATCHKEY + "=?",
                            new String[] { "all", "all" }));
                }
                notes.addAll(StartActivity.db.getAllNotes(teamKey, eventKey, thisMatchKey));
                int size = notes.size();
                ListGroup teamHeader = new ListGroup(
                        teamKey.substring(3) + (size > 0 ? (" (" + notes.size() + ")") : ""));

                for (Note n : notes) {
                    teamHeader.children.add(Note.buildMatchNoteTitle(n, false, false, false));
                    teamHeader.children_keys.add(Short.toString(n.getId()));
                }

                redGroups.append(i, teamHeader);
            }
        }
        if (blueTeams.size() > 0) {
            Iterator<JsonElement> iterator = blueTeams.iterator();
            String teamKey;
            for (int i = 0; iterator.hasNext(); i++) {
                teamKey = iterator.next().getAsString();
                ArrayList<Note> notes = new ArrayList<Note>();
                if (PreferenceHandler.showGeneralNotes()) {
                    notes.addAll(StartActivity.db.getAllNotes(
                            StartActivity.db.KEY_EVENTKEY + "=? AND " + StartActivity.db.KEY_MATCHKEY + "=?",
                            new String[] { "all", "all" }));
                }
                notes.addAll(StartActivity.db.getAllNotes(teamKey, eventKey, thisMatchKey));
                int size = notes.size();
                ListGroup teamHeader = new ListGroup(
                        teamKey.substring(3) + (size > 0 ? (" (" + notes.size() + ")") : ""));

                for (Note n : notes) {
                    teamHeader.children.add(Note.buildMatchNoteTitle(n, false, false, false));
                    teamHeader.children_keys.add(Short.toString(n.getId()));
                }

                blueGroups.append(i, teamHeader);
            }
        }

        //generic notes go here
        final ArrayList<Note> genericNotes = StartActivity.db.getAllNotes(
                StartActivity.db.KEY_TEAMKEY + "=? AND " + StartActivity.db.KEY_EVENTKEY + "=? AND "
                        + StartActivity.db.KEY_MATCHKEY + "=?",
                new String[] { "all", eventKey, match.getMatchKey() });
        Log.d(Constants.LOG_TAG, "Found " + genericNotes.size() + " generic notes");
        ArrayList<ListItem> genericVals = new ArrayList<ListItem>();
        ArrayList<String> genericKeys = new ArrayList<String>();
        for (Note n : genericNotes) {
            genericVals.add(new ListElement(n.getNote(), Short.toString(n.getId())));
            genericKeys.add(Short.toString(n.getId()));
        }
        genericAdapter = new ListViewArrayAdapter(activity, genericVals, genericKeys);

        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (!StartActivity.db.matchExists(nextMatchKey)) {
                    ImageView nextButton = (ImageView) activity.findViewById(R.id.next_match);
                    nextButton.setVisibility(View.GONE);
                }
                if (!StartActivity.db.matchExists(previousMatchKey)) {
                    ImageView prevButton = (ImageView) activity.findViewById(R.id.prev_match);
                    prevButton.setVisibility(View.GONE);
                }

                redAlliance = (ExpandableListView) activity.findViewById(R.id.red_teams);
                if (redAlliance == null)
                    return;
                redAdaper = new AllianceExpandableListAdapter(activity, redGroups);
                redAlliance.setAdapter(redAdaper);

                blueAlliance = (ExpandableListView) activity.findViewById(R.id.blue_teams);
                if (redAlliance == null)
                    return;
                blueAdapter = new AllianceExpandableListAdapter(activity, blueGroups);
                blueAlliance.setAdapter(blueAdapter);

                genericList = (ListView) activity.findViewById(R.id.generic_notes);
                genericList.setAdapter(genericAdapter);
                GenericNoteClick clickListener = new GenericNoteClick();
                genericList.setOnItemClickListener(clickListener);
                genericList.setOnItemLongClickListener(clickListener);
                if (genericNotes.size() > 0) {
                    genericList.setVisibility(View.VISIBLE);
                }

                //hide the progress bar
                ProgressBar prog = (ProgressBar) activity.findViewById(R.id.match_loading_progress);
                prog.setVisibility(View.GONE);
            }
        });

        return null;
    }

    public static void updateListData() {
        redAdaper.notifyDataSetChanged();
        blueAdapter.notifyDataSetChanged();
        genericAdapter.notifyDataSetChanged();
    }

    public static AllianceExpandableListAdapter getRedAdaper() {
        return redAdaper;
    }

    public static AllianceExpandableListAdapter getBlueAdapter() {
        return blueAdapter;
    }

    public static ListViewArrayAdapter getGenericAdapter() {
        return genericAdapter;
    }

    public static ActionMode.Callback mActionModeCallback = new ActionBarCallback() {
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
            case R.id.action_delete:
                confirmAndDelete(selectedNote);
                // the Action was executed, close the CAB
                selectedNote = "";
                mode.finish();
                return true;
            default:
                return false;
            }
        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            Log.d(Constants.LOG_TAG, "Destroy CAB");
            mActionMode = null;
            redAlliance.requestFocusFromTouch();
            redAlliance.clearChoices();
            blueAlliance.clearChoices();
            updateListData();
        }

        private void confirmAndDelete(final String noteId) {
            DialogInterface.OnClickListener deleter = new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //delete the event now
                    StartActivity.db.deleteNote(noteId);
                    redAdaper.removeNote(Short.parseShort(noteId));
                    blueAdapter.removeNote(Short.parseShort(noteId));
                    genericAdapter.removeKey(noteId);
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (genericAdapter.keys.size() == 0) {
                                genericList.setVisibility(View.GONE);
                            }
                        }
                    });
                    updateListData();
                    Toast.makeText(activity, "Deleted note from database", Toast.LENGTH_SHORT).show();
                    dialog.cancel();
                }
            };
            new DeleteDialog(activity.getString(R.string.note_deletion_message), deleter)
                    .show(activity.getFragmentManager(), "delete_note");
        }
    };

    class GenericNoteClick implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            if (!selectedNote.equals(""))
                return;
            final short noteId = Short.parseShort(genericAdapter.getKey(i));
            final Note oldNote = StartActivity.db.getNote(noteId);

            new EditNoteDialog(activity.getString(R.string.edit_note_generic_title), oldNote, noteId,
                    genericAdapter).show(activity.getFragmentManager(), "edit_note");
        }

        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            view.setSelected(true);
            GetNotesForMatch.selectedNote = genericAdapter.getKey(i);
            Log.d(Constants.LOG_TAG, "Note selected, id:" + GetNotesForMatch.selectedNote);
            GetNotesForMatch.mActionMode = activity.startActionMode(GetNotesForMatch.mActionModeCallback);
            GetNotesForMatch.updateListData();
            return false;
        }
    }

}