com.example.sensingapp.SensingApp.java Source code

Java tutorial

Introduction

Here is the source code for com.example.sensingapp.SensingApp.java

Source

package com.example.sensingapp;

/*
 * ****************************************************************************
 * Copyright 2014 Rufeng Meng <mengrufeng@gmail.com>
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 * ****************************************************************************
 */

/*  This program is used to collect sensor data from smartphone.
 *  
 *  Currently, the following sensor data could be recorded:
 *  1) Accelerometer
 *  2) Linear Acceleration
 *  3) Gyroscope
 *  4) Orientation
 *  5) Magnetic Field
 *  6) Light
 *  7) Barometer
 *  8) Audio (Sould level and audio file)
 *  9) Cellular ID
 *  10) GPS (Latitude, Longitude, Altitude, GeoDeclination, GeoInclination, Speed, Bearing)
 *  11) WiFi (SSID, BSSID, RSS)
 *  
 *  Data are stored locally as CSV files under /sdcard/Sensing/SensorData/ and could be uploaded to MySQL Server
 *   
 */

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.*;
import android.content.pm.*;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Environment;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.provider.Settings;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ProgressBar;
import android.widget.RadioGroup;
import android.widget.RadioButton;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.Toast;
import android.view.KeyEvent;
import android.view.View;
import android.telephony.CellLocation;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.text.*;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.GeomagneticField;
import android.util.*;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.net.wifi.*;
import android.content.BroadcastReceiver;
import android.location.*;
import android.app.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.util.Locale;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileWriter;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestFactory;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.http.client.ClientProtocolException;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import android.os.StrictMode;

@SuppressLint("NewApi")
public class SensingApp extends Activity implements SensorEventListener {
    private static final String TAG = "SensingApp";
    private static final int WIFI_COUNT = 20; // How many Wifi SSID to record from the scanned list (originally 10)

    private String[] m_arrsWiFiScanSpeed = { "Fast", "Normal", "Slow" };

    private int[] m_arrlWiFiScanSpeed = { 500, 3000, 15 * 1000 };

    private static boolean m_blnRecordStatus = false; // true: Recording; false: Stopped 

    //Sensor data type
    private static final int DATA_TYPE_SENSOR = 1;
    private static final int DATA_TYPE_MIC = 2;
    private static final int DATA_TYPE_CELLULAR = 3;
    private static final int DATA_TYPE_GPS = 4;
    private static final int DATA_TYPE_WIFI = 5;

    //Sensor event type
    private static int SENSOR_EVENT_NULL = 0;
    private static int SENSOR_EVENT_ACCL = 1;
    private static int SENSOR_EVENT_LINEAR_ACCL = 2;
    private static int SENSOR_EVENT_GYRO = 3;
    private static int SENSOR_EVENT_ORIENT = 4;
    private static int SENSOR_EVENT_MAGNET = 5;
    private static int SENSOR_EVENT_LIGHT = 6;
    private static int SENSOR_EVENT_BAROMETER = 7;
    private static int SENSOR_EVENT_MIC = 8;
    private static int SENSOR_EVENT_CELLULAR = 9;
    private static int SENSOR_EVENT_GPS = 10;
    private static int SENSOR_EVENT_WIFI = 11;
    private static int SENSOR_EVENT_GRAVITY = 12;

    private SensorManager m_smSurScan = null;

    /* Sensor is available or not */
    private static boolean m_blnOrientPresent = false;
    private static boolean m_blnGyroPresent = false;
    private static boolean m_blnAcclPresent = false;
    private static boolean m_blnLinearAcclPresent = false;
    private static boolean m_blnGravityPresent = false;
    private static boolean m_blnLightPresent = false;
    private static boolean m_blnBarometerPresent = false;

    private static boolean m_blnMagnetPresent = false;

    /* Sensor is selected or not */
    private static boolean m_blnOrientEnabled = false; /* false: Sensor data will not be recorded; 
                                                       true: will be recorded */
    private static boolean m_blnGyroEnabled = false;
    private static boolean m_blnAcclEnabled = false;
    private static boolean m_blnLinearAcclEnabled = false;
    private static boolean m_blnGravityEnabled = false;
    private static boolean m_blnLightEnabled = false;
    private static boolean m_blnBarometerEnabled = false;

    private static boolean m_blnMagnetEnabled = false;

    private static boolean m_blnMicEnabled = false;
    private static boolean m_blnCellularEnabled = false;

    /* Wifi is selected or not */
    private static boolean m_blnWifiEnabled = false;

    /* GPS is selected or not */
    private static boolean m_blnGPSEnabled = false;

    /* Default delay mode for sensors */
    private static int m_nAcclMode = SensorManager.SENSOR_DELAY_FASTEST;
    private static int m_nLinearAcclMode = SensorManager.SENSOR_DELAY_FASTEST;
    private static int m_nGravityMode = SensorManager.SENSOR_DELAY_FASTEST;
    private static int m_nGyroMode = SensorManager.SENSOR_DELAY_FASTEST;
    private static int m_nOrientMode = SensorManager.SENSOR_DELAY_FASTEST;
    private static int m_nMagnetMode = SensorManager.SENSOR_DELAY_FASTEST;
    private static int m_nLightMode = SensorManager.SENSOR_DELAY_FASTEST;
    private static int m_nBarometerMode = SensorManager.SENSOR_DELAY_FASTEST;

    private Location m_location;

    private String m_sRecordFile; //Sensor record file
    private String m_sFullPathFile; //Sensor record full pathfile

    private FileWriter m_fwSensorRecord = null;
    private SensingApp m_actHome = this;
    private Date m_dtFileStart; //The time sensor data file is created (for each data file intervally)
    private ResolveInfo m_riHome;

    private boolean m_blnWifiSignalEnabled = false; // true: Wifi signal is enabled
    private boolean m_blnGPSSignalEnabled = false; // true: GPS signal is enabled

    private float[] m_arrfAcclValues = null; // Store accelerometer values
    private float[] m_arrfMagnetValues = null; // Store magnetic values
    private float[] m_arrfOrientValues = new float[3]; // Store orientation values

    private WifiManager m_mainWifi = null;
    private WifiReceiver m_receiverWifi = null;
    List<ScanResult> m_lstWifiList; // Wifi List

    private Thread m_wifiScanThread = null;
    //private int m_nWiFiScanInterval = 500;   //500ms
    private int m_nWifiScanSpeedIndex = 0;

    private LocationManager m_locManager = null;
    private String m_sGPSProvider = LocationManager.GPS_PROVIDER; //GPS provider

    //Sensor data fields in CSV file
    private static String m_sAccl = ",,,";
    private static String m_sLinearAccl = ",,,";
    private static String m_sGravity = ",,,";
    private static String m_sGyro = ",,,";
    private static String m_sOrient = ",,,";
    private static String m_sMagnet = ",,,";

    private static String m_sLight = ",";
    private static String m_sBarometer = ",";

    private static String m_sGPS = ",,,,,,,";

    private static String m_sSouldLevel = ",";
    private static String m_sCellId = ",";
    private static String m_sWifi = ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"; // 20 WiFi <BSSID, RSS> tupes

    private static String m_sSensorAccuracy = ",,";

    ///////////////////////////////////////////////////
    private String m_sSettingFoler = ""; //Setting folder, which will be /sdcard/Sensing/Setting
    private String m_sExistingProjectNameFileName = "ExistingProjectName.txt"; //Existing project names are saved in this file under Setting folder
    private String m_sExistingUsernameFileName = "ExistingUsername.txt"; //Existing user names are saved in this file under Setting folder
    private String m_sExistingLabelFileName = "ExistingLabel.txt"; //Existing label names are saved in this file under Setting folder
    private String m_sUnUploadedFileName = "UnUploadedFileName.txt"; //The list of sensor data files which have not been uploaded

    private String m_sSensorDataFolder = ""; //Sensor data folder, which will be /sdcard/Sensing/SensorData

    private static int m_nProjectNameType = -1; //0--New,   1--Existing
    private static int m_nUsernameType = -1; //0--New,   1--Existing
    private static String m_sProjectName = "";
    private static String m_sUsername = "";
    private static String m_sCurrentLabel = "";
    private static String m_sSensingStartTime = "";
    private static String m_sSensingEndTime = "";

    private boolean m_blnRecordSoundFile = true;
    private boolean m_blnRecordSoundLevel = true;
    private int m_nBufferSize = 0;
    private AudioRecord m_audioRecorder = null;
    private Thread m_soundLevelThread = null;
    private Thread m_processSoundThread = null;
    private String m_sRecordFullPathFile = "";
    private double m_fSoundLevelDb = 1000; //db, the normal value should be < 0 db, 1000 stands for "no reading".

    private int m_nAudioSampleRate = 44100; //Audio sample rate
    private byte m_btAudioBuffer[];
    private int m_nAudioReadCount = AudioRecord.ERROR_INVALID_OPERATION;;

    private TelephonyManager m_tmCellular = null;
    private Thread m_cellularThreadGsm = null;
    private Thread m_cellularThreadCdma = null;
    private GsmCellLocation m_GsmCellLocation = null;
    private CdmaCellLocation m_CdmaCellLocation = null;

    private static int SCREEN_1 = 1;
    private static int SCREEN_6 = 6;

    private static int m_nPreviousScreen = -1; //For "Back" operation

    private List<String> m_lstExistingProjectName = new ArrayList<String>();
    private ArrayAdapter<String> m_adpExistingProjectName;

    private List<String> m_lstExistingUsername = new ArrayList<String>();
    private ArrayAdapter<String> m_adpExistingUsername;

    private List<String> m_lstSensorDataLabel = new ArrayList<String>();
    private int m_nCurrentLabelIndex = -1;

    private List<String> m_lstUsedSensorDateLabel = new ArrayList<String>();

    private List<String> m_lstUnUploadedFileName = new ArrayList<String>();
    private List<Integer> m_lstUploadedFileNameIndex = new ArrayList<Integer>(); //This is not the list of all the uploaded file name,
    //It is the file name which is in the m_lstUnUploadedFileName, 
    //but during the "Upload" operation, its upload is completed.

    private static boolean m_blnNoLabel = false;

    private static boolean m_blnGpsUp = false;

    //Screen 1: Begin
    private RadioGroup m_rdgpProjectNameType, m_rdgpUsernameType;
    private RadioButton m_rdProjectNameType_New, m_rdProjectNameType_Existing;
    private RadioButton m_rdUsernameType_New, m_rdUsernameType_Existing;

    private EditText m_etProjectName_New, m_etUsername_New;
    private Spinner m_spnScreen1_ExistingProjectName;
    private Spinner m_spnScreen1_ExistingUsername;
    private Button m_btnScreen1_Next;
    private Button m_btnScreen1_Upload;
    //Screen 1: End

    //Screen 2: Begin
    private CheckBox m_chkAccl, m_chkLinearAccl, m_chkGravity, m_chkGyro, m_chkOrient, m_chkLight, m_chkBarometer;
    private CheckBox m_chkMagnet;
    private CheckBox m_chkWifi, m_chkGPS;
    private CheckBox m_chkMic, m_chkCellular;

    private RadioGroup m_rdgpSensor, m_rdgpSensorMode;
    private RadioButton m_rdSensorOrient, m_rdSensorGyro, m_rdSensorAccl, m_rdSensorLinearAccl, m_rdSensorGravity,
            m_rdSensorMagnet, m_rdSensorLight;
    private RadioButton m_rdSensorBarometer;
    private RadioButton m_rdSensorModeFastest, m_rdSensorModeGame, m_rdSensorModeNormal, m_rdSensorModeUI;

    private Spinner m_spnScreen2_WiFiScanSpeed;
    private ArrayAdapter<String> m_adpWiFiScanSpeed;
    private Button m_btnScreen2_Back;
    private Button m_btnScreen2_Next;
    //Screen 2: End

    //Screen 3: Begin
    private EditText m_etSensorDataLabel;
    private Button m_btnScreen3_AddLabel;
    //   private TextView m_tvScreen3LabelList;
    private EditText m_etScreen3LabelList;

    private Button m_btnScreen3_Back;
    private Button m_btnScreen3_Next;
    //Screen 3: End

    //Screen 4: Begin
    private Spinner m_spnScreen4_SelectSensorDataLabel;
    private ArrayAdapter<String> m_adpSensorDataLabel;
    private List<String> m_lstSensorDataLabel_Screen4 = new ArrayList<String>();
    private CheckBox m_chkNoLabel;
    private Button m_btnScreen4_Back;
    private Button m_btnScreen4_Start;

    //Screen 4: End

    //Screen 5: Begin
    private TextView m_tvGpsUp;
    private TextView m_tvSensingInfo;
    private Button m_btnScreen5_Stop;
    private RadioButton m_arrLabelButton[];
    private EditText m_etScreen5_TempLabel;
    private CheckBox m_chkScreen5_UseTempLabel;
    private ScrollView m_svScreen5_Label;

