usbong.android.likha_collection_1.UsbongDecisionTreeEngineActivity.java Source code

Java tutorial

Introduction

Here is the source code for usbong.android.likha_collection_1.UsbongDecisionTreeEngineActivity.java

Source

/*
 * Copyright 2016 Michael Syson
 * 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 usbong.android.likha_collection_1;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;

import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import usbong.android.features.node.PaintActivity;
import usbong.android.features.node.QRCodeReaderActivity;
import usbong.android.likha_collection_1.UsbongDecisionTreeEngineActivity;
import usbong.android.likha_collection_1.UsbongMainActivity;
import usbong.android.multimedia.audio.AudioRecorder;
import usbong.android.utils.AppRater;
import usbong.android.utils.FedorMyLocation;
import usbong.android.utils.PurchaseLanguageBundleListAdapter;
import usbong.android.utils.UsbongConstants;
import usbong.android.utils.UsbongScreenProcessor;
import usbong.android.utils.UsbongUtils;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerFragment;

//@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class UsbongDecisionTreeEngineActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
    //   private static final boolean UsbongUtils.USE_UNESCAPE=true; //allows the use of \n (new line) in the decision tree

    //   private static boolean USE_ENG_ONLY=true; //uses English only   
    //   private static boolean UsbongUtils.IS_IN_DEBUG_MODE=false;

    public int currLanguageBeingUsed;

    public int currScreen = UsbongConstants.TEXTFIELD_SCREEN;

    public static final int PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE = 0;
    public static final int PLEASE_ANSWER_FIELD_ALERT_TYPE = 1;

    private Button backButton;
    private Button nextButton;

    private Button stopButton;
    private Button recordButton;
    private Button playButton;

    private static AudioRecorder currAudioRecorder;
    private static MediaPlayer myMediaPlayer;
    private static MediaPlayer myBGMediaPlayer; //added by Mike, 25 Sept. 2015

    private Button paintButton;
    private Button photoCaptureButton;
    private ImageView myImageView;

    private Button qrCodeReaderButton;

    public static Intent photoCaptureIntent;
    public static Intent paintIntent;
    public static Intent qrCodeReaderIntent;

    private String myPictureName = "default"; //change this later in the code
    private String myPaintName = "default"; //change this later in the code
    private String myQRCodeReaderName = "default"; //change this later in the code

    //   private boolean hasReachedEndOfAllDecisionTrees;
    //   private boolean isFirstQuestionForDecisionTree;

    public boolean usedBackButton;

    public boolean performedCapturePhoto;
    public boolean performedRunPaint;
    public boolean performedGetQRCode;

    public String currUsbongNode = "";
    public String currUsbongAudioString = ""; //added by Mike, 21 July 2015
    public String currUsbongBGAudioString = ""; //added by Mike, 25 Sept. 2015
    private String nextUsbongNodeIfYes;
    private String nextUsbongNodeIfNo;

    public String currUsbongNodeWithoutAnswer = "";

    public String textFieldUnit = "";

    public int usbongNodeContainerCounter = -1;//because I do a ++, so that the first element would be at 0;
    private int requiredTotalCheckedBoxes;
    public Vector<String> usbongNodeContainer;
    public Vector<String> classificationContainer;
    public Vector<String> radioButtonsContainer;
    public Vector<String> usbongAnswerContainer;
    public Vector<String> checkBoxesContainer;
    private Vector<String> decisionTrackerContainer; //added by Mike, Feb. 2, 2013

    public String noStringValue;
    public String yesStringValue;

    //   private String myTreeDirectory="usbong_trees/";
    public String myTree = "no tree selected.";//"input.xml";
    private String myOutputDirectory = UsbongUtils.getDateTimeStamp() + "/"; //add the ".csv" after appending the timestamp //output.csv

    private static UsbongDecisionTreeEngineActivity instance;
    private static TextToSpeech mTts;
    private HashMap<String, String> mTtsParams;

    public ListView treesListView;

    private CustomDataAdapter mCustomAdapter;
    private ArrayList<String> listOfTreesArrayList;

    public ArrayAdapter<CharSequence> monthAdapter;
    public ArrayAdapter<CharSequence> dayAdapter;

    private List<String> attachmentFilePaths;

    public FedorMyLocation myLocation;

    private boolean isInTreeLoader;

    private static String myQRCodeContent;
    public boolean hasReturnedFromAnotherActivity; //camera, paint, email, etc
    private static boolean wasNextButtonPressed;
    private static boolean hasUpdatedDecisionTrackerContainer;

    public boolean isAnOptionalNode;
    public String currAnswer;
    public int usbongAnswerContainerCounter;

    private int padding_in_dp = 5; // 5 dps
    public int padding_in_px;

    public String myMultipleRadioButtonsWithAnswerScreenAnswer;
    public String myTextFieldWithAnswerScreenAnswer;
    public String myTextAreaWithAnswerScreenAnswer;
    public String timestampString;

    public StringBuffer myDcatSummaryStringBuffer;

    private UsbongScreenProcessor myUsbongScreenProcessor;

    private Map<String, String> myUsbongVariableMemory;

    protected InputStreamReader isr;

    private ProgressDialog myProgressDialog;
    private ProgressDialog myInitTreeProgressDialog; //added by Mike, 20161111

    private int currSelectedItemForSetLanguage; //set this later in init()

    //added by Mike, 20160417
    private YouTubePlayerFragment myYouTubePlayerFragment;
    public static YouTubePlayer myYouTubePlayer;
    private UdteaObject myUdteaObject;

    //edited by Mike, 20160417
    public static ArrayList<Integer> selectedSettingsItems;
    public static boolean[] selectedSettingsItemsInBoolean;
    private AlertDialog inAppSettingsDialog;

    //added by Mike, 20160415
    private boolean isAutoLoopedTree;

    //added by Mike, 20160420
    private static AlertDialog.Builder purchaseLanguagesListDialog;
    private static PurchaseLanguageBundleListAdapter myPurchaseLanguageBundleListAdapter;
    //   private static DialogInterface purchaseLanguagesListDialogInterface;
    private static AlertDialog purchaseLanguageListAlertDialog;
    private static AlertDialog.Builder setLanguageDialog;
    private static AlertDialog mySetLanguageAlertDialog;

    private ArrayAdapter<String> arrayAdapter; //added by Mike, 20160507

    //   @SuppressLint("InlinedApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

        super.onCreate(savedInstanceState);

        instance = this;

        //added by Mike, 20160511
        if (UsbongUtils.hasUnlockedAllLanguages) {
            UsbongUtils.hasUnlockedLocalLanguages = true;
            UsbongUtils.hasUnlockedForeignLanguages = true;
        }

        //edited by Mike, 20160417
        UsbongUtils.USBONG_TREES_FILE_PATH = UsbongDecisionTreeEngineActivity.getInstance().getCacheDir()
                .getAbsolutePath() + UsbongUtils.myAppTreeFolder;

        //added by Mike, 20151212
        //       UsbongUtils.USBONG_TREES_FILE_PATH = UsbongDecisionTreeEngineActivity.getInstance().getCacheDir().getAbsolutePath() + "/usbong_kuto/" + "usbong_kuto_trees/";
        //       UsbongUtils.USBONG_TREES_FILE_PATH = UsbongDecisionTreeEngineActivity.getInstance().getApplicationContext().getExternalCacheDir().getAbsolutePath() + "/usbong_kuto/" + "usbong_kuto_trees/";
        //       UsbongUtils.USBONG_TREES_FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/usbong_kuto/" + "usbong_kuto_trees/";

        //added by Mike, 27 Sept. 2015
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        UsbongUtils.myAssetManager = getAssets();

        //added by Mike, 22 Sept. 2015
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Title Screen");

        currUsbongNode = ""; //added by Mike, 20160417
        isAutoLoopedTree = false; //added by Mike, 20160417

        /*//commented out by Mike, 20161110
              //added by Mike, 29 Sept. 2015
              myProgressDialog = ProgressDialog.show(instance, "Loading...",
          "This takes only a short while.", true, false);              
              new MyBackgroundTask().execute();        
        */
        //added by Mike, 20161111
        myInitTreeProgressDialog = ProgressDialog.show(instance, "Loading Trees...",
                "This takes only a short while.", true, false);
        new MyInitTreeBackgroundTask().execute();

        //        init(); //added by Mike, 20161110
    }

    public void init() {
        //if return is null, then currScreen=0
        //        currScreen=Integer.parseInt(getIntent().getStringExtra("currScreen")); 
        //modified by JPT, May 25, 2015
        if (getIntent().getStringExtra("currScreen") != null) {
            currScreen = Integer.parseInt(getIntent().getStringExtra("currScreen"));
        }

        //updated by Mike, 20160608
        /*        
                currLanguageBeingUsed=UsbongUtils.LANGUAGE_ENGLISH;
              UsbongUtils.setCurrLanguage("English"); //added by Mike, 22 Sept. 2015
        */
        //Reference: http://stackoverflow.com/questions/23024831/android-shared-preferences-example
        //; last accessed: 9 June 2015
        //answer by Elenasys
        //added by Mike, 9 June 2015
        SharedPreferences prefs = getSharedPreferences(UsbongConstants.MY_SAVED_LANGUAGE_SETTING, MODE_PRIVATE);
        if (prefs != null) {
            //@todo: remove this id thing, immediately use the String; otherwise it'll be cumbersome to keep on adding language ids
            currLanguageBeingUsed = prefs.getInt("preferredLanguage",
                    UsbongUtils.getLanguageID(UsbongUtils.getCurrLanguage())); //default is Filipino
            /* //commented out by Mike, 20160608
             * //default language will be set based on the default language set in the .xml of the .utree file
             *         UsbongUtils.setDefaultLanguage(UsbongUtils.getLanguageBasedOnID(currLanguageBeingUsed));
             */
            UsbongUtils.setCurrLanguage(UsbongUtils.getLanguageBasedOnID(currLanguageBeingUsed));//prefs.getInt("preferredLanguage", 0))); //updated by Mike, 20160612
        } else {
            //default..
            currLanguageBeingUsed = UsbongUtils.getLanguageID(UsbongUtils.getCurrLanguage());
            //UsbongUtils.setCurrLanguage(UsbongUtils.getLanguageBasedOnID(currLanguageBeingUsed)); //updated by Mike, 20160612
        }

        /*       //commented out by Mike, 20160618
         *       //why? the index numbers used by currSelectedItemForSetLanguage does not always match with currLanguageBeingUsed
         *        //added by Mike, 20160608
         *        currSelectedItemForSetLanguage = currLanguageBeingUsed;
         */
        //==================================================================
        //text-to-speech stuff
        /*//comment out, not needed in DAHON, 
         * commented out by Mike, 20160613
                Intent checkIntent = new Intent();
                checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
                startActivityForResult(checkIntent, UsbongUtils.MY_DATA_CHECK_CODE);
        */
        mTts = new TextToSpeech(this, this);
        mTts.setLanguage(new Locale("en", "US"));//default
        //==================================================================

        myMediaPlayer = new MediaPlayer();
        myMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //added by Mike, 22 July 2015
        myMediaPlayer.setVolume(1.0f, 1.0f);

        //added by Mike, 25 Sept. 2015
        myBGMediaPlayer = new MediaPlayer();
        myBGMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        myBGMediaPlayer.setVolume(0.5f, 0.5f);

        //added by Mike, 22 July 2015
        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);

        usbongNodeContainer = new Vector<String>();
        classificationContainer = new Vector<String>();
        radioButtonsContainer = new Vector<String>();
        usbongAnswerContainer = new Vector<String>();
        checkBoxesContainer = new Vector<String>();
        decisionTrackerContainer = new Vector<String>();

        usedBackButton = false;
        currAnswer = "";

        try {
            //commented out by Mike, 4 Oct. 2015
            UsbongUtils.createUsbongFileStructure();

            //added by Mike, 20160417
            UsbongUtils.initUsbongConfigFile();

            //create the usbong_demo_tree and store it in sdcard/usbong/usbong_trees
            //          UsbongUtils.storeAssetsFileIntoSDCard(this,"usbong_demo_tree.xml");
            //          UsbongUtils.storeAssetsFileIntoSDCard(this,UsbongUtils.DEFAULT_UTREE_TO_LOAD+".utree");

            //edited by Mike, 20161111
            UsbongUtils.storeAssetsFileIntoSDCard(this, "pagtsing.utree");
            UsbongUtils.storeAssetsFileIntoSDCard(this, "gamugamo.utree");
            UsbongUtils.storeAssetsFileIntoSDCard(this, "juant.utree");

            UsbongUtils.storeAssetsFileIntoSDCard(this, "pagtsing_icon.png");
            UsbongUtils.storeAssetsFileIntoSDCard(this, "gamugamo_icon.png");
            UsbongUtils.storeAssetsFileIntoSDCard(this, "juant_icon.png");
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

        //Reference: http://stackoverflow.com/questions/2793004/java-lista-addalllistb-fires-nullpointerexception
        //Last accessed: 14 March 2012
        attachmentFilePaths = new ArrayList<String>();
        //      attachmentFilePaths.clear();
        //      System.out.println(">>>>>>>>> attachmentFilePaths.clear!");
        currAudioRecorder = null;

        myQRCodeContent = "";
        hasReturnedFromAnotherActivity = false; //camera, paint, email, etc

        //added by Mike, March 4, 2013
        usbongAnswerContainerCounter = 0;
        /*              
               ArrayList<String> skuList = new ArrayList<String> ();
               skuList.add(UsbongConstants.ALL_LOCAL_LANGUAGES_PRODUCT_ID);
               skuList.add(UsbongConstants.ALL_FOREIGN_LANGUAGES_PRODUCT_ID);
               Bundle querySkus = new Bundle();
               querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
        */

        new AsyncTask<String, Integer, Boolean>() {
            @Override
            protected void onPostExecute(Boolean result) {
                //added by Mike, 20160421
                //init purchase languages list
                purchaseLanguagesListDialog = new AlertDialog.Builder(getInstance());
                myPurchaseLanguageBundleListAdapter = new PurchaseLanguageBundleListAdapter(getInstance(),
                        UsbongUtils.getInAppOwnedItems(), UsbongUtils.getInAppMService());
                purchaseLanguagesListDialog.setTitle("Purchase");
                purchaseLanguagesListDialog.setSingleChoiceItems(myPurchaseLanguageBundleListAdapter, 0,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                //                         Log.i("Selected Item : ", (String) myPurchaseLanguageBundleListAdapter.getItem(which));
                                dialog.dismiss(); //edited by Mike, 20160508                  
                                //                        purchaseLanguagesListDialogInterface = dialog;
                            }
                        });
                purchaseLanguagesListDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
            }

            @Override
            protected Boolean doInBackground(String... params) {
                try {
                    UsbongUtils.initInAppBillingService(getInstance());
                    UsbongUtils.initInAppBillingService(getInstance()); //need to call this twice to get the updated languageBundleList
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return true;
            }
        }.execute();

        //reference: Labeeb P's answer from stackoverflow;
        //http://stackoverflow.com/questions/4275797/view-setpadding-accepts-only-in-px-is-there-anyway-to-setpadding-in-dp;
        //last accessed: 23 May 2013
        final float scale = getResources().getDisplayMetrics().density;
        padding_in_px = (int) (padding_in_dp * scale + 0.5f);

        //added by Mike, 25 June 2013
        UsbongUtils.setDebugMode(UsbongUtils.isInDebugMode());

        //added by Mike, 25 Feb. 2014
        //        UsbongUtils.setStoreOutput(UsbongUtils.checkIfStoreOutput());
        UsbongUtils.setStoreOutput(false); //don't store output, added by Mike, 27 Sept. 2015

        myUsbongScreenProcessor = new UsbongScreenProcessor(UsbongDecisionTreeEngineActivity.getInstance());
        myUsbongVariableMemory = new HashMap<String, String>();

        //added by Mike, March 26, 2014
        try {
            Log.d(">>>>", "" + UsbongUtils.STORE_OUTPUT);
            if (UsbongUtils.STORE_OUTPUT) { //added by Mike, 27 Sept. 2015
                UsbongUtils.createNewOutputFolderStructure();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*//commented out by Mike, 20161110      
              //added by Mike, 30 April 2015
              isInTreeLoader=false;      
              myTree = UsbongUtils.DEFAULT_UTREE_TO_LOAD; //edited by Mike, 20160418
              UsbongUtils.clearTempFolder();
        */
        initTreeLoader();
    }

    //added by Mike, 29 Sept. 2015
    //Reference: http://stackoverflow.com/questions/13017122/how-to-show-progressdialog-across-launching-a-new-activity;
    //last accessed: 29 Sept. 2015; answer by: Slartibartfast, 23 Oct. 2012
    class MyBackgroundTask extends AsyncTask<String, Integer, Boolean> {
        @Override
        protected void onPreExecute() {
            Log.d(">>>>", "onPreExectue()");
        }

        @Override
        protected void onPostExecute(Boolean result) {
            Log.d(">>>>", "onPostExecute()");
            new Thread(new Runnable() {
                public void run() {
                    while (!UsbongUtils.hasLoadedPurchaseLanguageBundleList) {
                        android.os.SystemClock.sleep(3000);
                        Log.d(">>>", "sleeping");
                    }

                    Log.d(">>>", "DONE!");
                    Handler mainHandler = new Handler(getInstance().getBaseContext().getMainLooper());
                    Runnable myRunnable = new Runnable() {
                        @Override
                        public void run() {
                            initParser();
                            if (instance.myProgressDialog != null) {
                                instance.myProgressDialog.dismiss();
                            }
                        }
                    };
                    mainHandler.post(myRunnable);
                    return; //end this background thread
                }
            }).start();
            /*
                      initParser();
                      if (instance.myProgressDialog != null) {
                          instance.myProgressDialog.dismiss();
                      }      
            */
        }

        @Override
        protected Boolean doInBackground(String... params) {
            Log.d(">>>>", "doInBackground()");
            /*//commented out by Mike, 20161110
             *          init();
             */
            //Do all your slow tasks here but don't set anything on UI
            //ALL UI activities on the main thread       
            return true;

        }
    }

    //added by Mike, 20161111
    //Reference: http://stackoverflow.com/questions/13017122/how-to-show-progressdialog-across-launching-a-new-activity;
    //last accessed: 29 Sept. 2015; answer by: Slartibartfast, 23 Oct. 2012
    class MyInitTreeBackgroundTask extends AsyncTask<String, Integer, Boolean> {
        @Override
        protected void onPreExecute() {
            Log.d(">>>>", "onPreExectue()");
        }

        @Override
        protected void onPostExecute(Boolean result) {
            Log.d(">>>>", "onPostExecute()");
            new Thread(new Runnable() {
                public void run() {
                    Handler mainHandler = new Handler(getInstance().getBaseContext().getMainLooper());
                    Runnable myRunnable = new Runnable() {
                        @Override
                        public void run() {
                            init();
                            if (instance.myInitTreeProgressDialog != null) {
                                instance.myInitTreeProgressDialog.dismiss();
                            }
                        }
                    };
                    mainHandler.post(myRunnable);
                    return; //end this background thread
                }
            }).start();
        }

        @Override
        protected Boolean doInBackground(String... params) {
            Log.d(">>>>", "doInBackground()");
            //Do all your slow tasks here but don't set anything on UI
            //ALL UI activities on the main thread       
            return true;

        }
    }

    /*    
       @Override
       public void onRestoreInstanceState(Bundle savedInstanceState) {
          super.onRestoreInstanceState(savedInstanceState);
       }
    */
    public class MyOnItemSelectedListener implements OnItemSelectedListener {
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            /*
                       Toast.makeText(parent.getContext(), "The month is " +
                          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
            */
        }

        public void onNothingSelected(AdapterView<?> parent) {
            // Do nothing.
        }

    }

    public void initTreeLoader() {
        setContentView(R.layout.tree_list_interface);

        isInTreeLoader = true;

        listOfTreesArrayList = UsbongUtils.getTreeArrayList(UsbongUtils.USBONG_TREES_FILE_PATH);

        mCustomAdapter = new CustomDataAdapter(this, R.layout.tree_loader, listOfTreesArrayList);
        //Reference: http://stackoverflow.com/questions/8908549/sorting-of-listview-by-name-of-the-product-using-custom-adaptor;
        //last accessed: 2 Jan. 2014; answer by Alex Lockwood
        mCustomAdapter.sort(new Comparator<String>() {
            public int compare(String arg0, String arg1) {
                return arg0.compareTo(arg1);
            }
        });

        treesListView = (ListView) findViewById(R.id.tree_list_view);
        treesListView.setLongClickable(true);
        treesListView.setAdapter(mCustomAdapter);

        String pleaseMakeSureThatXMLTreeExistsString = (String) getResources()
                .getText(R.string.pleaseMakeSureThatXMLTreeExistsString);
        String alertString = (String) getResources().getText(R.string.alertStringValueEnglish);

        if (listOfTreesArrayList.isEmpty()) {
            new AlertDialog.Builder(UsbongDecisionTreeEngineActivity.this).setTitle(alertString)
                    .setMessage(pleaseMakeSureThatXMLTreeExistsString)
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                            Intent toUsbongMainActivityIntent = new Intent(UsbongDecisionTreeEngineActivity.this,
                                    UsbongMainActivity.class);
                            toUsbongMainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(toUsbongMainActivityIntent);
                        }
                    }).show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        Log.d(">>>>", "onCreateOptionsMenu");

        if (!isInTreeLoader) {
            Log.d(">>>>", "inside !isInTreeLoader");
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.speak_and_set_language_menu, menu);
            return super.onCreateOptionsMenu(menu); //added by Mike, 22 Sept. 2015
            //         return true;
        } /*
          else {
            Log.d(">>>>", "this.menu=menu;");
            UsbongDecisionTreeEngineActivity.menu = menu;
          }*/
        return false;
    }

    public void initSetLanguage() {
        //      UsbongUtils.checkForInAppOwnedItems(getInstance());

        //      final Dialog dialog = new Dialog(this);
        setLanguageDialog = new AlertDialog.Builder(this);
        // Get the layout inflater
        //       LayoutInflater inflater = this.getLayoutInflater();
        setLanguageDialog.setTitle("Select Language");

        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice) {
            //         private AlertDialog myAlertDialog;
            @Override
            public boolean isEnabled(int position) {
                if (UsbongUtils.isLanguageIsAnException(this.getItem(position).toString())) {
                    return true;
                }

                if (!UsbongUtils.hasUnlockedLocalLanguages) {
                    if (UsbongUtils.isLocalLanguage(this.getItem(position).toString())) {
                        if ((purchaseLanguageListAlertDialog == null)
                                || (!purchaseLanguageListAlertDialog.isShowing())) {
                            //added by Mike, 20160508
                            mySetLanguageAlertDialog.dismiss();
                            //                     myAlertDialog = purchaseLanguagesListDialog.show();                  
                            purchaseLanguageListAlertDialog = purchaseLanguagesListDialog.show();
                        }
                        return false;
                    }
                }

                if (!UsbongUtils.hasUnlockedForeignLanguages) {
                    //if it is not a local language, then it is a foreign language
                    if (!UsbongUtils.isLocalLanguage(this.getItem(position).toString())) {
                        if ((purchaseLanguageListAlertDialog == null)
                                || (!purchaseLanguageListAlertDialog.isShowing())) {
                            //added by Mike, 20160508
                            mySetLanguageAlertDialog.dismiss();
                            //                     myAlertDialog = purchaseLanguagesListDialog.show();
                            purchaseLanguageListAlertDialog = purchaseLanguagesListDialog.show();
                        }
                        return false;
                    }
                }
                return true;
            }
        };

        ArrayList<String> myTransArrayList = UsbongUtils.getAvailableTranslationsArrayList(myTree);

        if (myTransArrayList == null) {
            myTransArrayList = new ArrayList<String>();
        }

        //add the language setting of the xml tree to the list
        //        myTransArrayList.add(0, UsbongUtils.getDefaultLanguage());
        myTransArrayList.add(0, UsbongUtils.getDefaultLanguageOfXML()); //edited by Mike, 20160608
        final int myTransArrayListSize = myTransArrayList.size();

        //added by Mike, 20160618
        currSelectedItemForSetLanguage = UsbongUtils.getLanguageID(UsbongUtils.getDefaultLanguage());
        for (int i = 0; i < myTransArrayListSize; i++) {
            if (myTransArrayList.get(i).equals(UsbongUtils.getLanguageBasedOnID(currLanguageBeingUsed))) {
                currSelectedItemForSetLanguage = i;
            }
        }

        /*              
              for (int i = 0; i < myTransArrayListSize; i++) {
                  arrayAdapter.add(myTransArrayList.get(i));                
              }
        */
        //make sure is empty every time 
        //added by Mike, 20160427
        arrayAdapter.clear();

        for (int i = 0; i < myTransArrayListSize; i++) {
            if (UsbongUtils.isLanguageIsAnException(myTransArrayList.get(i))) {
                arrayAdapter.add(myTransArrayList.get(i));
                continue;
            } else {
                if (!UsbongUtils.hasUnlockedLocalLanguages) {
                    if (UsbongUtils.isLocalLanguage(myTransArrayList.get(i))) {
                        arrayAdapter.add(myTransArrayList.get(i) + " (Locked)");
                        continue;
                    }
                } else {
                    if (UsbongUtils.isLocalLanguage(myTransArrayList.get(i))) {
                        arrayAdapter.add(myTransArrayList.get(i));
                        continue;
                    }
                }

                if (!UsbongUtils.hasUnlockedForeignLanguages) {
                    if (!UsbongUtils.isLocalLanguage(myTransArrayList.get(i))) {
                        arrayAdapter.add(myTransArrayList.get(i) + " (Locked)");
                        continue;
                    }
                } else {
                    if (!UsbongUtils.isLocalLanguage(myTransArrayList.get(i))) {
                        arrayAdapter.add(myTransArrayList.get(i));
                        continue;
                    }
                }
            }
        }

        //20160420            
        // Unlock Languages button
        setLanguageDialog.setPositiveButton("Unlock Languages", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                purchaseLanguageListAlertDialog = purchaseLanguagesListDialog.show();
                dialog.dismiss();
            }
        });
        // cancel button
        setLanguageDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        Log.d(">>>>>", "currSelectedItemForSetLanguage: " + currSelectedItemForSetLanguage);
        setLanguageDialog.setSingleChoiceItems(arrayAdapter, currSelectedItemForSetLanguage, //setAdapter(arrayAdapter,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Log.i("Selected Item : ", arrayAdapter.getItem(which));
                        currSelectedItemForSetLanguage = which;

                        UsbongUtils.setLanguage(arrayAdapter.getItem(currSelectedItemForSetLanguage));

                        currLanguageBeingUsed = UsbongUtils.getLanguageID(UsbongUtils.getSetLanguage());
                        UsbongUtils.setCurrLanguage(UsbongUtils.getSetLanguage()); //added by Mike, 22 Sept. 2015

                        //added by Mike, 20160608
                        //Reference: http://stackoverflow.com/questions/23024831/android-shared-preferences-example
                        //; last accessed: 9 June 2015
                        //answer by Elenasys
                        //added by Mike, 9 June 2015
                        SharedPreferences.Editor editor = getSharedPreferences(
                                UsbongConstants.MY_SAVED_LANGUAGE_SETTING, MODE_PRIVATE).edit();
                        editor.putInt("preferredLanguage", currLanguageBeingUsed);
                        editor.commit();

                        //added by Mike, 4 June 2015
                        //remove the current element in the node container and start anew
                        //so that when end-user presses back, the previous screen will appear,
                        //and not cause the same screen to reappear.
                        if (!usbongNodeContainer.isEmpty()) {
                            usbongNodeContainer.removeElementAt(usbongNodeContainerCounter);
                            usbongNodeContainerCounter--;
                        }
                        initParser();
                        dialog.dismiss();
                    }
                });
        mySetLanguageAlertDialog = setLanguageDialog.show();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mTts.isSpeaking()) {
            mTts.stop();
        }

        StringBuffer sb = new StringBuffer();
        switch (item.getItemId()) {
        case (R.id.set_language):
            initSetLanguage();
            //refresh the menu options
            supportInvalidateOptionsMenu(); //added by Mike, 20160507
            invalidateOptionsMenu();
            return true;
        case (R.id.speak):
            processSpeak(sb);
            return true;
        case (R.id.settings):
            //20160417
            //Reference: http://stackoverflow.com/questions/16954196/alertdialog-with-checkbox-in-android;
            //last accessed: 20160408; answer by: kamal; edited by: Empty2K12
            final CharSequence[] items = { UsbongConstants.AUTO_NARRATE_STRING, UsbongConstants.AUTO_PLAY_STRING,
                    UsbongConstants.AUTO_LOOP_STRING };
            // arraylist to keep the selected items
            selectedSettingsItems = new ArrayList<Integer>();

            //check saved settings
            if (UsbongUtils.IS_IN_AUTO_NARRATE_MODE) {
                selectedSettingsItems.add(UsbongConstants.AUTO_NARRATE);
            }
            if (UsbongUtils.IS_IN_AUTO_PLAY_MODE) {
                selectedSettingsItems.add(UsbongConstants.AUTO_PLAY);
                selectedSettingsItems.add(UsbongConstants.AUTO_NARRATE); //if AUTO_PLAY is checked, AUTO_NARRATE should also be checked
            }
            if (UsbongUtils.IS_IN_AUTO_LOOP_MODE) {
                selectedSettingsItems.add(UsbongConstants.AUTO_LOOP);
            }

            selectedSettingsItemsInBoolean = new boolean[items.length];
            for (int k = 0; k < items.length; k++) {
                selectedSettingsItemsInBoolean[k] = false;
            }
            for (int i = 0; i < selectedSettingsItems.size(); i++) {
                selectedSettingsItemsInBoolean[selectedSettingsItems.get(i)] = true;
            }

            inAppSettingsDialog = new AlertDialog.Builder(this).setTitle("Settings").setMultiChoiceItems(items,
                    selectedSettingsItemsInBoolean, new DialogInterface.OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int indexSelected, boolean isChecked) {
                            Log.d(">>>", "onClick");

                            if (isChecked) {
                                // If the user checked the item, add it to the selected items
                                selectedSettingsItems.add(indexSelected);
                                if ((indexSelected == UsbongConstants.AUTO_PLAY)
                                        && !selectedSettingsItems.contains(UsbongConstants.AUTO_NARRATE)) {
                                    final ListView list = inAppSettingsDialog.getListView();
                                    list.setItemChecked(UsbongConstants.AUTO_NARRATE, true);
                                }
                            } else if (selectedSettingsItems.contains(indexSelected)) {
                                if ((indexSelected == UsbongConstants.AUTO_NARRATE)
                                        && selectedSettingsItems.contains(UsbongConstants.AUTO_PLAY)) {
                                    final ListView list = inAppSettingsDialog.getListView();
                                    list.setItemChecked(indexSelected, false);
                                } else {
                                    // Else, if the item is already in the array, remove it
                                    selectedSettingsItems.remove(Integer.valueOf(indexSelected));
                                }
                            }

                            //updated selectedSettingsItemsInBoolean
                            for (int k = 0; k < items.length; k++) {
                                selectedSettingsItemsInBoolean[k] = false;
                            }
                            for (int i = 0; i < selectedSettingsItems.size(); i++) {
                                selectedSettingsItemsInBoolean[selectedSettingsItems.get(i)] = true;
                            }
                        }
                    }).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            try {
                                InputStreamReader reader = UsbongUtils
                                        .getFileFromSDCardAsReader(UsbongUtils.BASE_FILE_PATH + "usbong.config");
                                BufferedReader br = new BufferedReader(reader);
                                String currLineString;

                                //write first to a temporary file
                                PrintWriter out = UsbongUtils.getFileFromSDCardAsWriter(
                                        UsbongUtils.BASE_FILE_PATH + "usbong.config" + "TEMP");

                                while ((currLineString = br.readLine()) != null) {
                                    Log.d(">>>", "currLineString: " + currLineString);
                                    if ((currLineString.contains("IS_IN_AUTO_NARRATE_MODE="))
                                            || (currLineString.contains("IS_IN_AUTO_PLAY_MODE="))
                                            || (currLineString.contains("IS_IN_AUTO_LOOP_MODE="))) {
                                        continue;
                                    } else {
                                        out.println(currLineString);
                                    }
                                }

                                for (int i = 0; i < items.length; i++) {
                                    Log.d(">>>>", i + "");
                                    if (selectedSettingsItemsInBoolean[i] == true) {
                                        if (i == UsbongConstants.AUTO_NARRATE) {
                                            out.println("IS_IN_AUTO_NARRATE_MODE=ON");
                                            UsbongUtils.IS_IN_AUTO_NARRATE_MODE = true;
                                        } else if (i == UsbongConstants.AUTO_PLAY) {
                                            out.println("IS_IN_AUTO_PLAY_MODE=ON");
                                            UsbongUtils.IS_IN_AUTO_PLAY_MODE = true;
                                            /*                            
                                                                        //if auto_play is ON, auto_narrate is also ON
                                                                        //however, it is possible to have auto_play OFF,
                                                                        //while auto_narrate is ON
                                                                        out.println("IS_IN_AUTO_NARRATE_MODE=ON");
                                                                        UsbongUtils.IS_IN_AUTO_NARRATE_MODE=true;
                                            */
                                        } else if (i == UsbongConstants.AUTO_LOOP) {
                                            out.println("IS_IN_AUTO_LOOP_MODE=ON");
                                            UsbongUtils.IS_IN_AUTO_LOOP_MODE = true;
                                        }
                                    } else {
                                        if (i == UsbongConstants.AUTO_NARRATE) {
                                            out.println("IS_IN_AUTO_NARRATE_MODE=OFF");
                                            UsbongUtils.IS_IN_AUTO_NARRATE_MODE = false;
                                        } else if (i == UsbongConstants.AUTO_PLAY) {
                                            out.println("IS_IN_AUTO_PLAY_MODE=OFF");
                                            UsbongUtils.IS_IN_AUTO_PLAY_MODE = false;
                                        } else if (i == UsbongConstants.AUTO_LOOP) {
                                            out.println("IS_IN_AUTO_LOOP_MODE=OFF");
                                            UsbongUtils.IS_IN_AUTO_LOOP_MODE = false;
                                        }
                                    }
                                }
                                out.close(); //remember to close

                                //copy temp file to actual usbong.config file
                                InputStreamReader reader2 = UsbongUtils.getFileFromSDCardAsReader(
                                        UsbongUtils.BASE_FILE_PATH + "usbong.config" + "TEMP");
                                BufferedReader br2 = new BufferedReader(reader2);
                                String currLineString2;

                                //write to actual usbong.config file
                                PrintWriter out2 = UsbongUtils
                                        .getFileFromSDCardAsWriter(UsbongUtils.BASE_FILE_PATH + "usbong.config");

                                while ((currLineString2 = br2.readLine()) != null) {
                                    out2.println(currLineString2);
                                }
                                out2.close();

                                UsbongUtils.deleteRecursive(
                                        new File(UsbongUtils.BASE_FILE_PATH + "usbong.config" + "TEMP"));
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            //  Your code when user clicked on Cancel
                        }
                    }).create();
            inAppSettingsDialog.show();
            /*         
            new AlertDialog.Builder(UsbongDecisionTreeEngineActivity.this).setTitle("Settings")
                        .setMessage("Automatic voice-over narration:")
            //               .setView(requiredFieldAlertStringTextView)
            .setPositiveButton("Turn On", new DialogInterface.OnClickListener() {               
              @Override
              public void onClick(DialogInterface dialog, int which) {
                 UsbongUtils.isInAutoVoiceOverNarration=true;
              }
            })
            .setNegativeButton("Turn Off", new DialogInterface.OnClickListener() {               
              @Override
              public void onClick(DialogInterface dialog, int which) {
                 UsbongUtils.isInAutoVoiceOverNarration=false;
              }
                        }).show();
            */
            return true;
        case (R.id.about):
            new AlertDialog.Builder(UsbongDecisionTreeEngineActivity.this).setTitle("About")
                    .setMessage(UsbongUtils.readTextFileInAssetsFolder(UsbongDecisionTreeEngineActivity.this,
                            "credits.txt")) //don't add a '/', otherwise the file would not be found
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    }).show();
            return true;
        case android.R.id.home: //added by Mike, 22 Sept. 2015
            processReturnToTitleScreenActivity();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    //added by Mike, 24 Sept. 2015
    @Override
    public void onStop() {
        if (mTts != null) {
            mTts.stop();
        }
        super.onStop();
    }

    //added by Mike, 25 Sept. 2015
    public void processPlayBGMusic() {
        try {
            String newCurrUsbongBGAudioString = UsbongUtils
                    .getBGAudioFilePathForThisScreenIfAvailable(currUsbongNode);
            Log.d(">>>>newCurrUsbongBGAudioString: ", "" + newCurrUsbongBGAudioString);
            Log.d(">>>>currUsbongBGAudioString: ", "" + currUsbongBGAudioString);

            if (currUsbongBGAudioString == newCurrUsbongBGAudioString) {
                return;
            } else {
                Log.d(">>>>", "inside currUsbongBGAudioString!=newCurrUsbongBGAudioString");
                currUsbongBGAudioString = newCurrUsbongBGAudioString;
                //            myBGMediaPlayer.stop();

                String filePath = UsbongUtils.getBGAudioFilePathFromUTree(currUsbongBGAudioString);
                //         Log.d(">>>>filePath: ",filePath);
                if (filePath != null) {
                    Log.d(">>>>", "inside filePath!=null");
                    Log.d(">>>>filePath: ", filePath);
                    if (myBGMediaPlayer.isPlaying()) {
                        myBGMediaPlayer.stop();
                    }
                    myBGMediaPlayer.reset();
                    //edited by Mike, 20151201
                    //               myBGMediaPlayer.setDataSource(filePath);
                    FileInputStream fis = new FileInputStream(new File(filePath));
                    myBGMediaPlayer.setDataSource(fis.getFD());
                    fis.close();

                    myBGMediaPlayer.prepare();
                    //            myMediaPlayer.setVolume(1.0f, 1.0f);
                    myBGMediaPlayer.setLooping(true);
                    myBGMediaPlayer.start();
                    //            myMediaPlayer.seekTo(0);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void processSpeak(StringBuffer sb) {
        if (mTts.isSpeaking()) { //commented out by Mike, 24 Sept. 2015
            mTts.stop();
        }

        //      Log.d(">>>>currScreen",currScreen+"");
        switch (currScreen) {
        //edit later, Mike, Sept. 26, 2013
        case UsbongConstants.SIMPLE_ENCRYPT_SCREEN:
            break;
        //edit later, Mike, May 23, 2013
        case UsbongConstants.DCAT_SUMMARY_SCREEN:
            break;

        case UsbongConstants.LINK_SCREEN:
        case UsbongConstants.MULTIPLE_RADIO_BUTTONS_SCREEN:
        case UsbongConstants.MULTIPLE_RADIO_BUTTONS_WITH_ANSWER_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");

            int totalRadioButtonsInContainer = radioButtonsContainer.size();
            for (int i = 0; i < totalRadioButtonsInContainer; i++) {
                sb.append(((RadioButton) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                        new RadioButton(this), UsbongUtils.IS_RADIOBUTTON, radioButtonsContainer.elementAt(i)))
                                .getText().toString()
                        + ". ");
            }
            break;
        case UsbongConstants.MULTIPLE_CHECKBOXES_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");

            int totalCheckBoxesInContainer = checkBoxesContainer.size();
            for (int i = 0; i < totalCheckBoxesInContainer; i++) {
                sb.append(((CheckBox) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                        new CheckBox(this), UsbongUtils.IS_CHECKBOX, checkBoxesContainer.elementAt(i))).getText()
                                .toString()
                        + ". ");
            }
            break;
        case UsbongConstants.AUDIO_RECORD_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");

            Button recordButton = (Button) findViewById(R.id.record_button);
            Button stopButton = (Button) findViewById(R.id.stop_button);
            Button playButton = (Button) findViewById(R.id.play_button);

            sb.append(recordButton.getText() + ". ");
            sb.append(stopButton.getText() + ". ");
            sb.append(playButton.getText() + ". ");
            break;
        case UsbongConstants.PAINT_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");

            Button paintButton = (Button) findViewById(R.id.paint_button);
            sb.append(paintButton.getText() + ". ");
            break;
        case UsbongConstants.PHOTO_CAPTURE_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");

            Button photoCaptureButton = (Button) findViewById(R.id.photo_capture_button);
            sb.append(photoCaptureButton.getText() + ". ");
            break;
        case UsbongConstants.TEXTFIELD_SCREEN:
        case UsbongConstants.TEXTFIELD_WITH_ANSWER_SCREEN:
        case UsbongConstants.TEXTFIELD_WITH_UNIT_SCREEN:
        case UsbongConstants.TEXTFIELD_NUMERICAL_SCREEN:
        case UsbongConstants.TEXTAREA_SCREEN:
        case UsbongConstants.TEXTAREA_WITH_ANSWER_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");
            break;
        case UsbongConstants.CLASSIFICATION_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");

            int totalClassificationsInContainer = classificationContainer.size();
            for (int i = 0; i < totalClassificationsInContainer; i++) {
                sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                        new TextView(this), UsbongUtils.IS_TEXTVIEW, classificationContainer.elementAt(i)))
                                .getText().toString()
                        + ". ");
            }
            break;
        case UsbongConstants.DATE_SCREEN:
        case UsbongConstants.TEXT_DISPLAY_SCREEN:
        case UsbongConstants.TEXT_IMAGE_DISPLAY_SCREEN:
        case UsbongConstants.IMAGE_TEXT_DISPLAY_SCREEN:
        case UsbongConstants.CLICKABLE_IMAGE_TEXT_DISPLAY_SCREEN:
        case UsbongConstants.TEXT_CLICKABLE_IMAGE_DISPLAY_SCREEN:
        case UsbongConstants.GPS_LOCATION_SCREEN:
        case UsbongConstants.QR_CODE_READER_SCREEN:
        case UsbongConstants.TIMESTAMP_DISPLAY_SCREEN:
        case UsbongConstants.VIDEO_FROM_FILE_WITH_TEXT_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");
            //              Log.d(">>>>sb",sb.toString());
            break;
        case UsbongConstants.CLICKABLE_IMAGE_DISPLAY_SCREEN:
        case UsbongConstants.IMAGE_DISPLAY_SCREEN:
        case UsbongConstants.VIDEO_FROM_FILE_SCREEN:
            break;
        case UsbongConstants.YES_NO_DECISION_SCREEN:
        case UsbongConstants.SEND_TO_WEBSERVER_SCREEN:
        case UsbongConstants.SEND_TO_CLOUD_BASED_SERVICE_SCREEN:
            sb.append(((TextView) UsbongUtils.applyTagsInView(UsbongDecisionTreeEngineActivity.getInstance(),
                    new TextView(this), UsbongUtils.IS_TEXTVIEW, currUsbongNode)).getText().toString() + ". ");
            sb.append(yesStringValue + ". ");
            sb.append(noStringValue + ". ");
            break;
        /*                  
                 case UsbongConstants.PAINT_SCREEN:
         if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_FILIPINO) {
           sb.append((String) getResources().getText(R.string.UsbongPaintScreenTextViewFILIPINO));
         }
         else if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_JAPANESE) {
           sb.append((String) getResources().getText(R.string.UsbongPaintScreenTextViewJAPANESE));                                            
         }
         else { //if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_ENGLISH) {
           sb.append((String) getResources().getText(R.string.UsbongPaintScreenTextViewENGLISH));                                            
         }
         break;          
        */
        /*         //commented out by Mike, 20160213           
        case UsbongConstants.END_STATE_SCREEN:
            if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_FILIPINO) {
              sb.append((String) getResources().getText(R.string.UsbongEndStateTextViewFILIPINO));                      
            }
            else if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_JAPANESE) {
              sb.append((String) getResources().getText(R.string.UsbongEndStateTextViewJAPANESE));                                            
            }
            else { //if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_ENGLISH) {
              sb.append((String) getResources().getText(R.string.UsbongEndStateTextViewENGLISH));                                            
            }
            break;          
           */
        }
        //edited by Mike, 21 July 2015
        try {

            currUsbongAudioString = UsbongUtils.getAudioFilePathForThisScreenIfAvailable(currUsbongNode);

            Log.d(">>>>currUsbongAudioString: ", "" + currUsbongAudioString);
            Log.d(">>>>currLanguageBeingUsed: ", UsbongUtils.getLanguageBasedOnID(currLanguageBeingUsed));

            //added by Mike, 2 Oct. 2015
            //exception for Mandarin
            //make simplified and traditional refer to the same audio folder
            if ((currLanguageBeingUsed == UsbongUtils.LANGUAGE_MANDARIN_SIMPLIFIED)
                    || (currLanguageBeingUsed == UsbongUtils.LANGUAGE_MANDARIN_TRADITIONAL)) {
                currLanguageBeingUsed = UsbongUtils.LANGUAGE_MANDARIN;
            }

            String filePath = UsbongUtils.getAudioFilePathFromUTree(currUsbongAudioString,
                    UsbongUtils.getLanguageBasedOnID(currLanguageBeingUsed));
            //         Log.d(">>>>filePath: ",filePath);
            if (filePath != null) {
                Log.d(">>>>", "inside filePath!=null");
                Log.d(">>>>filePath: ", filePath);
                if (myMediaPlayer.isPlaying()) {
                    myMediaPlayer.stop();
                }
                myMediaPlayer.reset();
                //edited by Mike, 20151201
                //            myMediaPlayer.setDataSource(filePath);
                FileInputStream fis = new FileInputStream(new File(filePath));
                myMediaPlayer.setDataSource(fis.getFD());
                fis.close();

                myMediaPlayer.prepare();
                //            myMediaPlayer.setVolume(1.0f, 1.0f);
                myMediaPlayer.start();
                //            myMediaPlayer.seekTo(0);

                //added by Mike, 20160417
                myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                    public void onCompletion(MediaPlayer mp) {
                        if ((UsbongUtils.IS_IN_AUTO_PLAY_MODE) && (UsbongUtils.isAnAutoPlayException(instance))) {
                            processNextButtonPressed();
                        }
                    }
                });
            } else {
                //it's either com.svox.pico (default) or com.svox.classic (Japanese, etc)                    
                //commented out by Mike, 11 Oct. 2015
                //            mTts.setEngineByPackageName("com.svox.pico"); //note: this method is already deprecated

                //20160417
                mTtsParams = new HashMap<String, String>();
                mTtsParams.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UsbongConstants.MY_UTTERANCE_ID);

                switch (currLanguageBeingUsed) {
                case UsbongUtils.LANGUAGE_FILIPINO:
                    mTts.setLanguage(new Locale("spa", "ESP"));
                    if (Build.VERSION.RELEASE.startsWith("5")) {
                        mTts.speak(UsbongUtils.convertFilipinoToSpanishAccentFriendlyText(sb.toString()),
                                TextToSpeech.QUEUE_FLUSH, null, null); //QUEUE_ADD         
                    } else {
                        mTts.speak(UsbongUtils.convertFilipinoToSpanishAccentFriendlyText(sb.toString()),
                                TextToSpeech.QUEUE_FLUSH, null); //QUEUE_ADD                              
                    }
                    break;
                case UsbongUtils.LANGUAGE_JAPANESE:
                    //                  commented out by Mike, 11 Oct. 2015
                    //                  mTts.setEngineByPackageName("com.svox.classic"); //note: this method is already deprecated
                    mTts.setLanguage(new Locale("ja", "JP"));
                    if (Build.VERSION.RELEASE.startsWith("5")) {
                        mTts.speak(sb.toString(), TextToSpeech.QUEUE_FLUSH, null, null); //QUEUE_ADD         

                    } else {
                        mTts.speak(sb.toString(), TextToSpeech.QUEUE_FLUSH, null); //QUEUE_ADD         
                    }
                    break;
                case UsbongUtils.LANGUAGE_ENGLISH:
                    mTts.setLanguage(new Locale("en", "US"));
                    if (Build.VERSION.RELEASE.startsWith("5")) {
                        mTts.speak(sb.toString(), TextToSpeech.QUEUE_FLUSH, null, null); //QUEUE_ADD         
                    } else {
                        mTts.speak(sb.toString(), TextToSpeech.QUEUE_FLUSH, null); //QUEUE_ADD                              
                    }
                    break;
                default:
                    mTts.setLanguage(new Locale("en", "US"));
                    mTts.speak(sb.toString(), TextToSpeech.QUEUE_ADD, null); //QUEUE_FLUSH         
                    break;
                }

                //added by Mike, 20160417
                mTts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                    @Override
                    public void onDone(String utteranceId) {
                        if (utteranceId.equals(UsbongConstants.MY_UTTERANCE_ID)) {
                            //added by Mike, 20160608
                            if ((UsbongUtils.IS_IN_AUTO_PLAY_MODE)
                                    && (UsbongUtils.isAnAutoPlayException(instance))) {
                                instance.runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        processNextButtonPressed();
                                    }
                                });
                            }
                        }
                    }

                    @Override
                    @Deprecated
                    public void onError(String utteranceId) {
                        // TODO Auto-generated method stub
                    }

                    @Override
                    public void onStart(String utteranceId) {
                        // TODO Auto-generated method stub                  
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onInit(int status) {
        //answer from Eternal Learner, stackoverflow
        //Reference: http://stackoverflow.com/questions/9473070/texttospeech-setenginebypackagename-doesnt-set-anything;
        //last accessed: Nov. 7, 2012
        //mTts.getDefaultEngine() and mTts.setEngineByPackageName(...) can only be called only when onInit(...) is reached      
        /*      
              String myEngine = mTts.getDefaultEngine();
                System.out.println(">>>>>>>>>>>>>>> myEngine: "+myEngine);
            
                //it's either com.svox.pico (default) or com.svox.classic (Japanese, etc)        
                mTts.setEngineByPackageName(myEngine); //note: this method is already deprecated
        */
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == UsbongUtils.MY_DATA_CHECK_CODE) {
            /*
             if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS instance
            mTts = new TextToSpeech(this, this);
              } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
              }
            */
            if (mTts == null) {
                Intent installIntent = new Intent();
                installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installIntent);
            }
            mTts = new TextToSpeech(this, this);
        } else if (requestCode == UsbongUtils.EMAIL_SENDING_SUCCESS) {
            finish();
            Intent toUsbongMainActivityIntent = new Intent(UsbongDecisionTreeEngineActivity.this,
                    UsbongMainActivity.class);
            toUsbongMainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(toUsbongMainActivityIntent);
            if (mTts != null) {
                mTts.shutdown();
            }
        } else if (requestCode == 1001) {
            int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
            String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
            String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");

            if (resultCode == RESULT_OK) {
                try {
                    JSONObject jo = new JSONObject(purchaseData);
                    String sku = jo.getString("productId");

                    //edited by Mike, 20160620
                    if (sku.contains("local")) {
                        UsbongUtils.hasUnlockedLocalLanguages = true; //added by Mike, 20160427
                        myPurchaseLanguageBundleListAdapter.setLocalLanguageToOwned();

                        //Reference: http://stackoverflow.com/questions/23024831/android-shared-preferences-example
                        //; last accessed: 9 June 2015
                        //answer by Elenasys
                        //added by Mike, 9 June 2015
                        SharedPreferences.Editor editor = getSharedPreferences(UsbongConstants.MY_PURCHASED_ITEMS,
                                MODE_PRIVATE).edit();
                        editor.putString(UsbongConstants.ALL_LOCAL_LANGUAGES_PRODUCT_ID, "Owned");
                        editor.commit();

                        new AlertDialog.Builder(getInstance()).setTitle("Purchase Complete!")
                                .setMessage("You have unlocked All Local Languages!")
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                    }
                                }).show();
                    } else if (sku.contains("local")) {
                        UsbongUtils.hasUnlockedForeignLanguages = true; //added by Mike, 20160427
                        myPurchaseLanguageBundleListAdapter.setForeignLanguageToOwned();

                        //Reference: http://stackoverflow.com/questions/23024831/android-shared-preferences-example
                        //; last accessed: 9 June 2015
                        //answer by Elenasys
                        //added by Mike, 9 June 2015
                        SharedPreferences.Editor editor = getSharedPreferences(UsbongConstants.MY_PURCHASED_ITEMS,
                                MODE_PRIVATE).edit();
                        editor.putString(UsbongConstants.ALL_FOREIGN_LANGUAGES_PRODUCT_ID, "Owned");
                        editor.commit();

                        new AlertDialog.Builder(getInstance()).setTitle("Purchase Complete!")
                                .setMessage("You have unlocked All Foreign Languages!")
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                    }
                                }).show();
                    } else { //for all languages
                        UsbongUtils.hasUnlockedLocalLanguages = true; //added by Mike, 20160427
                        UsbongUtils.hasUnlockedForeignLanguages = true; //added by Mike, 20160427
                        myPurchaseLanguageBundleListAdapter.setAllLanguagesToOwned();

                        //Reference: http://stackoverflow.com/questions/23024831/android-shared-preferences-example
                        //; last accessed: 9 June 2015
                        //answer by Elenasys
                        //added by Mike, 9 June 2015
                        SharedPreferences.Editor editor = getSharedPreferences(UsbongConstants.MY_PURCHASED_ITEMS,
                                MODE_PRIVATE).edit();
                        editor.putString(UsbongConstants.ALL_LANGUAGES_PRODUCT_ID, "Owned");
                        editor.commit();

                        new AlertDialog.Builder(getInstance()).setTitle("Purchase Complete!")
                                .setMessage("You have unlocked All Languages!")
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                    }
                                }).show();
                    }
                } catch (JSONException e) {
                    //TODO: fix this
                    //alert("Failed to parse purchase data.");
                    e.printStackTrace();
                }
                /*
                                //refresh the menu options
                               AlertDialog purchaseLanguagesListAlertDialog = purchaseLanguagesListDialog.create();
                               purchaseLanguagesListAlertDialog.invalidateOptionsMenu();
                    
                               AlertDialog setLanguageAlertDialog = setLanguageDialog.create();
                               setLanguageAlertDialog.invalidateOptionsMenu();              
                */
                purchaseLanguageListAlertDialog.dismiss();
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy(); //added by Mike, 7 Aug. 2015
        if (mTts != null) {
            mTts.shutdown();
        }
        if (myMediaPlayer != null) {
            myMediaPlayer.release();
        }
        if (myBGMediaPlayer != null) {
            myBGMediaPlayer.release();
        }
        //added by Mike, 20160417
        UsbongUtils.unbindInAppService(getInstance());
    }

    public static UsbongDecisionTreeEngineActivity getInstance() {
        return instance;
    }

    public static void setMyIntent(Intent i) {
        getInstance().setIntent(i);
    }

    public void setCurrScreen(int cs) {
        currScreen = cs;
    }

    /*
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       if (getParent()!=null) { 
       if (keyCode == KeyEvent.KEYCODE_BACK) {
          processReturnToTitleScreenActivity();
          return false;
       }
       }
    return super.onKeyDown(keyCode, event);
    }
    */

    //added by Mike, Feb. 2, 2013
    @Override
    public void onBackPressed() {
        processReturnToTitleScreenActivity();
    }

    @Override
    public void onRestart() {
        super.onRestart();

        //added by Mike, Dec. 24, 2012
        //       Log.d(">>>>>> onActivityResult", "inside!!!");
        hasReturnedFromAnotherActivity = true; //camera, paint, email, etc

        switch (currScreen) {
        case UsbongConstants.PHOTO_CAPTURE_SCREEN:
            initTakePhotoScreen();
            break;
        }
        initParser();
    }

    @Override
    public void onPause() {
        super.onPause();
        if (myLocation != null) {
            myLocation.cancelTimer();
        }
    }

    public void parseYesNoAnswers(XmlPullParser parser) {
        try {
            if (parser.getName().equals("transition")) {

                //check if the first transition's name is "No"
                //              if (parser.getAttributeValue(1).toString().equals(noStringValue)) {

                //if the edge or arrow doesn't have a label (e.g. Yes, No, Any), make it an "Any" as default
                //added by Mike, Aug. 13, 2012
                if (parser.getAttributeValue(null, "name") == null) {
                    nextUsbongNodeIfYes = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                    nextUsbongNodeIfNo = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                }
                //added by Mike, March 8, 2012
                //add the || just in case the language is Filipino, but we used "Yes/No" for the transitions
                else if (parser.getAttributeValue(null, "name").equals(noStringValue)
                        || parser.getAttributeValue(null, "name").equals("No")) {
                    nextUsbongNodeIfNo = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                    //do two nextTag()'s, because <transition> has a closing tag
                    parser.nextTag();
                    parser.nextTag();
                    nextUsbongNodeIfYes = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                }
                //              else if (parser.getAttributeValue(1).toString().equals(yesStringValue)) { // if it is "Yes"
                else if (parser.getAttributeValue(null, "name").equals(yesStringValue)
                        || parser.getAttributeValue(null, "name").equals("Yes")) {
                    nextUsbongNodeIfYes = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                    //do two nextTag()'s, because <transition> has a closing tag
                    parser.nextTag();
                    parser.nextTag();
                    nextUsbongNodeIfNo = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                } else { // if it is "Any"
                    nextUsbongNodeIfYes = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                    nextUsbongNodeIfNo = /*parser.getAttributeValue(null,"to").toString();*/parser
                            .getAttributeValue(0).toString();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //added by Mike, 20160417
    public void storeDataToUdteaObject() {
        //      Log.d(">>>>>", "storeDataToUdteaObject()");
        myUdteaObject.setMyTree(myTree);
        myUdteaObject.setCurrUsbongNode(currUsbongNode);
        Log.d(">>>>>currUsbongNode", currUsbongNode);

        myUdteaObject.setNextUsbongNodeIfYes(nextUsbongNodeIfYes);
        myUdteaObject.setNextUsbongNodeIfNo(nextUsbongNodeIfNo);

        myUdteaObject.setUsbongAnswerContainerCounter(usbongAnswerContainerCounter);
        myUdteaObject.setUsbongNodeContainerCounter(usbongNodeContainerCounter);
        myUdteaObject.setDecisionTrackerContainer(decisionTrackerContainer);
        myUdteaObject.setUsbongAnswerContainer(usbongAnswerContainer);
        myUdteaObject.setUsbongNodeContainer(usbongNodeContainer);
    }

    //added by Mike, 24 May 2015
    //@param: s is the name of the .utree file
    public void initParser(String s) {
        isInTreeLoader = false;
        invalidateOptionsMenu(); //should be after isInTreeLoader=false; added by Mike, 24 Sept. 2015
        myTree = s;

        //added by Mike, 20160417
        if (mTts != null) {
            mTts.stop();
        }
        //added by Mike, 20160417
        if (myMediaPlayer != null) {
            myMediaPlayer.stop();
        }

        UsbongUtils.clearTempFolder();
        currUsbongNode = ""; //added by Mike, 20160417

        initParser();
    }

    //Reference: 
    //http://wiki.forum.nokia.com/index.php/How_to_parse_an_XML_file_in_Java_ME_with_kXML ;Last accessed on: June 2,2010
    //http://kxml.sourceforge.net/kxml2/ ;Last accessed on: June 2,2010    
    //http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html; last accessed on: Aug. 23, 2011
    public void initParser() {
        //      hasReachedEndOfAllDecisionTrees=false;      
        //         decisionTrackerContainer.addElement(usbongAnswerContainer.lastElement());
        Log.d(">>>>>", "initParser");

        //added by Mike, 20161111
        isInTreeLoader = false;
        invalidateOptionsMenu(); //should be after isInTreeLoader=false;

        if (wasNextButtonPressed) {
            Log.d(">>>>>", "wasNextButtonPressed");

            if (!hasUpdatedDecisionTrackerContainer) {
                decisionTrackerContainer
                        .addElement(usbongAnswerContainer.elementAt(usbongAnswerContainerCounter - 1));
                hasUpdatedDecisionTrackerContainer = true;
            }

            //         System.out.println(">>>>>>>>>> wasNextButtonPressed");
            //         System.out.println(">>>>>>>>>> usbongAnswerContainerCounter: "+usbongAnswerContainerCounter);

            for (int i = 0; i < usbongAnswerContainer.size(); i++) {
                System.out.println(i + ": " + usbongAnswerContainer.elementAt(i));
            }

            if (usbongAnswerContainer.size() != 0) {
                UsbongUtils.processUsbongVariableAssignment(myUsbongVariableMemory,
                        usbongAnswerContainer.elementAt(usbongAnswerContainer.size() - 1));
            }

            if ((!usbongAnswerContainer.isEmpty())
                    && (usbongAnswerContainerCounter < usbongAnswerContainer.size())) {
                currAnswer = usbongAnswerContainer.elementAt(usbongAnswerContainerCounter);
                //            System.out.println(">>>> loob currAnswer: "+currAnswer);            
            } else {
                currAnswer = "";
            }

            wasNextButtonPressed = false;
        }
        Log.d(">>>>", "end of wasNextButtonPressed");

        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser parser = factory.newPullParser();

            //if *.xml is blank
            //        if (UsbongUtils.getFileFromSDCardAsReader(UsbongUtils.BASE_FILE_PATH + myTreeDirectory + myTree + ".xml") == null) { 
            //        UsbongUtils.getTreeFromSDCardAsReader(/*UsbongUtils.USBONG_TREES_FILE_PATH + */myTree));// + ".xml")        
            //        if (!hasRetrievedTree) {
            //edited by Mike, Sept. 10, 2014
            //        if (isr==null) {
            //           System.out.println("isr = null;");
            isr = UsbongUtils.getTreeFromSDCardAsReader(myTree);

            if (isr == null) {
                Toast.makeText(getApplicationContext(), "Error loading: " + myTree, Toast.LENGTH_LONG).show();
                return;
            }
            //        }
            /*        else {
                       System.out.println("isr not = null;"+isr.toString());
                    }
            */
            //           hasRetrievedTree=true;
            //        }        

            parser.setInput(isr);

            //20160417
            //load hints (if there are any) and put them in a hashtable
            //do this after isr = UsbongUtils.getTreeFromSDCardAsReader(myTree);
            //because UsbongUtils.getTreeFromSDCardAsReader(myTree) unzips the .utree file into the temp folder
            //added by Mike, 20160413
            UsbongUtils.putHintsInHashtable(myTree);

            while (parser.nextTag() != XmlPullParser.END_DOCUMENT) {
                //if this tag does not have an attribute; e.g. END_TAG
                if (parser.getAttributeCount() == -1) {
                    continue;
                }
                //if this is the first process-definition tag
                else if (parser.getAttributeCount() > 1) {
                    if ((currUsbongNode.equals("")) && (parser.getName().equals("process-definition"))) {
                        //edited by Mike, 20160608
                        //remove this so that it is possible to load the .utree with a saved language setting

                        UsbongUtils.setDefaultLanguageOfXML(UsbongUtils.getLanguageBasedOnID(
                                UsbongUtils.getLanguageID(parser.getAttributeValue(null, "lang"))));
                        /*
                                         if (!isAutoLoopedTree) {
                                            //@todo: remove this id thing, immediately use the String; otherwise it'll be cumbersome to keep on adding language ids
                            
                                            currLanguageBeingUsed=UsbongUtils.getLanguageID(parser.getAttributeValue(null, "lang"));
                                            UsbongUtils.setDefaultLanguage(UsbongUtils.getLanguageBasedOnID(currLanguageBeingUsed));
                                              UsbongUtils.setCurrLanguage(parser.getAttributeValue(null, "lang")); //added by Mike, 22 Sept. 2015
                                         }
                        */
                        //                 System.out.println("currLanguageBeingUsed: "+currLanguageBeingUsed);

                        //added by Mike, Feb. 2, 2013
                        decisionTrackerContainer.removeAllElements();
                    }
                    continue;
                } else if (parser.getAttributeCount() == 1) {
                    //if currUsbongNode is still blank
                    //getName() is not the name attribute, but the name of the tag (e.g. start-state, decision-node, task-node)
                    if ((currUsbongNode.equals("")) && (parser.getName().equals("start-state"))) {
                        //the next tag would be transition
                        //Example:
                        //<start-state name="start-state1">
                        //  <transition to="Is there tender swelling behind the ear?"></transition>
                        //</start-state>

                        //do two next()'s to skip the "\n", and proceed to <transition>...
                        //                 parser.next();
                        //                 parser.next();
                        //or do one nextTag();
                        parser.nextTag();
                        currUsbongNode = parser.getAttributeValue(0).toString();

                        //                 isFirstQuestionForDecisionTree=true;

                        //added by Mike, Dec. 24, 2012
                        //reset myQRCodeContent to blank
                        myQRCodeContent = "";
                        continue;
                    }
                    //edited by Mike, 21 July 2015
                    if ((!currUsbongNode.equals(""))
                            && /*(parser.getAttributeValue(null,"name")!=null) && ((parser.getAttributeValue(null,"name").toString().equals(currUsbongNode))*/(parser
                                    .getAttributeValue(0).toString().equals(currUsbongNode))
                            && !(parser.getName().equals("transition"))) { //make sure that the tag is not a transition node 
                        if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_FILIPINO) {
                            noStringValue = (String) getResources().getText(R.string.noStringValueFilipino);
                            yesStringValue = (String) getResources().getText(R.string.yesStringValueFilipino);
                        } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_JAPANESE) {
                            noStringValue = (String) getResources().getText(R.string.noStringValueJapanese); //noStringValue
                            yesStringValue = (String) getResources().getText(R.string.yesStringValueJapanese); //yesStringValue          
                        } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_MANDARIN) {
                            noStringValue = (String) getResources().getText(R.string.noStringValueMandarin); //noStringValue
                            yesStringValue = (String) getResources().getText(R.string.yesStringValueMandarin); //yesStringValue          
                        } else { //if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_ENGLISH) {
                            noStringValue = (String) getResources().getText(R.string.noStringValueEnglish); //noStringValue
                            yesStringValue = (String) getResources().getText(R.string.yesStringValueEnglish); //yesStringValue          
                        }

                        //if this is a decision tag and the next tag is transition...
                        //Example:
                        //<decision name="Is there tender swelling behind the ear?">
                        //  <transition to="Is there pus draining from the ear?" name="No"></transition>
                        //  <transition to="MASTOIDITIS" name="Yes"></transition>
                        //</decision>
                        if (parser.getName().equals("decision")) {//transition")) {//(parser.getAttributeCount()>1) {
                            currScreen = UsbongConstants.YES_NO_DECISION_SCREEN;
                            parser.nextTag(); //go to the next tag
                            parseYesNoAnswers(parser);
                        } else if (parser.getName().equals("end-state")) {
                            currScreen = UsbongConstants.END_STATE_SCREEN;
                            processNextButtonPressed();
                            return;
                            /*//commented out by Mike, 20160417                    
                                                  //added by Mike, 25 Sept. 2015
                                                  UsbongUtils.clearTempFolder();
                                                  finish();
                                                  return;
                            */
                        } else if (parser.getName().equals("task-node")) {
                            StringTokenizer st = new StringTokenizer(currUsbongNode, "~");
                            String myStringToken = st.nextToken();

                            if (myStringToken.equals(currUsbongNode)) {//if this is the task-node for classification and treatment/management plan                        
                                //<task-node name="SOME DEHYDRATION">
                                //   <task name="Give fluid, zinc supplements and food for some dehydration (Plan B)"></task>
                                //   <task name="If child also has a severe classification: 1) Refer URGENTLY to hospital with mother giving frequent sips of ORS on the way, 2) Advise the mother to continue breastfeeding"></task>
                                //   <task name="Advise mother when to return immediately"></task>
                                //   <task name="Follow-up in 5 days if not improving"></task>
                                //   <transition to="end-state1" name="to-end"></transition>
                                //</task-node>
                                parser.nextTag(); //go to task tag

                                currScreen = UsbongConstants.CLASSIFICATION_SCREEN;
                                classificationContainer.removeAllElements();
                                while (!parser.getName().equals("transition")) {
                                    classificationContainer.addElement(parser.getAttributeValue(0).toString());
                                    //do two nextTag()'s, because <task> has a closing tag
                                    parser.nextTag();
                                    parser.nextTag();
                                }
                                nextUsbongNodeIfYes = parser.getAttributeValue(0).toString();
                                nextUsbongNodeIfNo = parser.getAttributeValue(0).toString();
                            } else { //this is a task-node that has "~"                        
                                if (myStringToken.equals("radioButtons")) {
                                    //<task-node name="radioButtons~1~Life is good">
                                    //   <task name="Strongly Disagree"></task>
                                    //   <task name="Moderately Disagree"></task>
                                    //   <task name="Slightly Disagree"></task>
                                    //   <task name="Slightly Agree"></task>
                                    //   <task name="Moderately Agree"></task>
                                    //   <task name="Strongly Agree"></task>
                                    //   <transition to="radioButtons~1~I don't think that the world is a good place" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to task tag

                                    //radioButtons by definition requires only 1 ticked button in the group
                                    //requiredTotalCheckedBoxes = Integer.parseInt(st.nextToken());
                                    /*                                                      
                                                               String t=st.nextToken();
                                                               //do this so that we are sure that the token that we are going to check is the last token
                                                               while(st.hasMoreTokens()) {
                                                                  t=st.nextToken();
                                                               }
                                    */
                                    currScreen = UsbongConstants.MULTIPLE_RADIO_BUTTONS_SCREEN;

                                    radioButtonsContainer.removeAllElements();
                                    while (!parser.getName().equals("transition")) {
                                        radioButtonsContainer.addElement(parser.getAttributeValue(0).toString());

                                        //do two nextTag()'s, because <task> has a closing tag
                                        parser.nextTag();
                                        parser.nextTag();
                                    }
                                    parseYesNoAnswers(parser);
                                }
                                if (myStringToken.equals("radioButtonsWithAnswer")) {
                                    //<task-node name="radioButtonsWithAnswer~You see your teacher approaching you. What do you do?Answer=0">
                                    //   <task name="Greet him."></task>
                                    //   <task name="Run away."></task>
                                    //   <task name="Ignore him."></task>
                                    //   <transition to="textDisplay~Hello!" name="Yes"></transition>
                                    //   <transition to="textDisplay~You feel sad that you didn't greet him." name="No"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to task tag
                                    //radioButtons by definition requires only 1 ticked button in the group
                                    currScreen = UsbongConstants.MULTIPLE_RADIO_BUTTONS_WITH_ANSWER_SCREEN;

                                    radioButtonsContainer.removeAllElements();
                                    while (!parser.getName().equals("transition")) {
                                        radioButtonsContainer.addElement(parser.getAttributeValue(0).toString());

                                        //do two nextTag()'s, because <task> has a closing tag
                                        parser.nextTag();
                                        parser.nextTag();
                                    }
                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("link")) {
                                    //<task-node name="link~1~What will you do?">
                                    //   <task name="textDisplay~You ate the fruit.~I will eat the fruit."></task>
                                    //   <task name="textDisplay~You looked for another solution.~I will look for another solution"></task>
                                    //   <transition to="textDisplay~You ate the fruit.~I will eat the fruit." name="Any"></transition>
                                    //</task-node>
                                    //the transition is the default
                                    parser.nextTag(); //go to task tag

                                    //radioButtons by definition requires only 1 ticked button in the group
                                    //requiredTotalCheckedBoxes = Integer.parseInt(st.nextToken());
                                    /*                                                      
                                                               String t=st.nextToken();
                                                               //do this so that we are sure that the token that we are going to check is the last token
                                                               while(st.hasMoreTokens()) {
                                                                  t=st.nextToken();
                                                               }
                                    */
                                    currScreen = UsbongConstants.LINK_SCREEN;

                                    radioButtonsContainer.removeAllElements();
                                    while (!parser.getName().equals("transition")) {
                                        radioButtonsContainer.addElement(parser.getAttributeValue(0).toString());
                                        Log.d(">>>>>parser.getAttributeValue(0).toString()",
                                                parser.getAttributeValue(0).toString());
                                        //do two nextTag()'s, because <task> has a closing tag
                                        parser.nextTag();
                                        parser.nextTag();
                                    }
                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("checkList")) {
                                    //<task-node name="checkList~2~Check for SEVERE DEHYDRATION. Has at least two (2) of the following signs:">
                                    //   <task name="Is lethargic or unconscious."></task>
                                    //   <task name="Has sunken eyes."></task>
                                    //   <task name="Is not able to drink or is drinking poorly."></task>
                                    //   <task name="Skin pinch goes back VERY slowly (longer than 2 seconds)."></task>
                                    //   <transition to="SEVERE DEHYDRATION" name="Yes"></transition>
                                    //   <transition to="checkList-Check for SOME DEHYDRATION. Has at least two (2) of the following signs:" name="No"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to task tag
                                    requiredTotalCheckedBoxes = Integer.parseInt(st.nextToken());
                                    /*                                                      
                                                               String t=st.nextToken();
                                                               //do this so that we are sure that the token that we are going to check is the last token
                                                               while(st.hasMoreTokens()) {
                                                                  t=st.nextToken();
                                                               }
                                    */
                                    /*                           
                                                               //added by Mike, Aug. 20, 2010; st.nextToken()
                                                               if (t.equals(GENERAL_DANGER_SIGNS_CHECKBOX_QUESTION)) { //Does the question pertain to general danger signs?
                                                                  isAGeneralDangerSignsCheckBox=true;
                                                               }
                                                               //added by Mike, Sept. 17, 2010
                                                               else if (t.equals(SOME_DEHYDRATION_CHECKBOX_QUESTION)) {
                                                                  isSomeDehydrationCheckBox=true;
                                                               }
                                                               else if (t.equals(SEVERE_DEHYDRATION_CHECKBOX_QUESTION)) {
                                                                  isSevereDehydrationCheckBox=true;
                                                               }
                                    */
                                    currScreen = UsbongConstants.MULTIPLE_CHECKBOXES_SCREEN;

                                    checkBoxesContainer.removeAllElements();
                                    while (!parser.getName().equals("transition")) {
                                        checkBoxesContainer.addElement(parser.getAttributeValue(0).toString());

                                        //do two nextTag()'s, because <task> has a closing tag
                                        parser.nextTag();
                                        parser.nextTag();
                                    }
                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("sendToWebServer")) {
                                    currScreen = UsbongConstants.SEND_TO_WEBSERVER_SCREEN;
                                    parser.nextTag(); //go to the next tag
                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("sendToCloudBasedService")) {
                                    currScreen = UsbongConstants.SEND_TO_CLOUD_BASED_SERVICE_SCREEN;
                                    parser.nextTag(); //go to the next tag
                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("dcatSummary")) {
                                    currScreen = UsbongConstants.DCAT_SUMMARY_SCREEN;
                                    parser.nextTag(); //go to the next tag
                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("qrCodeReader")) {
                                    //<task-node name="qrCodeReader~Scan Patient's QR Code ID?">
                                    //  <transition to="textField~Family Name:" name="Any"></transition>
                                    //</task-node>
                                    currScreen = UsbongConstants.QR_CODE_READER_SCREEN;
                                    parser.nextTag(); //go to the next tag
                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textField")) {
                                    //<task-node name="textField~For how many days?">
                                    //  <transition to="Does the child have wheezing? (child must be calm)" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXTFIELD_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textFieldWithAnswer")) {
                                    //<task-node name="textFieldWithAnswer~Who is the founder of Usbong (nickname)?Answer=Mike">
                                    //  <transition to="textDisplay~Correct!" name="Yes"></transition>
                                    //  <transition to="textDisplay~Incorrect!" name="No"></transition>      
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXTFIELD_WITH_ANSWER_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textFieldWithUnit")) {
                                    //<task-node name="textFieldWithUnit~Days~For how many days?">
                                    //  <transition to="Does the child have wheezing? (child must be calm)" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    textFieldUnit = st.nextToken();
                                    currScreen = UsbongConstants.TEXTFIELD_WITH_UNIT_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textFieldNumerical")) {
                                    //<task-node name="textFieldNumerical~PatientID">
                                    //  <transition to="Does the child have wheezing? (child must be calm)" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXTFIELD_NUMERICAL_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textArea")) {
                                    //<task-node name="textArea~Comments">
                                    //  <transition to="Does the child have wheezing? (child must be calm)" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXTAREA_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textAreaWithAnswer")) {
                                    //<task-node name="textAreaWithAnswer~Who is the founder of Usbong (nickname)?Answer=Mike">
                                    //  <transition to="textDisplay~Correct!" name="Yes"></transition>
                                    //  <transition to="textDisplay~Incorrect!" name="No"></transition>      
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXTAREA_WITH_ANSWER_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("date")) { //special?
                                    //<task-node name="date~Birthday">
                                    //  <transition to="textField~Address" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.DATE_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("timestampDisplay")) { //special?
                                    //<task-node name="timestampDisplay~Timecheck">
                                    //  <transition to="textDisplay~Comments" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TIMESTAMP_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if ((myStringToken.equals("special"))
                                        || (myStringToken.equals("textDisplay"))) { //special?
                                    //<task-node name="special~Give a trial of rapid acting inhaled bronchodilator for up to 3 times 15-20 minutes apart. Count the breaths and look for chest indrawing again, and then classify.">
                                    //  <transition to="Does the child have wheezing? (child must be calm)" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXT_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if ((myStringToken.equals("specialImage"))
                                        || (myStringToken.equals("imageDisplay"))) { //special?
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.IMAGE_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("clickableImageDisplay")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.CLICKABLE_IMAGE_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textImageDisplay")) { //special?
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXT_IMAGE_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("imageTextDisplay")) { //special?
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.IMAGE_TEXT_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("textClickableImageDisplay")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.TEXT_CLICKABLE_IMAGE_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("clickableImageTextDisplay")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.CLICKABLE_IMAGE_TEXT_DISPLAY_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("videoFromFile")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.VIDEO_FROM_FILE_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("videoFromFileWithText")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.VIDEO_FROM_FILE_WITH_TEXT_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("gps")) { //special?
                                    //<task-node name="gps~My Location">
                                    //  <transition to="Does the child have wheezing? (child must be calm)" name="Any"></transition>
                                    //</task-node>
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.GPS_LOCATION_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("photoCapture")) {

                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.PHOTO_CAPTURE_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("audioRecord")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.AUDIO_RECORD_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("paint")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.PAINT_SCREEN;

                                    parseYesNoAnswers(parser);
                                } else if (myStringToken.equals("simpleEncrypt")) {
                                    parser.nextTag(); //go to transition tag
                                    currScreen = UsbongConstants.SIMPLE_ENCRYPT_SCREEN;

                                    parseYesNoAnswers(parser);
                                }
                            }
                        } /*
                          else { //this is a currIMCICaseList number
                          usbongNodeContainerCounter++;
                          currUsbongNode=(String)usbongNodeContainer.elementAt(usbongNodeContainerCounter);
                          continue;
                          }*/
                        break;
                    }
                    //TODO dosage guide/table
                    //It would be great if someone adds the above TODO as well.
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*      
              if ((!usedBackButton) && (!hasReturnedFromAnotherActivity)){
                 usbongNodeContainer.addElement(currUsbongNode);
                 usbongNodeContainerCounter++;
              }
              else {
                 usedBackButton=false;
                 hasReturnedFromAnotherActivity=false;
              }
        */
        initUsbongScreen();
    }

    public void initUsbongScreen() {
        myUsbongScreenProcessor.init();
        //added by Mike, 20160417
        if (UsbongUtils.IS_IN_AUTO_NARRATE_MODE) {
            processSpeak(new StringBuffer());
        }
        processPlayBGMusic(); //added by Mike, 25 Sept. 2015
    }

    public void initBackNextButtons() {
        initBackButton();
        initNextButton();
    }

    public void initBackButton() {
        backButton = (Button) findViewById(R.id.back_button);
        backButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                processBackButtonPressed();
            }
        });
    }

    public void processBackButtonPressed() {
        if (mTts.isSpeaking()) {
            mTts.stop();
        }
        //added by Mike, 21 July 2015
        if (myMediaPlayer.isPlaying()) {
            myMediaPlayer.stop();
        }

        usedBackButton = true;

        decisionTrackerContainer.addElement("B;");

        if (!usbongAnswerContainer.isEmpty()) {
            /*               
                           currAnswer = usbongAnswerContainer.lastElement();
                           usbongAnswerContainer.removeElementAt(usbongAnswerContainer.size()-1);               
            */
            usbongAnswerContainerCounter--;

            if (usbongAnswerContainerCounter < 0) {
                usbongAnswerContainerCounter = 0;
            }

            currAnswer = usbongAnswerContainer.elementAt(usbongAnswerContainerCounter);
        }

        if (!usbongNodeContainer.isEmpty()) {
            usbongNodeContainer.removeElementAt(usbongNodeContainerCounter);
            usbongNodeContainerCounter--;
        }

        if (usbongNodeContainerCounter >= 0) {
            currUsbongNode = (String) usbongNodeContainer.elementAt(usbongNodeContainerCounter);
        } else {
            processReturnToTitleScreenActivity();
            /*                   initParser();
               return;
            */
        }
        initParser();
    }

    public void initNextButton() {
        nextButton = (Button) findViewById(R.id.next_button);
        nextButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                processNextButtonPressed();
            }
        });
    }

    public void processNextButtonPressed() {
        wasNextButtonPressed = true;
        hasUpdatedDecisionTrackerContainer = false;

        //edited by Mike, 20160417
        if ((mTts != null) && (mTts.isSpeaking())) {
            mTts.stop();
        }
        //edited by Mike, 20160417
        if ((myMediaPlayer != null) && (myMediaPlayer.isPlaying())) {
            myMediaPlayer.stop();
        }

        if (currAudioRecorder != null) {
            try {
                //if stop button is pressable
                if (stopButton.isEnabled()) {
                    currAudioRecorder.stop();
                }
                if (currAudioRecorder.isPlaying()) {
                    currAudioRecorder.stopPlayback();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            String path = currAudioRecorder.getPath();
            //               System.out.println(">>>>>>>>>>>>>>>>>>>currAudioRecorder: "+currAudioRecorder);
            if (!attachmentFilePaths.contains(path)) {
                attachmentFilePaths.add(path);
                //                  System.out.println(">>>>>>>>>>>>>>>>adding path: "+path);
            }
        }

        //END_STATE_SCREEN = last screen
        if (currScreen == UsbongConstants.END_STATE_SCREEN) {
            int usbongAnswerContainerSize = usbongAnswerContainer.size();
            StringBuffer outputStringBuffer = new StringBuffer();
            for (int i = 0; i < usbongAnswerContainerSize; i++) {
                outputStringBuffer.append(usbongAnswerContainer.elementAt(i));
            }

            myOutputDirectory = UsbongUtils.getDateTimeStamp() + "/";
            if (UsbongUtils.STORE_OUTPUT) {
                try {
                    UsbongUtils.createNewOutputFolderStructure();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                UsbongUtils.storeOutputInSDCard(
                        UsbongUtils.BASE_FILE_PATH + myOutputDirectory + UsbongUtils.getDateTimeStamp() + ".csv",
                        outputStringBuffer.toString());
            } else {
                UsbongUtils.deleteRecursive(new File(UsbongUtils.BASE_FILE_PATH + myOutputDirectory));
            }

            //wasNextButtonPressed=false; //no need to make this true, because this is the last node
            hasUpdatedDecisionTrackerContainer = true;

            /*
            //send to server
            UsbongUtils.performFileUpload(UsbongUtils.BASE_FILE_PATH + myOutputDirectory + UsbongUtils.getTimeStamp() + ".csv");
                 
            //send to email
            Intent emailIntent = UsbongUtils.performEmailProcess(UsbongUtils.BASE_FILE_PATH + myOutputDirectory + UsbongUtils.getTimeStamp() + ".csv", attachmentFilePaths);
            emailIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            //                emailIntent.addFlags(RESULT_OK);
            startActivityForResult(Intent.createChooser(emailIntent, "Email:"),EMAIL_SENDING_SUCCESS);
            */

            //added by Mike, Sept. 10, 2014
            UsbongUtils.clearTempFolder();

            //added by Mike, 20160415
            if (UsbongUtils.IS_IN_AUTO_LOOP_MODE) {
                //added by Mike, 20161118
                AppRater.showRateDialog(this);

                isAutoLoopedTree = true;
                initParser(myTree);
                return;
            } else {
                //return to main activity
                finish();
                //added by Mike, 20161118
                Intent toUsbongMainActivityIntent = new Intent(UsbongDecisionTreeEngineActivity.this,
                        UsbongMainActivity.class);
                toUsbongMainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                toUsbongMainActivityIntent.putExtra("completed_tree", "true");
                startActivity(toUsbongMainActivityIntent);
            }
        } else {
            if (currScreen == UsbongConstants.YES_NO_DECISION_SCREEN) {
                RadioButton myYesRadioButton = (RadioButton) findViewById(R.id.yes_radiobutton);
                RadioButton myNoRadioButton = (RadioButton) findViewById(R.id.no_radiobutton);

                if (myYesRadioButton.isChecked()) {
                    currUsbongNode = nextUsbongNodeIfYes;

                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "Y;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                } else if (myNoRadioButton.isChecked()) {
                    currUsbongNode = nextUsbongNodeIfNo;
                    //                     usbongAnswerContainer.addElement("N;");                                             
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "N;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                } else { //if no radio button was checked                       
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                }
            } else if (currScreen == UsbongConstants.SEND_TO_WEBSERVER_SCREEN) {
                RadioButton myYesRadioButton = (RadioButton) findViewById(R.id.yes_radiobutton);
                RadioButton myNoRadioButton = (RadioButton) findViewById(R.id.no_radiobutton);

                if (myYesRadioButton.isChecked()) {
                    currUsbongNode = nextUsbongNodeIfYes;
                    //                     usbongAnswerContainer.addElement("Y;");         
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "Y;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    decisionTrackerContainer.addElement(usbongAnswerContainer.lastElement());
                    //                     wasNextButtonPressed=false; //no need to make this true, because "Y;" has already been added to decisionTrackerContainer
                    hasUpdatedDecisionTrackerContainer = true;

                    //edited by Mike, March 4, 2013
                    //"save" the output into the SDCard as "output.txt"
                    //                      int usbongAnswerContainerSize = usbongAnswerContainer.size();
                    int usbongAnswerContainerSize = usbongAnswerContainerCounter;

                    StringBuffer outputStringBuffer = new StringBuffer();
                    for (int i = 0; i < usbongAnswerContainerSize; i++) {
                        outputStringBuffer.append(usbongAnswerContainer.elementAt(i));
                    }

                    myOutputDirectory = UsbongUtils.getDateTimeStamp() + "/";
                    try {
                        UsbongUtils.createNewOutputFolderStructure();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    UsbongUtils.storeOutputInSDCard(UsbongUtils.BASE_FILE_PATH + myOutputDirectory
                            + UsbongUtils.getDateTimeStamp() + ".csv", outputStringBuffer.toString());

                    //send to server
                    UsbongUtils.performFileUpload(UsbongUtils.BASE_FILE_PATH + myOutputDirectory
                            + UsbongUtils.getDateTimeStamp() + ".csv");
                } else if (myNoRadioButton.isChecked()) {
                    currUsbongNode = nextUsbongNodeIfNo;
                    //                     usbongAnswerContainer.addElement("N;");                                             
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "N;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;
                } else { //if no radio button was checked                       
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    //                       else {
                    currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;
                    //                      initParser();            
                }
                initParser();
            } else if (currScreen == UsbongConstants.SEND_TO_CLOUD_BASED_SERVICE_SCREEN) {
                RadioButton myYesRadioButton = (RadioButton) findViewById(R.id.yes_radiobutton);
                RadioButton myNoRadioButton = (RadioButton) findViewById(R.id.no_radiobutton);

                if (myYesRadioButton.isChecked()) {
                    currUsbongNode = nextUsbongNodeIfYes;
                    //                     usbongAnswerContainer.addElement("Y;");                                             
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "Y;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    decisionTrackerContainer.addElement(usbongAnswerContainer.lastElement());
                    //                     wasNextButtonPressed=false; //no need to make this true, because "Y;" has already been added to decisionTrackerContainer
                    hasUpdatedDecisionTrackerContainer = true;

                    StringBuffer sb = new StringBuffer();
                    for (int i = 0; i < decisionTrackerContainer.size(); i++) {
                        sb.append(decisionTrackerContainer.elementAt(i));
                    }
                    Log.d(">>>>>>>>>>>>>decisionTrackerContainer", sb.toString());

                    //edited by Mike, March 4, 2013
                    //"save" the output into the SDCard as "output.txt"
                    //                      int usbongAnswerContainerSize = usbongAnswerContainer.size();
                    int usbongAnswerContainerSize = usbongAnswerContainerCounter;

                    StringBuffer outputStringBuffer = new StringBuffer();
                    for (int i = 0; i < usbongAnswerContainerSize; i++) {
                        outputStringBuffer.append(usbongAnswerContainer.elementAt(i));
                    }

                    myOutputDirectory = UsbongUtils.getDateTimeStamp() + "/";
                    try {
                        UsbongUtils.createNewOutputFolderStructure();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    UsbongUtils.storeOutputInSDCard(UsbongUtils.BASE_FILE_PATH + myOutputDirectory
                            + UsbongUtils.getDateTimeStamp() + ".csv", outputStringBuffer.toString());

                    //send to cloud-based service
                    Intent sendToCloudBasedServiceIntent = UsbongUtils
                            .performSendToCloudBasedServiceProcess(UsbongUtils.BASE_FILE_PATH + myOutputDirectory
                                    + UsbongUtils.getDateTimeStamp() + ".csv", attachmentFilePaths);
                    /*emailIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    */
                    //                      emailIntent.addFlags(RESULT_OK);
                    //                      startActivityForResult(Intent.createChooser(emailIntent, "Email:"),EMAIL_SENDING_SUCCESS);
                    //answer from Llango J, stackoverflow
                    //Reference: http://stackoverflow.com/questions/7479883/problem-with-sending-email-goes-back-to-previous-activity;
                    //last accessed: 22 Oct. 2012
                    startActivity(
                            Intent.createChooser(sendToCloudBasedServiceIntent, "Send to Cloud-based Service:"));
                } else if (myNoRadioButton.isChecked()) {
                    currUsbongNode = nextUsbongNodeIfNo;
                    //                     usbongAnswerContainer.addElement("N;");                                             
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "N;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;
                } else { //if no radio button was checked                       
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    //                       else {
                    currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;
                    //                      initParser();            

                    /*
                                           if (!isAnOptionalNode) {
                      showRequiredFieldAlert(PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE);
                     wasNextButtonPressed=false;
                     hasUpdatedDecisionTrackerContainer=true;
                         
                     return;
                                           }
                                           else {
                     currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    //                        usbongAnswerContainer.addElement("A;");                                             
                     UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;
                        
                    initParser();            
                                           }
                    */
                }
                /*                    
                                  currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                                  usbongAnswerContainer.addElement("Any;");                                             
                */
                initParser();
            } else if (currScreen == UsbongConstants.MULTIPLE_CHECKBOXES_SCREEN) {
                //                   requiredTotalCheckedBoxes   
                LinearLayout myMultipleCheckboxesLinearLayout = (LinearLayout) findViewById(
                        R.id.multiple_checkboxes_linearlayout);
                StringBuffer sb = new StringBuffer();
                int totalCheckedBoxes = 0;
                int totalCheckBoxChildren = myMultipleCheckboxesLinearLayout.getChildCount();
                //begin with i=1, because i=0 is for checkboxes_textview
                for (int i = 1; i < totalCheckBoxChildren; i++) {
                    if (((CheckBox) myMultipleCheckboxesLinearLayout.getChildAt(i)).isChecked()) {
                        totalCheckedBoxes++;
                        sb.append("," + (i - 1)); //do a (i-1) so that i starts with 0 for the checkboxes (excluding checkboxes_textview) to maintain consistency with the other components
                    }
                }

                if (totalCheckedBoxes >= requiredTotalCheckedBoxes) {
                    currUsbongNode = nextUsbongNodeIfYes;
                    sb.insert(0, "Y"); //insert in front of stringBuffer
                    sb.append(";");
                } else {
                    currUsbongNode = nextUsbongNodeIfNo;
                    sb.delete(0, sb.length());
                    sb.append("N,;"); //make sure to add the comma
                }
                //                   usbongAnswerContainer.addElement(sb.toString());
                UsbongUtils.addElementToContainer(usbongAnswerContainer, sb.toString(),
                        usbongAnswerContainerCounter);
                usbongAnswerContainerCounter++;

                initParser();
            } else if (currScreen == UsbongConstants.MULTIPLE_RADIO_BUTTONS_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                RadioGroup myRadioGroup = (RadioGroup) findViewById(R.id.multiple_radio_buttons_radiogroup);

                //                   if (UsbongUtils.IS_IN_DEBUG_MODE==false) {
                if (myRadioGroup.getCheckedRadioButtonId() == -1) { //no radio button checked
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    //                          else {
                    currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                    //                          }
                } else {
                    //                         usbongAnswerContainer.addElement(myRadioGroup.getCheckedRadioButtonId()+";");
                    UsbongUtils.addElementToContainer(usbongAnswerContainer,
                            myRadioGroup.getCheckedRadioButtonId() + ";", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                }
                //                   }
                /*                   
                                   else {
                //                      usbongAnswerContainer.addElement(myRadioGroup.getCheckedRadioButtonId()+";");
                  UsbongUtils.addElementToContainer(usbongAnswerContainer, myRadioGroup.getCheckedRadioButtonId()+";", usbongAnswerContainerCounter);
                 usbongAnswerContainerCounter++;
                      
                  initParser();                      
                                   }
                */
            } else if (currScreen == UsbongConstants.MULTIPLE_RADIO_BUTTONS_WITH_ANSWER_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                RadioGroup myRadioGroup = (RadioGroup) findViewById(R.id.multiple_radio_buttons_radiogroup);

                /*                   if (UsbongUtils.IS_IN_DEBUG_MODE==false) {
                 */
                if (myRadioGroup.getCheckedRadioButtonId() == -1) { //no radio button checked                                                  
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    //                          else {
                    currUsbongNode = nextUsbongNodeIfYes; //choose Yes if "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer,
                            "A," + myRadioGroup.getCheckedRadioButtonId() + ";", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                    //                          }
                } else {
                    if (myMultipleRadioButtonsWithAnswerScreenAnswer
                            .equals("" + myRadioGroup.getCheckedRadioButtonId())) {
                        currUsbongNode = nextUsbongNodeIfYes;
                        UsbongUtils.addElementToContainer(usbongAnswerContainer,
                                "Y," + myRadioGroup.getCheckedRadioButtonId() + ";", usbongAnswerContainerCounter);
                    } else {
                        currUsbongNode = nextUsbongNodeIfNo;
                        UsbongUtils.addElementToContainer(usbongAnswerContainer,
                                "N," + myRadioGroup.getCheckedRadioButtonId() + ";", usbongAnswerContainerCounter);
                    }

                    usbongAnswerContainerCounter++;
                    initParser();
                }
            } else if (currScreen == UsbongConstants.LINK_SCREEN) {
                RadioGroup myRadioGroup = (RadioGroup) findViewById(R.id.multiple_radio_buttons_radiogroup);

                try {
                    currUsbongNode = UsbongUtils.getLinkFromRadioButton(
                            radioButtonsContainer.elementAt(myRadioGroup.getCheckedRadioButtonId()));
                } catch (Exception e) {
                    //if the user hasn't ticked any radio button yet
                    //put the currUsbongNode to default
                    //                currUsbongNode = UsbongUtils.getLinkFromRadioButton(nextUsbongNodeIfYes); //nextUsbongNodeIfNo will also do, since this is "Any"
                    //of course, showPleaseAnswerAlert() will be called                        
                    //edited by Mike, 20160613
                    //don't change the currUsbongNode anymore if no radio button has been ticked                
                }

                //                   Log.d(">>>>>>>>>>currUsbongNode",currUsbongNode);
                if (myRadioGroup.getCheckedRadioButtonId() == -1) { //no radio button checked
                    //                         if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                    if (!isAnOptionalNode) {
                        showRequiredFieldAlert(PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE);
                        wasNextButtonPressed = false;
                        hasUpdatedDecisionTrackerContainer = true;

                        return;
                    }
                    //                         }
                    //                          else {
                    currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                    //                          }
                } else {
                    //                         usbongAnswerContainer.addElement(myRadioGroup.getCheckedRadioButtonId()+";");
                    UsbongUtils.addElementToContainer(usbongAnswerContainer,
                            myRadioGroup.getCheckedRadioButtonId() + ";", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                }
                /*                   }
                                   else {
                  usbongAnswerContainer.addElement(myRadioGroup.getCheckedRadioButtonId()+";");
                   initParser();                      
                                   }
                */
            } else if ((currScreen == UsbongConstants.TEXTFIELD_SCREEN)
                    || (currScreen == UsbongConstants.TEXTFIELD_WITH_UNIT_SCREEN)
                    || (currScreen == UsbongConstants.TEXTFIELD_NUMERICAL_SCREEN)) {
                currUsbongNode = nextUsbongNodeIfYes; //= nextIMCIQuestionIfNo will also do
                EditText myTextFieldScreenEditText = (EditText) findViewById(R.id.textfield_edittext);

                //                    if (UsbongUtils.IS_IN_DEBUG_MODE==false) {
                //if it's blank
                if (myTextFieldScreenEditText.getText().toString().trim().equals("")) {
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_ANSWER_FIELD_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    //                          else {
                    currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    //                           usbongAnswerContainer.addElement("A;");                                             
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A,;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                    //                          }
                } else {
                    //                        usbongAnswerContainer.addElement("A,"+myTextFieldScreenEditText.getText()+";");                     
                    UsbongUtils.addElementToContainer(usbongAnswerContainer,
                            "A," + myTextFieldScreenEditText.getText() + ";", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                }
            } else if (currScreen == UsbongConstants.TEXTFIELD_WITH_ANSWER_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes;
                EditText myTextFieldScreenEditText = (EditText) findViewById(R.id.textfield_edittext);
                //if it's blank
                if (myTextFieldScreenEditText.getText().toString().trim().equals("")) {
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_ANSWER_FIELD_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    currUsbongNode = nextUsbongNodeIfYes; //choose Yes if "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer,
                            "A," + myTextFieldScreenEditText.getText().toString().trim() + ";",
                            usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                } else {
                    //added by Mike, Jan. 27, 2014
                    Vector<String> myPossibleAnswers = new Vector<String>();
                    StringTokenizer myPossibleAnswersStringTokenizer = new StringTokenizer(
                            myTextFieldWithAnswerScreenAnswer, "||");
                    if (myPossibleAnswersStringTokenizer != null) {
                        while (myPossibleAnswersStringTokenizer.hasMoreTokens()) { //get last element (i.e. Mike in "textFieldWithAnswer~Who is the founder of Usbong (nickname)?Answer=Mike")
                            myPossibleAnswers.add(myPossibleAnswersStringTokenizer.nextToken());
                        }
                    }
                    int size = myPossibleAnswers.size();
                    for (int i = 0; i < size; i++) {
                        if (myPossibleAnswers.elementAt(i)
                                .equals(myTextFieldScreenEditText.getText().toString().trim())) {
                            currUsbongNode = nextUsbongNodeIfYes;
                            UsbongUtils.addElementToContainer(usbongAnswerContainer,
                                    "Y," + myTextFieldScreenEditText.getText().toString().trim() + ";",
                                    usbongAnswerContainerCounter);
                            break;
                        }

                        if (i == size - 1) { //if this is the last element in the vector
                            currUsbongNode = nextUsbongNodeIfNo;
                            UsbongUtils.addElementToContainer(usbongAnswerContainer,
                                    "N," + myTextFieldScreenEditText.getText().toString().trim() + ";",
                                    usbongAnswerContainerCounter);
                        }
                    }
                    /*                        
                      if (myTextFieldWithAnswerScreenAnswer.equals(myTextFieldScreenEditText.getText().toString().trim())) {
                       currUsbongNode = nextUsbongNodeIfYes;    
                        UsbongUtils.addElementToContainer(usbongAnswerContainer, "Y,"+myTextFieldScreenEditText.getText().toString().trim()+";", usbongAnswerContainerCounter);
                      }
                      else {
                       currUsbongNode = nextUsbongNodeIfNo;                                               
                        UsbongUtils.addElementToContainer(usbongAnswerContainer, "N,"+myTextFieldScreenEditText.getText().toString().trim()+";", usbongAnswerContainerCounter);
                      }                    
                    */
                    usbongAnswerContainerCounter++;
                    initParser();
                }
            } else if ((currScreen == UsbongConstants.TEXTAREA_SCREEN)) {
                currUsbongNode = nextUsbongNodeIfYes; //= nextIMCIQuestionIfNo will also do
                EditText myTextAreaScreenEditText = (EditText) findViewById(R.id.textarea_edittext);

                //                    if (UsbongUtils.IS_IN_DEBUG_MODE==false) {
                //if it's blank
                if (myTextAreaScreenEditText.getText().toString().trim().equals("")) {
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_ANSWER_FIELD_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    //                          else {
                    currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A,;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                    //                          }
                } else {
                    //                        usbongAnswerContainer.addElement("A,"+myTextAreaScreenEditText.getText()+";");                     
                    UsbongUtils.addElementToContainer(usbongAnswerContainer,
                            "A," + myTextAreaScreenEditText.getText() + ";", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                }
            } else if (currScreen == UsbongConstants.TEXTAREA_WITH_ANSWER_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes;
                EditText myTextAreaScreenEditText = (EditText) findViewById(R.id.textarea_edittext);
                //if it's blank
                if (myTextAreaScreenEditText.getText().toString().trim().equals("")) {
                    if (!UsbongUtils.IS_IN_DEBUG_MODE) {
                        if (!isAnOptionalNode) {
                            showRequiredFieldAlert(PLEASE_ANSWER_FIELD_ALERT_TYPE);
                            wasNextButtonPressed = false;
                            hasUpdatedDecisionTrackerContainer = true;
                            return;
                        }
                    }
                    currUsbongNode = nextUsbongNodeIfYes; //choose Yes if "Any"
                    UsbongUtils.addElementToContainer(usbongAnswerContainer,
                            "A," + myTextAreaScreenEditText.getText().toString().trim() + ";",
                            usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    initParser();
                } else {
                    /*                        
                      if (myTextAreaWithAnswerScreenAnswer.equals(myTextAreaScreenEditText.getText().toString().trim())) {
                       currUsbongNode = nextUsbongNodeIfYes;    
                        UsbongUtils.addElementToContainer(usbongAnswerContainer, "Y,"+myTextAreaScreenEditText.getText().toString().trim()+";", usbongAnswerContainerCounter);
                      }
                      else {
                       currUsbongNode = nextUsbongNodeIfNo;                                               
                        UsbongUtils.addElementToContainer(usbongAnswerContainer, "N,"+myTextAreaScreenEditText.getText().toString().trim()+";", usbongAnswerContainerCounter);
                      }                    
                    */
                    //added by Mike, Jan. 27, 2014
                    Vector<String> myPossibleAnswers = new Vector<String>();
                    StringTokenizer myPossibleAnswersStringTokenizer = new StringTokenizer(
                            myTextAreaWithAnswerScreenAnswer, "||");
                    if (myPossibleAnswersStringTokenizer != null) {
                        while (myPossibleAnswersStringTokenizer.hasMoreTokens()) { //get last element (i.e. Mike in "textAreaWithAnswer~Who is the founder of Usbong (nickname)?Answer=Mike||mike")
                            myPossibleAnswers.add(myPossibleAnswersStringTokenizer.nextToken());
                        }
                    }
                    int size = myPossibleAnswers.size();
                    for (int i = 0; i < size; i++) {
                        //                           Log.d(">>>>>>myPossibleAnswers: ",myPossibleAnswers.elementAt(i));
                        if (myPossibleAnswers.elementAt(i)
                                .equals(myTextAreaScreenEditText.getText().toString().trim())) {
                            currUsbongNode = nextUsbongNodeIfYes;
                            UsbongUtils.addElementToContainer(usbongAnswerContainer,
                                    "Y," + myTextAreaScreenEditText.getText().toString().trim() + ";",
                                    usbongAnswerContainerCounter);
                            break;
                        }

                        if (i == size - 1) { //if this is the last element in the vector
                            currUsbongNode = nextUsbongNodeIfNo;
                            UsbongUtils.addElementToContainer(usbongAnswerContainer,
                                    "N," + myTextAreaScreenEditText.getText().toString().trim() + ";",
                                    usbongAnswerContainerCounter);
                        }
                    }
                    usbongAnswerContainerCounter++;
                    initParser();
                }
            } else if (currScreen == UsbongConstants.GPS_LOCATION_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes; //= nextIMCIQuestionIfNo will also do
                TextView myLongitudeTextView = (TextView) findViewById(R.id.longitude_textview);
                TextView myLatitudeTextView = (TextView) findViewById(R.id.latitude_textview);

                //                  usbongAnswerContainer.addElement(myLongitudeTextView.getText()+","+myLatitudeTextView.getText()+";");                     
                UsbongUtils.addElementToContainer(usbongAnswerContainer,
                        "A," + myLongitudeTextView.getText() + "," + myLatitudeTextView.getText() + ";",
                        usbongAnswerContainerCounter);
                usbongAnswerContainerCounter++;

                initParser();

            } else if (currScreen == UsbongConstants.SIMPLE_ENCRYPT_SCREEN) {
                EditText myPinEditText = (EditText) findViewById(R.id.pin_edittext);

                if (myPinEditText.getText().toString().length() != 4) {
                    String message = "";
                    if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_FILIPINO) {
                        message = (String) getResources().getText(R.string.Usbong4DigitsPinAlertMessageFILIPINO);
                    } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_JAPANESE) {
                        message = (String) getResources().getText(R.string.Usbong4DigitsPinAlertMessageJAPANESE);
                    } else { //if (udtea.currLanguageBeingUsed==UsbongUtils.LANGUAGE_ENGLISH) {
                        message = (String) getResources().getText(R.string.Usbong4DigitsPinAlertMessageENGLISH);
                    }

                    new AlertDialog.Builder(UsbongDecisionTreeEngineActivity.this).setTitle("Hey!")
                            .setMessage(message).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                }
                            }).show();
                } else {
                    int yourKey = Integer.parseInt(myPinEditText.getText().toString());
                    currUsbongNode = nextUsbongNodeIfYes; //= nextIMCIQuestionIfNo will also do

                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;

                    //                  Log.d(">>>>>>>start encode","encode");
                    for (int i = 0; i < usbongAnswerContainerCounter; i++) {
                        try {
                            usbongAnswerContainer.set(i, UsbongUtils.performSimpleFileEncrypt(yourKey,
                                    usbongAnswerContainer.elementAt(i)));
                            //                        Log.d(">>>>>>"+i,""+usbongAnswerContainer.get(i));
                            //                        Log.d(">>>decoded"+i,""+UsbongUtils.performSimpleFileDecode(yourKey, usbongAnswerContainer.get(i)));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                    initParser();
                }
            } else if (currScreen == UsbongConstants.DATE_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes;
                //added by Mike, 13 Oct. 2015
                DatePicker myDatePicker = (DatePicker) findViewById(R.id.date_picker);
                UsbongUtils.addElementToContainer(usbongAnswerContainer, "A," + myDatePicker.getMonth()
                        + myDatePicker.getDayOfMonth() + "," + myDatePicker.getYear() + ";",
                        usbongAnswerContainerCounter);

                /*                   
                             Spinner dateMonthSpinner = (Spinner) findViewById(R.id.date_month_spinner);
                              Spinner dateDaySpinner = (Spinner) findViewById(R.id.date_day_spinner);
                              EditText myDateYearEditText = (EditText)findViewById(R.id.date_edittext);
                //             usbongAnswerContainer.addElement("A,"+monthAdapter.getItem(dateMonthSpinner.getSelectedItemPosition()).toString() +
                //                                      dayAdapter.getItem(dateDaySpinner.getSelectedItemPosition()).toString() + "," +
                //                                      myDateYearEditText.getText().toString()+";");                         
                             UsbongUtils.addElementToContainer(usbongAnswerContainer, "A,"+monthAdapter.getItem(dateMonthSpinner.getSelectedItemPosition()).toString() +
                                  dayAdapter.getItem(dateDaySpinner.getSelectedItemPosition()).toString() + "," +
                                  myDateYearEditText.getText().toString()+";", usbongAnswerContainerCounter);
                */
                usbongAnswerContainerCounter++;

                //             System.out.println(">>>>>>>>>>>>>Date screen: "+usbongAnswerContainer.lastElement());
                initParser();
            } else if (currScreen == UsbongConstants.TIMESTAMP_DISPLAY_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes;
                UsbongUtils.addElementToContainer(usbongAnswerContainer, timestampString + ";",
                        usbongAnswerContainerCounter);
                usbongAnswerContainerCounter++;

                initParser();
            } else if (currScreen == UsbongConstants.QR_CODE_READER_SCREEN) {
                currUsbongNode = nextUsbongNodeIfYes; //= nextIMCIQuestionIfNo will also do

                if (!myQRCodeContent.equals("")) {
                    //                      usbongAnswerContainer.addElement("Y,"+myQRCodeContent+";");                     
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "Y," + myQRCodeContent + ";",
                            usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;
                } else {
                    //                      usbongAnswerContainer.addElement("N;");                                           
                    UsbongUtils.addElementToContainer(usbongAnswerContainer, "N;", usbongAnswerContainerCounter);
                    usbongAnswerContainerCounter++;
                }
                initParser();
            } else if ((currScreen == UsbongConstants.DCAT_SUMMARY_SCREEN)) {
                currUsbongNode = nextUsbongNodeIfYes; //= nextIMCIQuestionIfNo will also do
                /*
                LinearLayout myDCATSummaryLinearLayout = (LinearLayout)findViewById(R.id.dcat_summary_linearlayout);
                int total = myDCATSummaryLinearLayout.getChildCount();
                    
                                  StringBuffer dcatSummary= new StringBuffer();
                for (int i=0; i<total; i++) {
                   dcatSummary.append(((TextView) myDCATSummaryLinearLayout.getChildAt(i)).getText().toString());
                }
                */
                //                   UsbongUtils.addElementToContainer(usbongAnswerContainer, "dcat_end;", usbongAnswerContainerCounter);
                UsbongUtils.addElementToContainer(usbongAnswerContainer,
                        "dcat_end," + myDcatSummaryStringBuffer.toString() + ";", usbongAnswerContainerCounter);
                usbongAnswerContainerCounter++;

                initParser();
            }

            else { //TODO: do this for now                
                currUsbongNode = nextUsbongNodeIfYes; //nextUsbongNodeIfNo will also do, since this is "Any"
                //                  usbongAnswerContainer.addElement("A;");                                             
                UsbongUtils.addElementToContainer(usbongAnswerContainer, "A;", usbongAnswerContainerCounter);
                usbongAnswerContainerCounter++;

                initParser();
            }
        }
    }

    public void initRecordAudioScreen() {
        String timeStamp = UsbongUtils.getDateTimeStamp();
        //        final AudioRecorder recorder = new AudioRecorder("/usbong/" + timeStamp,currUsbongNode);
        //        currAudioRecorder = recorder;        

        stopButton = (Button) findViewById(R.id.stop_button);
        stopButton.setEnabled(false);
        recordButton = (Button) findViewById(R.id.record_button);
        playButton = (Button) findViewById(R.id.play_button);
        playButton.setEnabled(false);

        /*
        if ((currAudioRecorder!=null) && (!currAudioRecorder.hasRecordedData())) {
        playButton.setEnabled(false);            
        }
        else {
           currAudioRecorder = new AudioRecorder("/usbong/" + timeStamp,currUsbongNode);
        }
        */
        currAudioRecorder = new AudioRecorder("/usbong/" + timeStamp, currUsbongNode);

        // add a click listener to the button
        recordButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                try {
                    currAudioRecorder.start();
                    stopButton.setEnabled(true);
                    recordButton.setEnabled(false);
                    playButton.setEnabled(false);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        // add a click listener to the button
        stopButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                try {
                    currAudioRecorder.stop();
                    recordButton.setEnabled(true);
                    playButton.setEnabled(true);
                    stopButton.setEnabled(false);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        // add a click listener to the button
        playButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                try {
                    currAudioRecorder.play();
                    recordButton.setEnabled(true);
                    //play.setEnabled(false);
                    stopButton.setEnabled(false);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        new AlertDialog.Builder(UsbongDecisionTreeEngineActivity.this).setTitle("Usbong Tip").setMessage(
                "Press the Record button to start recording. Press Stop to stop the recording. And press Play to hear what you've recorded!") // When you're done, hit the menu button and save your work.
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }).show();
    }

    public void initTakePhotoScreen() {
        //       myPictureName=currUsbongNode; //make the name of the picture the name of the currUsbongNode
        myPictureName = UsbongUtils.processStringToBeFilenameReady(currUsbongNode); //make the name of the picture the name of the currUsbongNode

        //      String path = "/sdcard/usbong/"+ UsbongUtils.getTimeStamp() +"/"+ myPictureName +".jpg";
        String path = UsbongUtils.BASE_FILE_PATH + UsbongUtils.getDateTimeStamp() + "/" + myPictureName + ".jpg";
        //only add path if it's not already in attachmentFilePaths
        if (!attachmentFilePaths.contains(path)) {
            attachmentFilePaths.add(path);
        }

        setContentView(R.layout.photo_capture_screen);
        myImageView = (ImageView) findViewById(R.id.CameraImage);

        File imageFile = new File(path);

        if (imageFile.exists()) {
            Bitmap myBitmap = BitmapFactory.decodeFile(path);
            if (myBitmap != null) {
                myImageView.setImageBitmap(myBitmap);
            }
            //Read more: http://www.brighthub.com/mobile/google-android/articles/64048.aspx#ixzz0yXLCazcU                     
        } else {
        }
        photoCaptureButton = (Button) findViewById(R.id.photo_capture_button);
        photoCaptureIntent = new Intent().setClass(this, CameraActivity.class);
        photoCaptureIntent.putExtra("myPictureName", myPictureName);
        photoCaptureButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(UsbongDecisionTreeEngineActivity.photoCaptureIntent);
            }
        });

    }

    public void initPaintScreen() {
        //       myPaintName=currUsbongNode; //make the name of the picture the name of the currUsbongNode
        myPaintName = UsbongUtils.processStringToBeFilenameReady(currUsbongNode); //make the name of the picture the name of the currUsbongNode

        Log.d(">>>>>>myPaintName:", myPaintName);

        //      String path = "/sdcard/usbong/"+ UsbongUtils.getTimeStamp() +"/"+ myPictureName +".jpg";
        String path = UsbongUtils.BASE_FILE_PATH + UsbongUtils.getDateTimeStamp() + "/" + myPaintName + ".jpg";

        //only add path if it's not already in attachmentFilePaths
        if (!attachmentFilePaths.contains(path)) {
            attachmentFilePaths.add(path);
        }

        setContentView(R.layout.paint_screen);
        myImageView = (ImageView) findViewById(R.id.PaintImage);

        File imageFile = new File(path);
        if (imageFile.exists()) {
            Bitmap myBitmap = BitmapFactory.decodeFile(path);
            if (myBitmap != null) {
                myImageView.setImageBitmap(myBitmap);
            }
            //Read more: http://www.brighthub.com/mobile/google-android/articles/64048.aspx#ixzz0yXLCazcU                     
        } else {
        }

        paintButton = (Button) findViewById(R.id.paint_button);
        paintIntent = new Intent().setClass(this, PaintActivity.class);
        paintIntent.putExtra("myPaintName", myPaintName);
        paintButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(UsbongDecisionTreeEngineActivity.paintIntent);
            }
        });
    }

    public void initQRCodeReaderScreen() {
        myQRCodeReaderName = currUsbongNode;
        setContentView(R.layout.qr_code_reader_screen);

        TextView qrCodeReaderResultTextView = (TextView) findViewById(R.id.qr_code_reader_result_textview);
        TextView qrCodeReaderContentTextView = (TextView) findViewById(R.id.qr_code_reader_content_textview);

        if (!myQRCodeContent.equals("")) {
            if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_FILIPINO) {
                qrCodeReaderResultTextView
                        .setText((String) getResources().getText(R.string.UsbongQRCodeReaderContentResultFILIPINO));
            } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_JAPANESE) {
                qrCodeReaderResultTextView
                        .setText((String) getResources().getText(R.string.UsbongQRCodeReaderContentResultJAPANESE));
            } else { //if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_ENGLISH) {
                qrCodeReaderResultTextView
                        .setText((String) getResources().getText(R.string.UsbongQRCodeReaderContentResultENGLISH));
            }

            //          qrCodeReaderResultTextView.setText("QR Code content successfully saved!");
            qrCodeReaderContentTextView.setText("--\n" + myQRCodeContent);
        } else {
            if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_FILIPINO) {
                qrCodeReaderResultTextView.setText(
                        (String) getResources().getText(R.string.UsbongQRCodeReaderContentResultNoneFILIPINO));
            } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_JAPANESE) {
                qrCodeReaderResultTextView.setText(
                        (String) getResources().getText(R.string.UsbongQRCodeReaderContentResultNoneJAPANESE));
            } else { //if (currLanguageBeingUsed==UsbongUtils.LANGUAGE_ENGLISH) {
                qrCodeReaderResultTextView.setText(
                        (String) getResources().getText(R.string.UsbongQRCodeReaderContentResultNoneENGLISH));
            }
            //          qrCodeReaderResultTextView.setText("No QR Code content has been saved yet!");          
        }

        qrCodeReaderButton = (Button) findViewById(R.id.qr_code_reader_button);
        qrCodeReaderIntent = new Intent().setClass(this, QRCodeReaderActivity.class);
        qrCodeReaderIntent.putExtra("myQRCodeReaderName", myQRCodeReaderName);
        qrCodeReaderButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(UsbongDecisionTreeEngineActivity.qrCodeReaderIntent);
            }
        });
    }

    public static void setQRCodeContent(String s) {
        myQRCodeContent = s;
    }

    public void decrementCurrScreen() {
        currScreen--;
        initUsbongScreen();
    }

    //this is not used at the moment (Sept 5, 2011)
    public void incrementCurrScreen() {
        currScreen++;
        initUsbongScreen();
    }

    //edited by Mike, 20160417
    private void processReturnToTitleScreenActivity() {
        String[] myPrompts = UsbongUtils.initProcessReturnToTitleScreenActivity();

        //added by Mike, Feb. 2, 2013;
        //edited by Mike, 20151120
        AlertDialog.Builder prompt = new AlertDialog.Builder(UsbongDecisionTreeEngineActivity.this);
        prompt.setTitle(myPrompts[UsbongUtils.MY_PROMPT_TITLE]);
        prompt.setMessage(myPrompts[UsbongUtils.MY_PROMPT_MESSAGE]);
        prompt.setPositiveButton(myPrompts[UsbongUtils.MY_PROMPT_POSITIVE_BUTTON_TEXT],
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        processReturnToTitleScreenActivityYes();
                    }
                });
        prompt.setNegativeButton(myPrompts[UsbongUtils.MY_PROMPT_NEGATIVE_BUTTON_TEXT],
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                });
        prompt.show();
    }

    //added by Mike, 20160616
    private void processReturnToMainMenuActivityYes() {
        processReturnToTitleScreenActivityYes();
    }

    //added by Mike, 20160417
    private void processReturnToTitleScreenActivityYes() {
        if (decisionTrackerContainer != null) {
            decisionTrackerContainer.removeAllElements();
        }

        Log.d(">>>>UsbongUtils.STORE_OUTPUT", "" + UsbongUtils.STORE_OUTPUT);
        myOutputDirectory = UsbongUtils.getDateTimeStamp() + "/";
        if (UsbongUtils.STORE_OUTPUT) {
            UsbongUtils.deleteEmptyOutputFolder(new File(UsbongUtils.BASE_FILE_PATH + myOutputDirectory));
        } else {
            UsbongUtils.deleteRecursive(new File(UsbongUtils.BASE_FILE_PATH + myOutputDirectory));
        }

        //added by Mike, Sept. 10, 2014
        UsbongUtils.clearTempFolder();

        //added by Mike, 21 July 2015
        if (myMediaPlayer != null) {
            myMediaPlayer.stop();
        }
        if (mTts != null) {
            mTts.stop();
        }
        if (myBGMediaPlayer != null) {
            myBGMediaPlayer.stop();
        } //added by Mike, 25 Sept. 2015

        //return to main activity
        finish();
        Intent toUsbongMainActivityIntent = new Intent(UsbongDecisionTreeEngineActivity.this,
                UsbongMainActivity.class);
        toUsbongMainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(toUsbongMainActivityIntent);
    }

    private class CustomDataAdapter extends ArrayAdapter<String> {
        private ArrayList<String> items;

        public CustomDataAdapter(Context context, int textViewResourceId, ArrayList<String> items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }

        @SuppressWarnings("deprecation")
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.tree_loader, null);
            }
            final String o = items.get(position);
            if (o != null) {
                TextView dataCurrentTextView = (TextView) v.findViewById(R.id.tree_item);
                //                   dataCurrentTextView.setText(o.toString());
                //edited by Mike, 20161111
                switch (o.toString()) {
                case "gamugamo":
                    dataCurrentTextView.setText("The Young Moth");
                    break;
                case "juant":
                    dataCurrentTextView.setText("Juan T.");
                    break;
                case "pagtsing":
                    dataCurrentTextView.setText("Turtle & Monkey");
                    break;
                }

                dataCurrentTextView.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        isInTreeLoader = false;
                        myTree = o.toString(); //edited by Mike, 20161110
                        UsbongUtils.clearTempFolder();

                        //added by Mike, 29 Sept. 2015
                        myProgressDialog = ProgressDialog.show(instance, "Loading...",
                                "This takes only a short while.", true, false);
                        new MyBackgroundTask().execute();
                        //                        initParser(o.toString());
                    }
                });

                //added by Mike, 20161111
                try {
                    // set the image here
                    //Reference: http://www.anddev.org/tinytut_-_get_resources_by_name__getidentifier_-t460.html; last accessed 14 Sept 2011
                    Resources myRes = instance.getResources();
                    Drawable myDrawableImage = Drawable
                            .createFromStream(myRes.getAssets().open(o.toString() + "_icon.png"), null);
                    //                     myDrawableImage = myRes.getAssets().open(o.toString()+"_icon.png").;// .getDrawable(myRes.getIdentifier(o.toString()+"_icon.png", "drawable", UsbongUtils.myPackageName));
                    ImageView image = (ImageView) v.findViewById(R.id.tree_item_image_view);
                    image.setImageDrawable(myDrawableImage);

                    image.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            isInTreeLoader = false;
                            myTree = o.toString(); //edited by Mike, 20161110
                            UsbongUtils.clearTempFolder();

                            //added by Mike, 29 Sept. 2015
                            myProgressDialog = ProgressDialog.show(instance, "Loading...",
                                    "This takes only a short while.", true, false);
                            new MyBackgroundTask().execute();
                            //                            initParser(o.toString());
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }

                /*                   
                                  try {
                File f = new File(UsbongUtils.USBONG_TREES_FILE_PATH+o.toString()+".jpg");
                 if (!f.exists()) {
                    f = new File(UsbongUtils.USBONG_TREES_FILE_PATH+o.toString()+".png");
                 }
                  ImageView image = (ImageView) v.findViewById(R.id.tree_item_image_view);
                Bitmap bmp = BitmapFactory.decodeFile(f.getAbsolutePath());
                image.setImageBitmap(bmp);                        
                                  }
                                  catch (Exception e) { 
                 e.printStackTrace();
                                  }
                */
                /*                   
                                   Button selectButton = (Button)v.findViewById(R.id.select_tree_button);
                                   selectButton.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
                    myTree = o.toString();
                      initParser();
                 }
                                   });
                */
            }
            return v;
        }
    }

    public void showRequiredFieldAlert(int type) {
        String requiredFieldAlertString = "";
        String alertString = "";

        switch (type) {
        case PLEASE_CHOOSE_AN_ANSWER_ALERT_TYPE:
            if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_FILIPINO) {
                requiredFieldAlertString = (String) getResources()
                        .getText(R.string.pleaseChooseAnAnswerStringValueFilipino);
            } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_JAPANESE) {
                requiredFieldAlertString = (String) getResources()
                        .getText(R.string.pleaseChooseAnAnswerStringValueJapanese);
            } else {
                requiredFieldAlertString = (String) getResources()
                        .getText(R.string.pleaseChooseAnAnswerStringValue);
            }
            break;
        case PLEASE_ANSWER_FIELD_ALERT_TYPE:
            if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_FILIPINO) {
                requiredFieldAlertString = (String) getResources()
                        .getText(R.string.pleaseAnswerFieldStringValueFilipino);
            } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_JAPANESE) {
                requiredFieldAlertString = (String) getResources()
                        .getText(R.string.pleaseAnswerFieldStringValueJapanese);
            } else {
                requiredFieldAlertString = (String) getResources().getText(R.string.pleaseAnswerFieldStringValue);
            }
            break;
        }
        requiredFieldAlertString = "{big}" + requiredFieldAlertString + "{/big}";

        if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_FILIPINO) {
            alertString = (String) getResources().getText(R.string.alertStringValueFilipino);
        } else if (currLanguageBeingUsed == UsbongUtils.LANGUAGE_JAPANESE) {
            alertString = (String) getResources().getText(R.string.alertStringValueJapanese);
        } else {
            alertString = (String) getResources().getText(R.string.alertStringValueEnglish);
        }

        TextView requiredFieldAlertStringTextView = (TextView) UsbongUtils.applyTagsInView(
                UsbongDecisionTreeEngineActivity.getInstance(),
                new TextView(UsbongDecisionTreeEngineActivity.getInstance()), UsbongUtils.IS_TEXTVIEW,
                requiredFieldAlertString);
        TextView alertStringTextView = (TextView) UsbongUtils.applyTagsInView(
                UsbongDecisionTreeEngineActivity.getInstance(),
                new TextView(UsbongDecisionTreeEngineActivity.getInstance()), UsbongUtils.IS_TEXTVIEW, alertString);

        new AlertDialog.Builder(UsbongDecisionTreeEngineActivity.this)
                .setTitle(alertStringTextView.getText().toString())
                //      .setMessage(requiredFieldAlertStringTextView.toString())
                .setView(requiredFieldAlertStringTextView)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }).show();
    }

    public String getVariableFromMyUsbongVariableMemory(String key) {
        if (myUsbongVariableMemory.containsKey(key)) {
            return myUsbongVariableMemory.get(key);
        }
        return "variable_not_found";
    }

    public void setVariableOntoMyUsbongVariableMemory(String varName, String varValue) {
        //      if (!myUsbongVariableMemory.containsKey(varName)) {
        myUsbongVariableMemory.put(varName, varValue);
        //      }
    }
}