de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments.SensorConfigFragment.java Source code

Java tutorial

Introduction

Here is the source code for de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments.SensorConfigFragment.java

Source

/* 
 * Copyright (C) 2014 TU Darmstadt, Hessen, Germany.
 * Department of Computer Science Databases and Distributed Systems
 *
 * 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 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments;

import java.util.ArrayList;

import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.Preferences;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.R;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.activities.SensorSettingsActivity;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.adapter.SensorListAdapter;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.services.SensorModuleManager;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.services.messagehandler.MessageHandler;
import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

/**
 * @author HieuHa
 * This class shows all external sensors that can be accessed by BluetoothAdapter
 * 
 */
public class SensorConfigFragment extends ListFragment {

    public interface OnTitleSelectedListener {

    }

    // for debugging
    private static final String TAG = SensorConfigFragment.class.getSimpleName();
    private static boolean D = true;

    // shared preferences including sensor auto-connect information
    private SharedPreferences preferences;

    private SensorListAdapter mAdapter;
    // private MAbstractSensorListAdapter adapter;

    // for enabling Bluetooth
    private BluetoothAdapter mBluetoothAdapter;

    /** Flag indicating whether we have called bind on the service. */
    private boolean mBound;

    // for communication with SensorModuleManager
    private Intent mSensorModuleManagerIntent;
    private SensorModuleManager.SensorModuleManagerBinder mSensorModuleManager;

    private Intent mMessageHandlerIntent;

    private View rootView;

    private ArrayList<SensorType> sensorTypes;

    // Extendtion for saving device name and macAdresse in preferenc
    public static final String deviceType = "_sensorType";
    public static final String deviceMac = "_deviceMac";

    private ProgressDialog progressDialog;

