/*
* Copyright (C) 2013 - 2015 Alexander "Evisceration" Martinz
*
* 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 org.namelessrom.devicecontrol.modules.device;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.balysv.materialmenu.MaterialMenuDrawable;
import com.balysv.materialmenu.extras.toolbar.MaterialMenuIconToolbar;
import org.namelessrom.devicecontrol.R;
import org.namelessrom.devicecontrol.activities.BaseActivity;
import org.namelessrom.devicecontrol.theme.AppResources;
import java.util.ArrayList;
import at.amartinz.hardware.sensors.BaseSensor;
import at.amartinz.hardware.sensors.environment.AmbientTemperatureSensor;
import at.amartinz.hardware.sensors.environment.LightSensor;
import at.amartinz.hardware.sensors.environment.PressureSensor;
import at.amartinz.hardware.sensors.environment.RelativeHumiditySensor;
import at.amartinz.hardware.sensors.motion.AccelerometerLinearSensor;
import at.amartinz.hardware.sensors.motion.AccelerometerSensor;
import at.amartinz.hardware.sensors.motion.GravitySensor;
import at.amartinz.hardware.sensors.motion.GyroscopeSensor;
import at.amartinz.hardware.sensors.motion.GyroscopeUncalibratedSensor;
import at.amartinz.hardware.sensors.motion.RotationVectorSensor;
import at.amartinz.hardware.sensors.motion.StepSensor;
import at.amartinz.hardware.sensors.position.GameRotationVectorSensor;
import at.amartinz.hardware.sensors.position.GeomagneticRotationVectorSensor;
import at.amartinz.hardware.sensors.position.MagneticFieldSensor;
import at.amartinz.hardware.sensors.position.MagneticFieldUncalibratedSensor;
import at.amartinz.hardware.sensors.position.ProximitySensor;
public class SensorActivity extends BaseActivity {
private final ArrayList<BaseSensor> mSensorList = new ArrayList<>();
private final ArrayList<String> mTitleList = new ArrayList<>();
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor);
// setup action bar
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { finish(); }
});
final MaterialMenuIconToolbar materialMenu =
new MaterialMenuIconToolbar(this, Color.WHITE, MaterialMenuDrawable.Stroke.THIN) {
@Override public int getToolbarViewId() { return R.id.toolbar; }
};
materialMenu.setState(MaterialMenuDrawable.IconState.ARROW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
materialMenu.setNeverDrawTouch(true);
}
mTitleList.add(getString(R.string.hardware_environment));
mTitleList.add(getString(R.string.hardware_motion));
mTitleList.add(getString(R.string.hardware_position));
final ViewPagerAdapter adapter = new ViewPagerAdapter(mTitleList);
final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(3);
final TabLayout tabHost = (TabLayout) findViewById(R.id.tabHost);
tabHost.setupWithViewPager(viewPager);
// tint the icons
final int iconTint = AppResources.get().getAccentColor();
BaseSensor.setIconTintGlobal(iconTint);
// and set the background
BaseSensor.setBackgroundColorGlobal(ContextCompat.getColor(this, R.color.cardview_background));
// Environment
final View environmentRoot = findViewById(R.id.environment_layout);
final LinearLayout environmentContainer =
(LinearLayout) environmentRoot.findViewById(R.id.sensor_container);
// Ambient temperature
if (BaseSensor.isSupported(this, AmbientTemperatureSensor.TYPE)) {
final AmbientTemperatureSensor amTemperatureSensor = new AmbientTemperatureSensor(this);
mSensorList.add(amTemperatureSensor);
environmentContainer.addView(amTemperatureSensor);
}
// Light
if (BaseSensor.isSupported(this, LightSensor.TYPE)) {
final LightSensor lightSensor = new LightSensor(this);
mSensorList.add(lightSensor);
environmentContainer.addView(lightSensor);
}
// Pressure
if (BaseSensor.isSupported(this, PressureSensor.TYPE)) {
final PressureSensor pressureSensor = new PressureSensor(this);
mSensorList.add(pressureSensor);
environmentContainer.addView(pressureSensor);
}
// Relative humidity
if (BaseSensor.isSupported(this, RelativeHumiditySensor.TYPE)) {
final RelativeHumiditySensor relativeHumiditySensor = new RelativeHumiditySensor(this);
mSensorList.add(relativeHumiditySensor);
environmentContainer.addView(relativeHumiditySensor);
}
// Motion
final View motionRoot = findViewById(R.id.motion_layout);
final LinearLayout motionContainer =
(LinearLayout) motionRoot.findViewById(R.id.sensor_container);
// Step counter
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (BaseSensor.isSupported(this, StepSensor.TYPE)) {
final StepSensor stepSensor = new StepSensor(this);
mSensorList.add(stepSensor);
motionContainer.addView(stepSensor);
}
}
// Accelerometer
if (BaseSensor.isSupported(this, AccelerometerSensor.TYPE)) {
final AccelerometerSensor accelerometerSensor = new AccelerometerSensor(this);
mSensorList.add(accelerometerSensor);
motionContainer.addView(accelerometerSensor);
}
// Accelerometer linear
if (BaseSensor.isSupported(this, AccelerometerLinearSensor.TYPE)) {
final AccelerometerLinearSensor accLinearSensor = new AccelerometerLinearSensor(this);
mSensorList.add(accLinearSensor);
motionContainer.addView(accLinearSensor);
}
// Gravity
if (BaseSensor.isSupported(this, GravitySensor.TYPE)) {
final GravitySensor gravitySensor = new GravitySensor(this);
mSensorList.add(gravitySensor);
motionContainer.addView(gravitySensor);
}
// Rotation vector
if (BaseSensor.isSupported(this, RotationVectorSensor.TYPE)) {
final RotationVectorSensor rotationVectorSensor = new RotationVectorSensor(this);
mSensorList.add(rotationVectorSensor);
motionContainer.addView(rotationVectorSensor);
}
// Gyroscope
if (BaseSensor.isSupported(this, GyroscopeSensor.TYPE)) {
final GyroscopeSensor gyroscopeSensor = new GyroscopeSensor(this);
mSensorList.add(gyroscopeSensor);
motionContainer.addView(gyroscopeSensor);
}
// Gyroscope uncalibrated
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
if (BaseSensor.isSupported(this, GyroscopeUncalibratedSensor.TYPE)) {
final GyroscopeUncalibratedSensor gyroscopeUncalibratedSensor =
new GyroscopeUncalibratedSensor(this);
mSensorList.add(gyroscopeUncalibratedSensor);
motionContainer.addView(gyroscopeUncalibratedSensor);
}
}
// Position
final View positionRoot = findViewById(R.id.position_layout);
final LinearLayout positionContainer =
(LinearLayout) positionRoot.findViewById(R.id.sensor_container);
// Proximity
if (BaseSensor.isSupported(this, ProximitySensor.TYPE)) {
final ProximitySensor proximitySensor = new ProximitySensor(this);
mSensorList.add(proximitySensor);
positionContainer.addView(proximitySensor);
}
// Magnetic field
if (BaseSensor.isSupported(this, MagneticFieldSensor.TYPE)) {
final MagneticFieldSensor magneticFieldSensor = new MagneticFieldSensor(this);
mSensorList.add(magneticFieldSensor);
positionContainer.addView(magneticFieldSensor);
}
// Magnetic field uncalibrated
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
if (BaseSensor.isSupported(this, MagneticFieldUncalibratedSensor.TYPE)) {
final MagneticFieldUncalibratedSensor magneticFieldUncalibratedSensor =
new MagneticFieldUncalibratedSensor(this);
mSensorList.add(magneticFieldUncalibratedSensor);
positionContainer.addView(magneticFieldUncalibratedSensor);
}
}
// Geomagnetic rotation vector
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (BaseSensor.isSupported(this, GeomagneticRotationVectorSensor.TYPE)) {
final GeomagneticRotationVectorSensor geomagneticRotationVectorSensor =
new GeomagneticRotationVectorSensor(this);
mSensorList.add(geomagneticRotationVectorSensor);
positionContainer.addView(geomagneticRotationVectorSensor);
}
}
// Game rotation vector
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
if (BaseSensor.isSupported(this, GameRotationVectorSensor.TYPE)) {
final GameRotationVectorSensor gameRotationVectorSensor =
new GameRotationVectorSensor(this);
mSensorList.add(gameRotationVectorSensor);
positionContainer.addView(gameRotationVectorSensor);
}
}
}
@Override protected void onPause() {
super.onPause();
// unregister all sensors
for (final BaseSensor sensor : mSensorList) {
sensor.onPause();
}
}
@Override protected void onResume() {
super.onResume();
// lock current orientation
switch (getResources().getConfiguration().orientation) {
case Configuration.ORIENTATION_PORTRAIT: {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
}
case Configuration.ORIENTATION_LANDSCAPE: {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
}
}
// register all sensors
for (final BaseSensor sensor : mSensorList) {
sensor.onResume();
}
}
public class ViewPagerAdapter extends PagerAdapter {
private final ArrayList<String> mTitles;
public ViewPagerAdapter(final ArrayList<String> titles) {
mTitles = titles;
}
@Override
public String getPageTitle(final int position) {
return mTitles.get(position);
}
@Override public Object instantiateItem(ViewGroup container, int position) {
final int resId;
switch (position) {
default:
case 0: {
resId = R.id.environment_layout;
break;
}
case 1: {
resId = R.id.motion_layout;
break;
}
case 2: {
resId = R.id.position_layout;
break;
}
}
return findViewById(resId);
}
@Override public int getCount() {
return mTitles.size();
}
@Override public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
}
}