Java tutorial
/* * 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; import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.fragments.SensorConfigFragment; import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.services.SensorModuleManager; import de.tudarmstadt.dvs.myhealthassistant.myhealthhub.services.messagehandler.MessageHandler; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.app.Dialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; 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.DialogFragment; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; /** * Design to fit on Google Glass GUI * @author HieuHa * */ public class MyHealthHubGlassMainActivity extends FragmentActivity { // for debugging private static final String TAG = MyHealthHubGlassMainActivity.class.getSimpleName(); private static boolean D = true; /** Flag indicating whether we have called bind on the service. */ boolean mBound; private ViewHolder viewHolder; private SharedPreferences pref; // for communication with SensorModuleManager private Intent mSensorModuleManagerIntent; private Intent mMessageHandlerIntent; private SensorModuleManager.SensorModuleManagerBinder mSensorModuleManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (D) Log.d(TAG, "onCreate"); setContentView(R.layout.glass_sensor_type_config); pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); // StartProducer message handler mMessageHandlerIntent = new Intent(this, MessageHandler.class); startService(mMessageHandlerIntent); // StartProducer sensor modules mSensorModuleManagerIntent = new Intent(getApplicationContext(), SensorModuleManager.class); getApplicationContext().bindService(mSensorModuleManagerIntent, mSensorModuleManagerConnection, Context.BIND_AUTO_CREATE); startService(mSensorModuleManagerIntent); viewHolder = new ViewHolder(); viewHolder.tv_typePulse = (TextView) findViewById(R.id.sensor_name); viewHolder.tv_typePulse.setText(getResources().getString(R.string.pulse)); viewHolder.tv_PulseSensorAdd = (TextView) findViewById(R.id.device_add); viewHolder.pulseCheckBox = (CheckBox) findViewById(R.id.enablePulse); viewHolder.autoConnectCheckBox = (CheckBox) findViewById(R.id.autoEnable); viewHolder.tv_typeAcc = (TextView) findViewById(R.id.acc_sensor_name); viewHolder.tv_AccSensorAdd = (TextView) findViewById(R.id.acc_device_add); viewHolder.accCheckBox = (CheckBox) findViewById(R.id.enableAcc); } private static class ViewHolder { CheckBox autoConnectCheckBox; TextView tv_typePulse; TextView tv_PulseSensorAdd; CheckBox pulseCheckBox; TextView tv_typeAcc; TextView tv_AccSensorAdd; CheckBox accCheckBox; } /** * 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 to SensorModuleManagerBinder: " + className.toString()); mSensorModuleManager = (SensorModuleManager.SensorModuleManagerBinder) binder; mBound = true; checkAutoConnectEnable(); } @Override public void onServiceDisconnected(ComponentName className) { mBound = false; Toast.makeText(getApplicationContext(), "mSensorModuleManager: disconnected from service.", Toast.LENGTH_SHORT).show(); } }; private void checkAutoConnectEnable() { viewHolder.autoConnectCheckBox.setChecked(pref.getBoolean(Preferences.AUTO_CONNECT_ENABLED, false)); String pulseType = getResources().getString(R.string.pulse); boolean enPulse = pref.getBoolean(pulseType, false); if (enPulse) { viewHolder.pulseCheckBox.setChecked(enPulse); String deviceAdd = pref.getString(pulseType + SensorConfigFragment.deviceMac, "-"); String sensorFamily = pref.getString(pulseType + SensorConfigFragment.deviceType, "-"); viewHolder.tv_typePulse.setText(sensorFamily); viewHolder.tv_PulseSensorAdd.setText(deviceAdd); // if (mSensorModuleManager != null) { // mSensorModuleManager.enableModule(sensorFamily, true, // sensorFamily, deviceAdd); // } } String accType = getResources().getString(R.string.acc_leg); if (pref.getBoolean(accType, false)) { String deviceAdd = pref.getString(accType + SensorConfigFragment.deviceMac, "-"); String sensorFamily = pref.getString(accType + SensorConfigFragment.deviceType, "-"); viewHolder.tv_typeAcc.setText(sensorFamily); viewHolder.tv_AccSensorAdd.setText(deviceAdd); viewHolder.accCheckBox.setChecked(true); // if (mSensorModuleManager != null) { // mSensorModuleManager.enableModule(sensorFamily, true, // sensorFamily, deviceAdd); // } } } public void onClickAutoEnable(View v) { boolean en = viewHolder.autoConnectCheckBox.isChecked(); Log.d(TAG, "autoEnable:" + en); pref.edit().putBoolean(Preferences.AUTO_CONNECT_ENABLED, en).commit(); } private void onClickEnableDevice(String sensorType) { boolean en = pref.getBoolean(sensorType, false); String deviceAdd = pref.getString(sensorType + SensorConfigFragment.deviceMac, ""); String sensorFamily = pref.getString(sensorType + SensorConfigFragment.deviceType, ""); if (mSensorModuleManager != null) { mSensorModuleManager.enableModule(sensorFamily, !en, sensorFamily, deviceAdd); // auto-save state of sensor's Enabling on phone // so that each time this app open, sensor can be start // immediately pref.edit().putBoolean(sensorType, !en).commit(); } } public void onClickSelectPulseType(View v) { Bundle extras = new Bundle(); openSelectSensorType(extras, getResources().getString(R.string.pulse), getResources().getStringArray(R.array.type_pulse)); } public void onClickEnablePulse(View v) { onClickEnableDevice(getResources().getString(R.string.pulse)); } public void onClickSelectAccSensor(View v) { Bundle extras = new Bundle(); openSelectSensorType(extras, getResources().getString(R.string.acc_leg), getResources().getStringArray(R.array.type_acc_leg)); } public void onClickEnableAccSensor(View v) { onClickEnableDevice(getResources().getString(R.string.acc_leg)); } public void onClickExit(View v) { this.finish(); } private void openSelectSensorType(Bundle extras, String sensorType, String[] names) { DialogFragment deviceDialog = new SelectDeviceDialogFragment(); extras.putInt("position", 0); extras.putBoolean("device", false); extras.putString("sensorType", sensorType); extras.putStringArray("names", names); deviceDialog.setArguments(extras); getFragmentManager().beginTransaction(); deviceDialog.show(getSupportFragmentManager().beginTransaction(), "deviceDialog"); } private void openSelectDeviceDialog(String sensorType) { 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]; int i = 0; for (BluetoothDevice device : mAllBondedDevices) { deviceNames[i++] = device.getName() + "|" + device.getAddress(); } DialogFragment deviceDialog = new SelectDeviceDialogFragment(); Bundle args = new Bundle(); args.putString("sensorType", sensorType); 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"); final String sensorType = arg.getString("sensorType"); int position = arg.getInt("position", -1); if (position == -1) position = 0; 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) { value = names[i].split("\\|", 2)[1]; // get // mac // Address // of // selected // device updateBTDeviceSummary(sensorType, value); } else { updateBTTypeSummary(sensorType, value); } dismiss(); } }).create(); } } private void updateBTTypeSummary(String sensorType, String value) { if (value.equals(getResources().getString(R.string.dummy_empty))) { updateBTDeviceSummary(sensorType, "-"); } if (sensorType.equals(getResources().getString(R.string.pulse))) { viewHolder.tv_typePulse.setText(value); pref.edit().putString(sensorType + SensorConfigFragment.deviceType, value).commit(); // auto start select deviceMac after select pulse type openSelectDeviceDialog(getResources().getString(R.string.pulse)); } else if (sensorType.equals(getResources().getString(R.string.acc_leg))) { viewHolder.tv_typeAcc.setText(value); pref.edit().putString(sensorType + SensorConfigFragment.deviceType, value).commit(); // auto start select deviceMac after select pulse type openSelectDeviceDialog(getResources().getString(R.string.acc_leg)); } } private void updateBTDeviceSummary(String sensorType, String value) { if (sensorType.equals(getResources().getString(R.string.pulse))) { viewHolder.tv_PulseSensorAdd.setText(value); pref.edit().putString(sensorType + SensorConfigFragment.deviceMac, value).commit(); } else if (sensorType.equals(getResources().getString(R.string.acc_leg))) { viewHolder.tv_AccSensorAdd.setText(value); pref.edit().putString(sensorType + SensorConfigFragment.deviceMac, value).commit(); } } @Override protected void onDestroy() { if (D) Log.d(TAG, "onDestroy " + TAG); // Unbind from the service if (mBound) { getApplicationContext().unbindService(mSensorModuleManagerConnection); mBound = false; } else Log.i(TAG, "mSensorModuleManagerConnection is already unbounded"); stopService(mSensorModuleManagerIntent); stopService(mMessageHandlerIntent); super.onDestroy(); } }