    private static final int REQUEST_ENABLE_BT = 1 + 5 << 12;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_list_with_empty_container, container, false);

        if (D)
            Log.d(TAG, TAG + ": onCreateView");

        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter == null) {
            // no bluetooth support on this device, app should be stop
            Toast.makeText(getActivity().getApplicationContext(), "No Bluetooth Support!", Toast.LENGTH_LONG)
                    .show();
            getActivity().finish();
        }
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            return;
        }

        // start create Sensors when bluetooth is enabled;
        startSensorModule();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_ENABLE_BT)
            if (resultCode == Activity.RESULT_OK) {
                Log.d(TAG, "Enabled Bluetooth, Wee!");
                startSensorModule();
            } else {
                Log.e(TAG, "Bluetooth should be enable, dude!");
            }
    }

    private void startSensorModule() {
        //      progressDialog = new ProgressDialog(getActivity());
        //      progressDialog.setTitle("");
        //      progressDialog.setMessage("Loading...");
        //      progressDialog.setCancelable(false);
        //      progressDialog.setIndeterminate(true);
        //      progressDialog.show();

        /* Preferences */
        preferences = PreferenceManager.getDefaultSharedPreferences(this.getActivity());

        // StartProducer message handler
        mMessageHandlerIntent = new Intent(getActivity().getApplicationContext(), MessageHandler.class);
        getActivity().startService(mMessageHandlerIntent);

        registerForContextMenu(getListView());

        mSensorModuleManagerIntent = new Intent(getActivity(), SensorModuleManager.class);
        getActivity().getApplicationContext().bindService(mSensorModuleManagerIntent,
                mSensorModuleManagerConnection, Context.BIND_AUTO_CREATE);
        getActivity().startService(mSensorModuleManagerIntent);
    }

    /**
     * Sets up a connection to the SensorModuleManager.
     */
    private ServiceConnection mSensorModuleManagerConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className, IBinder binder) {
            if (D)
                Log.d(TAG, "I am connected.");
            mSensorModuleManager = (SensorModuleManager.SensorModuleManagerBinder) binder;
            mBound = true;

            if (progressDialog != null)
                progressDialog.dismiss();
            createActivity();
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            mBound = false;
            Toast.makeText(getActivity(), "mSensorModuleManager: disconnected from service.", Toast.LENGTH_SHORT)
                    .show();
        }
    };

    private void createActivity() {
        // adapter = new MAbstractSensorListAdapter(getActivity(), getActivity()
        // .getApplicationContext());
        // setListAdapter(adapter);
        sensorTypes = new ArrayList<SensorType>();
        // Create a bunch of sensor types
        SensorType s_hr = new SensorType(getResources().getString(R.string.pulse),
                getResources().getStringArray(R.array.type_pulse));
        SensorType s_ecg = new SensorType(getResources().getString(R.string.ecg),
                getResources().getStringArray(R.array.type_ecg));
        SensorType s_iem = new SensorType(getResources().getString(R.string.scale),
                getResources().getStringArray(R.array.type_cale));
        SensorType s_boso = new SensorType(getResources().getString(R.string.blood_pressure),
                getResources().getStringArray(R.array.type_bp));
        SensorType s_acc_leg = new SensorType(getResources().getString(R.string.acc_leg),
                getResources().getStringArray(R.array.type_acc_leg));
        SensorType s_acc_chest = new SensorType(getResources().getString(R.string.acc_chest),
                getResources().getStringArray(R.array.type_acc_chest));
        SensorType s_acc_wrist = new SensorType(getResources().getString(R.string.acc_wrist),
                getResources().getStringArray(R.array.type_acc_wrist));
        SensorType s_ambient_roving = new SensorType(getResources().getString(R.string.ambient_roving),
                getResources().getStringArray(R.array.type_ambient_roving));
        SensorType s_ambient_infraWot = new SensorType(getResources().getString(R.string.ambient_infra),
                getResources().getStringArray(R.array.type_ambient_infra));
        SensorType s_debug = new SensorType(getResources().getString(R.string.acc_debug),
                getResources().getStringArray(R.array.type_acc_debug));

        mAdapter = new SensorListAdapter(getActivity(), getActivity().getApplicationContext());
        setListAdapter(mAdapter);

        sensorTypes.add(s_hr);
        sensorTypes.add(s_ecg);
        sensorTypes.add(s_iem);
        sensorTypes.add(s_boso);
        sensorTypes.add(s_acc_leg);
        sensorTypes.add(s_acc_chest);
        sensorTypes.add(s_acc_wrist);
        sensorTypes.add(s_ambient_roving);
        sensorTypes.add(s_ambient_infraWot);
        sensorTypes.add(s_debug);

        checkAutoConnectPreferences();
        mAdapter.setData(sensorTypes);
    }

    /** Checks preferences for auto connection */
    private void checkAutoConnectPreferences() {
        Log.e(TAG, "check auto connect pref!");
        if (sensorTypes != null && preferences != null) {
            for (SensorType st : sensorTypes) {
                String sensorType = st.getType();
                String deviceAdd = preferences.getString(sensorType + deviceMac, "");
                String sensorFamily = preferences.getString(sensorType + deviceType, "");
                st.setDeviceFamily(sensorFamily);
                st.setDeviceMac(deviceAdd);

                if (preferences.getBoolean(Preferences.AUTO_CONNECT_ENABLED, false))
                    st.onEnableEvent(preferences.getBoolean(st.getType(), false));

                if (mSensorModuleManager != null)
                    st.setActiveModule(mSensorModuleManager.isActiveModule(sensorFamily));
                else
                    Log.e(TAG, "mSensorModuleManager'S still null!");

            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.support.v4.app.Fragment#onDestroyView()
     */
    @Override
    public void onStop() {
        if (D)
            Log.d(TAG, "onStop");

        // Unbind from the service
        if (mBound) {
            getActivity().getApplicationContext().unbindService(mSensorModuleManagerConnection);
            mBound = false;
        } else
            Log.i(TAG, "mSensorModuleManagerConnection is already unbounded");

        if (mSensorModuleManagerIntent != null)
            getActivity().stopService(mSensorModuleManagerIntent);
        if (mMessageHandlerIntent != null)
            getActivity().stopService(mMessageHandlerIntent);
        super.onStop();
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.support.v4.app.Fragment#onPause()
     */
    @Override
    public void onPause() {
        if (D)
            Log.d(TAG, "onPauseView");
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        SharedPreferences pref = PreferenceManager
                .getDefaultSharedPreferences(getActivity().getApplicationContext());
        if (sensorTypes != null) {
            for (SensorType st : sensorTypes) {
                String sensorType = st.getType();
                String deviceAdd = pref.getString(sensorType + deviceMac, "");
                String sensorFamily = pref.getString(sensorType + deviceType, "");
                st.setDeviceFamily(sensorFamily);
                st.setDeviceMac(deviceAdd);

                // in case of changing device, sensor must be enable again
                //            st.onEnableEvent(st.isEnabled());

                st.setActiveModule(mSensorModuleManager.isActiveModule(sensorFamily));

            }

            mAdapter.notifyDataSetChanged();
        }
    }

    //   private BluetoothDevice getDevice(String deviceName) {
    //      BluetoothDevice[] bondDevice = (BluetoothDevice[]) mBluetoothAdapter
    //            .getBondedDevices().toArray(new BluetoothDevice[0]);
    //      for (BluetoothDevice bd : bondDevice) {
    //         if (bd.getName().equals(deviceName))
    //            return bd;
    //      }
    //      return null;
    //   }

    public class SensorType {
        private String sensorType;
        private String mDevice;
        private String[] sensorNames;
        private String deviceFamily;
        private boolean activeModule;

        private boolean enable;

        public SensorType(String type, String[] names) {
            this.sensorType = type;
            this.sensorNames = names;
        }

        public void setActiveModule(boolean activeModule) {
            this.activeModule = activeModule;
        }

        public boolean isActiveModule() {
            return this.activeModule;
        }

        public boolean isCheckable() {
            return (deviceFamily != null && mDevice != null);
        }

        public String getType() {
            return this.sensorType;
        }

        public void onConnectEvent() {
            if (mSensorModuleManager != null) {
                mSensorModuleManager.connectModule(deviceFamily);
            }
        }

        public void onEnableEvent(boolean en) {
            if (mSensorModuleManager != null && isCheckable()) {
                mSensorModuleManager.enableModule(deviceFamily, en, deviceFamily, mDevice);

                // auto-save state of sensor's Enabling on phone
                // so that each time this app open, sensor can be start
                // immediately
                // preferences.edit().putBoolean(sensorType, en).commit();
            }
            this.enable = en;
        }

        public boolean isEnabled() {
            return this.enable;
        }

        public boolean isOn() {
            return (deviceFamily != null && !deviceFamily.equals(getResources().getString(R.string.dummy_empty)));
        }

        public void onSetupSensor() {
            openSetupSensorActivity(sensorType, sensorNames);
        }

        public void setDeviceMac(String device) {
            this.mDevice = device;
        }

        public String hasDevice() {
            return mDevice;
        }

        public String getDeviceFamily() {
            return deviceFamily;
        }

        public void setDeviceFamily(String deviceFamily) {
            this.deviceFamily = deviceFamily;
        }
    }

    /**
     * Open up a new tab for setting up sensors
     * 
     * @param sensorType
     * @param sensorNames
     */
    private void openSetupSensorActivity(String sensorType, String[] sensorNames) {
        Intent intent = new Intent(getActivity().getApplicationContext(), SensorSettingsActivity.class);
        Bundle arg = new Bundle();
        arg.putString("type", sensorType);
        arg.putStringArray("names", sensorNames);
        intent.putExtras(arg);
        startActivity(intent);
    }
}