/* * 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 android.app.AlarmManager; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.SwitchPreference; import android.preference.Preference.OnPreferenceChangeListener; import android.util.Log; import android.view.LayoutInflater; import android.widget.TextView; public class InternalSensorPreference extends PreferenceActivity { private static final String TAG = InternalSensorPreference.class .getSimpleName(); private Context context; private CheckBoxPreference checkboxPref; private int enabledSensorNr; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getApplicationContext(); getFragmentManager().beginTransaction() .replace(android.R.id.content, new MyPreferenceFragment()) .commit(); } public class MyPreferenceFragment extends PreferenceFragment { public MyPreferenceFragment() { // Just an empty constructor! } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.internal_sensor__confix); enabledSensorNr = 0; mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); String[] internalSensorArrayList = getResources().getStringArray( R.array.internal_sensor_config); for (String s : internalSensorArrayList) { final SwitchPreference swp = (SwitchPreference) getPreferenceManager() .findPreference(s); if (swp.isChecked()) enabledSensorNr++; if (!availableSensor(swp.getKey())) { swp.setSummary("not available"); swp.setEnabled(false); } else { swp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange( Preference preference, Object newValue) { if ((Boolean) newValue) { if (enabledSensorNr >= 2) { openPopupDialog("Warning", "More than 2 sensors can't be enabled at once!"); return false; } else { enabledSensorNr++; return true; } } else { enabledSensorNr--; return true; } } }); } } } } private void openPopupDialog(String title, String mess) { LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); TextView bodyView = (TextView) layoutInflater.inflate( R.layout.popup_dialog, null); AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setView(bodyView).setTitle(title).setMessage(mess).create() .show(); } private MSensorEventListener fakeEvent = new MSensorEventListener(); private class MSensorEventListener implements SensorEventListener { @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { } } SensorManager mSensorManager; private boolean availableSensor(String s) { boolean avail = false; if (s.equals(getResources().getString(R.string.in_grav))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_GRAVITY); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_gyrs))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_GYROSCOPE); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_hum))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_lin_acc))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_mag))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_pres))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_PRESSURE); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_prox))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_PROXIMITY); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_tem))) { Sensor sensor = mSensorManager .getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE); avail = (mSensorManager.registerListener(fakeEvent, sensor, SensorManager.SENSOR_DELAY_NORMAL)); } if (s.equals(getResources().getString(R.string.in_acc)) || s.equals(getResources().getString(R.string.in_lig))) { avail = true; // based on every phone has accelerometer and light // sensor } mSensorManager.unregisterListener(fakeEvent); return avail; } @Override public void onStop() { Log.e(TAG, "onStop"); Intent i = new Intent( "de.tudarmstadt.dvs.myhealthassistant.myhealthhub.START_ISS"); context.getApplicationContext().stopService(i); if (isAnyServiceOn()) { // restart service context.getApplicationContext().startService(i); } else { // cancel the repeating alarm Intent intent = new Intent( "de.tudarmstadt.dvs.myhealthassistant.myhealthhub.START_ALARM"); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } super.onStop(); } private boolean isAnyServiceOn() { SharedPreferences pref = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); String[] sensorTypesArray = getResources().getStringArray( R.array.internal_sensor_config); for (String s : sensorTypesArray) { if (pref.getBoolean(s, false)) return true; } // if (pref.getBoolean(getResources().getString(R.string.in_acc), false) // || pref.getBoolean(getResources().getString(R.string.in_grav), false) // || pref.getBoolean(getResources().getString(R.string.in_gyrs), false) // || pref.getBoolean(getResources().getString(R.string.in_hum), false) // || pref.getBoolean(getResources().getString(R.string.in_lig), false) // || pref.getBoolean(getResources().getString(R.string.in_lin_acc), // false) // || pref.getBoolean(getResources().getString(R.string.in_mag), false) // || pref.getBoolean(getResources().getString(R.string.in_pres), false) // || pref.getBoolean(getResources().getString(R.string.in_prox), false) // || pref.getBoolean(getResources().getString(R.string.in_tem), // false)){ // return true; // } return false; } }