de.tudarmstadt.dvs.myhealthassistant.myhealthhub.activities.SensorSettingsActivity.java Source code

Java tutorial

Introduction

Here is the source code for de.tudarmstadt.dvs.myhealthassistant.myhealthhub.activities.SensorSettingsActivity.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.activities;

import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.R;
import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments.SensorConfigFragment;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.Dialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 
 * @author HieuHa
 *
 * Open a windows to point to each type of sensor with its mac address 
 */
public class SensorSettingsActivity extends FragmentActivity {
    private static String TAG = SensorSettingsActivity.class.getName();
    private ViewHolder viewHolder;
    private String sensorType;
    private String deviceType;
    private String deviceMacAdd;
    private SharedPreferences pref;

    // private CheckBoxPreference discoverableBox;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        Log.e(TAG, "onCreate");

        setContentView(R.layout.sensor_connection_settings_fragment);

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        Bundle extras = getIntent().getExtras();
        sensorType = extras.getString("type");

        pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        // Keeps reference to avoid future findViewById()
        viewHolder = new ViewHolder();
        viewHolder.tv_sensor_type = (TextView) findViewById(R.id.tv_sensor_type);
        viewHolder.tv_sensor_type.setText(sensorType);
        // -----
        viewHolder.ll_bt_type = (LinearLayout) findViewById(R.id.ll_bluetooth_type);
        viewHolder.ll_bt_type.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                openSelectSensorType();
            }
        });

        deviceType = pref.getString(sensorType + SensorConfigFragment.deviceType, "");
        viewHolder.tv_bt_type_sum = (TextView) findViewById(R.id.tv_bluetooth_type_summary);
        viewHolder.tv_bt_type_sum.setText(deviceType);
        // -----
        viewHolder.ll_bt_sel = (LinearLayout) findViewById(R.id.ll_bluetooth_sel);
        viewHolder.ll_bt_sel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                openSelectDeviceDialog();
            }
        });

        viewHolder.tv_bt_sel_sum = (TextView) findViewById(R.id.tv_bluetooth_sel_summary);
        deviceMacAdd = pref.getString(sensorType + SensorConfigFragment.deviceMac, "");
        if (!deviceMacAdd.isEmpty()) {
            String name = getDeviceName(deviceMacAdd);
            viewHolder.tv_bt_sel_sum.setText(name + " (" + deviceMacAdd + ")");
        }
    }

    private String getDeviceName(String deviceAddress) {
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        BluetoothDevice[] bondDevice = (BluetoothDevice[]) mBluetoothAdapter.getBondedDevices()
                .toArray(new BluetoothDevice[0]);
        for (BluetoothDevice bd : bondDevice) {
            if (bd.getAddress().equals(deviceAddress))
                return bd.getName();
        }
        return null;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            this.finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private static class ViewHolder {
        TextView tv_sensor_type;
        // -------
        LinearLayout ll_bt_type;
        TextView tv_bt_type_sum;
        // -------
        LinearLayout ll_bt_sel;
        TextView tv_bt_sel_sum;

    }

    private void openSelectSensorType() {
        Bundle extras = getIntent().getExtras();
        DialogFragment deviceDialog = new SelectDeviceDialogFragment();
        extras.putInt("position", -1);
        extras.putBoolean("device", false);
        deviceDialog.setArguments(extras);
        getFragmentManager().beginTransaction();
        deviceDialog.show(getSupportFragmentManager().beginTransaction(), "deviceDialog");
    }

    private void openSelectDeviceDialog() {
        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter != null) {
            BluetoothDevice[] mAllBondedDevices = (BluetoothDevice[]) mBluetoothAdapter.getBondedDevices()
                    .toArray(new BluetoothDevice[0]);

            int mDeviceIndex = 0;
            if (mAllBondedDevices.length > 0) {
                int deviceCount = mAllBondedDevices.length;
                String[] deviceNames = new String[deviceCount];
                for (int i = 0; i < deviceCount; i++) {
                    BluetoothDevice device = mAllBondedDevices[i];
                    deviceNames[i] = device.getName() + "\n|" + device.getAddress();
                    if (deviceMacAdd.equals(device.getAddress())) {
                        mDeviceIndex = i;
                    }
                }
                DialogFragment deviceDialog = new SelectDeviceDialogFragment();
                Bundle args = new Bundle();
                args.putStringArray("names", deviceNames);
                args.putInt("position", mDeviceIndex);
                args.putBoolean("device", true);
                deviceDialog.setArguments(args);
                getFragmentManager().beginTransaction();
                deviceDialog.show(getSupportFragmentManager().beginTransaction(), "deviceDialog");
            }
        }
    }

    /**
     * Dialog to display a list of bonded Bluetooth devices for user to select
     * from. This is needed only for connection initiated from the application.
     */
    @SuppressLint("ValidFragment")
    public class SelectDeviceDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            Bundle arg = getArguments();
            final boolean isSelectingDevice = arg.getBoolean("device");
            final String[] names = arg.getStringArray("names");
            int position = arg.getInt("position", 0);
            if (position == -1) {
                for (int i = 0; i < names.length; i++) {
                    if (deviceType.equals(names[i]))
                        position = i;
                }
            }
            return new AlertDialog.Builder(getActivity()).setTitle(R.string.select_device)
                    .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dismiss();
                        }
                    }).setSingleChoiceItems(names, position, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            int i = (which == -1) ? 0 : which;
                            String value = names[i];
                            if (isSelectingDevice) {
                                String[] sp = value.split("\\|", 2);
                                String id = sp[0];
                                String mac = sp[1];// get mac address of
                                // selected device
                                updateBTDeviceSummary(id, mac);
                            } else {
                                updateBTTypeSummary(value);
                            }
                            dismiss();
                        }
                    }).create();
        }
    }

    private void updateBTDeviceSummary(String id, String mac) {
        if (!id.isEmpty())
            viewHolder.tv_bt_sel_sum.setText(id + " (" + mac + ")");
        else
            viewHolder.tv_bt_sel_sum.setText("");
        deviceMacAdd = mac;
        pref.edit().putString(sensorType + SensorConfigFragment.deviceMac, mac).commit();

    }

    private void updateBTTypeSummary(String value) {
        viewHolder.tv_bt_type_sum.setText(value);
        deviceType = value;
        pref.edit().putString(sensorType + SensorConfigFragment.deviceType, value).commit();
        if (value.equals(getResources().getString(R.string.dummy_empty))) {
            viewHolder.ll_bt_sel.setClickable(false);
            updateBTDeviceSummary("", "");
        } else {
            viewHolder.ll_bt_sel.setClickable(true);
        }
    }
}