com.aniruddhc.acemusic.player.Dialogs.ID3sArtistEditorDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.aniruddhc.acemusic.player.Dialogs.ID3sArtistEditorDialog.java

Source

/*
 * Copyright (C) 2014 Saravan Pantham
 *
 * 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.aniruddhc.acemusic.player.Dialogs;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.NoSuchElementException;

import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.CannotWriteException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.tag.FieldDataInvalidException;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.KeyNotFoundException;
import org.jaudiotagger.tag.Tag;
import org.jaudiotagger.tag.TagException;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.aniruddhc.acemusic.player.R;
import com.aniruddhc.acemusic.player.DBHelpers.DBAccessHelper;
import com.aniruddhc.acemusic.player.Helpers.TypefaceHelper;

public class ID3sArtistEditorDialog extends DialogFragment {

    private Context mContext;
    private static Activity parentActivity;
    private DialogFragment dialogFragment;
    private View rootView;

    private TextView titleText;
    private TextView artistText;
    private TextView albumText;
    private TextView albumArtistText;
    private TextView genreText;
    private TextView producerText;
    private TextView yearText;
    private TextView trackText;
    private TextView ofText;
    private TextView commentsText;

    private EditText titleEditText;
    private EditText artistEditText;
    private EditText albumEditText;
    private EditText albumArtistEditText;
    private EditText genreEditText;
    private EditText producerEditText;
    private EditText yearEditText;
    private EditText trackEditText;
    private EditText trackTotalEditText;
    private EditText commentsEditText;

    private CheckBox titleCheckbox;
    private CheckBox artistCheckbox;
    private CheckBox albumCheckbox;
    private CheckBox albumArtistCheckbox;
    private CheckBox genreCheckbox;
    private CheckBox producerCheckbox;
    private CheckBox yearCheckbox;
    private CheckBox trackCheckbox;
    private CheckBox commentCheckbox;

    private boolean titleEdited = false;
    private boolean artistEdited = false;
    private boolean albumEdited = false;
    private boolean albumArtistEdited = false;
    private boolean genreEdited = false;
    private boolean producerEdited = false;
    private boolean yearEdited = false;
    private boolean trackEdited = false;
    private boolean commentEdited = false;

    private String ARTIST;

    private ArrayList<String> titlesList = new ArrayList<String>();
    private ArrayList<String> artistsList = new ArrayList<String>();
    private ArrayList<String> albumsList = new ArrayList<String>();
    private ArrayList<String> albumArtistsList = new ArrayList<String>();
    private ArrayList<String> genresList = new ArrayList<String>();
    private ArrayList<String> producersList = new ArrayList<String>();
    private ArrayList<String> yearsList = new ArrayList<String>();
    private ArrayList<String> trackNumbersList = new ArrayList<String>();
    private ArrayList<String> totalTracksList = new ArrayList<String>();
    private ArrayList<String> commentsList = new ArrayList<String>();
    private ArrayList<String> songURIsList = new ArrayList<String>();

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        mContext = getActivity();
        parentActivity = getActivity();
        dialogFragment = this;

        //Get the artist name.
        ARTIST = getArguments().getString("ARTIST");

        rootView = (View) parentActivity.getLayoutInflater().inflate(R.layout.fragment_edit_id3_artist_album_dialog,
                null);

        titleText = (TextView) rootView.findViewById(R.id.edit_title_text);
        artistText = (TextView) rootView.findViewById(R.id.edit_artist_text);
        albumText = (TextView) rootView.findViewById(R.id.edit_album_text);
        albumArtistText = (TextView) rootView.findViewById(R.id.edit_album_artist_text);
        genreText = (TextView) rootView.findViewById(R.id.edit_genre_text);
        producerText = (TextView) rootView.findViewById(R.id.edit_producer_text);
        yearText = (TextView) rootView.findViewById(R.id.edit_year_text);
        trackText = (TextView) rootView.findViewById(R.id.edit_track_text);
        ofText = (TextView) rootView.findViewById(R.id.text_of);
        commentsText = (TextView) rootView.findViewById(R.id.edit_comment_text);

        titleEditText = (EditText) rootView.findViewById(R.id.edit_title_field);
        artistEditText = (EditText) rootView.findViewById(R.id.edit_artist_field);
        albumEditText = (EditText) rootView.findViewById(R.id.edit_album_field);
        albumArtistEditText = (EditText) rootView.findViewById(R.id.edit_album_artist_field);
        genreEditText = (EditText) rootView.findViewById(R.id.edit_genre_field);
        producerEditText = (EditText) rootView.findViewById(R.id.edit_producer_field);
        yearEditText = (EditText) rootView.findViewById(R.id.edit_year_field);
        trackEditText = (EditText) rootView.findViewById(R.id.edit_track_field);
        trackTotalEditText = (EditText) rootView.findViewById(R.id.edit_track_total_field);
        commentsEditText = (EditText) rootView.findViewById(R.id.edit_comment_field);

        titleCheckbox = (CheckBox) rootView.findViewById(R.id.title_checkbox);
        artistCheckbox = (CheckBox) rootView.findViewById(R.id.artist_checkbox);
        albumCheckbox = (CheckBox) rootView.findViewById(R.id.album_checkbox);
        albumArtistCheckbox = (CheckBox) rootView.findViewById(R.id.album_artist_checkbox);
        genreCheckbox = (CheckBox) rootView.findViewById(R.id.genre_checkbox);
        producerCheckbox = (CheckBox) rootView.findViewById(R.id.producer_checkbox);
        yearCheckbox = (CheckBox) rootView.findViewById(R.id.year_checkbox);
        trackCheckbox = (CheckBox) rootView.findViewById(R.id.track_checkbox);
        commentCheckbox = (CheckBox) rootView.findViewById(R.id.comment_checkbox);

        titleText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        artistText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        albumText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        albumArtistText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        genreText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        producerText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        yearText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        trackText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        ofText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        commentsText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));

        titleText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        artistText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        albumText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        albumArtistText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        genreText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        producerText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        yearText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        trackText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        ofText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);
        commentsText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG
                | Paint.FAKE_BOLD_TEXT_FLAG);

        titleEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        artistEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        albumEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        albumArtistEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        genreEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        producerEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        yearEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        trackEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        trackTotalEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));
        commentsEditText.setTypeface(TypefaceHelper.getTypeface(parentActivity, "RobotoCondensed-Light"));

        titleEditText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        artistEditText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        albumEditText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        albumArtistEditText
                .setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        genreEditText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        producerEditText
                .setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        yearEditText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        trackEditText.setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        trackTotalEditText
                .setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        commentsEditText
                .setPaintFlags(titleText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);

        //Keep all the fields locked by default.
        titleCheckbox.setChecked(false);
        artistCheckbox.setChecked(false);
        albumCheckbox.setChecked(false);
        albumArtistCheckbox.setChecked(false);
        genreCheckbox.setChecked(false);
        producerCheckbox.setChecked(false);
        yearCheckbox.setChecked(false);
        trackCheckbox.setChecked(false);
        commentCheckbox.setChecked(false);

        //Disable all EditTexts by default.
        titleEditText.setEnabled(false);
        artistEditText.setEnabled(false);
        albumEditText.setEnabled(false);
        albumArtistEditText.setEnabled(false);
        genreEditText.setEnabled(false);
        producerEditText.setEnabled(false);
        yearEditText.setEnabled(false);
        trackEditText.setEnabled(false);
        commentsEditText.setEnabled(false);

        //Register click registers on each checkbox.
        titleCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    titleEdited = true;
                    titleEditText.setEnabled(true);
                } else {
                    titleEdited = false;
                    titleEditText.setEnabled(false);
                }

            }

        });

        artistCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    artistEdited = true;
                    artistEditText.setEnabled(true);
                    ;
                } else {
                    artistEdited = false;
                    artistEditText.setEnabled(false);
                }

            }

        });

        albumArtistCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    albumEdited = true;
                    albumEditText.setEnabled(true);
                    ;
                } else {
                    albumEdited = false;
                    albumEditText.setEnabled(false);
                }

            }

        });

        albumCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    albumArtistEdited = true;
                    albumArtistEditText.setEnabled(true);
                    ;
                } else {
                    albumArtistEdited = false;
                    albumArtistEditText.setEnabled(false);
                }

            }

        });

        genreCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    genreEdited = true;
                    genreEditText.setEnabled(true);
                    ;
                } else {
                    genreEdited = false;
                    genreEditText.setEnabled(false);
                }

            }

        });

        producerCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    producerEdited = true;
                    producerEditText.setEnabled(true);
                    ;
                } else {
                    producerEdited = false;
                    producerEditText.setEnabled(false);
                }

            }

        });

        yearCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    yearEdited = true;
                    yearEditText.setEnabled(true);
                    ;
                } else {
                    yearEdited = false;
                    yearEditText.setEnabled(false);
                }

            }

        });

        trackCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    trackEdited = true;
                    trackEditText.setEnabled(true);
                    ;
                } else {
                    trackEdited = false;
                    trackEditText.setEnabled(false);
                }

            }

        });

        commentCheckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkbox, boolean checked) {

                if (checked == true) {
                    commentEdited = true;
                    commentsEditText.setEnabled(true);
                    ;
                } else {
                    commentEdited = false;
                    commentsEditText.setEnabled(false);
                }

            }

        });

        if (ARTIST != null) {
            songURIsList = getAllSongsByArtist(ARTIST);

            //Populate the ArrayLists with the song tags.
            try {
                getSongTags(songURIsList);
            } catch (CannotReadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (TagException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ReadOnlyFileException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvalidAudioFrameException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            //Now check if any of the ArrayLists contain the same exact elements.
            boolean titlesSame = checkIfAllElementsEqual(titlesList);
            boolean artistsSame = checkIfAllElementsEqual(artistsList);
            boolean albumsSame = checkIfAllElementsEqual(albumsList);
            boolean albumArtistsSame = checkIfAllElementsEqual(albumArtistsList);
            boolean genresSame = checkIfAllElementsEqual(genresList);
            boolean producersSame = checkIfAllElementsEqual(producersList);
            boolean yearsSame = checkIfAllElementsEqual(yearsList);
            boolean tracksSame = checkIfAllElementsEqual(trackNumbersList);
            boolean totalTracksSame = checkIfAllElementsEqual(totalTracksList);
            boolean commentsSame = checkIfAllElementsEqual(commentsList);

            //Populate the EditTexts.
            setEditorFields(titlesSame, titlesList, titleEditText);
            setEditorFields(artistsSame, artistsList, artistEditText);
            setEditorFields(albumsSame, albumsList, albumEditText);
            setEditorFields(albumArtistsSame, albumArtistsList, albumArtistEditText);
            setEditorFields(genresSame, genresList, genreEditText);
            setEditorFields(producersSame, producersList, producerEditText);
            setEditorFields(yearsSame, yearsList, yearEditText);
            setEditorFields(tracksSame, trackNumbersList, trackEditText);
            setEditorFields(totalTracksSame, totalTracksList, trackTotalEditText);
            setEditorFields(commentsSame, commentsList, commentsEditText);

        }

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        //Set the dialog title.
        builder.setTitle(R.string.edit_tags);
        builder.setView(rootView);
        builder.setPositiveButton(R.string.save, new OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                dialogFragment.dismiss();
                AsyncSaveArtistTagsTask asyncSaveArtistTagsTask = new AsyncSaveArtistTagsTask(getActivity(),
                        getActivity());
                asyncSaveArtistTagsTask.execute();

            }

        });

        builder.setNegativeButton(R.string.cancel, new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();

            }

        });

        return builder.create();

    }

    public static ArrayList<String> getAllSongsInAlbum(String albumName, String artistName) {
        ArrayList<String> songURIsList = new ArrayList<String>();

        DBAccessHelper dbHelper = new DBAccessHelper(parentActivity);

        //Escape any rogue apostrophes.
        if (albumName.contains("'")) {
            albumName = albumName.replace("'", "''");
        }

        if (artistName.contains("'")) {
            artistName = artistName.replace("'", "''");
        }

        String selection = DBAccessHelper.SONG_ALBUM + "=" + "'" + albumName + "'" + " AND "
                + DBAccessHelper.SONG_ARTIST + "=" + "'" + artistName + "'" + " AND " + DBAccessHelper.SONG_SOURCE
                + "<>" + "'GOOGLE_PLAY_MUSIC'";

        String[] projection = { DBAccessHelper._ID, DBAccessHelper.SONG_FILE_PATH };

        Cursor cursor = dbHelper.getWritableDatabase().query(DBAccessHelper.MUSIC_LIBRARY_TABLE, projection,
                selection, null, null, null, null);

        cursor.moveToFirst();

        if (cursor.getCount() != 0) {

            songURIsList.add(cursor.getString(1));

            while (cursor.moveToNext()) {
                songURIsList.add(cursor.getString(1));

            }

        }

        cursor.close();

        return songURIsList;

    }

    public static ArrayList<String> getAllSongsByArtist(String artistName) {
        ArrayList<String> songURIsList = new ArrayList<String>();

        DBAccessHelper dbHelper = new DBAccessHelper(parentActivity);

        //Escape any rogue apostrophes.
        if (artistName.contains("'")) {
            artistName = artistName.replace("'", "''");
        }

        String selection = DBAccessHelper.SONG_ARTIST + "=" + "'" + artistName + "'" + " AND "
                + DBAccessHelper.SONG_SOURCE + "<>" + "'GOOGLE_PLAY_MUSIC'";

        String[] projection = { DBAccessHelper._ID, DBAccessHelper.SONG_FILE_PATH };

        Cursor cursor = dbHelper.getWritableDatabase().query(DBAccessHelper.MUSIC_LIBRARY_TABLE, projection,
                selection, null, null, null, null);

        cursor.moveToFirst();

        if (cursor.getCount() != 0) {

            songURIsList.add(cursor.getString(1));

            while (cursor.moveToNext()) {
                songURIsList.add(cursor.getString(1));

            }

        }

        cursor.close();

        return songURIsList;

    }

    //This method loops through all the songs and saves their tags into ArrayLists.
    public void getSongTags(ArrayList<String> dataURIsList) throws CannotReadException, IOException, TagException,
            ReadOnlyFileException, InvalidAudioFrameException {

        for (int i = 0; i < dataURIsList.size(); i++) {

            try {
                File file = new File(dataURIsList.get(i));
                AudioFile audioFile = AudioFileIO.read(file);

                titlesList.add(audioFile.getTag().getFirst(FieldKey.TITLE));
                artistsList.add(audioFile.getTag().getFirst(FieldKey.ARTIST));
                albumsList.add(audioFile.getTag().getFirst(FieldKey.ALBUM));
                albumArtistsList.add(audioFile.getTag().getFirst(FieldKey.ALBUM_ARTIST));
                genresList.add(audioFile.getTag().getFirst(FieldKey.GENRE));
                producersList.add(audioFile.getTag().getFirst(FieldKey.PRODUCER));
                yearsList.add(audioFile.getTag().getFirst(FieldKey.YEAR));
                trackNumbersList.add(audioFile.getTag().getFirst(FieldKey.TRACK));
                totalTracksList.add(audioFile.getTag().getFirst(FieldKey.TRACK_TOTAL));
                commentsList.add(audioFile.getTag().getFirst(FieldKey.COMMENT));

            } catch (Exception e) {
                e.printStackTrace();
                continue;
            }

        }

    }

    //This method goes through the inputted ArrayList and checks if all its elements are the same.
    public static boolean checkIfAllElementsEqual(ArrayList<String> list) {

        if (list.size() != 0) {
            String firstElement = list.get(0);

            for (int i = 0; i < list.size(); i++) {
                if (!firstElement.equals(list.get(i))) {
                    return false;
                }

            }

            return true;
        }

        return false;

    }

    //This method sets the specified EditText values based on the boolean parameter.
    public static void setEditorFields(boolean allElementsSame, ArrayList<String> list, EditText editText) {

        if (allElementsSame == true) {
            editText.setText(list.get(0));
        } else {
            editText.setText(R.string.varies_by_song);
        }

    }

    class AsyncSaveArtistTagsTask extends AsyncTask<String, String, String> {

        private Context mContext;
        private Activity mActivity;
        private ProgressDialog pd;
        private int i = 0;

        private String songTitle;
        private String songArtist;
        private String songAlbum;
        private String songAlbumArtist;
        private String songComposer;
        private String songProducer;
        private String songTrackNumber;
        private String songTrackTotals;
        private String songComments;
        private String songYear;

        public AsyncSaveArtistTagsTask(Context context, Activity activity) {
            mContext = context;
            mActivity = activity;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pd = new ProgressDialog(mActivity);
            pd.setTitle(R.string.saving_artist_info);
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd.setIndeterminate(false);
            pd.setMax(songURIsList.size());
            pd.show();

            //Retrieve the strings from the EditText fields.
            if (titleEdited) {
                songTitle = titleEditText.getText().toString();
                songTitle = songTitle.replace("'", "''");
            } else {
                songTitle = null;
            }

            if (artistEdited) {
                songArtist = artistEditText.getText().toString();
                songArtist = songArtist.replace("'", "''");
            } else {
                songArtist = null;
            }

            if (albumEdited) {
                songAlbum = albumEditText.getText().toString();
                songAlbum = songAlbum.replace("'", "''");
            } else {
                songAlbum = null;
            }

            if (albumArtistEdited) {
                songAlbumArtist = albumArtistEditText.getText().toString();
                songAlbumArtist = songAlbumArtist.replace("'", "''");
            } else {
                songAlbumArtist = null;
            }

            if (genreEdited) {
                songComposer = genreEditText.getText().toString();
                songComposer = songComposer.replace("'", "''");
            } else {
                songComposer = null;
            }

            if (producerEdited) {
                songProducer = producerEditText.getText().toString();
                songProducer = songProducer.replace("'", "''");
            } else {
                songProducer = null;
            }

            if (trackEdited) {
                songTrackNumber = trackEditText.getText().toString();
                songTrackNumber = songTrackNumber.replace("'", "''");
                songTrackTotals = trackTotalEditText.getText().toString();
                songTrackTotals = songTrackTotals.replace("'", "''");
            } else {
                songTrackNumber = null;
                songTrackTotals = null;
            }

            if (commentEdited) {
                songComments = commentsEditText.getText().toString();
                songComments = songComments.replace("'", "''");
            } else {
                songComments = null;
            }

            if (yearEdited) {
                songYear = yearEditText.getText().toString();
                songYear = songYear.replace("'", "''");
            } else {
                songYear = null;
            }

        }

        @Override
        protected String doInBackground(String... arg0) {

            //Create DB instances.
            DBAccessHelper dbHelper = new DBAccessHelper(mContext.getApplicationContext());

            for (i = 0; i < songURIsList.size(); i++) {
                publishProgress(new String[] {});
                File file = null;
                try {
                    file = new File(songURIsList.get(i));
                } catch (Exception e) {
                    e.printStackTrace();
                    continue;
                }
                AudioFile audioFile = null;

                try {
                    audioFile = AudioFileIO.read(file);
                } catch (CannotReadException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (TagException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ReadOnlyFileException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvalidAudioFrameException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                //Escape any rogue apostrophes.
                String uri = songURIsList.get(i);

                if (uri != null) {
                    if (uri.contains("'")) {
                        uri = uri.replace("'", "''");
                    }

                } else {
                    continue;
                }

                Tag tag = audioFile.getTag();

                if (tag != null) {
                    String whereClause = DBAccessHelper.SONG_FILE_PATH + "=" + "'" + uri + "'";
                    ContentValues values = new ContentValues();

                    if (titleEdited == false) {
                        //Don't do anything here. The user didn't change the title.
                    } else {
                        try {
                            tag.setField(FieldKey.TITLE, songTitle);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        values.put(DBAccessHelper.SONG_TITLE, songTitle);

                    }

                    if (albumEdited == false) {
                        //Don't do anything here. The user didn't change the album.
                    } else {
                        try {
                            tag.setField(FieldKey.ALBUM, songAlbum);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        values.put(DBAccessHelper.SONG_ALBUM, songAlbum);

                    }

                    if (artistEdited == false) {
                        //Don't do anything here. The user didn't change the artist.
                    } else {
                        try {
                            tag.setField(FieldKey.ARTIST, songArtist);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        values.put(DBAccessHelper.SONG_ARTIST, songArtist);

                    }

                    if (albumArtistEdited == false) {
                        //Don't do anything here. The user didn't change the album artist.
                    } else {
                        try {
                            tag.setField(FieldKey.ALBUM_ARTIST, songAlbumArtist);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        values.put(DBAccessHelper.SONG_ALBUM_ARTIST, songAlbumArtist);

                    }

                    if (genreEdited == false) {
                        //Don't do anything here. The user didn't change the genre.
                    } else {
                        try {
                            tag.setField(FieldKey.GENRE, songComposer);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }

                    if (producerEdited == false) {
                        //Don't do anything here. The user didn't change the producer.
                    } else {
                        try {
                            tag.setField(FieldKey.PRODUCER, songProducer);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }

                    if (yearEdited == false) {
                        //Don't do anything here. The user didn't change the year.
                    } else {
                        try {
                            tag.setField(FieldKey.YEAR, songYear);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NumberFormatException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        values.put(DBAccessHelper.SONG_YEAR, songYear);

                    }

                    if (trackEdited == false) {
                        //Don't do anything here. The user didn't change the track number.
                    } else {
                        try {
                            tag.setField(FieldKey.TRACK, songTrackNumber);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NumberFormatException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        values.put(DBAccessHelper.SONG_TRACK_NUMBER, songTrackNumber);

                    }

                    try {
                        tag.setField(FieldKey.TRACK_TOTAL, songTrackTotals);
                    } catch (KeyNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (FieldDataInvalidException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (NoSuchElementException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (NumberFormatException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    if (commentEdited == false) {
                        //Don't do anything here. The user didn't change the comments.
                    } else {
                        try {
                            tag.setField(FieldKey.COMMENT, songComments);
                        } catch (KeyNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FieldDataInvalidException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (NoSuchElementException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }

                    try {
                        audioFile.commit();
                    } catch (CannotWriteException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    //Write the values to the DB.
                    try {
                        dbHelper.getWritableDatabase().update(DBAccessHelper.MUSIC_LIBRARY_TABLE, values,
                                whereClause, null);

                        dbHelper.close();
                        dbHelper = null;

                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                } else {
                    Toast.makeText(mContext, R.string.unable_to_edit_artist_tags, Toast.LENGTH_SHORT).show();
                }

            }

            return null;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            pd.setProgress(i);
            String message = mContext.getResources().getString(R.string.saving_song_info_for) + " "
                    + titlesList.get(i) + ".";
            pd.setMessage(message);

        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            pd.dismiss();

            try {

            } catch (Exception e) {
                e.printStackTrace();
            }

            //Delete all the contents of the ArrayLists.
            clearArrayLists();
            dialogFragment.dismiss();
            Toast.makeText(parentActivity, R.string.changes_saved, Toast.LENGTH_SHORT).show();

        }

    }

    public void clearArrayLists() {
        if (titlesList != null) {
            titlesList.clear();
            titlesList = null;
        }

        if (artistsList != null) {
            artistsList.clear();
            artistsList = null;
        }

        if (albumsList != null) {
            albumsList.clear();
            albumsList = null;
        }

        if (albumArtistsList != null) {
            albumArtistsList.clear();
            albumArtistsList = null;
        }

        if (genresList != null) {
            genresList.clear();
            genresList = null;
        }

        if (producersList != null) {
            producersList.clear();
            producersList = null;
        }

        if (yearsList != null) {
            yearsList.clear();
            yearsList = null;
        }

        if (trackNumbersList != null) {
            trackNumbersList.clear();
            trackNumbersList = null;
        }

        if (totalTracksList != null) {
            totalTracksList.clear();
            totalTracksList = null;
        }

        if (commentsList != null) {
            commentsList.clear();
            commentsList = null;
        }

        if (songURIsList != null) {
            songURIsList.clear();
            songURIsList = null;
        }

        /*if (songSourcesList!=null) {
           songSourcesList.clear();
           songSourcesList = null;
        }
            
        if (songIdsList!=null) {
           songIdsList.clear();
           songIdsList = null;
        }*/

    }

}