    private RadioGroup m_rdgpLabelRadioButtonGroup;
    private LayoutParams m_lpLabelButtonParams = new LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.WRAP_CONTENT);

    //Screen 5: End

    //Screen 6: Begin
    private TextView m_tvScreen6_Username;
    private TextView m_tvScreen6_ProjectName;
    private TextView m_tvScreen6_StartTime;
    private TextView m_tvScreen6_EndTime;
    private TextView m_tvScreen6_LabelNumber;

    private Button m_btnScreen6_Back;
    private Button m_btnScreen6_Upload;
    //Screen 6: End

    //Screen Upload Data:  Begin
    private Button m_btnScreenUploadData_Upload;
    private Button m_btnScreenUploadData_Back;
    private LinearLayout m_llUploadData_ChkLayoutFileName;
    private CheckBox m_arrChkFilename[];
    private LayoutParams m_lpFilenameChkParams = new LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.WRAP_CONTENT);
    private ProgressBar m_pgbActivityIndicator;
    private boolean m_blnUpload = false;

    //Screen Upload Data:  End

    //For Sensor working after screen off
    private WakeLock m_wakeLock;

    private static boolean m_blnUploadFunctionEnabled = false; //Change this to "true" to enable the Upload function

    private static final String m_sURL = "http://xxx.xxx.xxx.xxx/sensordata_upload.php"; //Set the server address for sensor data upload
    ////////////////////////////////////////////////

    public static void PrintCurrentTime(String sTag) {
        Date dtFileStart = new Date();
        final String DATE_FORMAT = "yyyy/MM/dd-HH:mm:ss";
        SimpleDateFormat spdCurrentTime = new SimpleDateFormat(DATE_FORMAT);

        System.out.println("[" + sTag + "] Time:  " + spdCurrentTime.format(dtFileStart));
    }

    /* Class for upload recorded sensor data file to server */
    private class SensorDataUpload extends AsyncTask<Void, Void, Void> {

        private List<String> m_lstSelectedUploadFile = new ArrayList<String>();
        private List<Integer> m_lstSelectedUploadFileID = new ArrayList<Integer>();
        private HttpClient m_httpClt = null;
        private HttpPost m_httpPost = null;

        public SensorDataUpload(List<String> lstSelectedUploadFile, List<Integer> lstSelectedUploadFileID) {
            m_lstSelectedUploadFile = lstSelectedUploadFile;
            m_lstSelectedUploadFileID = lstSelectedUploadFileID;

            m_httpClt = new DefaultHttpClient();
            m_httpPost = new HttpPost(m_sURL);
        }

        private List<String> getUserProjName(String sFilePathName) {
            List<String> lstUserProjName = new ArrayList<String>();

            String sFileName;
            int nPos = -1;
            String delims = "-";

            nPos = sFilePathName.lastIndexOf('/');
            sFileName = sFilePathName.substring(nPos + 1);
            String[] names = sFileName.split(delims);
            lstUserProjName.add(names[0]);
            lstUserProjName.add(names[1]);

            return lstUserProjName;
        }

        private void operateDb() {
            FileReader fr;
            BufferedReader br;
            String sLine = "";
            String[] fieldsData;
            String[] fields;
            String sUsername = "";
            String sProjectname = "";
            int nFieldCnt = 59; // Number of fields
            List<String> lstUserProjName = new ArrayList<String>();

            for (int i = 0; i < m_lstSelectedUploadFile.size(); i++) {
                if (m_blnUpload == false)
                    break;

                lstUserProjName = getUserProjName(m_lstSelectedUploadFile.get(i));
                sUsername = lstUserProjName.get(0);
                sProjectname = lstUserProjName.get(1);

                try {
                    fr = new FileReader(m_lstSelectedUploadFile.get(i));
                    br = new BufferedReader(fr);

                    while (((sLine = br.readLine()) != null) && (m_blnUpload == true)) {
                        fields = new String[nFieldCnt];

                        for (int j = 0; j < nFieldCnt; j++) {
                            fields[j] = "";
                        }

                        fieldsData = sLine.split(",");
                        for (int k = 0; k < fieldsData.length; k++) {
                            fields[k] = fieldsData[k];
                        }
                        /*
                         *  0) Timestamp
                         *  1) Label
                         *  2) SensingEventType
                         *  3-5) Accl
                         *  6-8) Linear Accl
                         *  9-11) Gravity
                         *  12-14) Gyro
                         *  15-17) Orientation
                         *  18-20) Magnet
                         *  21) Light
                         *  22) Barometer
                         *  23) Sould Level (Decibel)
                         *  24) Cell ID
                         *  25-31) GPS (Lat, Long, Alt, Declination, Inclination, Speed, Bearing)
                         *  32-61) WiFi (<SSID, BSSID, Level>) 
                         */

                        try {
                            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                            nameValuePairs.add(new BasicNameValuePair("projectname", sProjectname));
                            nameValuePairs.add(new BasicNameValuePair("username", sUsername));
                            nameValuePairs.add(new BasicNameValuePair("timestamp", fields[0]));
                            nameValuePairs.add(new BasicNameValuePair("label", fields[1]));
                            nameValuePairs.add(new BasicNameValuePair("datatype", fields[2]));

                            nameValuePairs.add(new BasicNameValuePair("acclX", fields[3]));
                            nameValuePairs.add(new BasicNameValuePair("acclY", fields[4]));
                            nameValuePairs.add(new BasicNameValuePair("acclZ", fields[5]));

                            nameValuePairs.add(new BasicNameValuePair("linearAcclX", fields[6]));
                            nameValuePairs.add(new BasicNameValuePair("linearAcclY", fields[7]));
                            nameValuePairs.add(new BasicNameValuePair("linearAcclZ", fields[8]));

                            nameValuePairs.add(new BasicNameValuePair("gravityX", fields[9]));
                            nameValuePairs.add(new BasicNameValuePair("gravityY", fields[10]));
                            nameValuePairs.add(new BasicNameValuePair("gravityZ", fields[11]));

                            nameValuePairs.add(new BasicNameValuePair("gyroX", fields[12]));
                            nameValuePairs.add(new BasicNameValuePair("gyroY", fields[13]));
                            nameValuePairs.add(new BasicNameValuePair("gyroZ", fields[14]));

                            nameValuePairs.add(new BasicNameValuePair("orientX", fields[15]));
                            nameValuePairs.add(new BasicNameValuePair("orientY", fields[16]));
                            nameValuePairs.add(new BasicNameValuePair("orientZ", fields[17]));

                            nameValuePairs.add(new BasicNameValuePair("magnetX", fields[18]));
                            nameValuePairs.add(new BasicNameValuePair("magnetY", fields[19]));
                            nameValuePairs.add(new BasicNameValuePair("magnetZ", fields[20]));

                            nameValuePairs.add(new BasicNameValuePair("light", fields[21]));

                            nameValuePairs.add(new BasicNameValuePair("barometer", fields[22]));

                            nameValuePairs.add(new BasicNameValuePair("soundlevel", fields[23]));

                            nameValuePairs.add(new BasicNameValuePair("cellid", fields[24]));

                            nameValuePairs.add(new BasicNameValuePair("gpsLat", fields[25]));
                            nameValuePairs.add(new BasicNameValuePair("gpsLong", fields[26]));
                            nameValuePairs.add(new BasicNameValuePair("gpsAlt", fields[27]));
                            nameValuePairs.add(new BasicNameValuePair("geoDeclination", fields[28]));
                            nameValuePairs.add(new BasicNameValuePair("geoInclination", fields[29]));
                            nameValuePairs.add(new BasicNameValuePair("gpsSpeed", fields[30]));
                            nameValuePairs.add(new BasicNameValuePair("gpsBearing", fields[31]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID1", fields[32]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID1", fields[33]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS1", fields[34]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID2", fields[35]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID2", fields[36]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS2", fields[37]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID3", fields[38]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID3", fields[39]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS3", fields[40]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID4", fields[41]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID4", fields[42]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS4", fields[43]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID5", fields[44]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID5", fields[45]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS5", fields[46]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID6", fields[47]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID6", fields[48]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS6", fields[49]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID7", fields[50]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID7", fields[51]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS7", fields[52]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID8", fields[53]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID8", fields[54]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS8", fields[55]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID9", fields[56]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID9", fields[57]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS9", fields[58]));

                            nameValuePairs.add(new BasicNameValuePair("wifiSSID10", fields[59]));
                            nameValuePairs.add(new BasicNameValuePair("wifiBSSID10", fields[60]));
                            nameValuePairs.add(new BasicNameValuePair("wifiRSS10", fields[61]));

                            m_httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                            m_httpClt.execute(m_httpPost);

                            //HttpResponse response = httpClt.execute(httpPost);
                            //HttpEntity resEntity = response.getEntity();
                            //if(resEntity != null) {
                            //   String responseMsg = EntityUtils.toString(resEntity).trim();
                            //   Log.i("......Response: " + responseMsg); 
                            //}
                        } catch (Exception e) {

                        }

                    } //While

                    fr.close();
                } catch (Exception e) {

                }

                m_lstUploadedFileNameIndex.add(m_lstSelectedUploadFileID.get(i));

            } //For

        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            operateDb();
            return null;
        }

        protected void onProgressUpdate(Void... params) {

        }

        protected void onPostExecute(Void result) {
            int i;

            m_pgbActivityIndicator.setVisibility(View.GONE);
            m_btnScreenUploadData_Back.setEnabled(true);
            m_btnScreenUploadData_Upload.setText(R.string.upload);

            for (i = 0; i < m_arrChkFilename.length; i++) {
                m_arrChkFilename[i].setEnabled(true);
            }

            //Update the UnUploadedFileName.txt
            for (i = m_lstUploadedFileNameIndex.size() - 1; i >= 0; i--) {
                m_lstUnUploadedFileName.remove(m_lstUploadedFileNameIndex.get(i).intValue());
            }

            updateUnUploadedFileName(m_lstUnUploadedFileName);

            refreshUploadFileNameBox();

            m_blnUpload = false;
        }

    }

    //When the power button is pushed, screen goes off, to still keep the service running, some need to be re-enabled
    public BroadcastReceiver m_ScreenOffReceiver = new BroadcastReceiver() {

        public void onReceive(Context context, Intent intent) {

            if (!intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                return;
            }

            if (m_blnRecordStatus == true) {

                if ((m_blnWifiSignalEnabled == true) && (m_blnWifiEnabled == true)) {
                    if (m_receiverWifi != null) {
                        unregisterReceiver(m_receiverWifi);
                        registerReceiver(m_receiverWifi,
                                new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                        //m_mainWifi.startScan();
                        startWiFiScan();
                    }
                }

                if (m_blnGPSSignalEnabled == true && m_blnGPSEnabled == true) {
                    if (m_locManager != null) {
                        m_locManager.removeUpdates(m_locListener);
                        m_locManager.requestLocationUpdates(m_sGPSProvider, 0L, 0.0f, m_locListener);
                    }
                }

            }

        }

    };

    private boolean containComma(String sContent) {
        boolean bRet = false;

        bRet = sContent.contains(",");

        return bRet;
    }

    //Refresh the sensor data file list when the selected files are uploaded
    private void refreshUploadFileNameBox() {
        int i;
        int nCnt = m_arrChkFilename.length;
        for (i = nCnt - 1; i >= 0; i--) {
            m_llUploadData_ChkLayoutFileName.removeViewAt(i);
            m_arrChkFilename[i] = null;
        }

        int nCount = m_lstUnUploadedFileName.size();
        m_arrChkFilename = new CheckBox[nCount];

        for (i = 0; i < nCount; i++) {
            m_arrChkFilename[i] = new CheckBox(this);
            m_arrChkFilename[i].setId(i);
            m_arrChkFilename[i].setText(getFileName(m_lstUnUploadedFileName.get(i)));
            m_arrChkFilename[i].setOnCheckedChangeListener(null);
            m_arrChkFilename[i].setLayoutParams(m_lpFilenameChkParams);
            m_llUploadData_ChkLayoutFileName.addView(m_arrChkFilename[i]);
            m_arrChkFilename[i].setEnabled(true);
        }

    }

    private void resetValues() {
        m_sOrient = ",,,";
        m_sGyro = ",,,";
        m_sAccl = ",,,";
        m_sLinearAccl = ",,,";
        m_sGravity = ",,,";
        m_sLight = ",";
        m_sBarometer = ",";

        m_sMagnet = ",,,";

        m_sSouldLevel = ",";
        m_sCellId = ",";

        m_sGPS = ",,,,,,,";
        m_sWifi = ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";

        m_sSensorAccuracy = ",,";

        m_blnGpsUp = false;
    }

    private class WifiReceiver extends BroadcastReceiver {
        /* Record scanned Wifi information */
        public void onReceive(Context c, Intent intent) {
            int i, j, iCount, iRecordCount = 0;
            WifiData wifiData = null;
            WifiData tmpWifiData = null;
            int nPos;

            //PrintCurrentTime("WiFi Receiver");

            m_lstWifiList = m_mainWifi.getScanResults();

            iCount = m_lstWifiList.size();
            iRecordCount = iCount;

            if (iRecordCount <= 0)
                return;

            List<WifiData> lstWifiData = new ArrayList<WifiData>();

            wifiData = new WifiData(m_lstWifiList.get(0).SSID, m_lstWifiList.get(0).BSSID,
                    m_lstWifiList.get(0).level);
            lstWifiData.add(wifiData);

            for (i = 1; i < iRecordCount; i++) {
                wifiData = new WifiData(m_lstWifiList.get(i).SSID, m_lstWifiList.get(i).BSSID,
                        m_lstWifiList.get(i).level);
                nPos = -1;
                for (j = 0; j < lstWifiData.size(); j++) {
                    tmpWifiData = lstWifiData.get(j);
                    if (m_lstWifiList.get(i).level > tmpWifiData.getSignalLevel()) {
                        nPos = j;
                        break;
                    }
                }

                if (nPos == -1) {
                    lstWifiData.add(wifiData);
                } else {
                    lstWifiData.add(nPos, wifiData);
                }
            }

            SensorData senData = new SensorData(DATA_TYPE_WIFI, lstWifiData);
            recordSensingInfo(senData);

        }
    }

    /* Set file identification and type 
     * Add "_" + "O", "G", "A", "M", "P", "L" to represent each enabled sensor recorded in the data file
     * Sensor data is recorded as "CSV" file 
     */
    private String getFileType() {
        String sFileType = "";
        boolean blnHasUnderscore = false; //Indicate the first "_" before the letters representing sensors

        //      if (m_blnAcclEnabled) {
        //         sFileType = "_A";
        //         blnHasUnderscore = true;
        //      }

        if (m_blnAcclEnabled) {
            sFileType = "_A";
            blnHasUnderscore = true;
        }

        if (m_blnLinearAcclEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "R";
            } else {
                sFileType = "_R";
                blnHasUnderscore = true;
            }
        }

        if (m_blnGravityEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "V";
            } else {
                sFileType = "_V";
                blnHasUnderscore = true;
            }
        }

        if (m_blnGyroEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "G";
            } else {
                sFileType = "_G";
                blnHasUnderscore = true;
            }
        }

        if (m_blnOrientEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "O";
            } else {
                sFileType = "_O";
                blnHasUnderscore = true;
            }
        }

        if (m_blnMagnetEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "N";
            } else {
                sFileType = "_N";
                blnHasUnderscore = true;
            }
        }

        if (m_blnLightEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "L";
            } else {
                sFileType = "_L";
                blnHasUnderscore = true;
            }
        }

        if (m_blnBarometerEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "B";
            } else {
                sFileType = "_B";
                blnHasUnderscore = true;
            }
        }

        if (m_blnMicEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "M";
            } else {
                sFileType = "_M";
                blnHasUnderscore = true;
            }
        }

        if (m_blnCellularEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "C";
            } else {
                sFileType = "_C";
                blnHasUnderscore = true;
            }
        }

        if (m_blnGPSEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "S";
            } else {
                sFileType = "_S";
                blnHasUnderscore = true;
            }
        }

        if (m_blnWifiEnabled) {
            if (blnHasUnderscore == true) {
                sFileType = sFileType + "W";
            } else {
                sFileType = "_W";
                blnHasUnderscore = true;
            }
        }

        sFileType = sFileType + ".csv";

        return sFileType;

    }

    /* Enable/Disable sensor setting 
     * When recording is going on, sensor setting should be disabled 
     */
    private void enableSensorSetting(boolean blnSettingEnabled) {
        if (m_blnOrientPresent) {
            m_chkOrient.setEnabled(blnSettingEnabled);
            m_rdSensorOrient.setEnabled(blnSettingEnabled);
        } else {
            m_chkOrient.setEnabled(false);
            m_rdSensorOrient.setEnabled(false);
        }

        if (m_blnGyroPresent) {
            m_chkGyro.setEnabled(blnSettingEnabled);
            m_rdSensorGyro.setEnabled(blnSettingEnabled);
        } else {
            m_chkGyro.setEnabled(false);
            m_rdSensorGyro.setEnabled(false);
        }

        if (m_blnAcclPresent) {
            m_chkAccl.setEnabled(blnSettingEnabled);
            m_rdSensorAccl.setEnabled(blnSettingEnabled);
        } else {
            m_chkAccl.setEnabled(false);
            m_rdSensorAccl.setEnabled(false);
        }

        if (m_blnLinearAcclPresent) {
            m_chkLinearAccl.setEnabled(blnSettingEnabled);
            m_rdSensorLinearAccl.setEnabled(blnSettingEnabled);
        } else {
            m_chkLinearAccl.setEnabled(false);
            m_rdSensorLinearAccl.setEnabled(false);
        }

        if (m_blnGravityPresent) {
            m_chkGravity.setEnabled(blnSettingEnabled);
            m_rdSensorGravity.setEnabled(blnSettingEnabled);
        } else {
            m_chkGravity.setEnabled(false);
            m_rdSensorGravity.setEnabled(false);
        }

        if (m_blnMagnetPresent) {
            m_chkMagnet.setEnabled(blnSettingEnabled);
            m_rdSensorMagnet.setEnabled(blnSettingEnabled);
        } else {
            m_chkMagnet.setEnabled(false);
            m_rdSensorMagnet.setEnabled(false);
        }

        if (m_blnLightPresent) {
            m_chkLight.setEnabled(blnSettingEnabled);
            m_rdSensorLight.setEnabled(blnSettingEnabled);
        } else {
            m_chkLight.setEnabled(false);
            m_rdSensorLight.setEnabled(false);
        }

        if (m_blnBarometerPresent) {
            m_chkBarometer.setEnabled(blnSettingEnabled);
            m_rdSensorBarometer.setEnabled(blnSettingEnabled);
        } else {
            m_chkBarometer.setEnabled(false);
            m_rdSensorBarometer.setEnabled(false);
        }

        if (m_blnMicEnabled) {
            m_chkMic.setEnabled(blnSettingEnabled);
        } else {
            m_chkMic.setEnabled(false);
        }

        if (m_blnCellularEnabled) {
            m_chkCellular.setEnabled(blnSettingEnabled);
        } else {
            m_chkCellular.setEnabled(false);
        }

        if (m_blnWifiSignalEnabled) {
            m_chkWifi.setEnabled(blnSettingEnabled);
        } else {
            m_chkWifi.setEnabled(false);
        }

        if (m_blnGPSSignalEnabled) {
            m_chkGPS.setEnabled(blnSettingEnabled);
        } else {
            m_chkGPS.setEnabled(false);
        }

        if (m_blnOrientPresent || m_blnGyroPresent || m_blnAcclPresent || m_blnLinearAcclPresent
                || m_blnGravityPresent || m_blnMagnetPresent || m_blnLightPresent || m_blnBarometerPresent) {

            m_rdSensorModeFastest.setEnabled(blnSettingEnabled);
            m_rdSensorModeGame.setEnabled(blnSettingEnabled);
            m_rdSensorModeNormal.setEnabled(blnSettingEnabled);
            m_rdSensorModeUI.setEnabled(blnSettingEnabled);
        } else {
            //No sensor is installed, disable mode selection
            m_rdSensorModeFastest.setEnabled(false);
            m_rdSensorModeGame.setEnabled(false);
            m_rdSensorModeNormal.setEnabled(false);
            m_rdSensorModeUI.setEnabled(false);

        }

    }

    /* Set default widget status and setting */
    private void setDefaultStatus() {
        m_blnOrientEnabled = false;
        m_blnGyroEnabled = false;
        m_blnAcclEnabled = false;
        m_blnLinearAcclEnabled = false;
        m_blnGravityEnabled = false;
        m_blnMagnetEnabled = false;
        m_blnLightEnabled = false;
        m_blnBarometerEnabled = false;

        m_blnWifiEnabled = false;
        m_blnGPSEnabled = false;

        m_blnMicEnabled = false;
        m_blnCellularEnabled = false;

        m_nOrientMode = SensorManager.SENSOR_DELAY_FASTEST;
        m_nGyroMode = SensorManager.SENSOR_DELAY_FASTEST;
        m_nAcclMode = SensorManager.SENSOR_DELAY_FASTEST;
        m_nLinearAcclMode = SensorManager.SENSOR_DELAY_FASTEST;
        m_nGravityMode = SensorManager.SENSOR_DELAY_FASTEST;
        m_nMagnetMode = SensorManager.SENSOR_DELAY_FASTEST;
        m_nLightMode = SensorManager.SENSOR_DELAY_FASTEST;
        m_nBarometerMode = SensorManager.SENSOR_DELAY_FASTEST;

        m_chkOrient.setChecked(false);
        m_chkGyro.setChecked(false);
        m_chkAccl.setChecked(false);
        m_chkLinearAccl.setChecked(false);
        m_chkGravity.setChecked(false);
        m_chkMagnet.setChecked(false);
        m_chkLight.setChecked(false);
        m_chkBarometer.setChecked(false);

        m_chkWifi.setChecked(false);
        m_chkGPS.setChecked(false);

        enableSensorSetting(true);
        m_rdSensorOrient.setChecked(true);
        m_rdSensorModeNormal.setChecked(true);
        m_blnRecordStatus = false;
    }

    /* Event for sensor enable/disable */
    private OnCheckedChangeListener m_chkSensorEnableListener = new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if (buttonView == m_chkOrient) {
                if (isChecked == true) {
                    m_blnOrientEnabled = true;
                } else {
                    m_blnOrientEnabled = false;
                }
            }

            if (buttonView == m_chkGyro) {
                if (isChecked == true) {
                    m_blnGyroEnabled = true;
                } else {
                    m_blnGyroEnabled = false;
                }
            }

            if (buttonView == m_chkAccl) {
                if (isChecked == true) {
                    m_blnAcclEnabled = true;
                } else {
                    m_blnAcclEnabled = false;
                }
            }

            if (buttonView == m_chkLinearAccl) {
                if (isChecked == true) {
                    m_blnLinearAcclEnabled = true;
                } else {
                    m_blnLinearAcclEnabled = false;
                }
            }

            if (buttonView == m_chkGravity) {
                if (isChecked == true) {
                    m_blnGravityEnabled = true;
                } else {
                    m_blnGravityEnabled = false;
                }
            }

            if (buttonView == m_chkMagnet) {
                if (isChecked == true) {
                    m_blnMagnetEnabled = true;
                } else {
                    m_blnMagnetEnabled = false;
                    if (m_blnOrientEnabled == false) {
                    }
                }
            }

            if (buttonView == m_chkLight) {
                if (isChecked == true) {
                    m_blnLightEnabled = true;
                } else {
                    m_blnLightEnabled = false;
                }
            }

            if (buttonView == m_chkBarometer) {
                if (isChecked == true) {
                    m_blnBarometerEnabled = true;
                } else {
                    m_blnBarometerEnabled = false;
                }
            }

            if (buttonView == m_chkMic) {
                if (isChecked == true) {
                    m_blnMicEnabled = true;
                } else {
                    m_blnMicEnabled = false;
                }
            }

            if (buttonView == m_chkCellular) {
                if (isChecked == true) {
                    m_blnCellularEnabled = true;
                } else {
                    m_blnCellularEnabled = false;
                }
            }

            if (buttonView == m_chkWifi) {
                if (isChecked == true) {
                    m_blnWifiEnabled = true;
                } else {
                    m_blnWifiEnabled = false;
                }
            }

            if (buttonView == m_chkGPS) {
                if (isChecked == true) {
                    m_blnGPSEnabled = true;
                } else {
                    m_blnGPSEnabled = false;
                }
            }

        }
    };

    /* Event listener for sensor radiogroup selection */
    private RadioGroup.OnCheckedChangeListener m_rdgpSensorListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub
            int iModeType = SensorManager.SENSOR_DELAY_FASTEST;

            if (m_rdSensorOrient.isChecked()) {
                iModeType = m_nOrientMode;
            } else if (m_rdSensorGyro.isChecked()) {
                iModeType = m_nGyroMode;
            } else if (m_rdSensorAccl.isChecked()) {
                iModeType = m_nAcclMode;
            } else if (m_rdSensorLinearAccl.isChecked()) {
                iModeType = m_nLinearAcclMode;
            } else if (m_rdSensorGravity.isChecked()) {
                iModeType = m_nGravityMode;
            } else if (m_rdSensorMagnet.isChecked()) {
                iModeType = m_nMagnetMode;
            } else if (m_rdSensorLight.isChecked()) {
                iModeType = m_nLightMode;
            } else if (m_rdSensorBarometer.isChecked()) {
                iModeType = m_nBarometerMode;
            }

            if (iModeType == SensorManager.SENSOR_DELAY_FASTEST) {
                m_rdSensorModeFastest.setChecked(true);
            } else if (iModeType == SensorManager.SENSOR_DELAY_GAME) {
                m_rdSensorModeGame.setChecked(true);
            } else if (iModeType == SensorManager.SENSOR_DELAY_NORMAL) {
                m_rdSensorModeNormal.setChecked(true);
            } else if (iModeType == SensorManager.SENSOR_DELAY_UI) {
                m_rdSensorModeUI.setChecked(true);
            }

        }
    };

    /* Event listener for sensor mode radiogroup selection */
    private RadioGroup.OnCheckedChangeListener m_rdgpSensorModeListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub
            int iDelayMode = SensorManager.SENSOR_DELAY_FASTEST;

            if (m_rdSensorModeFastest.isChecked()) {
                iDelayMode = SensorManager.SENSOR_DELAY_FASTEST;
            } else if (m_rdSensorModeGame.isChecked()) {
                iDelayMode = SensorManager.SENSOR_DELAY_GAME;
            } else if (m_rdSensorModeNormal.isChecked()) {
                iDelayMode = SensorManager.SENSOR_DELAY_NORMAL;
            } else if (m_rdSensorModeUI.isChecked()) {
                iDelayMode = SensorManager.SENSOR_DELAY_UI;
            }

            if (m_rdSensorOrient.isChecked()) {
                m_nOrientMode = iDelayMode;
            } else if (m_rdSensorGyro.isChecked()) {
                m_nGyroMode = iDelayMode;
            } else if (m_rdSensorAccl.isChecked()) {
                m_nAcclMode = iDelayMode;
            } else if (m_rdSensorLinearAccl.isChecked()) {
                m_nLinearAcclMode = iDelayMode;
            } else if (m_rdSensorGravity.isChecked()) {
                m_nGravityMode = iDelayMode;
            } else if (m_rdSensorMagnet.isChecked()) {
                m_nMagnetMode = iDelayMode;
            } else if (m_rdSensorLight.isChecked()) {
                m_nLightMode = iDelayMode;
            } else if (m_rdSensorBarometer.isChecked()) {
                m_nBarometerMode = iDelayMode;
            }

        }
    };

    /* Get GPS provider */
    private boolean getGPSProvider() {
        Location location = null;
        Criteria crit = new Criteria();
        float fLat, fLng, fAlt;

        m_sGPSProvider = m_locManager.getBestProvider(crit, true); //false?
        if (m_sGPSProvider != null) {
            m_blnGPSSignalEnabled = true;
            location = m_locManager.getLastKnownLocation(m_sGPSProvider);
            if (location != null) {
                fLat = (float) (location.getLatitude());
                fLng = (float) (location.getLongitude());
                if (location.hasAltitude()) {
                    fAlt = (float) (location.getAltitude());
                }
            }
            return true;
        } else {
            m_chkGPS.setEnabled(false);
            return false;
        }
    }

    private LocationListener m_locListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            if (location != null) {
                recordLocation(location);
            } else {
                m_blnGpsUp = false;
                show_screen5_GpsUp();
            }
        }

        public void onProviderDisabled(String provider) {
            if (provider.equals(m_sGPSProvider)) {
                m_blnGPSSignalEnabled = false;
                m_chkGPS.setEnabled(false);
            }
        }

        public void onProviderEnabled(String provider) {
            if (provider.equals(m_sGPSProvider)) {
                m_blnGPSSignalEnabled = true;
                if (m_blnRecordStatus == false) {
                    m_chkGPS.setEnabled(true);
                }
            }
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
            if (provider.equals(m_sGPSProvider)) {
                if (status == LocationProvider.OUT_OF_SERVICE) {
                    m_blnGPSSignalEnabled = false;
                    m_chkGPS.setEnabled(false);

                    m_blnGpsUp = false;
                    show_screen5_GpsUp();
                } else {
                    m_blnGPSSignalEnabled = true;
                    if (m_blnRecordStatus == false) {
                        m_chkGPS.setEnabled(true);
                    }
                }
            } else {
                m_blnGpsUp = false;
                show_screen5_GpsUp();
            }
        }

    };

    private Button.OnClickListener m_btnScreen1_Next_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            int nIndex = 0;
            String sTmpProjectName;
            String sTmpUsername;
            int nPos = -1;
            String sLine;

            if (m_rdProjectNameType_New.isChecked() == false && m_rdProjectNameType_Existing.isChecked() == false) {
                Toast.makeText(getApplicationContext(), "Please set project name", Toast.LENGTH_SHORT).show();
                return;
            }

            if (m_rdUsernameType_New.isChecked() == false && m_rdUsernameType_Existing.isChecked() == false) {
                Toast.makeText(getApplicationContext(), "Please set username", Toast.LENGTH_SHORT).show();
                return;
            }

            //Process project name
            if (m_rdProjectNameType_New.isChecked()) {
                m_nProjectNameType = 0;
                m_sProjectName = m_etProjectName_New.getText().toString();

                if (m_sProjectName.length() == 0) {
                    Toast.makeText(getApplicationContext(), "Please input project name!", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }

                if (containComma(m_sProjectName)) {
                    Toast.makeText(getApplicationContext(), "Comma should not be used in project name!",
                            Toast.LENGTH_SHORT).show();
                    return;
                }

            } else if (m_rdProjectNameType_Existing.isChecked()) {
                m_nProjectNameType = 1;
                nIndex = m_spnScreen1_ExistingProjectName.getSelectedItemPosition();
                m_sProjectName = m_lstExistingProjectName.get(nIndex);
            }

            //Process username
            if (m_rdUsernameType_New.isChecked()) {
                m_nUsernameType = 0;
                m_sUsername = m_etUsername_New.getText().toString();

                if (m_sUsername.length() == 0) {
                    Toast.makeText(getApplicationContext(), "Please input username!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (containComma(m_sUsername)) {
                    Toast.makeText(getApplicationContext(), "Comma should not be used in user name!",
                            Toast.LENGTH_SHORT).show();
                    return;
                }

            } else if (m_rdUsernameType_Existing.isChecked()) {
                m_nUsernameType = 1;
                nIndex = m_spnScreen1_ExistingUsername.getSelectedItemPosition();
                m_sUsername = m_lstExistingUsername.get(nIndex);
            }

            if (m_nProjectNameType == 0) {
                //Add the new Project name into m_lstExistingProjectName
                nIndex = m_lstExistingProjectName.indexOf(m_sProjectName);
                if (nIndex != -1) { //Exist

                } else {
                    for (int i = 0; i < m_lstExistingProjectName.size(); i++) {
                        sTmpProjectName = m_lstExistingProjectName.get(i);
                        if (m_sProjectName.compareToIgnoreCase(sTmpProjectName) < 0) {
                            nPos = i;
                            break;
                        }
                    }

                    if (nPos != -1) {
                        m_lstExistingProjectName.add(nPos, m_sProjectName);
                    } else {
                        m_lstExistingProjectName.add(m_sProjectName);
                    }

                }

                //Update the ExistingProjectName file
                try {
                    String sExistingProjectNameFilePath = m_sSettingFoler + File.separator
                            + m_sExistingProjectNameFileName;

                    FileWriter fwExistingProjectName = new FileWriter(sExistingProjectNameFilePath, false); //Overwrite

                    for (String sProjectName : m_lstExistingProjectName) {
                        sLine = sProjectName + "\n";
                        fwExistingProjectName.write(sLine);
                    }

                    fwExistingProjectName.close();
                } catch (Exception e) {

                }

            }

            if (m_nUsernameType == 0) {
                //Add the new username into m_lstExistingUsername
                nIndex = m_lstExistingUsername.indexOf(m_sUsername);
                if (nIndex != -1) { //Exist, do not add

                } else {
                    for (int i = 0; i < m_lstExistingUsername.size(); i++) {
                        sTmpUsername = m_lstExistingUsername.get(i);
                        if (m_sUsername.compareToIgnoreCase(sTmpUsername) < 0) {
                            nPos = i;
                            break;
                        }
                    }

                    if (nPos != -1) {
                        m_lstExistingUsername.add(nPos, m_sUsername);
                    } else {
                        m_lstExistingUsername.add(m_sUsername);
                    }

                }

                //Update the ExistingUsername file
                try {
                    String sExistingUsernameFilePath = m_sSettingFoler + File.separator
                            + m_sExistingUsernameFileName;

                    FileWriter fwExistingUsername = new FileWriter(sExistingUsernameFilePath, false); //Overwrite

                    for (String sUsername : m_lstExistingUsername) {
                        sLine = sUsername + "\n";
                        fwExistingUsername.write(sLine);
                    }

                    fwExistingUsername.close();
                } catch (Exception e) {

                }

            }

            show_screen2();
        }
    };

    private Button.OnClickListener m_btnScreen1_Upload_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            if (m_blnUploadFunctionEnabled) {
                m_nPreviousScreen = SCREEN_1;
                show_screenUploadData();
            }

        }
    };

    private Button.OnClickListener m_btnScreen2_Back_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            m_nWifiScanSpeedIndex = m_spnScreen2_WiFiScanSpeed.getSelectedItemPosition();
            show_screen1();
        }
    };

    private Button.OnClickListener m_btnScreen2_Next_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            //Check whether any sensor is selected         
            if ((m_blnAcclEnabled == false) && (m_blnLinearAcclEnabled == false) && (m_blnGravityEnabled == false)
                    && (m_blnGyroEnabled == false) && (m_blnOrientEnabled == false) && (m_blnMagnetEnabled == false)
                    && (m_blnLightEnabled == false) && (m_blnBarometerEnabled == false)
                    && (m_blnWifiEnabled == false) && (m_blnGPSEnabled == false) && (m_blnMicEnabled == false)
                    && (m_blnCellularEnabled == false)) {

                Toast.makeText(getApplicationContext(), "Please select sensor!", Toast.LENGTH_SHORT).show();
                return;
            }

            UpdateSensorServiceRegistration();

            m_nWifiScanSpeedIndex = m_spnScreen2_WiFiScanSpeed.getSelectedItemPosition();

            show_screen3();
        }
    };

    private Button.OnClickListener m_btnScreen3_AddLabel_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            String sLabelName = m_etSensorDataLabel.getText().toString();
            String sTmpLabel = "";
            int nIndex = -1;
            int nLast;
            String sLabelList = "";

            if (sLabelName.length() > 0) {

                if (containComma(sLabelName)) {
                    Toast.makeText(getApplicationContext(), "Comma should not be used in label!",
                            Toast.LENGTH_SHORT).show();
                    return;
                }

                for (int i = 0; i < m_lstSensorDataLabel.size(); i++) {
                    sTmpLabel = m_lstSensorDataLabel.get(i);
                    if (sLabelName.compareToIgnoreCase(sTmpLabel) == 0) {
                        nIndex = -2; //Same label exists
                        break;
                    }

                    if (sLabelName.compareToIgnoreCase(sTmpLabel) < 0) {
                        nIndex = i;
                        break;
                    }
                }

                if (nIndex == -2) {
                    //Same label exists, do nothing
                } else if (nIndex == -1) {
                    m_lstSensorDataLabel.add(sLabelName);
                } else {
                    m_lstSensorDataLabel.add(nIndex, sLabelName);
                }
            }

            nLast = m_lstSensorDataLabel.size() - 1;
            for (int i = 0; i < m_lstSensorDataLabel.size(); i++) {
                if (i != nLast) {
                    sLabelList = sLabelList + m_lstSensorDataLabel.get(i) + "\n";
                } else {
                    sLabelList = sLabelList + m_lstSensorDataLabel.get(i);
                }
            }

            m_etScreen3LabelList.setText(sLabelList);

            m_etSensorDataLabel.setText("");
        }
    };

    //Update Sensor Data file
    private void updateSensorDataLabel() {
        String sLine;
        String sLabels;
        boolean bExist;
        int nIndex;

        sLabels = m_etScreen3LabelList.getText().toString();

        String sArrLabel[] = sLabels.split("\n");

        m_lstSensorDataLabel.clear();

        for (int i = 0; i < sArrLabel.length; i++) {
            bExist = false;
            nIndex = -1;

            for (int j = 0; j < m_lstSensorDataLabel.size(); j++) {
                if (sArrLabel[i].compareToIgnoreCase(m_lstSensorDataLabel.get(j)) == 0) {
                    bExist = true;
                    break;
                }

                if (sArrLabel[i].compareToIgnoreCase(m_lstSensorDataLabel.get(j)) < 0) {
                    bExist = false;
                    nIndex = j;
                }
            }

            if (bExist == false) {
                if (nIndex == -1) {
                    m_lstSensorDataLabel.add(sArrLabel[i]);
                } else {
                    m_lstSensorDataLabel.add(nIndex, sArrLabel[i]);
                }
            }

        }

        try {
            String sExistingLabelFilePath = m_sSettingFoler + File.separator + m_sExistingLabelFileName;

            FileWriter fwExistingLabel = new FileWriter(sExistingLabelFilePath, false); //Overwrite

            for (String sLabel : m_lstSensorDataLabel) {
                sLine = sLabel + "\n";
                fwExistingLabel.write(sLine);
            }

            fwExistingLabel.close();
        } catch (Exception e) {

        }

    }

    private Button.OnClickListener m_btnScreen3_Back_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            updateSensorDataLabel();

            show_screen2();
        }
    };

    private Button.OnClickListener m_btnScreen3_Next_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            updateSensorDataLabel();

            show_screen4();
        }
    };

    private Button.OnClickListener m_btnScreen4_Back_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            show_screen3();
        }
    };

    private OnCheckedChangeListener m_chkNoLabel_Listener = new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (m_chkNoLabel.isChecked()) {
                m_blnNoLabel = true;
            } else {
                m_blnNoLabel = false;
            }
        }
    };

    //Process when the user uses temp label during sensing
    private OnCheckedChangeListener m_chkScreen5_UseTempLabelListener = new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (m_chkScreen5_UseTempLabel.isChecked()) {
                String sTempLabel = m_etScreen5_TempLabel.getText().toString();
                if (sTempLabel.length() == 0) {
                    m_chkScreen5_UseTempLabel.setChecked(false);
                    m_arrLabelButton[m_nCurrentLabelIndex].setChecked(true);
                    m_sCurrentLabel = m_lstSensorDataLabel.get(m_nCurrentLabelIndex);
                    Toast.makeText(getApplicationContext(), "Please input label", Toast.LENGTH_SHORT).show();
                } else {
                    if (containComma(sTempLabel)) {
                        Toast.makeText(getApplicationContext(), "Comma should not be used in label!",
                                Toast.LENGTH_SHORT).show();
                        m_chkScreen5_UseTempLabel.setChecked(false);
                        return;
                    }

                    m_sCurrentLabel = sTempLabel;
                    m_lstUsedSensorDateLabel.add(m_sCurrentLabel);
                    m_arrLabelButton[m_nCurrentLabelIndex].setChecked(false);
                    m_chkScreen5_UseTempLabel.setChecked(true);
                }
            } else {
                m_arrLabelButton[m_nCurrentLabelIndex].setChecked(true);
                m_sCurrentLabel = m_lstSensorDataLabel.get(m_nCurrentLabelIndex);
            }
        }
    };

    /* Event listener for sensor radiogroup selection */
    private RadioGroup.OnCheckedChangeListener m_rdgpScreen5_LabelRadioButtonListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub
            for (int i = 0; i < m_lstSensorDataLabel.size(); i++) {
                if (m_arrLabelButton[i].isChecked()) {
                    m_nCurrentLabelIndex = i;
                    m_sCurrentLabel = m_lstSensorDataLabel.get(i);
                    m_lstUsedSensorDateLabel.add(m_sCurrentLabel);
                    break;
                }
            }

            m_chkScreen5_UseTempLabel.setChecked(false);
        }
    };

    private Button.OnClickListener m_btnScreen6_Back_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            show_screen4();
        }
    };

    private Button.OnClickListener m_btnScreen6_Upload_Listener = new Button.OnClickListener() {
        public void onClick(View v) {

            if (m_blnUploadFunctionEnabled) {

                m_nPreviousScreen = SCREEN_6;
                show_screenUploadData();
            }

        }
    };

    //Processing for uploading data
    private Button.OnClickListener m_btnScreenUploadData_Upload_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            if (m_blnUpload == false) {
                if (m_lstUnUploadedFileName.size() == 0)
                    return;

                List<String> lstSelectedUploadFile = new ArrayList<String>();
                List<Integer> lstSelectedUploadFileID = new ArrayList<Integer>();

                for (int i = 0; i < m_lstUnUploadedFileName.size(); i++) {
                    if (m_arrChkFilename[i].isChecked() == true) {
                        lstSelectedUploadFile.add(m_lstUnUploadedFileName.get(i));
                        lstSelectedUploadFileID.add(i);
                    }
                }

                if (lstSelectedUploadFile.size() == 0) {
                    Toast.makeText(getApplicationContext(), "Please select file to upload!", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }

                m_btnScreenUploadData_Back.setEnabled(false);
                m_pgbActivityIndicator.setVisibility(View.VISIBLE);
                for (int i = 0; i < m_lstUnUploadedFileName.size(); i++) {
                    m_arrChkFilename[i].setEnabled(false);
                }
                m_btnScreenUploadData_Upload.setText(R.string.cancelupload);

                m_blnUpload = true;
                m_lstUploadedFileNameIndex.clear();

                new SensorDataUpload(lstSelectedUploadFile, lstSelectedUploadFileID).execute();

            } else {

                //Update the UnUploadedFileName.txt
                for (int i = m_lstUploadedFileNameIndex.size() - 1; i >= 0; i--) {
                    m_lstUnUploadedFileName.remove(m_lstUploadedFileNameIndex.get(i));

                    m_llUploadData_ChkLayoutFileName.removeViewAt(m_lstUploadedFileNameIndex.get(i));
                }

                updateUnUploadedFileName(m_lstUnUploadedFileName);

                refreshUploadFileNameBox();

                m_btnScreenUploadData_Back.setEnabled(true);
                m_pgbActivityIndicator.setVisibility(View.GONE);

                m_btnScreenUploadData_Upload.setText(R.string.upload);

                m_blnUpload = false;

            }
        }
    };

    private Button.OnClickListener m_btScreenUploadData_Back_Listener = new Button.OnClickListener() {
        public void onClick(View v) {
            if (m_nPreviousScreen == SCREEN_1) {
                show_screen1();
            } else {
                show_screen4();
            }
        }
    };

    private void UpdateSensorServiceRegistration() {
        //Register sensors according to the enable/disable status
        //       if (m_blnAcclEnabled) {
        //          m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), m_nAcclMode);
        //          m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), m_nAcclMode);
        //       } else {
        //          m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION));
        //          m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
        //       }

        if (m_blnAcclEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    m_nAcclMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
        }

        if (m_blnLinearAcclEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                    m_nLinearAcclMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome,
                    m_smSurScan.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION));
        }

        if (m_blnGravityEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_GRAVITY),
                    m_nGravityMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_GRAVITY));
        }

        if (m_blnGyroEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
                    m_nGyroMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_GYROSCOPE));
        }

        if (m_blnMagnetEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                    m_nMagnetMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD));
        }

        // Changed on 20150910
        //       if (m_blnOrientEnabled) {
        //         if (!m_blnAcclEnabled) { 
        //            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), m_nOrientMode);
        //         }
        //         
        //         if (!m_blnMagnetEnabled) {
        //            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), m_nOrientMode);
        //         }              
        //       } else {
        //          if (!m_blnAcclEnabled) {
        //             m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
        //          }
        //          
        //          if (!m_blnMagnetEnabled) {
        //             m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD));
        //          }
        //       }

        if (m_blnOrientEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR),
                    m_nOrientMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR));
        }

        if (m_blnLightEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_LIGHT), m_nLightMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_LIGHT));
        }

        if (m_blnBarometerEnabled) {
            m_smSurScan.registerListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_PRESSURE),
                    m_nBarometerMode);
        } else {
            m_smSurScan.unregisterListener(m_actHome, m_smSurScan.getDefaultSensor(Sensor.TYPE_PRESSURE));
        }

    }

    /* Event listener for Start Record button on Screen 4 */
    private Button.OnClickListener m_btnStartRecordListener = new Button.OnClickListener() {
        public void onClick(View v) {
            String sDataDir;
            File flDataFolder;
            boolean blnSensorSelected = false;
            boolean blnWifiSelected = false;

            if (m_blnRecordStatus == false) {

                if ((m_blnOrientEnabled == false) && (m_blnGyroEnabled == false) && (m_blnAcclEnabled == false)
                        && (m_blnLinearAcclEnabled == false) && (m_blnGravityEnabled == false)
                        && (m_blnMagnetEnabled == false) && (m_blnLightEnabled == false)
                        && (m_blnBarometerEnabled == false)) {
                    // No sensor has been selected
                    blnSensorSelected = false;
                } else {
                    blnSensorSelected = true;
                }

                if ((m_blnWifiSignalEnabled == true) && (m_blnWifiEnabled == true)) {
                    blnWifiSelected = true;
                    // Start scanning Wifi
                    m_receiverWifi = new WifiReceiver();
                    registerReceiver(m_receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                    //m_mainWifi.startScan();

                    startWiFiScan();

                }

                if (m_blnGPSSignalEnabled == true && m_blnGPSEnabled == true) {
                    m_locManager.requestLocationUpdates(m_sGPSProvider, 0L, 0.0f, m_locListener);
                }

                if (blnSensorSelected == false && blnWifiSelected == false && m_blnMicEnabled == false
                        && m_blnCellularEnabled == false
                        && (m_blnGPSSignalEnabled == false || m_blnGPSEnabled == false)) {

                    return;
                }

                // Start to record
                m_dtFileStart = new Date();
                final String DATE_FORMAT = "yyyyMMddHHmmss";
                final String DATE_FORMAT_READABLE = "yyyy/MM/dd HH:mm:ss";
                SimpleDateFormat spdCurrentTime = new SimpleDateFormat(DATE_FORMAT);
                SimpleDateFormat spdCurrentTimeReadable = new SimpleDateFormat(DATE_FORMAT_READABLE);

                if (blnSensorSelected || m_blnGPSEnabled || blnWifiSelected || m_blnMicEnabled
                        || m_blnCellularEnabled) {
                    m_sRecordFile = spdCurrentTime.format(m_dtFileStart);
                    m_sSensingStartTime = spdCurrentTimeReadable.format(m_dtFileStart);
                }

                if (blnSensorSelected || m_blnGPSEnabled || blnWifiSelected || m_blnMicEnabled
                        || m_blnCellularEnabled) {
                    m_sFullPathFile = m_sSensorDataFolder + File.separator;

                    if (m_sUsername.length() > 0) {
                        m_sFullPathFile = m_sFullPathFile + m_sUsername + "-";
                    }

                    if (m_sProjectName.length() > 0) {
                        m_sFullPathFile = m_sFullPathFile + m_sProjectName + "-";
                    }

                    m_sFullPathFile = m_sFullPathFile + m_sRecordFile;

                    // Append file type information to the file name
                    m_sFullPathFile = m_sFullPathFile + getFileType();

                    try {
                        m_fwSensorRecord = new FileWriter(m_sFullPathFile);
                    } catch (IOException e) {
                        m_fwSensorRecord = null;
                        return;
                    }

                }

                if (m_blnMicEnabled) {

                    if (m_blnRecordSoundFile == true) {
                        m_sRecordFullPathFile = m_sSensorDataFolder + File.separator;

                        if (m_sUsername.length() > 0) {
                            m_sRecordFullPathFile = m_sRecordFullPathFile + m_sUsername + "-";
                        }

                        if (m_sProjectName.length() > 0) {
                            m_sRecordFullPathFile = m_sRecordFullPathFile + m_sProjectName + "-";
                        }

                        m_sRecordFullPathFile = m_sRecordFullPathFile + m_sRecordFile;
                    }

                    startAudioRecording();
                }

                if (m_blnCellularEnabled) {
                    startGettingCellularNetworkInfo();
                }

                // Disable setting for sensor when recording
                enableSensorSetting(false);

                m_nCurrentLabelIndex = m_spnScreen4_SelectSensorDataLabel.getSelectedItemPosition();
                m_sCurrentLabel = m_lstSensorDataLabel.get(m_nCurrentLabelIndex);
                m_lstUsedSensorDateLabel.clear();

                // Save to file once an interval
                m_blnRecordStatus = true;

                m_wakeLock.acquire();

                show_screen5();
            }
        }
    };

    /* Event listener for Stop Recording button on Screen 5 */
    private Button.OnClickListener m_btnStopRecordListener = new Button.OnClickListener() {
        public void onClick(View v) {

            if (m_blnRecordStatus == true) {
                // Stop record. Close Sensor Record File
                if (m_fwSensorRecord != null) {
                    try {
                        m_fwSensorRecord.close();
                        m_fwSensorRecord = null;
                    } catch (IOException e) {
                        //
                    }
                }

                if (m_blnMicEnabled) {
                    stopAudioRecording();
                }

                if (m_blnCellularEnabled) {
                    stopGettingCellularNetworkInfo();
                }

                if ((m_blnWifiSignalEnabled == true) && (m_blnWifiEnabled == true)) {
                    stopWiFiScan();
                }

                if (m_blnGPSSignalEnabled && m_blnGPSEnabled) {
                    m_locManager.removeUpdates(m_locListener);
                }

                Date dtTmp = new Date();
                final String DATE_FORMAT_READABLE = "yyyy/MM/dd HH:mm:ss";
                SimpleDateFormat spdCurrentTime = new SimpleDateFormat(DATE_FORMAT_READABLE);
                m_sSensingEndTime = spdCurrentTime.format(dtTmp);

                // Enable sensor setting when recording stops
                enableSensorSetting(true);

                resetValues();
                m_blnRecordStatus = false;

                updateUnUploadedFileName(m_sFullPathFile);

                m_wakeLock.release();

                show_screen5_GpsUp();

                show_screen6();
            }
        }
    };

    /* Check the availability of sensors, disable relative widgets */
    private void checkSensorAvailability() {
        //List<Sensor> lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_ORIENTATION);
        List<Sensor> lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_ROTATION_VECTOR); //Changed on 20150910
        if (lstSensor.size() > 0) {
            m_blnOrientPresent = true;
        } else {
            m_blnOrientPresent = false;
            m_blnOrientEnabled = false;
        }

        lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_GYROSCOPE);
        if (lstSensor.size() > 0) {
            m_blnGyroPresent = true;
        } else {
            m_blnGyroPresent = false;
            m_blnGyroEnabled = false;
        }

        lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_ACCELEROMETER);
        if (lstSensor.size() > 0) {
            m_blnAcclPresent = true;
        } else {
            m_blnAcclPresent = false;
            m_blnAcclEnabled = false;
        }

        lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_LINEAR_ACCELERATION);
        if (lstSensor.size() > 0) {
            m_blnLinearAcclPresent = true;
        } else {
            m_blnLinearAcclPresent = false;
            m_blnLinearAcclEnabled = false;
        }

        lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_GRAVITY);
        if (lstSensor.size() > 0) {
            m_blnGravityPresent = true;
        } else {
            m_blnGravityPresent = false;
            m_blnGravityEnabled = false;
        }

        lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
        if (lstSensor.size() > 0) {
            m_blnMagnetPresent = true;
        } else {
            m_blnMagnetPresent = false;
            m_blnMagnetEnabled = false;
        }

        lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_LIGHT);
        if (lstSensor.size() > 0) {
            m_blnLightPresent = true;
        } else {
            m_blnLightPresent = false;
            m_blnLightEnabled = false;
        }

        lstSensor = m_smSurScan.getSensorList(Sensor.TYPE_PRESSURE);
        if (lstSensor.size() > 0) {
            m_blnBarometerPresent = true;
        } else {
            m_blnBarometerPresent = false;
            m_blnBarometerEnabled = false;
        }

    }

    private void configSensorOptionStatus() {
        if (m_blnOrientPresent == false) {
            m_chkOrient.setEnabled(false);
            m_rdSensorOrient.setEnabled(false);
        }

        if (m_blnGyroPresent == false) {
            m_chkGyro.setEnabled(false);
            m_rdSensorGyro.setEnabled(false);
        }

        if (m_blnAcclPresent == false) {
            m_chkAccl.setEnabled(false);
            m_rdSensorAccl.setEnabled(false);
        }

        if (m_blnLinearAcclPresent == false) {
            m_chkLinearAccl.setEnabled(false);
            m_rdSensorLinearAccl.setEnabled(false);
        }

        if (m_blnGravityPresent == false) {
            m_chkGravity.setEnabled(false);
            m_rdSensorGravity.setEnabled(false);
        }

        if (m_blnMagnetPresent == false) {
            m_chkMagnet.setEnabled(false);
            m_rdSensorMagnet.setEnabled(false);
        }

        if (m_blnLightPresent == false) {
            m_chkLight.setEnabled(false);
            m_rdSensorLight.setEnabled(false);
        }

        if (m_blnBarometerPresent == false) {
            m_chkBarometer.setEnabled(false);
            m_rdSensorBarometer.setEnabled(false);
        }

    }

    /* Calculate orientation from accelerometer and magnetic field value */
    private boolean calculateOrientation() {
        float[] arrfValues = new float[3];
        float[] arrfR = new float[9];
        float[] arrfI = new float[9];

        if ((m_arrfAcclValues == null) || (m_arrfMagnetValues == null)) {
            return false;
        }

        //if (SensorManager.getRotationMatrix(arrfR, null, m_arrfAcclValues, m_arrfMagnetValues)) {    //Ignore inclintion matrix calculation will make the execution faster

        if (SensorManager.getRotationMatrix(arrfR, arrfI, m_arrfAcclValues, m_arrfMagnetValues)) {
            SensorManager.getOrientation(arrfR, arrfValues);
            m_arrfOrientValues[0] = (float) Math.toDegrees(arrfValues[0]);
            m_arrfOrientValues[1] = (float) Math.toDegrees(arrfValues[1]);
            m_arrfOrientValues[2] = (float) Math.toDegrees(arrfValues[2]);

            if (m_arrfOrientValues[0] < 0) {
                m_arrfOrientValues[0] = m_arrfOrientValues[0] + 360; // Make Azimuth 0 ~ 360
            }

            return true;
        } else {
            return false;
        }

    }

    private BroadcastReceiver m_brcvWifiStateChangedReceiver = new BroadcastReceiver() {
        /* Monitor Wifi Enable/Disable status */
        public void onReceive(Context context, Intent intent) {
            int iExtraWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);

            if (iExtraWifiState == WifiManager.WIFI_STATE_ENABLED) {
                m_blnWifiSignalEnabled = true;
                m_chkWifi.setEnabled(true);
            } else if (iExtraWifiState == WifiManager.WIFI_STATE_DISABLED) {
                m_blnWifiSignalEnabled = false;
                m_chkWifi.setEnabled(false);
            }
        }
    };

    public void show_screen1() {
        int nIndex = -1;
        setContentView(R.layout.screen_1_user_project);

        m_rdgpProjectNameType = (RadioGroup) findViewById(R.id.RdGpProjectNameType);
        m_rdProjectNameType_New = (RadioButton) findViewById(R.id.RdProjectNameType_New);
        m_rdProjectNameType_Existing = (RadioButton) findViewById(R.id.RdProjectNameType_Existing);

        m_rdgpUsernameType = (RadioGroup) findViewById(R.id.RdGpUsernameType);
        m_rdUsernameType_New = (RadioButton) findViewById(R.id.RdUsernameType_New);
        m_rdUsernameType_Existing = (RadioButton) findViewById(R.id.RdUsernameType_Existing);

        m_etProjectName_New = (EditText) findViewById(R.id.etProjectNameNew);
        m_etUsername_New = (EditText) findViewById(R.id.etUsernameNew);

        m_spnScreen1_ExistingProjectName = (Spinner) findViewById(R.id.spnSelectExistingProjectName);
        m_spnScreen1_ExistingUsername = (Spinner) findViewById(R.id.spnSelectExistingUsername);

        m_btnScreen1_Next = (Button) findViewById(R.id.Screen1_Next);
        m_btnScreen1_Next.setOnClickListener(m_btnScreen1_Next_Listener);

        m_btnScreen1_Upload = (Button) findViewById(R.id.btScreen1_Upload);
        m_btnScreen1_Upload.setOnClickListener(m_btnScreen1_Upload_Listener);

        m_adpExistingProjectName = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
                m_lstExistingProjectName);
        m_adpExistingProjectName.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        m_spnScreen1_ExistingProjectName.setAdapter(m_adpExistingProjectName);

        m_adpExistingUsername = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
                m_lstExistingUsername);
        m_adpExistingUsername.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        m_spnScreen1_ExistingUsername.setAdapter(m_adpExistingUsername);

        if (m_nProjectNameType == 0) {
            m_rdProjectNameType_New.setChecked(true);
            if (m_sProjectName.length() > 0) {
                m_etProjectName_New.setText(m_sProjectName);
            }
        } else if (m_nProjectNameType == 1) {
            m_rdProjectNameType_Existing.setChecked(true);

            if (m_lstExistingProjectName.size() > 0) {
                nIndex = m_lstExistingProjectName.indexOf(m_sProjectName);
                if (nIndex != -1) {
                    m_spnScreen1_ExistingProjectName.setSelection(nIndex);
                }
            }

        }

        if (m_nUsernameType == 0) {
            m_rdUsernameType_New.setChecked(true);
            if (m_sUsername.length() > 0) {
                m_etUsername_New.setText(m_sUsername);
            }
        } else if (m_nUsernameType == 1) {
            m_rdUsernameType_Existing.setChecked(true);

            if (m_lstExistingUsername.size() > 0) {
                nIndex = m_lstExistingUsername.indexOf(m_sUsername);
                if (nIndex != -1) {
                    m_spnScreen1_ExistingUsername.setSelection(nIndex);
                }
            }

        }

    }

    public void show_screen2() {
        int i;
        Location location = null;

        setContentView(R.layout.screen_2_sensors);

        m_chkAccl = (CheckBox) findViewById(R.id.chkAccl);
        m_chkLinearAccl = (CheckBox) findViewById(R.id.chkLinearAccl);
        m_chkGravity = (CheckBox) findViewById(R.id.chkGravity);
        m_chkGyro = (CheckBox) findViewById(R.id.chkGyro);
        m_chkOrient = (CheckBox) findViewById(R.id.chkOrient);
        m_chkMagnet = (CheckBox) findViewById(R.id.chkMagnetic);
        m_chkLight = (CheckBox) findViewById(R.id.chkLight);
        m_chkBarometer = (CheckBox) findViewById(R.id.chkBarometer);

        m_chkMic = (CheckBox) findViewById(R.id.chkMic);
        m_chkCellular = (CheckBox) findViewById(R.id.chkCellular);

        m_chkGPS = (CheckBox) findViewById(R.id.chkGPS);
        m_chkWifi = (CheckBox) findViewById(R.id.chkWifi);

        m_chkAccl.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkLinearAccl.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkGravity.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkGyro.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkOrient.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkMagnet.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkLight.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkBarometer.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkMic.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkCellular.setOnCheckedChangeListener(m_chkSensorEnableListener);

        m_chkGPS.setOnCheckedChangeListener(m_chkSensorEnableListener);
        m_chkWifi.setOnCheckedChangeListener(m_chkSensorEnableListener);

        m_spnScreen2_WiFiScanSpeed = (Spinner) findViewById(R.id.Screen2_spnWiFiScanSpeed);

        m_adpWiFiScanSpeed = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
                m_arrsWiFiScanSpeed);
        m_adpWiFiScanSpeed.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        m_spnScreen2_WiFiScanSpeed.setAdapter(m_adpWiFiScanSpeed);
        m_spnScreen2_WiFiScanSpeed.setSelection(m_nWifiScanSpeedIndex);

        m_rdgpSensor = (RadioGroup) findViewById(R.id.RdGpSensor);
        m_rdSensorAccl = (RadioButton) findViewById(R.id.RdSensor_Accl);
        m_rdSensorLinearAccl = (RadioButton) findViewById(R.id.RdSensor_LinearAccl);
        m_rdSensorGravity = (RadioButton) findViewById(R.id.RdSensor_Gravity);
        m_rdSensorGyro = (RadioButton) findViewById(R.id.RdSensor_Gyro);
        m_rdSensorOrient = (RadioButton) findViewById(R.id.RdSensor_Orient);
        m_rdSensorMagnet = (RadioButton) findViewById(R.id.RdSensor_Magnetic);
        m_rdSensorLight = (RadioButton) findViewById(R.id.RdSensor_Light);
        m_rdSensorBarometer = (RadioButton) findViewById(R.id.RdSensor_Barometer);

        m_rdgpSensorMode = (RadioGroup) findViewById(R.id.RdGpSensorMode);
        m_rdSensorModeFastest = (RadioButton) findViewById(R.id.RdSensorMode_Fastest);
        m_rdSensorModeGame = (RadioButton) findViewById(R.id.RdSensorMode_Game);
        m_rdSensorModeNormal = (RadioButton) findViewById(R.id.RdSensorMode_Normal);
        m_rdSensorModeUI = (RadioButton) findViewById(R.id.RdSensorMode_UI);

        m_rdgpSensor.setOnCheckedChangeListener(m_rdgpSensorListener);
        m_rdgpSensorMode.setOnCheckedChangeListener(m_rdgpSensorModeListener);

        configSensorOptionStatus();

        m_mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if (m_mainWifi.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
            m_blnWifiSignalEnabled = true;
        } else {
            m_blnWifiSignalEnabled = false;
            m_chkWifi.setEnabled(false);
        }

        this.registerReceiver(m_brcvWifiStateChangedReceiver,
                new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));

        m_locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        m_blnGPSSignalEnabled = m_locManager.isProviderEnabled(m_sGPSProvider);

        if ((m_locManager != null) && (m_blnGPSSignalEnabled == true)) {
            location = m_locManager.getLastKnownLocation(m_sGPSProvider);
            if (location != null) {
                float fLat = (float) (location.getLatitude());
                float fLng = (float) (location.getLongitude());
                if (location.hasAltitude()) {
                    float fAlt = (float) (location.getAltitude());
                }
            }
        }

        m_btnScreen2_Back = (Button) findViewById(R.id.btScreen2_Back);
        m_btnScreen2_Back.setOnClickListener(m_btnScreen2_Back_Listener);
        m_btnScreen2_Next = (Button) findViewById(R.id.btScreen2_Next);
        m_btnScreen2_Next.setOnClickListener(m_btnScreen2_Next_Listener);

        /* No sensor is installed, disable other widgets and show information to user */
        if ((m_blnOrientPresent == false) && (m_blnGyroPresent == false) && (m_blnAcclPresent == false)
                && (m_blnLinearAcclPresent == false) && (m_blnGravityPresent == false)
                && (m_blnMagnetPresent == false) && (m_blnLightPresent == false)
                && (m_blnBarometerPresent == false)) {

            m_rdSensorModeFastest.setEnabled(false);
            m_rdSensorModeGame.setEnabled(false);
            m_rdSensorModeNormal.setEnabled(false);
            m_rdSensorModeUI.setEnabled(false);

        }

        if (m_blnAcclEnabled == true) {
            m_chkAccl.setChecked(true);
        }

        if (m_blnLinearAcclEnabled == true) {
            m_chkLinearAccl.setChecked(true);
        }

        if (m_blnGravityEnabled == true) {
            m_chkGravity.setChecked(true);
        }

        if (m_blnGyroEnabled == true) {
            m_chkGyro.setChecked(true);
        }

        if (m_blnOrientEnabled == true) {
            m_chkOrient.setChecked(true);
        }

        if (m_blnMagnetEnabled == true) {
            m_chkMagnet.setChecked(true);
        }

        if (m_blnLightEnabled == true) {
            m_chkLight.setChecked(true);
        }

        if (m_blnBarometerEnabled == true) {
            m_chkBarometer.setChecked(true);
        }

        if (m_blnMicEnabled == true) {
            m_chkMic.setChecked(true);
        }

        if (m_blnCellularEnabled == true) {
            m_chkCellular.setChecked(true);
        }

        if (m_blnGPSEnabled == true) {
            m_chkGPS.setChecked(true);
        }

        if (m_blnWifiEnabled == true) {
            m_chkWifi.setChecked(true);
        }

        Settings.System.putInt(getContentResolver(), Settings.System.WIFI_SLEEP_POLICY,
                Settings.System.WIFI_SLEEP_POLICY_NEVER);

    }

    public void show_screen3() {
        int nLast;
        String sLabelList = "";

        setContentView(R.layout.screen_3_label);

        m_etSensorDataLabel = (EditText) findViewById(R.id.etSensorDataLabel);

        m_btnScreen3_AddLabel = (Button) findViewById(R.id.btScreen3_AddLabel);
        m_btnScreen3_AddLabel.setOnClickListener(m_btnScreen3_AddLabel_Listener);
        m_etScreen3LabelList = (EditText) findViewById(R.id.tvScreen3LabelList);

        m_btnScreen3_Back = (Button) findViewById(R.id.btScreen3_Back);
        m_btnScreen3_Back.setOnClickListener(m_btnScreen3_Back_Listener);

        m_btnScreen3_Next = (Button) findViewById(R.id.btScreen3_Next);
        m_btnScreen3_Next.setOnClickListener(m_btnScreen3_Next_Listener);

        nLast = m_lstSensorDataLabel.size() - 1;
        for (int i = 0; i < m_lstSensorDataLabel.size(); i++) {
            if (i != nLast) {
                sLabelList = sLabelList + m_lstSensorDataLabel.get(i) + "\n";
            } else {
                sLabelList = sLabelList + m_lstSensorDataLabel.get(i);
            }
        }

        m_etScreen3LabelList.setText(sLabelList);

    }

    public void show_screen4() {

        setContentView(R.layout.screen_4_start);

        m_spnScreen4_SelectSensorDataLabel = (Spinner) findViewById(R.id.Screen4_spnSelectSensorDataLabel);

        m_adpSensorDataLabel = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
                m_lstSensorDataLabel);
        m_adpSensorDataLabel.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        m_spnScreen4_SelectSensorDataLabel.setAdapter(m_adpSensorDataLabel);

        m_chkNoLabel = (CheckBox) findViewById(R.id.chkNoLabel);

        m_btnScreen4_Start = (Button) findViewById(R.id.btScreen4_Start);
        m_btnScreen4_Start.setOnClickListener(m_btnStartRecordListener);

        m_btnScreen4_Back = (Button) findViewById(R.id.btScreen4_Back);
        m_btnScreen4_Back.setOnClickListener(m_btnScreen4_Back_Listener);

        m_chkNoLabel.setChecked(m_blnNoLabel);
        m_chkNoLabel.setOnCheckedChangeListener(m_chkNoLabel_Listener);
    }

    public void show_screen5() {
        String sSensorList = "";

        setContentView(R.layout.screen_5_stop);

        m_tvGpsUp = (TextView) findViewById(R.id.Screen5_GpsUp);
        m_tvSensingInfo = (TextView) findViewById(R.id.Screen5_SensingInfo);

        m_btnScreen5_Stop = (Button) findViewById(R.id.btScreen5_Stop);
        m_btnScreen5_Stop.setOnClickListener(m_btnStopRecordListener);

        if (m_blnAcclEnabled) {
            sSensorList = sSensorList + "   - Accelerometer" + "\n";
        }

        if (m_blnLinearAcclEnabled) {
            sSensorList = sSensorList + "   - Linear Accl" + "\n";
        }

        if (m_blnGravityEnabled) {
            sSensorList = sSensorList + "   - Gravity" + "\n";
        }

        if (m_blnGyroEnabled) {
            sSensorList = sSensorList + "   - Gyroscope" + "\n";
        }

        if (m_blnOrientEnabled) {
            sSensorList = sSensorList + "   - Orientation" + "\n";
        }

        if (m_blnMagnetEnabled) {
            sSensorList = sSensorList + "   - Magnetic Field" + "\n";
        }

        if (m_blnLightEnabled) {
            sSensorList = sSensorList + "   - Light" + "\n";
        }

        if (m_blnBarometerEnabled) {
            sSensorList = sSensorList + "   - Barometer" + "\n";
        }

        if (m_blnMicEnabled) {
            sSensorList = sSensorList + "   - Microphone" + "\n";
        }

        if (m_blnCellularEnabled) {
            sSensorList = sSensorList + "   - Cellular ID" + "\n";
        }

        if (m_blnGPSEnabled) {
            sSensorList = sSensorList + "   - GPS" + "\n";
        }

        if (m_blnWifiEnabled) {
            sSensorList = sSensorList + "   - WiFi" + "\n";
        }

        m_tvSensingInfo.setText(sSensorList);

        m_etScreen5_TempLabel = (EditText) findViewById(R.id.Screen5_etTempLabel);
        m_chkScreen5_UseTempLabel = (CheckBox) findViewById(R.id.Screen5_chkUseTempLabel);
        m_chkScreen5_UseTempLabel.setOnCheckedChangeListener(m_chkScreen5_UseTempLabelListener);

        m_svScreen5_Label = (ScrollView) findViewById(R.id.Screen5_scrollview);

        m_rdgpLabelRadioButtonGroup = (RadioGroup) findViewById(R.id.Screen5_LabelRadioButtonGroup);
        m_rdgpLabelRadioButtonGroup.setOnCheckedChangeListener(m_rdgpScreen5_LabelRadioButtonListener);

        m_arrLabelButton = new RadioButton[m_lstSensorDataLabel.size()];

        for (int i = 0; i < m_lstSensorDataLabel.size(); i++) {
            m_arrLabelButton[i] = new RadioButton(this);
            m_arrLabelButton[i].setText(m_lstSensorDataLabel.get(i));

            m_rdgpLabelRadioButtonGroup.addView(m_arrLabelButton[i], m_lpLabelButtonParams);
            if (i == m_nCurrentLabelIndex) {
                m_arrLabelButton[i].setChecked(true);
            }
        }

        m_svScreen5_Label.post(new Runnable() {
            public void run() {
                if (m_nCurrentLabelIndex != -1) {
                    int nY = (int) (m_rdgpLabelRadioButtonGroup.getHeight() * m_nCurrentLabelIndex
                            / m_lstSensorDataLabel.size());

                    m_svScreen5_Label.scrollTo(0, nY);
                }

            }
        });

        String sInfo = "";

        if (m_blnNoLabel == true) {
            sInfo = "No Label";
        } else {
            sInfo = "Labeling";
        }

        m_tvGpsUp.setText(sInfo);
    }

    public void show_screen5_GpsUp() {
        String sInfo = "";

        if (m_blnNoLabel == true) {
            sInfo = "No Label";
        } else {
            sInfo = "Labeling";
        }

        if (m_blnGpsUp == false) {
            sInfo = sInfo + "";
            //m_tvGpsUp.setText("");
        } else {
            sInfo = sInfo + " *GPS ON*";
            //m_tvGpsUp.setText("**GPS ON**");
        }

        m_tvGpsUp.setText(sInfo);
    }

    public void show_screen6() {
        List<String> lstLabelNoDuplicate = new ArrayList<String>();
        String sTmpLabel = "";

        setContentView(R.layout.screen_6_summary);

        m_tvScreen6_Username = (TextView) findViewById(R.id.Screen6_tvUsername);
        m_tvScreen6_ProjectName = (TextView) findViewById(R.id.Screen6_tvProjectName);
        m_tvScreen6_StartTime = (TextView) findViewById(R.id.Screen6_tvStartTime);
        m_tvScreen6_EndTime = (TextView) findViewById(R.id.Screen6_tvEndTime);
        m_tvScreen6_LabelNumber = (TextView) findViewById(R.id.Screen6_tvLabelNumber);

        m_btnScreen6_Back = (Button) findViewById(R.id.btScreen6_Back);
        m_btnScreen6_Back.setOnClickListener(m_btnScreen6_Back_Listener);

        m_btnScreen6_Upload = (Button) findViewById(R.id.btScreen6_Upload);
        m_btnScreen6_Upload.setOnClickListener(m_btnScreen6_Upload_Listener);

        m_tvScreen6_Username.setText(m_sUsername);
        m_tvScreen6_ProjectName.setText(m_sProjectName);
        m_tvScreen6_StartTime.setText(m_sSensingStartTime);
        m_tvScreen6_EndTime.setText(m_sSensingEndTime);

        if (m_lstUsedSensorDateLabel.size() > 0) {
            lstLabelNoDuplicate.add(m_lstUsedSensorDateLabel.get(0));
        }

        for (int i = 1; i < m_lstUsedSensorDateLabel.size(); i++) {
            sTmpLabel = m_lstUsedSensorDateLabel.get(i);
            if (lstLabelNoDuplicate.contains(sTmpLabel) == false) {
                lstLabelNoDuplicate.add(sTmpLabel);
            }
        }

        m_tvScreen6_LabelNumber.setText(Integer.valueOf(lstLabelNoDuplicate.size()).toString());

    }

    //Get the list of sensor data files which have not been uploaded
    private void readUnUploadedFileName() {
        String sUnUploadedFileNameFilePath = "";
        File flFile;
        FileReader fr;
        BufferedReader br;
        String sLine = "";

        m_lstUnUploadedFileName.clear();

        sUnUploadedFileNameFilePath = m_sSettingFoler + File.separator + m_sUnUploadedFileName;

        flFile = new File(sUnUploadedFileNameFilePath);
        if (flFile.exists()) {
            //Derive existing labels
            try {
                fr = new FileReader(sUnUploadedFileNameFilePath);
                br = new BufferedReader(fr);

                while ((sLine = br.readLine()) != null) {
                    m_lstUnUploadedFileName.add(sLine);
                }

                fr.close();
            } catch (Exception e) {

            }
        }

    }

    private void updateUnUploadedFileName(String sFilePathName) {
        try {
            String sUnUploadedFileNameFilePath = m_sSettingFoler + File.separator + m_sUnUploadedFileName;

            FileWriter fwUnUploadedFile = new FileWriter(sUnUploadedFileNameFilePath, true); //Append

            String sLine = sFilePathName + "\n";
            fwUnUploadedFile.write(sLine);

            fwUnUploadedFile.close();
        } catch (Exception e) {

        }

    }

    private void updateUnUploadedFileName(List<String> lstFilePathName) {
        try {
            String sUnUploadedFileNameFilePath = m_sSettingFoler + File.separator + m_sUnUploadedFileName;

            FileWriter fwUnUploadedFile = new FileWriter(sUnUploadedFileNameFilePath, false); //Overwrite

            String sLine;

            for (int i = 0; i < lstFilePathName.size(); i++) {
                sLine = lstFilePathName.get(i) + "\n";
                fwUnUploadedFile.write(sLine);
            }

            fwUnUploadedFile.close();
        } catch (Exception e) {

        }

    }

    private String getFileName(String sFilePathName) {
        String sFileName;
        int nPos = -1;

        nPos = sFilePathName.lastIndexOf('/');
        sFileName = sFilePathName.substring(nPos + 1);
        return sFileName;
    }

    private void show_screenUploadData() {
        int nCount;

        setContentView(R.layout.screen_upload_data);
        m_btnScreenUploadData_Back = (Button) findViewById(R.id.btScreenUploadData_Back);
        m_btnScreenUploadData_Back.setOnClickListener(m_btScreenUploadData_Back_Listener);

        m_btnScreenUploadData_Upload = (Button) findViewById(R.id.btScreenUploadData_Upload);
        m_btnScreenUploadData_Upload.setText(R.string.upload);
        m_btnScreenUploadData_Upload.setOnClickListener(m_btnScreenUploadData_Upload_Listener);

        m_blnUpload = false;

        m_pgbActivityIndicator = (ProgressBar) findViewById(R.id.ScreenUploadData_UploadProgress);

        m_llUploadData_ChkLayoutFileName = (LinearLayout) findViewById(R.id.ScreenUploadData_ChkLayoutFileName);

        readUnUploadedFileName();

        nCount = m_lstUnUploadedFileName.size();
        m_arrChkFilename = new CheckBox[nCount];

        for (int i = 0; i < nCount; i++) {
            m_arrChkFilename[i] = new CheckBox(this);
            m_arrChkFilename[i].setId(i);
            m_arrChkFilename[i].setText(getFileName(m_lstUnUploadedFileName.get(i)));
            m_arrChkFilename[i].setOnCheckedChangeListener(null);
            m_arrChkFilename[i].setLayoutParams(m_lpFilenameChkParams);
            m_llUploadData_ChkLayoutFileName.addView(m_arrChkFilename[i]);

        }

    }

    //This function prepare the existing project names/usernames/labels
    private void preconfigSetting() {
        String sAppFolder = "";
        String sExistingProjectNameFilePath = "";
        String sExistingUsernameFilePath = "";
        String sExistingLabelFilePath = "";
        File flFolder, flFile;
        FileReader fr;
        BufferedReader br;
        String sLine = "";

        // Check whether SD Card has been plugged in
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            sAppFolder = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator
                    + getString(R.string.app_folder);
            flFolder = new File(sAppFolder);
            //Check whether /mnt/sdcard/Sensing/ exists
            if (!flFolder.exists()) {
                //Does not exist, create it
                if (flFolder.mkdir()) {

                } else {
                    //Failed to create
                    Toast.makeText(getApplicationContext(), "SD Card is not accessible!", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }
            }

            m_sSettingFoler = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator
                    + getString(R.string.app_folder) + File.separator + getString(R.string.setting_folder);
            flFolder = new File(m_sSettingFoler);
            //Check whether /mnt/sdcard/Sensing/Setting/ exists
            if (!flFolder.exists()) {
                //Does not exist, create it
                if (flFolder.mkdir()) {

                } else {
                    //Failed to create
                    Toast.makeText(getApplicationContext(), "SD Card is not accessible!", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }
            } else {
                sExistingProjectNameFilePath = m_sSettingFoler + File.separator + m_sExistingProjectNameFileName;

                flFile = new File(sExistingProjectNameFilePath);
                if (flFile.exists()) {
                    //Derive existing project names
                    try {
                        fr = new FileReader(sExistingProjectNameFilePath);
                        br = new BufferedReader(fr);

                        while ((sLine = br.readLine()) != null) {
                            m_lstExistingProjectName.add(sLine);
                        }

                        fr.close();
                    } catch (Exception e) {

                    }

                }

                sExistingUsernameFilePath = m_sSettingFoler + File.separator + m_sExistingUsernameFileName;

                flFile = new File(sExistingUsernameFilePath);
                if (flFile.exists()) {
                    //Derive existing usernames
                    try {
                        fr = new FileReader(sExistingUsernameFilePath);
                        br = new BufferedReader(fr);

                        while ((sLine = br.readLine()) != null) {
                            m_lstExistingUsername.add(sLine);
                        }

                        fr.close();
                    } catch (Exception e) {

                    }

                }

                sExistingLabelFilePath = m_sSettingFoler + File.separator + m_sExistingLabelFileName;

                flFile = new File(sExistingLabelFilePath);
                if (flFile.exists()) {
                    //Derive existing labels
                    try {
                        fr = new FileReader(sExistingLabelFilePath);
                        br = new BufferedReader(fr);

                        while ((sLine = br.readLine()) != null) {
                            m_lstSensorDataLabel.add(sLine);
                        }

                        fr.close();
                    } catch (Exception e) {

                    }
                }

            }

            m_sSensorDataFolder = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator
                    + getString(R.string.app_folder) + File.separator + getString(R.string.sensordata_folder);
            flFolder = new File(m_sSensorDataFolder);
            //Check whether /mnt/sdcard/Sensing/SensorData/ exists
            if (!flFolder.exists()) {
                //Does not exist, create it
                if (flFolder.mkdir()) {

                } else {
                    //Failed to create
                    Toast.makeText(getApplicationContext(), "SD Card is not accessible!", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }
            }

        } else {
            //NO SD Card
            Toast.makeText(getApplicationContext(), "Please insert SD Card!", Toast.LENGTH_SHORT).show();
            return;
        }

    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        int i;
        Location location = null;

        super.onCreate(savedInstanceState);

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        try {
            Class.forName("android.os.AsyncTask");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        m_smSurScan = (SensorManager) getSystemService(SENSOR_SERVICE);

        PackageManager pm = getPackageManager();
        m_riHome = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), 0);

        m_nBufferSize = AudioRecord.getMinBufferSize(m_nAudioSampleRate, AudioFormat.CHANNEL_IN_STEREO,
                AudioFormat.ENCODING_PCM_16BIT);

        m_tmCellular = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        checkSensorAvailability();

        //Get Existing Project Name and Existing User Name
        preconfigSetting();

        /* When the power button is pressed and the screen goes off, the sensors will stop work by default,
         * Here keep the CPU on to keep sensor alive and also use SCREEN_OFF notification to re-enable GPS/WiFi
         */
        PowerManager pwrManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        m_wakeLock = pwrManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);

        registerReceiver(m_ScreenOffReceiver, filter);

        show_screen1();
    }

    public void startActivitySafely(Intent intent) {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, "unable to open", Toast.LENGTH_SHORT).show();
        } catch (SecurityException e) {
            Toast.makeText(this, "unable to open", Toast.LENGTH_SHORT).show();
        }

    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            //Show MAIN app without finishing current activity
            ActivityInfo ai = m_riHome.activityInfo;
            Intent startIntent = new Intent(Intent.ACTION_MAIN);
            startIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            startIntent.setComponent(new ComponentName(ai.packageName, ai.name));
            startActivitySafely(startIntent);
            return true;
        } else {
            return super.onKeyDown(keyCode, event);
        }
    }

    protected void onResume() {
        super.onResume();
    }

    protected void onStop() {
        super.onStop();
    }

    //Record Sound Level
    public void recordSoundLevel(double fSoundLevelDb) {
        SensorData senData = new SensorData(DATA_TYPE_MIC, fSoundLevelDb);
        recordSensingInfo(senData);
    }

    //Record Cellular Network ID
    public void recordCellInfo(int nCellId) {
        SensorData senData = new SensorData(DATA_TYPE_CELLULAR, nCellId);
        recordSensingInfo(senData);
    }

    //Record GPS Readings
    public void recordLocation(Location location) {
        SensorData senData = new SensorData(DATA_TYPE_GPS, location);
        recordSensingInfo(senData);
    }

    //Record Sensor readings
    public void onSensorChanged(SensorEvent event) {
        SensorData senData = new SensorData(DATA_TYPE_SENSOR, event);
        recordSensingInfo(senData);
    }

    //Organize the sensing information and save into CSV file
    public void recordSensingInfo(SensorData senData) {
        String sRecordLine;
        String sTimeField;
        Date dtCurDate;
        int i;
        long lStartTime = 0;
        long lCurrentTime = 0;
        SimpleDateFormat spdRecordTime, spdCurDateTime;
        final String DATE_FORMAT = "yyyyMMddHHmmss";
        final String DATE_FORMAT_S = "yyMMddHHmmssSSS"; //"yyyyMMddHHmmssSSS"
        int nSensorReadingType = SENSOR_EVENT_NULL;
        int nSensorDataType;

        if (m_blnRecordStatus == false) { //Stopped
            return;
        }

        dtCurDate = new Date();

        // Timestamp for the record
        spdRecordTime = new SimpleDateFormat(DATE_FORMAT_S);
        sTimeField = spdRecordTime.format(dtCurDate);

        nSensorDataType = senData.getSensorDataType();

        if (nSensorDataType == DATA_TYPE_SENSOR) {
            SensorEvent event;

            event = senData.getSensorEvent();

            synchronized (this) {
                switch (event.sensor.getType()) {

                case Sensor.TYPE_ACCELEROMETER:
                    //X, Y, Z
                    if (m_blnAcclEnabled) {
                        m_sAccl = Float.toString(event.values[0]) + "," + Float.toString(event.values[1]) + ","
                                + Float.toString(event.values[2]) + ",";

                        nSensorReadingType = SENSOR_EVENT_ACCL;
                    }

                    //                   if (m_blnOrientEnabled) {
                    //                      m_arrfAcclValues = event.values.clone();
                    //                      
                    //                      if (calculateOrientation()) {
                    //                         //Azimuth (rotation around z-axis); Pitch (rotation around x-axis), Roll (rotation around y-axis)
                    //                         m_sOrient = Float.toString(m_arrfOrientValues[0]) + "," + 
                    //                                  Float.toString(m_arrfOrientValues[1]) + "," + 
                    //                                  Float.toString(m_arrfOrientValues[2]) + ",";
                    //                         
                    //                         nSensorReadingType = SENSOR_EVENT_ORIENT;
                    //                         
                    //                      }
                    //                   }
                    break;

                case Sensor.TYPE_LINEAR_ACCELERATION:
                    //X,Y,Z
                    if (m_blnLinearAcclEnabled) {
                        m_sLinearAccl = Float.toString(event.values[0]) + "," + Float.toString(event.values[1])
                                + "," + Float.toString(event.values[2]) + ",";

                        nSensorReadingType = SENSOR_EVENT_LINEAR_ACCL;
                    }

                    break;

                case Sensor.TYPE_GRAVITY:
                    //X,Y,Z
                    if (m_blnGravityEnabled) {
                        m_sGravity = Float.toString(event.values[0]) + "," + Float.toString(event.values[1]) + ","
                                + Float.toString(event.values[2]) + ",";

                        nSensorReadingType = SENSOR_EVENT_GRAVITY;
                    }

                    break;

                case Sensor.TYPE_GYROSCOPE:
                    //X,Y,Z
                    m_sGyro = Float.toString(event.values[0]) + "," + Float.toString(event.values[1]) + ","
                            + Float.toString(event.values[2]) + ",";
                    nSensorReadingType = SENSOR_EVENT_GYRO;
                    break;

                case Sensor.TYPE_MAGNETIC_FIELD:
                    // Values are in micro-Tesla (uT) and measure the ambient magnetic field 
                    if (m_blnMagnetEnabled) {
                        m_sMagnet = Float.toString(event.values[0]) + "," + Float.toString(event.values[1]) + ","
                                + Float.toString(event.values[2]) + ",";

                        nSensorReadingType = SENSOR_EVENT_MAGNET;
                    }

                    //                   if (m_blnOrientEnabled) {
                    //                      m_arrfMagnetValues = event.values.clone();
                    //                      
                    //                      if (calculateOrientation()) {
                    //                         //Azimuth (rotation around z-axis); Pitch (rotation around x-axis), Roll (rotation around y-axis)
                    //                         m_sOrient = Float.toString(m_arrfOrientValues[0]) + "," + 
                    //                                  Float.toString(m_arrfOrientValues[1]) + "," + 
                    //                                  Float.toString(m_arrfOrientValues[2]) + ",";
                    //                                                  
                    //                         if (nSensorReadingType != SENSOR_EVENT_MAGNET) {
                    //                            nSensorReadingType = SENSOR_EVENT_ORIENT;
                    //                         }
                    //                      }
                    //                   }

                    break;

                case Sensor.TYPE_ROTATION_VECTOR: //Added on 20150910
                    if (m_blnOrientEnabled) {
                        float[] arrfRotVal = new float[3];
                        float[] arrfR = new float[9];
                        float[] arrfValues = new float[3];

                        try {
                            System.arraycopy(event.values, 0, arrfRotVal, 0, event.values.length);
                        } catch (IllegalArgumentException e) {
                            //Hardcode the size to handle a bug on Samsung devices
                            System.arraycopy(event.values, 0, arrfRotVal, 0, 3);
                        }

                        SensorManager.getRotationMatrixFromVector(arrfR, arrfRotVal);
                        SensorManager.getOrientation(arrfR, arrfValues);

                        m_arrfOrientValues[0] = (float) Math.toDegrees(arrfValues[0]);
                        m_arrfOrientValues[1] = (float) Math.toDegrees(arrfValues[1]);
                        m_arrfOrientValues[2] = (float) Math.toDegrees(arrfValues[2]);

                        if (m_arrfOrientValues[0] < 0) {
                            m_arrfOrientValues[0] = m_arrfOrientValues[0] + 360; // Make Azimuth 0 ~ 360
                        }

                        //                      //Azimuth (rotation around z-axis); Pitch (rotation around x-axis), Roll (rotation around y-axis)
                        m_sOrient = Float.toString(m_arrfOrientValues[0]) + ","
                                + Float.toString(m_arrfOrientValues[1]) + ","
                                + Float.toString(m_arrfOrientValues[2]) + ",";

                        //m_tvGpsUp.setText(m_sOrient); //Show orientation
                        nSensorReadingType = SENSOR_EVENT_ORIENT;
                    }

                    break;

                case Sensor.TYPE_LIGHT:
                    // Ambient light level in SI lux units 
                    m_sLight = Float.toString(event.values[0]) + ",";
                    nSensorReadingType = SENSOR_EVENT_LIGHT;
                    break;

                case Sensor.TYPE_PRESSURE:
                    // Atmospheric pressure in hPa (millibar)
                    m_sBarometer = Float.toString(event.values[0]) + ",";
                    nSensorReadingType = SENSOR_EVENT_BAROMETER;
                    break;

                }
            }
        } else if (nSensorDataType == DATA_TYPE_GPS) {
            Location locationGps;
            locationGps = senData.getGpsLocation();

            if (locationGps != null) {

                m_location = new Location(locationGps);

                //Change from double to float
                m_sGPS = Float.valueOf((float) (locationGps.getLatitude())).toString() + ","
                        + Float.valueOf((float) (locationGps.getLongitude())).toString() + ",";
                if (locationGps.hasAltitude()) {
                    m_sGPS = m_sGPS + Float.valueOf((float) (locationGps.getAltitude())).toString() + ",";
                    GeomagneticField geoField = new GeomagneticField(
                            Double.valueOf(locationGps.getLatitude()).floatValue(),
                            Double.valueOf(locationGps.getLongitude()).floatValue(),
                            Double.valueOf(locationGps.getAltitude()).floatValue(), System.currentTimeMillis());
                    // Append Declination, in Degree
                    m_sGPS = m_sGPS + Float.valueOf((float) (geoField.getDeclination())).toString() + ","
                            + Float.valueOf((float) (geoField.getInclination())).toString() + ",";
                } else {
                    m_sGPS = m_sGPS + ",,,";
                    //m_sGPS = m_sGPS + ",";
                }

                //New add 201408270009
                if (locationGps.hasSpeed()) {
                    m_sGPS = m_sGPS + Float.valueOf((float) (locationGps.getSpeed())).toString() + ",";
                } else {
                    m_sGPS = m_sGPS + ",";
                }

                if (locationGps.hasBearing()) {
                    m_sGPS = m_sGPS + Float.valueOf((float) (locationGps.getBearing())).toString() + ",";
                } else {
                    m_sGPS = m_sGPS + ",";
                }

                nSensorReadingType = SENSOR_EVENT_GPS;

                m_blnGpsUp = true;
                show_screen5_GpsUp();
            } else {
                m_blnGpsUp = false;
                show_screen5_GpsUp();
            }
        } else if (nSensorDataType == DATA_TYPE_MIC) {
            double fSoundLevelDb;
            fSoundLevelDb = senData.getSoundLevelDb();
            m_sSouldLevel = new BigDecimal(fSoundLevelDb).setScale(0, BigDecimal.ROUND_HALF_UP) + ",";

            nSensorReadingType = SENSOR_EVENT_MIC;

        } else if (nSensorDataType == DATA_TYPE_CELLULAR) {
            int nCellId;
            nCellId = senData.getCellId();
            m_sCellId = Integer.valueOf(nCellId).toString() + ",";
            nSensorReadingType = SENSOR_EVENT_CELLULAR;

        } else if (nSensorDataType == DATA_TYPE_WIFI) {
            List<WifiData> lstWifiData = senData.getListWifiData();
            int nWifiCnt = Math.min(WIFI_COUNT, lstWifiData.size());
            m_sWifi = "";
            for (i = 0; i < nWifiCnt; i++) {
                //m_sWifi = m_sWifi + lstWifiData.get(i).getSSID() + "," + lstWifiData.get(i).getBSSID() + "," + lstWifiData.get(i).getSignalLevel() + ",";
                m_sWifi = m_sWifi + lstWifiData.get(i).getBSSID() + "," + lstWifiData.get(i).getSignalLevel() + ",";

            }

            for (i = 1; i <= WIFI_COUNT - nWifiCnt; i++) {
                //m_sWifi = m_sWifi + ",,,";
                m_sWifi = m_sWifi + ",,";
            }

            nSensorReadingType = SENSOR_EVENT_WIFI;
        }

        if (nSensorReadingType == SENSOR_EVENT_NULL) {
            return;
        }

        sRecordLine = sTimeField + ",";

        if (m_blnNoLabel == false) {
            sRecordLine = sRecordLine + m_sCurrentLabel + ",";
        }

        sRecordLine = sRecordLine + Integer.valueOf(nSensorReadingType) + ",";

        //New: Every field always there
        //Field in each line:
        /*
         *  1) Timestamp
         *  2) Label
         *  3) SensingEventType
         *  4-6) Accl
         *  7-9) Linear Accl
         *  10-12) Gravity
         *  13-15) Gyro
         *  16-18) Orientation
         *  19-21) Magnet
         *  22) Light
         *  23) Barometer
         *  24) Sould Level (Decibel)
         *  25) Cell ID
         *  26-32) GPS (Lat, Long, Alt, Declination, Inclination, Speed, Bearing)
         *  33-72) WiFi (<BSSID, Level>) 
         */
        //      sRecordLine = sRecordLine  + m_sAccl + m_sGyro + m_sOrient + m_sMagnet + 
        //                           m_sLight + m_sBarometer +  
        //                           m_sSouldLevel + m_sCellId +
        //                           m_sGPS + m_sWifi;

        sRecordLine = sRecordLine + m_sAccl + m_sLinearAccl + m_sGravity + m_sGyro + m_sOrient + m_sMagnet
                + m_sLight + m_sBarometer + m_sSouldLevel + m_sCellId + m_sGPS + m_sWifi;

        ////////////////////////////
        //      String sAngle = calculateRot(m_sAccl, m_sGravity);
        //      String sarrAngle[] = sAngle.split(",");
        //      String sShow = sarrAngle[0] + "\n" + sarrAngle[1];

        //      String sShow = "";

        //      if (m_sGravity.length() > 3) {
        //         String sarrAngle[] = m_sGravity.split(",");
        //         double fX = Double.valueOf(sarrAngle[0]).doubleValue();
        //         double fY = Double.valueOf(sarrAngle[1]).doubleValue();
        //         double fZ = Double.valueOf(sarrAngle[2]).doubleValue();
        //         
        //         double fTotal = Math.sqrt(fX*fX + fY*fY + fZ*fZ);
        //         
        //         double fAngleZ = Math.acos(fZ/fTotal)/Math.PI*180;
        //         double fAngleY = 90 - Math.acos(fY/fTotal)/Math.PI*180;
        //         double fAngleX = 90 - Math.acos(fX/fTotal)/Math.PI*180;
        //         
        //         sShow = "X:  " +  fAngleX + "\n";
        //         sShow = sShow + "Y:  " +  fAngleY + "\n";
        //         sShow = sShow + "Z:  " +  fAngleZ;
        //         
        //                     
        //      }

        //      if (m_sGravity.length() > 3) {
        //         String sarrAngle[] = m_sGravity.split(",");
        //         double fX = Double.valueOf(sarrAngle[0]).doubleValue();
        //         double fY = Double.valueOf(sarrAngle[1]).doubleValue();
        //         double fZ = Double.valueOf(sarrAngle[2]).doubleValue();
        //         
        //         int nSymbol = 0;
        //         if (fX < 0)  {
        //            sShow = sShow + "- X" + "\n";
        //         } else if (fX > 0) {
        //            sShow = sShow + "+ X" + "\n";
        //         }
        //         
        //         if (fY < 0)  {
        //            sShow = sShow + "- Y" + "\n";
        //         } else if (fY > 0) {
        //            sShow = sShow + "+ Y" + "\n";
        //         }
        //         
        //         if (fZ < 0)  {
        //            sShow = sShow + "- Z";
        //         } else if (fZ > 0) {
        //            sShow = sShow + "+ Z";
        //         }
        //                     
        //      }
        //      
        //      if (m_sGyro.length() > 3) {
        //         String sarrAngle[] = m_sGyro.split(",");
        //         double fX = Double.valueOf(sarrAngle[0]).doubleValue();
        //         double fY = Double.valueOf(sarrAngle[1]).doubleValue();
        //         double fZ = Double.valueOf(sarrAngle[2]).doubleValue();
        //         
        //         int nSymbol = 0;
        //         if (fX < 0)  {
        //            nSymbol = -1;
        //         } else if (fX > 0) {
        //            nSymbol = 1;
        //         }
        //         
        //         if (fY < 0)  {
        //            nSymbol = nSymbol + (-1);
        //         } else if (fY > 0) {
        //            nSymbol = nSymbol + 1;
        //         }
        //         
        //         if (fZ < 0)  {
        //            nSymbol = nSymbol + (-1);
        //         } else if (fZ > 0) {
        //            nSymbol = nSymbol + 1;
        //         }
        //            
        //         if (nSymbol < 0) {
        //            nSymbol = -1;
        //         } else if (nSymbol > 0) {
        //            nSymbol = 1;
        //         }
        //         
        //         sShow = sShow + "\n\n" + nSymbol + "";
        //      }

        //      m_tvSensingInfo.setText(sShow);
        ////////////////////////////

        sRecordLine = sRecordLine + System.getProperty("line.separator");

        if (m_fwSensorRecord != null) {
            //Write information into file
            //Compose information into recordLine
            try {
                m_fwSensorRecord.write(sRecordLine);
            } catch (IOException e) {

            }
        }

    }

    public String calculateRot(String sAccl, String sGravity) {
        String sResult = "0,0";
        String[] sarrAccl = null;
        String[] sarrGravity = null;

        if ((sAccl.length() > 3) && (sGravity.length() > 3)) {
            sarrAccl = sAccl.split(",");
            sarrGravity = sGravity.split(",");
            double fAcclX = Double.valueOf(sarrAccl[0]).doubleValue();
            double fAcclY = Double.valueOf(sarrAccl[1]).doubleValue();
            double fGravityX = Double.valueOf(sarrGravity[0]).doubleValue();
            double fGravityY = Double.valueOf(sarrGravity[1]).doubleValue();

            double alpha, beta;

            if (fGravityX > 0) {
                alpha = Math.asin(fAcclX / fGravityX) / Math.PI * 180;
            } else {
                alpha = 0;
            }

            if (fGravityY > 0) {
                beta = Math.asin(fAcclY / fGravityY) / Math.PI * 180;
            } else {
                beta = 0;
            }

            sResult = alpha + "     ," + beta;
        }

        return sResult;
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        switch (sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            m_sSensorAccuracy = "1,"; //Accl
            break;

        case Sensor.TYPE_LINEAR_ACCELERATION:
            m_sSensorAccuracy = "2,"; //LinearAccl
            break;

        case Sensor.TYPE_GYROSCOPE:
            m_sSensorAccuracy = "3,"; //Gyro
            break;

        case Sensor.TYPE_MAGNETIC_FIELD:
            m_sSensorAccuracy = "4,"; //Magnet
            break;

        case Sensor.TYPE_GRAVITY:
            m_sSensorAccuracy = "5,"; //Gravity      
            break;

        case Sensor.TYPE_PROXIMITY:
            m_sSensorAccuracy = "6,"; //Proxi
            break;

        case Sensor.TYPE_LIGHT:
            m_sSensorAccuracy = "7,"; //Light
            break;

        case Sensor.TYPE_PRESSURE:
            m_sSensorAccuracy = "8,"; //Barometer
            break;

        case Sensor.TYPE_RELATIVE_HUMIDITY:
            m_sSensorAccuracy = "9,"; //Humidity
            break;

        case Sensor.TYPE_AMBIENT_TEMPERATURE:
            m_sSensorAccuracy = "10,"; //Temperature
            break;

        default:
            m_sSensorAccuracy = "11,"; //Other
        }

        switch (accuracy) {
        case SensorManager.SENSOR_STATUS_ACCURACY_HIGH:
            m_sSensorAccuracy = m_sSensorAccuracy + "1,"; //H
            break;

        case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM:
            m_sSensorAccuracy = m_sSensorAccuracy + "2,"; //M
            break;

        case SensorManager.SENSOR_STATUS_ACCURACY_LOW:
            m_sSensorAccuracy = m_sSensorAccuracy + "3,"; //L
            break;

        case SensorManager.SENSOR_STATUS_UNRELIABLE:
            m_sSensorAccuracy = m_sSensorAccuracy + "4,"; //U
            break;
        }
    }

    private void startWiFiScan() {
        if (m_mainWifi != null) {

            m_wifiScanThread = new Thread(new Runnable() {
                public void run() {
                    scanWiFi();
                }
            }, "Scanning WiFi Thread");

            m_wifiScanThread.start();
        }
    }

    private void scanWiFi() {
        while (m_wifiScanThread != null && m_mainWifi != null) {
            m_mainWifi.startScan();
            //          try {
            //             Method startScanActiveMethod = WifiManager.class.getMethod("startScanActive");
            //             startScanActiveMethod.invoke(m_mainWifi);        
            //          } catch (Exception e) {
            //             
            //          }
            //PrintCurrentTime("StartScan");

            try {
                Thread.sleep(m_arrlWiFiScanSpeed[m_nWifiScanSpeedIndex]);
            } catch (InterruptedException e) {

            }

        }

    }

    private void stopWiFiScan() {
        m_wifiScanThread = null;
        if (m_receiverWifi != null) {
            unregisterReceiver(m_receiverWifi);
        }
    }

    private void startGettingCellularNetworkInfo() {

        if (m_tmCellular != null) {

            CellLocation cellLoc = m_tmCellular.getCellLocation();

            if (cellLoc instanceof GsmCellLocation) { //GSM compatible network

                m_GsmCellLocation = (GsmCellLocation) cellLoc;

                if (m_GsmCellLocation != null) {
                    m_cellularThreadGsm = new Thread(new Runnable() {
                        public void run() {
                            getGsmCellularInfo();
                        }
                    }, "GSM Cellular Thread");

                    m_cellularThreadGsm.start();
                }
            } else if (cellLoc instanceof CdmaCellLocation) { //CDMA compatible network

                m_CdmaCellLocation = (CdmaCellLocation) cellLoc;

                if (m_CdmaCellLocation != null) {
                    m_cellularThreadCdma = new Thread(new Runnable() {
                        public void run() {
                            getCdmaCellularInfo();
                        }
                    }, "CDMA Cellular Thread");

                    m_cellularThreadCdma.start();
                }

            }
        }

    }

    private void getGsmCellularInfo() {

        while (m_GsmCellLocation != null) {
            m_GsmCellLocation.requestLocationUpdate();

            int nCellId = m_GsmCellLocation.getCid();

            recordCellInfo(nCellId);

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {

            }

        }
    }

    private void getCdmaCellularInfo() {

        while (m_CdmaCellLocation != null) {
            m_CdmaCellLocation.requestLocationUpdate();

            int nCellId = m_CdmaCellLocation.getBaseStationId();

            recordCellInfo(nCellId);

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {

            }

        }
    }

    private void stopGettingCellularNetworkInfo() {
        if (m_GsmCellLocation != null) {
            m_GsmCellLocation = null;
        }

        if (m_CdmaCellLocation != null) {
            m_CdmaCellLocation = null;
        }

        m_cellularThreadGsm = null;
        m_cellularThreadCdma = null;
    }

    private void startAudioRecording() {
        m_audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, m_nAudioSampleRate,
                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, m_nBufferSize);

        if (m_audioRecorder == null)
            return;

        int i = m_audioRecorder.getState();
        if (i == AudioRecord.STATE_INITIALIZED) {
            m_audioRecorder.startRecording();
        } else {
            return;
        }

        if (m_blnRecordSoundLevel == true || m_blnRecordSoundFile == true) {
            m_processSoundThread = new Thread(new Runnable() {
                public void run() {
                    processAudioData();
                }
            }, "Audio Thread");

            m_processSoundThread.start();

            if (m_blnRecordSoundLevel == true) {
                m_soundLevelThread = new Thread(new Runnable() {
                    public void run() {
                        calculateAudioSoundLevel();
                    }
                }, "Sould Level Thread");

                m_soundLevelThread.start();
            }
        }

    }

    private void processAudioData() {
        String sFullAudioPathFileTmp = m_sRecordFullPathFile + ".wav.tmp";
        FileOutputStream os = null;

        m_btAudioBuffer = new byte[m_nBufferSize];
        m_nAudioReadCount = AudioRecord.ERROR_INVALID_OPERATION;

        if (m_blnRecordSoundFile == true) {
            try {
                os = new FileOutputStream(sFullAudioPathFileTmp);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        while (m_audioRecorder != null) {

            m_nAudioReadCount = m_audioRecorder.read(m_btAudioBuffer, 0, m_nBufferSize);

            if (m_nAudioReadCount != AudioRecord.ERROR_INVALID_OPERATION) {

                if (m_blnRecordSoundFile == true && os != null) {
                    try {
                        os.write(m_btAudioBuffer);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        } //While

        if (m_blnRecordSoundFile == true && os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

    private void calculateAudioSoundLevel() {
        long nTotalVal;
        int nLen;
        short shtBuffer[];

        while (m_soundLevelThread != null && m_blnRecordSoundLevel == true) {

            if (m_nAudioReadCount != AudioRecord.ERROR_INVALID_OPERATION) {
                nTotalVal = 0;

                shtBuffer = DataUtil.Bytes2Shorts(m_btAudioBuffer, m_nAudioReadCount);

                nLen = shtBuffer.length;

                for (int i = 0; i < nLen; i++) {
                    nTotalVal = nTotalVal + shtBuffer[i] * shtBuffer[i];
                }

                double fMean = nTotalVal * 1.0 / nLen;

                if (fMean == 0) {
                    m_fSoundLevelDb = 1000;
                } else {
                    m_fSoundLevelDb = 10 * Math.log10(fMean);
                }

                if (Double.isInfinite(m_fSoundLevelDb) || Double.isNaN(m_fSoundLevelDb)) {

                } else {
                    recordSoundLevel(m_fSoundLevelDb);
                }

            } // if

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {

            }
        } // while
    }

    private void writeAudioDataToFile() {
        byte data[] = new byte[m_nBufferSize];
        String sFullAudioPathFileTmp = m_sRecordFullPathFile + ".wav.tmp";
        FileOutputStream os = null;

        try {
            os = new FileOutputStream(sFullAudioPathFileTmp);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        int read = 0;

        if (os != null) {
            while (m_audioRecorder != null) {
                read = m_audioRecorder.read(data, 0, m_nBufferSize);

                if (AudioRecord.ERROR_INVALID_OPERATION != read) {
                    try {
                        os.write(data);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void stopAudioRecording() {

        if (m_audioRecorder != null) {
            int i = m_audioRecorder.getState();

            if (i == AudioRecord.STATE_INITIALIZED) {
                m_audioRecorder.stop();
                m_audioRecorder.release();
            }

            m_audioRecorder = null;

            if (m_blnRecordSoundLevel == true || m_blnRecordSoundFile == true) {
                m_processSoundThread = null;
                m_soundLevelThread = null;
            }

        }

        if (m_blnRecordSoundFile == true) {
            copyWaveFile();
            deleteTempFile();
        }
    }

    private void deleteTempFile() {
        String sFullAudioPathFileTmp = m_sRecordFullPathFile + ".wav.tmp";

        File file = new File(sFullAudioPathFileTmp);

        file.delete();
    }

    private void copyWaveFile() {
        FileInputStream in = null;
        FileOutputStream out = null;
        long totalAudioLen = 0;
        long totalDataLen = totalAudioLen + 36;
        int channels = 2;
        long byteRate = 16 * m_nAudioSampleRate * channels / 8;
        String sFullAudioPathFileTmp = m_sRecordFullPathFile + ".wav.tmp";
        String sFullAudioPathFile = m_sRecordFullPathFile + ".wav";

        byte[] data = new byte[m_nBufferSize];

        try {
            in = new FileInputStream(sFullAudioPathFileTmp);
            out = new FileOutputStream(sFullAudioPathFile);
            totalAudioLen = in.getChannel().size();
            totalDataLen = totalAudioLen + 36;

            WriteWaveFileHeader(out, totalAudioLen, totalDataLen, m_nAudioSampleRate, channels, byteRate);

            while (in.read(data) != -1) {
                out.write(data);
            }

            in.close();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen, long totalDataLen,
            long longSampleRate, int channels, long byteRate) throws IOException {

        byte[] header = new byte[44];

        header[0] = 'R'; // RIFF/WAVE header
        header[1] = 'I';
        header[2] = 'F';
        header[3] = 'F';
        header[4] = (byte) (totalDataLen & 0xff);
        header[5] = (byte) ((totalDataLen >> 8) & 0xff);
        header[6] = (byte) ((totalDataLen >> 16) & 0xff);
        header[7] = (byte) ((totalDataLen >> 24) & 0xff);
        header[8] = 'W';
        header[9] = 'A';
        header[10] = 'V';
        header[11] = 'E';
        header[12] = 'f'; // 'fmt ' chunk
        header[13] = 'm';
        header[14] = 't';
        header[15] = ' ';
        header[16] = 16; // 4 bytes: size of 'fmt ' chunk
        header[17] = 0;
        header[18] = 0;
        header[19] = 0;
        header[20] = 1; // format = 1
        header[21] = 0;
        header[22] = (byte) channels;
        header[23] = 0;
        header[24] = (byte) (longSampleRate & 0xff);
        header[25] = (byte) ((longSampleRate >> 8) & 0xff);
        header[26] = (byte) ((longSampleRate >> 16) & 0xff);
        header[27] = (byte) ((longSampleRate >> 24) & 0xff);
        header[28] = (byte) (byteRate & 0xff);
        header[29] = (byte) ((byteRate >> 8) & 0xff);
        header[30] = (byte) ((byteRate >> 16) & 0xff);
        header[31] = (byte) ((byteRate >> 24) & 0xff);
        header[32] = (byte) (2 * 16 / 8); // block align
        header[33] = 0;
        header[34] = 16; // bits per sample
        header[35] = 0;
        header[36] = 'd';
        header[37] = 'a';
        header[38] = 't';
        header[39] = 'a';
        header[40] = (byte) (totalAudioLen & 0xff);
        header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
        header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
        header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

        out.write(header, 0, 44);
    }

}