testImplementation 'junit:junit:4.13.2' | testImplementation 'junit:junit:4.13.2' | ||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5' | androidTestImplementation 'androidx.test.ext:junit:1.1.5' | ||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' | androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' | ||||
def camerax_version = "1.2.3" | |||||
implementation "androidx.camera:camera-camera2:${camerax_version}" | |||||
implementation "androidx.camera:camera-lifecycle:${camerax_version}" | |||||
implementation "androidx.camera:camera-view:${camerax_version}" | |||||
} | } |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
package="com.example.greenwatch"> | package="com.example.greenwatch"> | ||||
<uses-permission android:name="android.permission.INTERNET" /> | |||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | |||||
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> | |||||
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> | |||||
<uses-permission android:name="android.permission.RECORD_AUDIO" /> | |||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | |||||
<uses-permission android:name="android.permission.CAMERA" /> | |||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> | |||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> | |||||
<uses-feature android:name="android.hardware.camera"/> | |||||
<application | <application | ||||
android:allowBackup="true" | android:allowBackup="true" | ||||
android:icon="@mipmap/ic_launcher" | android:icon="@mipmap/ic_launcher" | ||||
android:roundIcon="@mipmap/ic_launcher_round" | android:roundIcon="@mipmap/ic_launcher_round" | ||||
android:supportsRtl="true" | android:supportsRtl="true" | ||||
android:theme="@style/Theme.GreenWatch"> | android:theme="@style/Theme.GreenWatch"> | ||||
<activity | |||||
android:name=".VideodetectionAndAccelerometerActivity" | |||||
android:exported="false" /> | |||||
<activity | |||||
android:name=".AudiodetectionAndAccelerometerActivity" | |||||
android:exported="false" /> | |||||
<activity | |||||
android:name=".VideodetectionActivity" | |||||
android:exported="false" /> | |||||
<activity | |||||
android:name=".AudiodetectionActivity" | |||||
android:exported="false" /> | |||||
<activity | |||||
android:name=".AccelerometerActivity" | |||||
android:exported="false" /> | |||||
<activity | <activity | ||||
android:name=".MainActivity" | android:name=".MainActivity" | ||||
android:exported="true"> | android:exported="true"> |
package com.example.greenwatch; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModelProvider; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.hardware.Sensor; | |||||
import android.hardware.SensorEvent; | |||||
import android.hardware.SensorEventListener; | |||||
import android.hardware.SensorManager; | |||||
import android.os.Bundle; | |||||
import android.view.SurfaceView; | |||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.adapters.AlarmHistoryListAdapter; | |||||
import com.example.greenwatch.adapters.DeviceListAdapter; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.viewmodels.AccelerometerViewModel; | |||||
import java.util.List; | |||||
public class AccelerometerActivity extends AppCompatActivity implements SensorEventListener { | |||||
private SensorManager accelerometerManager; | |||||
private Sensor accelerometerSensor; | |||||
private SurfaceView surfaceView; | |||||
private TextView accelerometerStatusMessage; | |||||
private TextView accelerometerDataTV; | |||||
private TextView tvAccelerometerdeviceListRecyclerView; | |||||
private TextView tvAccelerometeralarmHistoryListRecyclerView; | |||||
private Button backToMainActivityButton; | |||||
private AccelerometerViewModel mAccelerometerViewModel; | |||||
private Permission permission = new Permission(); | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_accelerometer); | |||||
surfaceView = (SurfaceView) findViewById(R.id.surfaceViewAccelerometer); | |||||
accelerometerStatusMessage = (TextView) findViewById(R.id.tvAccelerometerStatusmessage); | |||||
accelerometerDataTV = (TextView) findViewById(R.id.tvAccelerometerData); | |||||
tvAccelerometerdeviceListRecyclerView = (TextView) findViewById(R.id.tvAccelerometerdeviceListRecyclerView); | |||||
tvAccelerometeralarmHistoryListRecyclerView = (TextView) findViewById(R.id.tvAccelerometeralarmHistoryListRecyclerView); | |||||
backToMainActivityButton = (Button) findViewById(R.id.accelerometerBackToMainActivity); | |||||
RecyclerView recyclerView = findViewById(R.id.deviceListRecyclerView); | |||||
recyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
recyclerView.setHasFixedSize(true); | |||||
final DeviceListAdapter deviceListAdapter = new DeviceListAdapter(); | |||||
recyclerView.setAdapter(deviceListAdapter); | |||||
RecyclerView alarmHistoryListRecyclerView = findViewById(R.id.alarmHistoryListRecyclerView); | |||||
alarmHistoryListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
alarmHistoryListRecyclerView.setHasFixedSize(true); | |||||
final AlarmHistoryListAdapter alarmHistoryListAdapter = new AlarmHistoryListAdapter(); | |||||
alarmHistoryListRecyclerView.setAdapter(alarmHistoryListAdapter); | |||||
backToMainActivityButton.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
finish(); | |||||
} | |||||
}); | |||||
mAccelerometerViewModel = new ViewModelProvider(this).get(AccelerometerViewModel.class); | |||||
mAccelerometerViewModel.init(surfaceView.getHolder()); | |||||
mAccelerometerViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
deviceListAdapter.setDevices(devices); | |||||
} | |||||
}); | |||||
mAccelerometerViewModel.getAlarmHistoryList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
alarmHistoryListAdapter.setAlarmHistoryList(devices); | |||||
} | |||||
}); | |||||
mAccelerometerViewModel.getStartAlarmRecording().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
if(permission.alarmRechtePruefen(AccelerometerActivity.this, AccelerometerActivity.this)){ | |||||
Toast.makeText(AccelerometerActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mAccelerometerViewModel.startAlarmRecording(); | |||||
//todo AlarmHandling einfügen | |||||
} | |||||
else { | |||||
permission.alarmRechteAnfordern(AccelerometerActivity.this); | |||||
if(permission.alarmRechtePruefen(AccelerometerActivity.this, AccelerometerActivity.this)){ | |||||
Toast.makeText(AccelerometerActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mAccelerometerViewModel.startAlarmRecording(); | |||||
//todo Alarmhandling einfügen | |||||
} | |||||
else { | |||||
Toast.makeText(AccelerometerActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mAccelerometerViewModel.stopAlarmRecording(AccelerometerActivity.this); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
mAccelerometerViewModel.stopAlarmRecording(AccelerometerActivity.this); | |||||
Toast.makeText(AccelerometerActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
}); | |||||
mAccelerometerViewModel.getAccelerometerAlarmDetected().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
mAccelerometerViewModel.updateDevice(mAccelerometerViewModel.getLocalDeviceUUID(), mAccelerometerViewModel.getSystemTimeStamp(), true, "Accelerometer", mAccelerometerViewModel.getAccelerometerSensorMeanValue()); | |||||
} | |||||
else { | |||||
mAccelerometerViewModel.updateDevice(mAccelerometerViewModel.getLocalDeviceUUID(), mAccelerometerViewModel.getSystemTimeStamp(), false, "Accelerometer", 0.0f); | |||||
} | |||||
} | |||||
}); | |||||
accelerometerManager = (SensorManager) getSystemService(SENSOR_SERVICE); | |||||
if (accelerometerManager.getSensorList(Sensor.TYPE_GYROSCOPE).size() == 0) { | |||||
accelerometerSensor = null; | |||||
Toast.makeText(AccelerometerActivity.this, "No accelerometer sensor available", Toast.LENGTH_LONG).show(); | |||||
} | |||||
else { | |||||
accelerometerSensor = accelerometerManager.getSensorList(Sensor.TYPE_GYROSCOPE).get(0); | |||||
} | |||||
} | |||||
@Override | |||||
public void onSensorChanged(SensorEvent event) { | |||||
StringBuilder sb = new StringBuilder(); | |||||
sb.append("x=") | |||||
.append(event.values[0]) | |||||
.append("\ny=") | |||||
.append(event.values[1]) | |||||
.append("\nz=") | |||||
.append(event.values[2]); | |||||
accelerometerDataTV.setText(sb.toString()); | |||||
mAccelerometerViewModel.addValueToGesamtBE(event.values[0] + event.values[1] + event.values[2]); | |||||
mAccelerometerViewModel.meanValueCalculation(); | |||||
mAccelerometerViewModel.calibrateAccelerometerSensor(); | |||||
mAccelerometerViewModel.checkAlarmCondition(); | |||||
} | |||||
@Override | |||||
public void onAccuracyChanged(Sensor sensor, int accuracy) { | |||||
} | |||||
@Override | |||||
protected void onResume() { | |||||
super.onResume(); | |||||
if (accelerometerSensor != null) { | |||||
if (accelerometerManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME)) { | |||||
Toast.makeText(AccelerometerActivity.this, "We registered to the sensor", Toast.LENGTH_LONG).show(); | |||||
} else { | |||||
Toast.makeText(AccelerometerActivity.this, "Registration did not work", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
protected void onPause() { | |||||
super.onPause(); | |||||
if (accelerometerSensor != null) { | |||||
accelerometerManager.unregisterListener(this, accelerometerSensor); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModelProvider; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.os.Bundle; | |||||
import android.view.SurfaceView; | |||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.adapters.AlarmHistoryListAdapter; | |||||
import com.example.greenwatch.adapters.DeviceListAdapter; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.viewmodels.MicrofonViewModel; | |||||
import java.util.List; | |||||
public class AudiodetectionActivity extends AppCompatActivity { | |||||
private TextView microfonStatusMessage; | |||||
private TextView tvAAudiodetectionAlarmHistoryListRecyclerView; | |||||
private TextView tvAudiodetectionDeviceListRecyclerView; | |||||
private Button backToMainActivityButton; | |||||
private SurfaceView surfaceView; | |||||
private Permission permission = new Permission(); | |||||
private MicrofonViewModel mMicrofonViewModel; | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_audiodetection); | |||||
surfaceView = (SurfaceView) findViewById(R.id.surfaceViewAudio); | |||||
microfonStatusMessage = (TextView) findViewById(R.id.tvAudiodetectionStatusmessage); | |||||
tvAAudiodetectionAlarmHistoryListRecyclerView = (TextView) findViewById(R.id.tvAudiodetectionAlarmHistoryListRecyclerView); | |||||
tvAudiodetectionDeviceListRecyclerView = (TextView) findViewById(R.id.tvAudiodetectionDeviceListRecyclerView); | |||||
backToMainActivityButton = (Button) findViewById(R.id.audiodetectorBackToMainActivity); | |||||
RecyclerView recyclerView = findViewById(R.id.deviceListRecyclerView); | |||||
recyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
recyclerView.setHasFixedSize(true); | |||||
final DeviceListAdapter deviceListAdapter = new DeviceListAdapter(); | |||||
recyclerView.setAdapter(deviceListAdapter); | |||||
RecyclerView alarmHistoryListRecyclerView = findViewById(R.id.alarmHistoryListRecyclerView); | |||||
alarmHistoryListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
alarmHistoryListRecyclerView.setHasFixedSize(true); | |||||
final AlarmHistoryListAdapter alarmHistoryListAdapter = new AlarmHistoryListAdapter(); | |||||
alarmHistoryListRecyclerView.setAdapter(alarmHistoryListAdapter); | |||||
backToMainActivityButton.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
finish(); | |||||
} | |||||
}); | |||||
mMicrofonViewModel = new ViewModelProvider(this).get(MicrofonViewModel.class); | |||||
mMicrofonViewModel.init(surfaceView.getHolder()); | |||||
mMicrofonViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
deviceListAdapter.setDevices(devices); | |||||
} | |||||
}); | |||||
mMicrofonViewModel.getAlarmHistoryList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
alarmHistoryListAdapter.setAlarmHistoryList(devices); | |||||
} | |||||
}); | |||||
mMicrofonViewModel.getStartAlarmRecording().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
if(permission.alarmRechtePruefen(AudiodetectionActivity.this, AudiodetectionActivity.this)){ | |||||
Toast.makeText(AudiodetectionActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mMicrofonViewModel.startAlarmRecording(); | |||||
//todo AlarmHandling einfügen | |||||
} else { | |||||
permission.alarmRechteAnfordern(AudiodetectionActivity.this); | |||||
if(permission.alarmRechtePruefen(AudiodetectionActivity.this, AudiodetectionActivity.this)){ | |||||
Toast.makeText(AudiodetectionActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mMicrofonViewModel.startAlarmRecording(); | |||||
//todo Alarmhandling einfügen | |||||
} else { | |||||
Toast.makeText(AudiodetectionActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mMicrofonViewModel.stopAlarmRecording(AudiodetectionActivity.this); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
Toast.makeText(AudiodetectionActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mMicrofonViewModel.stopAlarmRecording(AudiodetectionActivity.this); | |||||
} | |||||
} | |||||
}); | |||||
mMicrofonViewModel.getMicrofonAlarmDetected().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
mMicrofonViewModel.updateDevice(mMicrofonViewModel.getLocalDeviceUUID(), mMicrofonViewModel.getSystemTimeStamp(), true, "Audio", mMicrofonViewModel.getAmplitudeInDB()); | |||||
} | |||||
else { | |||||
mMicrofonViewModel.updateDevice(mMicrofonViewModel.getLocalDeviceUUID(), mMicrofonViewModel.getSystemTimeStamp(), false, "Audio", 0.0f); | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
protected void onResume() { | |||||
super.onResume(); | |||||
mMicrofonViewModel.startMicrofonSensor(); | |||||
} | |||||
@Override | |||||
protected void onPause() { | |||||
super.onPause(); | |||||
if (isFinishing()){ | |||||
mMicrofonViewModel.recalibrationMicrofonSensor(); | |||||
} | |||||
mMicrofonViewModel.stopMicrofonSensor(); | |||||
} | |||||
} |
package com.example.greenwatch; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModelProvider; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.hardware.Sensor; | |||||
import android.hardware.SensorEvent; | |||||
import android.hardware.SensorEventListener; | |||||
import android.hardware.SensorManager; | |||||
import android.os.Bundle; | |||||
import android.view.SurfaceView; | |||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.adapters.AlarmHistoryListAdapter; | |||||
import com.example.greenwatch.adapters.DeviceListAdapter; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.viewmodels.AudiodetectionAndAccelerometerViewModel; | |||||
import java.util.List; | |||||
public class AudiodetectionAndAccelerometerActivity extends AppCompatActivity implements SensorEventListener { | |||||
private SensorManager accelerometerManager; | |||||
private Sensor accelerometerSensor; | |||||
private SurfaceView surfaceView; | |||||
private TextView audiodetectionAndAccelerometerStatusMessage; | |||||
private TextView tvAudiodetectionAndAccelerometerDeviceListRecyclerView; | |||||
private TextView tvAudiodetectionAndAccelerometerAlarmHistoryListRecyclerView; | |||||
private AudiodetectionAndAccelerometerViewModel mAudiodetectionAndAccelerometerViewModel; | |||||
private Button backToMainActivity; | |||||
private Permission permission = new Permission(); | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_audiodetection_and_accelerometer); | |||||
surfaceView = (SurfaceView) findViewById(R.id.surfaceViewAudiodetectionAndAccelerometer); | |||||
audiodetectionAndAccelerometerStatusMessage = (TextView) findViewById(R.id.tvAudiodetectionAndAccelerometerStatusmessage); | |||||
tvAudiodetectionAndAccelerometerDeviceListRecyclerView = (TextView) findViewById(R.id.tvAudiodetectionAndAccelerometerDeviceListRecyclerView); | |||||
tvAudiodetectionAndAccelerometerAlarmHistoryListRecyclerView = (TextView) findViewById(R.id.tvAudiodetectionAndAccelerometerAlarmHistoryListRecyclerView); | |||||
backToMainActivity = (Button) findViewById(R.id.audiodetectionAndAccelerometerBackToMainActivity); | |||||
RecyclerView recyclerView = findViewById(R.id.deviceListRecyclerView); | |||||
recyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
recyclerView.setHasFixedSize(true); | |||||
final DeviceListAdapter deviceListAdapter = new DeviceListAdapter(); | |||||
recyclerView.setAdapter(deviceListAdapter); | |||||
RecyclerView alarmHistoryListRecyclerView = findViewById(R.id.alarmHistoryListRecyclerView); | |||||
alarmHistoryListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
alarmHistoryListRecyclerView.setHasFixedSize(true); | |||||
final AlarmHistoryListAdapter alarmHistoryListAdapter = new AlarmHistoryListAdapter(); | |||||
alarmHistoryListRecyclerView.setAdapter(alarmHistoryListAdapter); | |||||
backToMainActivity.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
finish(); | |||||
} | |||||
}); | |||||
mAudiodetectionAndAccelerometerViewModel = new ViewModelProvider(this).get(AudiodetectionAndAccelerometerViewModel.class); | |||||
mAudiodetectionAndAccelerometerViewModel.init(surfaceView.getHolder()); | |||||
mAudiodetectionAndAccelerometerViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
deviceListAdapter.setDevices(devices); | |||||
} | |||||
}); | |||||
mAudiodetectionAndAccelerometerViewModel.getAlarmHistoryList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
alarmHistoryListAdapter.setAlarmHistoryList(devices); | |||||
} | |||||
}); | |||||
mAudiodetectionAndAccelerometerViewModel.getStartAlarmRecording().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
if(permission.alarmRechtePruefen(AudiodetectionAndAccelerometerActivity.this, AudiodetectionAndAccelerometerActivity.this)){ | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mAudiodetectionAndAccelerometerViewModel.startAlarmRecording(); | |||||
//todo AlarmHandling einfügen | |||||
} else { | |||||
permission.alarmRechteAnfordern(AudiodetectionAndAccelerometerActivity.this); | |||||
if(permission.alarmRechtePruefen(AudiodetectionAndAccelerometerActivity.this, AudiodetectionAndAccelerometerActivity.this)){ | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mAudiodetectionAndAccelerometerViewModel.startAlarmRecording(); | |||||
//todo Alarmhandling einfügen | |||||
} else { | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mAudiodetectionAndAccelerometerViewModel.stopAlarmRecording(AudiodetectionAndAccelerometerActivity.this); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mAudiodetectionAndAccelerometerViewModel.stopAlarmRecording(AudiodetectionAndAccelerometerActivity.this); | |||||
} | |||||
} | |||||
}); | |||||
mAudiodetectionAndAccelerometerViewModel.getAudiodetectionAndAccelerometerAlarmDetected().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "onChangedTrue", Toast.LENGTH_LONG).show(); | |||||
if (mAudiodetectionAndAccelerometerViewModel.getAccelerometerAlarmDetected() && !mAudiodetectionAndAccelerometerViewModel.getMicrofonAlarmDetected()) { | |||||
mAudiodetectionAndAccelerometerViewModel.updateDevice(mAudiodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mAudiodetectionAndAccelerometerViewModel.getSystemTimeStamp(), true, "Accelerometer", mAudiodetectionAndAccelerometerViewModel.getAccelerometerSensorMeanValue()); | |||||
} | |||||
else if (mAudiodetectionAndAccelerometerViewModel.getMicrofonAlarmDetected() && !mAudiodetectionAndAccelerometerViewModel.getAccelerometerAlarmDetected()) { | |||||
mAudiodetectionAndAccelerometerViewModel.updateDevice(mAudiodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mAudiodetectionAndAccelerometerViewModel.getSystemTimeStamp(), true, "Audio", mAudiodetectionAndAccelerometerViewModel.getAmplitudeInDB()); | |||||
} | |||||
else if (mAudiodetectionAndAccelerometerViewModel.getMicrofonAlarmDetected() && mAudiodetectionAndAccelerometerViewModel.getAccelerometerAlarmDetected()) { | |||||
mAudiodetectionAndAccelerometerViewModel.updateDevice(mAudiodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mAudiodetectionAndAccelerometerViewModel.getSystemTimeStamp(), true, "AudioAndAccelerometer", mAudiodetectionAndAccelerometerViewModel.getAmplitudeInDB()); | |||||
} | |||||
} | |||||
else { | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "onChangedFalse", Toast.LENGTH_LONG).show(); | |||||
mAudiodetectionAndAccelerometerViewModel.updateDevice(mAudiodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mAudiodetectionAndAccelerometerViewModel.getSystemTimeStamp(), false, "AudioAndAccelerometer", 0.0f); | |||||
} | |||||
} | |||||
}); | |||||
accelerometerManager = (SensorManager) getSystemService(SENSOR_SERVICE); | |||||
if (accelerometerManager.getSensorList(Sensor.TYPE_GYROSCOPE).size() == 0) { | |||||
accelerometerSensor = null; | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "No accelerometer sensor available", Toast.LENGTH_LONG).show(); | |||||
} | |||||
else { | |||||
accelerometerSensor = accelerometerManager.getSensorList(Sensor.TYPE_GYROSCOPE).get(0); | |||||
} | |||||
} | |||||
@Override | |||||
public void onSensorChanged(SensorEvent event) { | |||||
StringBuilder sb = new StringBuilder(); | |||||
sb.append("x=") | |||||
.append(event.values[0]) | |||||
.append("\ny=") | |||||
.append(event.values[1]) | |||||
.append("\nz=") | |||||
.append(event.values[2]); | |||||
audiodetectionAndAccelerometerStatusMessage.setText(sb.toString()); | |||||
mAudiodetectionAndAccelerometerViewModel.addValueToGesamtBE(event.values[0] + event.values[1] + event.values[2]); | |||||
mAudiodetectionAndAccelerometerViewModel.meanValueCalculation(); | |||||
mAudiodetectionAndAccelerometerViewModel.calibrateAccelerometerSensor(); | |||||
mAudiodetectionAndAccelerometerViewModel.checkAlarmCondition(); | |||||
} | |||||
@Override | |||||
public void onAccuracyChanged(Sensor sensor, int accuracy) { | |||||
} | |||||
@Override | |||||
protected void onResume() { | |||||
super.onResume(); | |||||
mAudiodetectionAndAccelerometerViewModel.startMicrofonSensor(); | |||||
if (accelerometerSensor != null) { | |||||
if (accelerometerManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME)) { | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "We registered to the sensor", Toast.LENGTH_LONG).show(); | |||||
} else { | |||||
Toast.makeText(AudiodetectionAndAccelerometerActivity.this, "Registration did not work", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
protected void onPause() { | |||||
super.onPause(); | |||||
if (isFinishing()){ | |||||
mAudiodetectionAndAccelerometerViewModel.recalibrationMicrofonSensor(); | |||||
} | |||||
mAudiodetectionAndAccelerometerViewModel.stopMicrofonSensor(); | |||||
if (accelerometerSensor != null) { | |||||
accelerometerManager.unregisterListener(this, accelerometerSensor); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch; | package com.example.greenwatch; | ||||
import androidx.appcompat.app.AppCompatActivity; | import androidx.appcompat.app.AppCompatActivity; | ||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModelProvider; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.app.Activity; | |||||
import android.content.Context; | |||||
import android.content.Intent; | |||||
import android.os.Bundle; | import android.os.Bundle; | ||||
import android.view.SurfaceView; | |||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.adapters.AlarmHistoryListAdapter; | |||||
import com.example.greenwatch.adapters.DeviceListAdapter; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.viewmodels.MainActivityViewModel; | |||||
import java.util.List; | |||||
public class MainActivity extends AppCompatActivity { | public class MainActivity extends AppCompatActivity { | ||||
private Button audiodetectionButton; | |||||
private Button videodetectionButton; | |||||
private Button accelerometerButton; | |||||
private Button audiodetectionAndAccelerometerButton; | |||||
private Button videodetectionAndAccelerometerButton; | |||||
private TextView tvMainActivityDeviceListRecyclerView; | |||||
private TextView tvMainActivityAlarmHistoryListRecyclerView; | |||||
private SurfaceView surfaceView; | |||||
private MainActivityViewModel mMainActivityViewModel; | |||||
private Permission permission = new Permission(); | |||||
private Activity activity = new Activity(); | |||||
private Context context; | |||||
@Override | @Override | ||||
protected void onCreate(Bundle savedInstanceState) { | protected void onCreate(Bundle savedInstanceState) { | ||||
super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
setContentView(R.layout.activity_main); | setContentView(R.layout.activity_main); | ||||
activity = MainActivity.this; | |||||
context = MainActivity.this; | |||||
surfaceView = (SurfaceView) findViewById(R.id.surfaceViewMainActivity); | |||||
tvMainActivityDeviceListRecyclerView = (TextView) findViewById(R.id.tvMainActivityDeviceListRecyclerView); | |||||
tvMainActivityAlarmHistoryListRecyclerView = (TextView) findViewById(R.id.tvMainActivityAlarmHistoryListRecyclerView); | |||||
audiodetectionButton = (Button) findViewById(R.id.audiodetectionButton); | |||||
videodetectionButton = (Button) findViewById(R.id.videodetectionButton); | |||||
accelerometerButton = (Button) findViewById(R.id.accelerometerButton); | |||||
audiodetectionAndAccelerometerButton = (Button) findViewById(R.id.audiodetectionAndAccelerometerButton); | |||||
videodetectionAndAccelerometerButton = (Button) findViewById(R.id.videodetectionAndAccelerometerButton); | |||||
RecyclerView deviceListRecyclerView = findViewById(R.id.deviceListRecyclerView); | |||||
deviceListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
deviceListRecyclerView.setHasFixedSize(true); | |||||
final DeviceListAdapter deviceListAdapter = new DeviceListAdapter(); | |||||
deviceListRecyclerView.setAdapter(deviceListAdapter); | |||||
RecyclerView alarmHistoryListRecyclerView = findViewById(R.id.alarmHistoryListRecyclerView); | |||||
alarmHistoryListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
alarmHistoryListRecyclerView.setHasFixedSize(true); | |||||
final AlarmHistoryListAdapter alarmHistoryListAdapter = new AlarmHistoryListAdapter(); | |||||
alarmHistoryListRecyclerView.setAdapter(alarmHistoryListAdapter); | |||||
permission.startRechtePruefen(this, this); | |||||
mMainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class); | |||||
mMainActivityViewModel.init(surfaceView.getHolder()); | |||||
mMainActivityViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
deviceListAdapter.setDevices(devices); | |||||
} | |||||
}); | |||||
mMainActivityViewModel.getAlarmHistoryList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
alarmHistoryListAdapter.setAlarmHistoryList(devices); | |||||
} | |||||
}); | |||||
mMainActivityViewModel.getStartAlarmRecording().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
if(permission.alarmRechtePruefen(context, activity)){ | |||||
Toast.makeText(MainActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mMainActivityViewModel.startAlarmRecording(); | |||||
//todo AlarmHandling einfügen | |||||
} else { | |||||
permission.alarmRechteAnfordern(activity); | |||||
if(permission.alarmRechtePruefen(context, activity)){ | |||||
Toast.makeText(MainActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mMainActivityViewModel.startAlarmRecording(); | |||||
//todo Alarmhandling einfügen | |||||
} else { | |||||
Toast.makeText(MainActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mMainActivityViewModel.stopAlarmRecording(MainActivity.this); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
Toast.makeText(MainActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
}); | |||||
audiodetectionButton.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (permission.microRechtePruefen(context, activity)) { | |||||
openAudiodetectionActivity(); | |||||
} | |||||
else { | |||||
permission.microRechteAnfordern(activity); | |||||
} | |||||
} | |||||
}); | |||||
videodetectionButton.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (permission.kameraRechtePruefen(context, activity)) { | |||||
openVideodetectionActivity(); | |||||
} | |||||
else { | |||||
permission.kameraRechteAnfordern(activity); | |||||
} | |||||
} | |||||
}); | |||||
accelerometerButton.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
openAccelerometerActivity(); | |||||
mMainActivityViewModel.setSensorType(mMainActivityViewModel.getLocalDeviceUUID(), "Accelerometer"); | |||||
} | |||||
}); | |||||
audiodetectionAndAccelerometerButton.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (permission.microRechtePruefen(context, activity)) { | |||||
openAudiodetectionAndAccelerometerActivity(); | |||||
} | |||||
else { | |||||
permission.microRechteAnfordern(activity); | |||||
} | |||||
} | |||||
}); | |||||
videodetectionAndAccelerometerButton.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (permission.kameraRechtePruefen(context, activity)) { | |||||
openVideodetectionAndAccelerometerActivity(); | |||||
} | |||||
else { | |||||
permission.kameraRechteAnfordern(activity); | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
protected void onResume() { | |||||
super.onResume(); | |||||
mMainActivityViewModel.updateDevice(mMainActivityViewModel.getLocalDeviceUUID(), mMainActivityViewModel.getSystemTimeStamp(), false, "No Sensor selected", 0.0f); | |||||
} | |||||
public void openAudiodetectionActivity() { | |||||
mMainActivityViewModel.updateDevice(mMainActivityViewModel.getLocalDeviceUUID(), mMainActivityViewModel.getSystemTimeStamp(), false, "Audio", 0.0f); | |||||
Intent intent = new Intent(this, AudiodetectionActivity.class); | |||||
startActivity(intent); | |||||
} | |||||
public void openVideodetectionActivity() { | |||||
mMainActivityViewModel.updateDevice(mMainActivityViewModel.getLocalDeviceUUID(), mMainActivityViewModel.getSystemTimeStamp(), false, "Video", 0.0f); | |||||
Intent intent = new Intent(this, VideodetectionActivity.class); | |||||
startActivity(intent); | |||||
} | |||||
public void openAccelerometerActivity() { | |||||
mMainActivityViewModel.updateDevice(mMainActivityViewModel.getLocalDeviceUUID(), mMainActivityViewModel.getSystemTimeStamp(), false, "Accelerometer", 0.0f); | |||||
Intent intent = new Intent(this, AccelerometerActivity.class); | |||||
startActivity(intent); | |||||
} | |||||
public void openAudiodetectionAndAccelerometerActivity() { | |||||
mMainActivityViewModel.updateDevice(mMainActivityViewModel.getLocalDeviceUUID(), mMainActivityViewModel.getSystemTimeStamp(), false, "AudioAndAccelerometer", 0.0f); | |||||
Intent intent = new Intent(this, AudiodetectionAndAccelerometerActivity.class); | |||||
startActivity(intent); | |||||
} | |||||
public void openVideodetectionAndAccelerometerActivity() { | |||||
mMainActivityViewModel.updateDevice(mMainActivityViewModel.getLocalDeviceUUID(), mMainActivityViewModel.getSystemTimeStamp(), false, "VideoAndAccelerometer", 0.0f); | |||||
Intent intent = new Intent(this, VideodetectionAndAccelerometerActivity.class); | |||||
startActivity(intent); | |||||
} | |||||
@Override | |||||
protected void onPause() { | |||||
super.onPause(); | |||||
} | } | ||||
} | } |
package com.example.greenwatch; | |||||
import static android.Manifest.permission.CAMERA; | |||||
import static android.Manifest.permission.RECORD_AUDIO; | |||||
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; | |||||
import static android.Manifest.permission.READ_EXTERNAL_STORAGE; | |||||
import static androidx.core.app.ActivityCompat.requestPermissions; | |||||
import static androidx.core.content.ContextCompat.checkSelfPermission; | |||||
import android.Manifest; | |||||
import android.app.Activity; | |||||
import android.content.Context; | |||||
import android.content.DialogInterface; | |||||
import android.content.pm.PackageManager; | |||||
import android.os.Bundle; | |||||
import android.util.Log; | |||||
import android.view.View; | |||||
import androidx.appcompat.app.AlertDialog; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import androidx.core.app.ActivityCompat; | |||||
import androidx.core.content.ContextCompat; | |||||
public class Permission { | |||||
private static final int PERMISSION_REQUEST_MICRO = 1; | |||||
private static final int PERMISSION_REQUEST_CAMERA = 2; | |||||
private static final int PERMISSION_REQUEST_ALARM = 1234; | |||||
private static final int PERMISSION_REQUEST_START = 1235; | |||||
public void startRechtePruefen(Context context, Activity activity){ | |||||
boolean rechtKamera = checkSelfPermission(context, CAMERA) == PackageManager.PERMISSION_GRANTED; | |||||
boolean rechtAudio = checkSelfPermission(context, RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED; | |||||
boolean rechtSchreiben = checkSelfPermission(context, WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; | |||||
boolean rechtLesen = checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; | |||||
Log.d("Kamera Rechte", String.valueOf(rechtKamera)); | |||||
Log.d("Audio Rechte", String.valueOf(rechtAudio)); | |||||
Log.d("Schreib Rechte", String.valueOf(rechtSchreiben)); | |||||
Log.d("Lese Rechte", String.valueOf(rechtLesen)); | |||||
if(rechtKamera && rechtAudio && rechtSchreiben && rechtLesen){ | |||||
Log.d("Rechte", "erteilt"); | |||||
} else { | |||||
startRechteAnfordern(activity); | |||||
} | |||||
} | |||||
public boolean kameraRechtePruefen(Context context, Activity activity){ | |||||
boolean rechtKamera = checkSelfPermission(context, CAMERA) == PackageManager.PERMISSION_GRANTED; | |||||
Log.d("Kamera Rechte", String.valueOf(rechtKamera)); | |||||
if(rechtKamera){ | |||||
Log.d("Kamerarechte", "erteilt"); | |||||
return true; | |||||
} else { | |||||
kameraRechteAnfordern(activity); | |||||
if(checkSelfPermission(context, CAMERA) == PackageManager.PERMISSION_GRANTED){ | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | |||||
} | |||||
public boolean microRechtePruefen(Context context, Activity activity){ | |||||
boolean rechtAudio = checkSelfPermission(context, RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED; | |||||
Log.d("Audio Rechte", String.valueOf(rechtAudio)); | |||||
if(rechtAudio){ | |||||
Log.d("Rechte", "erteilt"); | |||||
return true; | |||||
} else { | |||||
microRechteAnfordern(activity); | |||||
if(checkSelfPermission(context, RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED){ | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | |||||
} | |||||
public boolean alarmRechtePruefen(Context context, Activity activity){ | |||||
boolean rechtKamera = checkSelfPermission(context, CAMERA) == PackageManager.PERMISSION_GRANTED; | |||||
boolean rechtAudio = checkSelfPermission(context, RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED; | |||||
boolean rechtSchreiben = checkSelfPermission(context, WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; | |||||
boolean rechtLesen = checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; | |||||
Log.d("Kamera Rechte", String.valueOf(rechtKamera)); | |||||
Log.d("Audio Rechte", String.valueOf(rechtAudio)); | |||||
Log.d("Schreib Rechte", String.valueOf(rechtSchreiben)); | |||||
Log.d("Lese Rechte", String.valueOf(rechtLesen)); | |||||
if(rechtKamera && rechtAudio && rechtSchreiben && rechtLesen){ | |||||
Log.d("Rechte", "erteilt"); | |||||
return true; | |||||
} else { | |||||
alarmRechteAnfordern(activity); | |||||
if(checkSelfPermission(context, CAMERA) == PackageManager.PERMISSION_GRANTED | |||||
&& checkSelfPermission(context, RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED | |||||
&& checkSelfPermission(context, WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED | |||||
&& checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){ | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | |||||
} | |||||
public void startRechteAnfordern(Activity activity){ | |||||
ActivityCompat.requestPermissions(activity, new String[]{CAMERA, RECORD_AUDIO, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_START); | |||||
} | |||||
public void kameraRechteAnfordern(Activity activity){ | |||||
ActivityCompat.requestPermissions(activity, new String[]{CAMERA}, PERMISSION_REQUEST_CAMERA); | |||||
} | |||||
public void microRechteAnfordern(Activity activity){ | |||||
ActivityCompat.requestPermissions(activity, new String[]{RECORD_AUDIO}, PERMISSION_REQUEST_MICRO); | |||||
} | |||||
public void alarmRechteAnfordern(Activity activity){ | |||||
ActivityCompat.requestPermissions(activity, new String[]{CAMERA, RECORD_AUDIO, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_ALARM); | |||||
} | |||||
} |
package com.example.greenwatch; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import androidx.camera.lifecycle.ProcessCameraProvider; | |||||
import androidx.core.content.ContextCompat; | |||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModelProvider; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.os.Bundle; | |||||
import android.view.SurfaceView; | |||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.adapters.AlarmHistoryListAdapter; | |||||
import com.example.greenwatch.adapters.DeviceListAdapter; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.viewmodels.VideodetectionViewModel; | |||||
import com.google.common.util.concurrent.ListenableFuture; | |||||
import java.util.List; | |||||
import java.util.concurrent.ExecutionException; | |||||
public class VideodetectionActivity extends AppCompatActivity { | |||||
private Button backToMainActivity; | |||||
private SurfaceView surfaceView; | |||||
private TextView tvVideodetectionDeviceListRecyclerView; | |||||
private TextView tvVideodetectionAlarmHistoryListRecyclerView; | |||||
private VideodetectionViewModel mVideoDetectionViewModel; | |||||
private Permission permission = new Permission(); | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_videodetection); | |||||
surfaceView = (SurfaceView) findViewById(R.id.surfaceViewVideodetection); | |||||
tvVideodetectionDeviceListRecyclerView = (TextView) findViewById(R.id.tvVideodetectionDeviceListRecyclerView); | |||||
tvVideodetectionAlarmHistoryListRecyclerView = (TextView) findViewById(R.id.tvVideodetectionAlarmHistoryListRecyclerView); | |||||
backToMainActivity = (Button) findViewById(R.id.videodetectorBackToMainActivity); | |||||
RecyclerView recyclerView = findViewById(R.id.deviceListRecyclerView); | |||||
recyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
recyclerView.setHasFixedSize(true); | |||||
final DeviceListAdapter deviceListAdapter = new DeviceListAdapter(); | |||||
recyclerView.setAdapter(deviceListAdapter); | |||||
RecyclerView alarmHistoryListRecyclerView = findViewById(R.id.alarmHistoryListRecyclerView); | |||||
alarmHistoryListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
alarmHistoryListRecyclerView.setHasFixedSize(true); | |||||
final AlarmHistoryListAdapter alarmHistoryListAdapter = new AlarmHistoryListAdapter(); | |||||
alarmHistoryListRecyclerView.setAdapter(alarmHistoryListAdapter); | |||||
backToMainActivity.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
finish(); | |||||
} | |||||
}); | |||||
mVideoDetectionViewModel = new ViewModelProvider(this).get(VideodetectionViewModel.class); | |||||
mVideoDetectionViewModel.init(surfaceView.getHolder()); | |||||
mVideoDetectionViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
deviceListAdapter.setDevices(devices); | |||||
} | |||||
}); | |||||
mVideoDetectionViewModel.getAlarmHistoryList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
alarmHistoryListAdapter.setAlarmHistoryList(devices); | |||||
} | |||||
}); | |||||
mVideoDetectionViewModel.getStartAlarmRecording().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
if(permission.alarmRechtePruefen(VideodetectionActivity.this, VideodetectionActivity.this)){ | |||||
Toast.makeText(VideodetectionActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mVideoDetectionViewModel.startAlarmRecording(); | |||||
//todo AlarmHandling einfügen | |||||
} else { | |||||
permission.alarmRechteAnfordern(VideodetectionActivity.this); | |||||
if(permission.alarmRechtePruefen(VideodetectionActivity.this, VideodetectionActivity.this)){ | |||||
Toast.makeText(VideodetectionActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mVideoDetectionViewModel.startAlarmRecording(); | |||||
//todo Alarmhandling einfügen | |||||
} else { | |||||
Toast.makeText(VideodetectionActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mVideoDetectionViewModel.stopAlarmRecording(VideodetectionActivity.this); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
Toast.makeText(VideodetectionActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
}); | |||||
mVideoDetectionViewModel.getVideoAlarmDetectedValue().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
mVideoDetectionViewModel.updateDevice(mVideoDetectionViewModel.getLocalDeviceUUID(), mVideoDetectionViewModel.getSystemTimeStamp(), true, "Video", 1.0f); | |||||
} | |||||
else { | |||||
mVideoDetectionViewModel.updateDevice(mVideoDetectionViewModel.getLocalDeviceUUID(), mVideoDetectionViewModel.getSystemTimeStamp(), false, "Video", 0.0f); | |||||
} | |||||
} | |||||
}); | |||||
final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this); | |||||
cameraProviderFuture.addListener(() -> { | |||||
try { | |||||
mVideoDetectionViewModel.bindImageAnalysis(cameraProviderFuture.get(), this, this); | |||||
} catch (ExecutionException | InterruptedException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
}, ContextCompat.getMainExecutor(this)); | |||||
} | |||||
} |
package com.example.greenwatch; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import androidx.camera.lifecycle.ProcessCameraProvider; | |||||
import androidx.core.content.ContextCompat; | |||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModelProvider; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import android.hardware.Sensor; | |||||
import android.hardware.SensorEvent; | |||||
import android.hardware.SensorEventListener; | |||||
import android.hardware.SensorManager; | |||||
import android.os.Bundle; | |||||
import android.view.SurfaceView; | |||||
import android.view.View; | |||||
import android.widget.Button; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.adapters.AlarmHistoryListAdapter; | |||||
import com.example.greenwatch.adapters.DeviceListAdapter; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.viewmodels.AccelerometerViewModel; | |||||
import com.example.greenwatch.viewmodels.VideodetectionAndAccelerometerViewModel; | |||||
import com.example.greenwatch.viewmodels.VideodetectionViewModel; | |||||
import com.google.common.util.concurrent.ListenableFuture; | |||||
import java.util.List; | |||||
import java.util.concurrent.ExecutionException; | |||||
public class VideodetectionAndAccelerometerActivity extends AppCompatActivity implements SensorEventListener { | |||||
private SensorManager accelerometerManager; | |||||
private Sensor accelerometerSensor; | |||||
private SurfaceView surfaceView; | |||||
private TextView videodetectionAndAccelerometerStatusMessage; | |||||
private TextView videodetectionAndAccelerometerDataTV; | |||||
private TextView tvVideodetectionAndAccelerometerDeviceListRecyclerView; | |||||
private TextView tvVideodetectionAndAccelerometerAlarmHistoryListRecyclerView; | |||||
private Button backToMainActivity; | |||||
private VideodetectionAndAccelerometerViewModel mVideodetectionAndAccelerometerViewModel; | |||||
private Permission permission = new Permission(); | |||||
@Override | |||||
protected void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_videodetection_and_accelerometer); | |||||
surfaceView = (SurfaceView) findViewById(R.id.surfaceViewVideodetectionAndAccelerometer); | |||||
videodetectionAndAccelerometerStatusMessage = (TextView) findViewById(R.id.tvvideodetectionAndAccelerometerStatusmessage); | |||||
videodetectionAndAccelerometerDataTV = (TextView) findViewById(R.id.tvvideodetectionAndAccelerometerData); | |||||
tvVideodetectionAndAccelerometerDeviceListRecyclerView = (TextView) findViewById(R.id.tvVideodetectionAndAccelerometerDeviceListRecyclerView); | |||||
tvVideodetectionAndAccelerometerAlarmHistoryListRecyclerView = (TextView) findViewById(R.id.tvVideodetectionAndAccelerometerAlarmHistoryListRecyclerView); | |||||
backToMainActivity = (Button) findViewById(R.id.videodetectionAndAccelerometerBackToMainActivity); | |||||
RecyclerView recyclerView = findViewById(R.id.deviceListRecyclerView); | |||||
recyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
recyclerView.setHasFixedSize(true); | |||||
final DeviceListAdapter deviceListAdapter = new DeviceListAdapter(); | |||||
recyclerView.setAdapter(deviceListAdapter); | |||||
RecyclerView alarmHistoryListRecyclerView = findViewById(R.id.alarmHistoryListRecyclerView); | |||||
alarmHistoryListRecyclerView.setLayoutManager(new LinearLayoutManager(this)); | |||||
alarmHistoryListRecyclerView.setHasFixedSize(true); | |||||
final AlarmHistoryListAdapter alarmHistoryListAdapter = new AlarmHistoryListAdapter(); | |||||
alarmHistoryListRecyclerView.setAdapter(alarmHistoryListAdapter); | |||||
backToMainActivity.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
finish(); | |||||
} | |||||
}); | |||||
mVideodetectionAndAccelerometerViewModel = new ViewModelProvider(this).get(VideodetectionAndAccelerometerViewModel.class); | |||||
mVideodetectionAndAccelerometerViewModel.init(surfaceView.getHolder()); | |||||
mVideodetectionAndAccelerometerViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
deviceListAdapter.setDevices(devices); | |||||
} | |||||
}); | |||||
mVideodetectionAndAccelerometerViewModel.getAlarmHistoryList().observe(this, new Observer<List<Device>>() { | |||||
@Override | |||||
public void onChanged(List<Device> devices) { | |||||
alarmHistoryListAdapter.setAlarmHistoryList(devices); | |||||
} | |||||
}); | |||||
mVideodetectionAndAccelerometerViewModel.getStartAlarmRecording().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
if(permission.alarmRechtePruefen(VideodetectionAndAccelerometerActivity.this, VideodetectionAndAccelerometerActivity.this)){ | |||||
Toast.makeText(VideodetectionAndAccelerometerActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mVideodetectionAndAccelerometerViewModel.startAlarmRecording(); | |||||
//todo AlarmHandling einfügen | |||||
} else { | |||||
permission.alarmRechteAnfordern(VideodetectionAndAccelerometerActivity.this); | |||||
if(permission.alarmRechtePruefen(VideodetectionAndAccelerometerActivity.this, VideodetectionAndAccelerometerActivity.this)){ | |||||
Toast.makeText(VideodetectionAndAccelerometerActivity.this, "Start Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mVideodetectionAndAccelerometerViewModel.startAlarmRecording(); | |||||
//todo Alarmhandling einfügen | |||||
} else { | |||||
Toast.makeText(VideodetectionAndAccelerometerActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mVideodetectionAndAccelerometerViewModel.stopAlarmRecording(VideodetectionAndAccelerometerActivity.this); | |||||
} | |||||
} | |||||
} | |||||
else { | |||||
Toast.makeText(VideodetectionAndAccelerometerActivity.this, "Stop Alarm Recording", Toast.LENGTH_LONG).show(); | |||||
mVideodetectionAndAccelerometerViewModel.stopAlarmRecording(VideodetectionAndAccelerometerActivity.this); | |||||
} | |||||
} | |||||
}); | |||||
mVideodetectionAndAccelerometerViewModel.getVideodetectionAndAccelerometerAlarmDetected().observe(this, new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
if (aBoolean) { | |||||
if (mVideodetectionAndAccelerometerViewModel.getAccelerometerAlarmDetected() && !mVideodetectionAndAccelerometerViewModel.getVideoAlarmDetected()) { | |||||
mVideodetectionAndAccelerometerViewModel.updateDevice(mVideodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mVideodetectionAndAccelerometerViewModel.getSystemTimeStamp(), true, "Accelerometer", mVideodetectionAndAccelerometerViewModel.getAccelerometerSensorMeanValue()); | |||||
} | |||||
else if (mVideodetectionAndAccelerometerViewModel.getVideoAlarmDetected() && !mVideodetectionAndAccelerometerViewModel.getAccelerometerAlarmDetected()) { | |||||
mVideodetectionAndAccelerometerViewModel.updateDevice(mVideodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mVideodetectionAndAccelerometerViewModel.getSystemTimeStamp(), true, "Video", 1.0f); | |||||
} | |||||
else if (mVideodetectionAndAccelerometerViewModel.getAccelerometerAlarmDetected() && mVideodetectionAndAccelerometerViewModel.getVideoAlarmDetected()) { | |||||
mVideodetectionAndAccelerometerViewModel.updateDevice(mVideodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mVideodetectionAndAccelerometerViewModel.getSystemTimeStamp(), true, "VideoAndAccelerometer", mVideodetectionAndAccelerometerViewModel.getAccelerometerSensorMeanValue()); | |||||
} | |||||
} | |||||
else { | |||||
mVideodetectionAndAccelerometerViewModel.updateDevice(mVideodetectionAndAccelerometerViewModel.getLocalDeviceUUID(), mVideodetectionAndAccelerometerViewModel.getSystemTimeStamp(), false, "VideoAndAccelerometer", 0.0f); | |||||
} | |||||
} | |||||
}); | |||||
final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this); | |||||
cameraProviderFuture.addListener(() -> { | |||||
try { | |||||
mVideodetectionAndAccelerometerViewModel.bindImageAnalysis(cameraProviderFuture.get(), this, this); | |||||
} catch (ExecutionException | InterruptedException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
}, ContextCompat.getMainExecutor(this)); | |||||
accelerometerManager = (SensorManager) getSystemService(SENSOR_SERVICE); | |||||
if (accelerometerManager.getSensorList(Sensor.TYPE_GYROSCOPE).size() == 0) { | |||||
accelerometerSensor = null; | |||||
Toast.makeText(VideodetectionAndAccelerometerActivity.this, "No accelerometer sensor available", Toast.LENGTH_LONG).show(); | |||||
} | |||||
else { | |||||
accelerometerSensor = accelerometerManager.getSensorList(Sensor.TYPE_GYROSCOPE).get(0); | |||||
} | |||||
} | |||||
@Override | |||||
public void onSensorChanged(SensorEvent event) { | |||||
StringBuilder sb = new StringBuilder(); | |||||
sb.append("x=") | |||||
.append(event.values[0]) | |||||
.append("\ny=") | |||||
.append(event.values[1]) | |||||
.append("\nz=") | |||||
.append(event.values[2]); | |||||
videodetectionAndAccelerometerDataTV.setText(sb.toString()); | |||||
mVideodetectionAndAccelerometerViewModel.addValueToGesamtBE(event.values[0] + event.values[1] + event.values[2]); | |||||
mVideodetectionAndAccelerometerViewModel.meanValueCalculation(); | |||||
mVideodetectionAndAccelerometerViewModel.calibrateAccelerometerSensor(); | |||||
mVideodetectionAndAccelerometerViewModel.checkAlarmCondition(); | |||||
} | |||||
@Override | |||||
public void onAccuracyChanged(Sensor sensor, int accuracy) { | |||||
} | |||||
@Override | |||||
protected void onResume() { | |||||
super.onResume(); | |||||
if (accelerometerSensor != null) { | |||||
if (accelerometerManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME)) { | |||||
Toast.makeText(VideodetectionAndAccelerometerActivity.this, "We registered to the sensor", Toast.LENGTH_LONG).show(); | |||||
} else { | |||||
Toast.makeText(VideodetectionAndAccelerometerActivity.this, "Registration did not work", Toast.LENGTH_LONG).show(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
protected void onPause() { | |||||
super.onPause(); | |||||
if (accelerometerSensor != null) { | |||||
accelerometerManager.unregisterListener(this, accelerometerSensor); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.adapters; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.widget.TextView; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import com.example.greenwatch.R; | |||||
import com.example.greenwatch.models.Device; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
public class AlarmHistoryListAdapter extends RecyclerView.Adapter<AlarmHistoryListAdapter.AlarmHistoryListHolder> { | |||||
private List<Device> alarmHistoryList = new ArrayList<>(); | |||||
@NonNull | |||||
@Override | |||||
public AlarmHistoryListHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||||
View itemView = LayoutInflater.from(parent.getContext()) | |||||
.inflate(R.layout.alarm_history_item, parent, false); | |||||
return new AlarmHistoryListHolder(itemView); | |||||
} | |||||
@Override | |||||
public void onBindViewHolder(@NonNull AlarmHistoryListHolder holder, int position) { | |||||
Device currentDevice = alarmHistoryList.get(position); | |||||
holder.textViewSensorType.setText(holder.itemView.getContext().getString(R.string.sensor_type_placeholder, currentDevice.getSensorType())); | |||||
holder.textViewDeviceID.setText(holder.itemView.getContext().getString(R.string.deviceID_placeholder, currentDevice.getDeviceID())); | |||||
holder.textViewTimeStamp.setText(holder.itemView.getContext().getString(R.string.sensor_time_stamp_placeholder, currentDevice.getTimeStamp())); | |||||
holder.textViewSensorMessage.setText(holder.itemView.getContext().getString(R.string.sensor_message_placeholder, currentDevice.getSensorMassage())); | |||||
} | |||||
@Override | |||||
public int getItemCount() { | |||||
return alarmHistoryList.size(); | |||||
} | |||||
public void setAlarmHistoryList(List<Device> alarmHistoryList) { | |||||
this.alarmHistoryList = alarmHistoryList; | |||||
notifyDataSetChanged(); | |||||
} | |||||
class AlarmHistoryListHolder extends RecyclerView.ViewHolder { | |||||
private TextView textViewSensorType; | |||||
private TextView textViewDeviceID; | |||||
private TextView textViewTimeStamp; | |||||
private TextView textViewSensorMessage; | |||||
public AlarmHistoryListHolder(View itemView) { | |||||
super(itemView); | |||||
textViewSensorType = (TextView) itemView.findViewById(R.id.tvAlarmHistoryDeviceSensorType); | |||||
textViewDeviceID = (TextView) itemView.findViewById(R.id.tvAlarmHistoryDeviceID); | |||||
textViewTimeStamp = (TextView) itemView.findViewById(R.id.tvAlarmHistoryDeviceTimeStamp); | |||||
textViewSensorMessage = (TextView) itemView.findViewById(R.id.tvAlarmHistoryDeviceSensorMassage); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.adapters; | |||||
import android.graphics.Color; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.widget.TextView; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import com.example.greenwatch.R; | |||||
import com.example.greenwatch.models.Device; | |||||
import java.util.ArrayList; | |||||
import java.util.Collections; | |||||
import java.util.Comparator; | |||||
import java.util.List; | |||||
public class DeviceListAdapter extends RecyclerView.Adapter<DeviceListAdapter.DeviceListHolder> { | |||||
private List<Device> devices = new ArrayList<>(); | |||||
@NonNull | |||||
@Override | |||||
public DeviceListHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||||
View itemView = LayoutInflater.from(parent.getContext()) | |||||
.inflate(R.layout.device_item, parent, false); | |||||
return new DeviceListHolder(itemView); | |||||
} | |||||
@Override | |||||
public void onBindViewHolder(@NonNull DeviceListHolder holder, int position) { | |||||
Device currentDevice = devices.get(position); | |||||
holder.textViewSensorType.setText(holder.itemView.getContext().getString(R.string.sensor_type_placeholder, currentDevice.getSensorType())); | |||||
holder.textViewDeviceID.setText(holder.itemView.getContext().getString(R.string.deviceID_placeholder, currentDevice.getDeviceID())); | |||||
holder.textViewTimeStamp.setText(holder.itemView.getContext().getString(R.string.sensor_time_stamp_placeholder, currentDevice.getTimeStamp())); | |||||
holder.textViewSensorMessage.setText(holder.itemView.getContext().getString(R.string.sensor_message_placeholder, currentDevice.getSensorMassage())); | |||||
holder.setDeviceSensorStatus(currentDevice); | |||||
} | |||||
@Override | |||||
public int getItemCount() { | |||||
return devices.size(); | |||||
} | |||||
public void setDevices(List<Device> devices) { | |||||
this.devices = devices; | |||||
Collections.sort(this.devices, new Comparator<Device>() { | |||||
@Override | |||||
public int compare(Device device1, Device device2) { | |||||
if (device1.getSensorStatus() && !device2.getSensorStatus()) { | |||||
return -1; | |||||
} else if (!device1.getSensorStatus() && device2.getSensorStatus()) { | |||||
return 1; | |||||
} else { | |||||
return 0; | |||||
} | |||||
} | |||||
}); | |||||
notifyDataSetChanged(); | |||||
} | |||||
class DeviceListHolder extends RecyclerView.ViewHolder { | |||||
private TextView textViewSensorType; | |||||
private TextView textViewSensorStatus; | |||||
private TextView textViewDeviceID; | |||||
private TextView textViewTimeStamp; | |||||
private TextView textViewSensorMessage; | |||||
public DeviceListHolder(View itemView) { | |||||
super(itemView); | |||||
textViewSensorType = (TextView) itemView.findViewById(R.id.tvDeviceSensorType); | |||||
textViewSensorStatus = (TextView) itemView.findViewById(R.id.tvDeviceSensorStatus); | |||||
textViewDeviceID = (TextView) itemView.findViewById(R.id.tvDeviceID); | |||||
textViewTimeStamp = (TextView) itemView.findViewById(R.id.tvDeviceTimeStamp); | |||||
textViewSensorMessage = (TextView) itemView.findViewById(R.id.tvDeviceSensorMassage); | |||||
} | |||||
public void setDeviceSensorStatus(Device device) { | |||||
if (device.getSensorStatus()) { | |||||
textViewSensorStatus.setText(itemView.getContext().getString(R.string.sensor_status_placeholder, "AN")); | |||||
itemView.setBackgroundColor(Color.RED); | |||||
} | |||||
else { | |||||
textViewSensorStatus.setText(itemView.getContext().getString(R.string.sensor_status_placeholder, "AUS")); | |||||
itemView.setBackgroundColor(Color.WHITE); | |||||
} | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.alarmrecorder; | |||||
import android.app.Activity; | |||||
import android.content.Context; | |||||
import android.media.MediaCodec; | |||||
import android.media.MediaExtractor; | |||||
import android.media.MediaFormat; | |||||
import android.media.MediaMuxer; | |||||
import android.media.MediaRecorder; | |||||
import android.os.Environment; | |||||
import android.view.SurfaceHolder; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.MainActivity; | |||||
import com.example.greenwatch.alarmrecorder.runnables.AudioRecorder; | |||||
import com.example.greenwatch.alarmrecorder.runnables.VideoRecorder; | |||||
import com.example.greenwatch.sensors.AccelerometerSensor; | |||||
import com.example.greenwatch.sensors.CameraSensor; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.nio.ByteBuffer; | |||||
public class AlarmRecorder { | |||||
private static AlarmRecorder alarmRecorderInstance; | |||||
private boolean isRecording; | |||||
private String videoPath; | |||||
private String audioPath; | |||||
private MediaFormat videoFormat; | |||||
private MediaFormat audioFormat; | |||||
private MediaExtractor videoExtractor; | |||||
private MediaExtractor audioExtractor; | |||||
private AudioRecorder audioRecorderRunnable; | |||||
private VideoRecorder videoRecorderRunnable; | |||||
private SurfaceHolder previewHolder; | |||||
private MediaRecorder videoRecorder; | |||||
//private MediaRecorder audioRecorder; | |||||
private Thread videoThread; // Video-Thread als Instanzvariable | |||||
private Thread audioThread; // Audio-Thread als Instanzvariable | |||||
private AlarmRecorder() { | |||||
//audioRecorder = new MediaRecorder(); | |||||
//videoRecorder = new MediaRecorder(); | |||||
videoExtractor = new MediaExtractor(); | |||||
audioExtractor = new MediaExtractor(); | |||||
audioRecorderRunnable = new AudioRecorder(); | |||||
videoRecorderRunnable = new VideoRecorder(); | |||||
} | |||||
public static synchronized AlarmRecorder getInstance() { | |||||
if (alarmRecorderInstance == null){ | |||||
alarmRecorderInstance = new AlarmRecorder(); | |||||
} | |||||
return alarmRecorderInstance; | |||||
} | |||||
public void setPreviewHolder(SurfaceHolder previewHolder) { | |||||
this.previewHolder = previewHolder; | |||||
} | |||||
public void startRecording() { | |||||
createStoragePaths(); //Speicherort und -namen für Audio- und Video-Datei | |||||
setAudioPath(audioPath); | |||||
setVideoPath(videoPath); | |||||
setVideoRecorderPreviewHolder(previewHolder); | |||||
//audioThread = new Thread(audioRecorderRunnable); | |||||
videoThread = new Thread(videoRecorderRunnable); | |||||
//Threads starten | |||||
videoThread.start(); | |||||
//audioThread.start(); | |||||
} | |||||
public void stopRecording(Context context) { | |||||
try { | |||||
//stopAudioRecording(); | |||||
stopVideoRecording(); | |||||
Toast.makeText(context, "Video- und Audioaufzeichnung beendet", Toast.LENGTH_SHORT).show(); | |||||
waitTillThreadsStopped(); | |||||
File videoFile = new File(videoPath); //Speichere das aufgenommene Video | |||||
File audioFile = new File(audioPath); //Speichere die aufgenommene Audio | |||||
if (videoFile.exists() && audioFile.exists()) { | |||||
//Wenn Video- und Audioaufzeichnung gestoppt und abgespeichert sind, beginne mit dem Mergeprozess der beiden | |||||
// mergeVideoWithAudio(); | |||||
Toast.makeText(context, "Video und Audio erfolgreich zusammengeführt", Toast.LENGTH_SHORT).show(); | |||||
} else { | |||||
Toast.makeText(context, "Dateien wurden nicht gefunden!", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
} catch (RuntimeException stopException) { | |||||
stopException.printStackTrace(); | |||||
} | |||||
} | |||||
private void createStoragePaths(){ | |||||
//Pfade zum Zwischenspeichern der aufgenommenen Audio und Video-Datei | |||||
String externalStorageDirectory = Environment.getExternalStorageDirectory().getAbsolutePath(); | |||||
String dcimDirectory = externalStorageDirectory + "/DCIM"; | |||||
videoPath = dcimDirectory + "/video.mp4"; | |||||
audioPath = dcimDirectory + "/audio.mp3"; | |||||
} | |||||
private void setVideoPath(String videoPath) { | |||||
videoRecorderRunnable.setVideoPath(videoPath); | |||||
} | |||||
private void setVideoRecorderPreviewHolder(SurfaceHolder previewHolder) { | |||||
videoRecorderRunnable.setPreviewHolder(previewHolder); | |||||
} | |||||
private void stopVideoRecording(){ | |||||
videoRecorderRunnable.stopVideoRecording(); | |||||
} | |||||
private void setAudioPath(String audioPath) { | |||||
audioRecorderRunnable.setAudioPath(audioPath); | |||||
} | |||||
private void stopAudioRecording(){ | |||||
audioRecorderRunnable.stopAudioRecording(); | |||||
} | |||||
private void waitTillThreadsStopped(){ | |||||
try { | |||||
videoThread.join(); | |||||
audioThread.join(); | |||||
} catch (InterruptedException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
private void mergeVideoWithAudio() { | |||||
try { | |||||
setVideoExtractorDataSource(); //extrahieren der Video Datei, die zuvor zwischengespeichert wurde | |||||
setAudioExtractorDataSource(); //extrahieren der Audio Datei, die zuvor zwischengespeichert wurde | |||||
//Speicherort der später zusammengeführten Datei | |||||
String outputFilePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath() + "/merged_video.mp4"; | |||||
//MediaMuxer zum Zusammenführen einer Audio- und einer Videodatei | |||||
MediaMuxer muxer = new MediaMuxer(outputFilePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); | |||||
int videoTrack = muxer.addTrack(videoFormat); | |||||
int audioTrack = muxer.addTrack(audioFormat); | |||||
muxer.start(); | |||||
ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); | |||||
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); | |||||
videoExtraction(buffer, videoTrack, bufferInfo, muxer); | |||||
audioExtraction(buffer, audioTrack, bufferInfo, muxer); | |||||
muxer.stop(); | |||||
muxer.release(); | |||||
// Löschen der separaten Video- und Audio-Dateien | |||||
deleteVideoFile(); | |||||
deleteAudioFile(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
private void setVideoExtractorDataSource() { | |||||
try { | |||||
videoExtractor.setDataSource(videoPath); | |||||
int videoTrackIndex = getTrackIndex(videoExtractor, "video/"); | |||||
if (videoTrackIndex < 0) { | |||||
// Video-Track nicht gefunden | |||||
return; | |||||
} | |||||
videoExtractor.selectTrack(videoTrackIndex); | |||||
videoFormat = videoExtractor.getTrackFormat(videoTrackIndex); | |||||
} catch (IOException e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
} | |||||
private void setAudioExtractorDataSource() { | |||||
try { | |||||
audioExtractor.setDataSource(audioPath); | |||||
int audioTrackIndex = getTrackIndex(audioExtractor, "audio/"); | |||||
if (audioTrackIndex < 0) { | |||||
// Audio-Track nicht gefunden | |||||
return; | |||||
} | |||||
audioExtractor.selectTrack(audioTrackIndex); | |||||
audioFormat = audioExtractor.getTrackFormat(audioTrackIndex); | |||||
} catch (IOException e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
} | |||||
private int getTrackIndex(MediaExtractor extractor, String mimeType) { | |||||
int trackCount = extractor.getTrackCount(); | |||||
for (int i = 0; i < trackCount; i++) { | |||||
MediaFormat format = extractor.getTrackFormat(i); | |||||
String trackMimeType = format.getString(MediaFormat.KEY_MIME); | |||||
if (trackMimeType.startsWith(mimeType)) { | |||||
return i; | |||||
} | |||||
} | |||||
return -1; | |||||
} | |||||
private void videoExtraction(ByteBuffer buffer, int videoTrack, MediaCodec.BufferInfo bufferInfo, MediaMuxer muxer) { | |||||
videoExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC); | |||||
while (true) { | |||||
int sampleSize = videoExtractor.readSampleData(buffer, 0); | |||||
if (sampleSize < 0) { | |||||
break; | |||||
} | |||||
long presentationTimeUs = videoExtractor.getSampleTime(); | |||||
bufferInfo.offset = 0; | |||||
bufferInfo.size = sampleSize; | |||||
bufferInfo.flags = MediaCodec.BUFFER_FLAG_KEY_FRAME; | |||||
bufferInfo.presentationTimeUs = presentationTimeUs; | |||||
muxer.writeSampleData(videoTrack, buffer, bufferInfo); | |||||
videoExtractor.advance(); | |||||
} | |||||
} | |||||
private void audioExtraction(ByteBuffer buffer, int audioTrack, MediaCodec.BufferInfo bufferInfo, MediaMuxer muxer) { | |||||
audioExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC); | |||||
while (true) { | |||||
int sampleSize = audioExtractor.readSampleData(buffer, 0); | |||||
if (sampleSize < 0) { | |||||
break; | |||||
} | |||||
long presentationTimeUs = audioExtractor.getSampleTime(); | |||||
bufferInfo.offset = 0; | |||||
bufferInfo.size = sampleSize; | |||||
bufferInfo.flags = 0; // or MediaCodec.BUFFER_FLAG_KEY_FRAME | |||||
bufferInfo.presentationTimeUs = presentationTimeUs; | |||||
muxer.writeSampleData(audioTrack, buffer, bufferInfo); | |||||
audioExtractor.advance(); | |||||
} | |||||
} | |||||
private void deleteVideoFile(){ | |||||
File videoFile = new File(videoPath); | |||||
if (videoFile.exists()) { | |||||
videoFile.delete(); | |||||
} | |||||
} | |||||
private void deleteAudioFile(){ | |||||
File audioFile = new File(audioPath); | |||||
if (audioFile.exists()) { | |||||
audioFile.delete(); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.alarmrecorder.runnables; | |||||
import android.media.MediaRecorder; | |||||
import android.view.SurfaceHolder; | |||||
import android.widget.Toast; | |||||
import com.example.greenwatch.MainActivity; | |||||
import java.io.IOException; | |||||
public class AudioRecorder implements Runnable { | |||||
private MediaRecorder audioRecorder; | |||||
private String audioPath; | |||||
public AudioRecorder() { | |||||
audioRecorder = new MediaRecorder(); | |||||
} | |||||
public void setAudioPath(String audioPath) { | |||||
this.audioPath = audioPath; | |||||
} | |||||
public void stopAudioRecording(){ | |||||
if (audioRecorder != null) { | |||||
audioRecorder.stop(); | |||||
audioRecorder.reset(); | |||||
audioRecorder.release(); | |||||
audioRecorder = null; | |||||
} | |||||
} | |||||
@Override | |||||
public void run() { | |||||
audioRecorder = new MediaRecorder(); | |||||
audioRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); | |||||
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); | |||||
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); | |||||
audioRecorder.setOutputFile(audioPath); | |||||
try { | |||||
audioRecorder.prepare(); | |||||
audioRecorder.start(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.alarmrecorder.runnables; | |||||
import android.media.MediaRecorder; | |||||
import android.view.SurfaceHolder; | |||||
import com.example.greenwatch.viewmodels.ViewModelInterface; | |||||
import java.io.IOException; | |||||
public class VideoRecorder implements Runnable{ | |||||
private MediaRecorder videoRecorder; | |||||
private String videoPath; | |||||
private SurfaceHolder previewHolder; | |||||
public VideoRecorder() { | |||||
videoRecorder = new MediaRecorder(); | |||||
} | |||||
public void setPreviewHolder(SurfaceHolder previewHolder) { | |||||
this.previewHolder = previewHolder; | |||||
} | |||||
public void setVideoPath(String audioPath) { | |||||
this.videoPath = audioPath; | |||||
} | |||||
public void stopVideoRecording(){ | |||||
if (videoRecorder != null) { | |||||
videoRecorder.stop(); | |||||
videoRecorder.reset(); | |||||
videoRecorder.release(); | |||||
videoRecorder = null; | |||||
} | |||||
} | |||||
@Override | |||||
public void run() { | |||||
videoRecorder = new MediaRecorder(); | |||||
videoRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); | |||||
videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); | |||||
videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); | |||||
videoRecorder.setOutputFile(videoPath); | |||||
videoRecorder.setOrientationHint(90); | |||||
videoRecorder.setPreviewDisplay(previewHolder.getSurface()); | |||||
try { | |||||
videoRecorder.prepare(); | |||||
videoRecorder.start(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.communication; | |||||
import com.example.greenwatch.repositories.DeviceRepository; | |||||
import java.io.IOException; | |||||
import java.net.DatagramPacket; | |||||
import java.net.DatagramSocket; | |||||
import java.net.Inet4Address; | |||||
import java.net.InetAddress; | |||||
import java.net.NetworkInterface; | |||||
import java.net.SocketException; | |||||
import java.net.UnknownHostException; | |||||
import java.util.Enumeration; | |||||
public class WiFiCommunication { | |||||
private final InetAddress address; | |||||
private final DatagramSocket socket; | |||||
private final int port; | |||||
private volatile String rxString; | |||||
private String sendMessage; | |||||
//private String sendMsg = "default"; | |||||
private boolean isNewMessage; | |||||
volatile private boolean running; | |||||
private static WiFiCommunication wifiCommunicationInstance; | |||||
private DeviceRepository mDeviceRepository; | |||||
private WiFiCommunication() { | |||||
port = 1234; | |||||
try { | |||||
socket = new DatagramSocket(port); | |||||
socket.setBroadcast(true); | |||||
address = InetAddress.getByName("255.255.255.255"); | |||||
running = true; | |||||
isNewMessage = false; | |||||
new ReceiveThread().start(); | |||||
new SendThread().start(); | |||||
} catch (SocketException | UnknownHostException e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
} | |||||
public static synchronized WiFiCommunication getInstance() { | |||||
if (wifiCommunicationInstance == null){ | |||||
wifiCommunicationInstance = new WiFiCommunication(); | |||||
} | |||||
return wifiCommunicationInstance; | |||||
} | |||||
public void setDeviceRepository(DeviceRepository deviceRepository) { | |||||
if (mDeviceRepository == null) { | |||||
this.mDeviceRepository = deviceRepository; | |||||
} | |||||
} | |||||
public void setNewMessage(String newMessage, boolean isNewMessage){ | |||||
this.sendMessage = newMessage; | |||||
this.isNewMessage = isNewMessage; | |||||
} | |||||
public static String getLocalIpAddress() { | |||||
try { | |||||
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { | |||||
NetworkInterface networkInterface = (NetworkInterface) ((Enumeration<?>) en).nextElement(); | |||||
for (Enumeration<InetAddress> addresses = networkInterface.getInetAddresses(); addresses.hasMoreElements();) { | |||||
InetAddress inetAddress = addresses.nextElement(); | |||||
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { | |||||
return inetAddress.getHostAddress(); | |||||
} | |||||
} | |||||
} | |||||
} catch (SocketException ex) { | |||||
ex.printStackTrace(); | |||||
} | |||||
return null; | |||||
} | |||||
public void stopCommunication() { | |||||
running = false; | |||||
socket.close(); | |||||
} | |||||
private class SendThread extends Thread { | |||||
private int tmpCnt = 0; | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
do { | |||||
if(isNewMessage) | |||||
{ | |||||
isNewMessage = false; | |||||
String txString = sendMessage; | |||||
byte[] txBuffer = txString.getBytes(); | |||||
DatagramPacket txPacket = new DatagramPacket(txBuffer, txBuffer.length, address, port); | |||||
for(int i = 0; i < 20; i++) { | |||||
socket.send(txPacket); | |||||
} | |||||
} | |||||
} while (running); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} | |||||
private class ReceiveThread extends Thread { | |||||
private String rxString = ""; | |||||
private String previousRxString = ""; | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
do { | |||||
byte[] rxBuffer = new byte[1024]; | |||||
DatagramPacket packet = new DatagramPacket(rxBuffer, rxBuffer.length); | |||||
socket.receive(packet); | |||||
rxString = new String(packet.getData(), 0, packet.getLength()); | |||||
if(!previousRxString.equals(rxString)){ | |||||
mDeviceRepository.getNewReceivedMessage(rxString); | |||||
} | |||||
previousRxString = rxString; | |||||
} while (running); | |||||
} | |||||
catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.models; | |||||
public class Device { | |||||
private String timeStamp; | |||||
private String deviceID; | |||||
private boolean sensorStatus; | |||||
private String sensorType; | |||||
private float sensorMassage; | |||||
public Device(String timeStamp, String deviceID, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
this.timeStamp = timeStamp; | |||||
this.deviceID = deviceID; | |||||
this.sensorStatus = sensorStatus; | |||||
this.sensorType = sensorType; | |||||
this.sensorMassage = sensorMassage; | |||||
} | |||||
public void setTimeStamp(String timeStamp) { | |||||
this.timeStamp = timeStamp; | |||||
} | |||||
public String getTimeStamp() { | |||||
return timeStamp; | |||||
} | |||||
public void setDeviceID(String deviceID) { | |||||
this.deviceID = deviceID; | |||||
} | |||||
public String getDeviceID() { | |||||
return deviceID; | |||||
} | |||||
public void setSensorType(String sensorType) { | |||||
this.sensorType = sensorType; | |||||
} | |||||
public String getSensorType() { | |||||
return sensorType; | |||||
} | |||||
public void setSensorStatus(boolean sensorStatus) { | |||||
this.sensorStatus = sensorStatus; | |||||
} | |||||
public Boolean getSensorStatus() { | |||||
return sensorStatus; | |||||
} | |||||
public void setSensorMassage(float sensorMassage) { | |||||
this.sensorMassage = sensorMassage; | |||||
} | |||||
public float getSensorMassage() { | |||||
return sensorMassage; | |||||
} | |||||
} |
package com.example.greenwatch.repositories; | |||||
import android.os.Looper; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.communication.WiFiCommunication; | |||||
import java.text.SimpleDateFormat; | |||||
import java.util.ArrayList; | |||||
import java.util.Date; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.UUID; | |||||
public class DeviceRepository { | |||||
private final int maxAlarmHistoryListSize = 20; | |||||
private final String delimiter = ", "; | |||||
private final String sensorStatusKey = "An"; | |||||
private String localDeviceUUID; | |||||
private static DeviceRepository deviceRepositoryInstance; | |||||
private WiFiCommunication mWiFiCommunication; | |||||
private boolean startAlarmRecordingValue; | |||||
private MutableLiveData<Boolean> startAlarmRecording = new MutableLiveData<>(); | |||||
private MutableLiveData<List<Device>> deviceList = new MutableLiveData<>(); | |||||
private MutableLiveData<List<Device>> alarmHistoryList = new MutableLiveData<>(); | |||||
private HashMap<String, Device> connectedDevicesList = new HashMap<>(); | |||||
private HashMap<String, String> deviceIDMapper = new HashMap<>(); | |||||
private List<Device> alarmHistoryDeviceList = new ArrayList<>(); | |||||
private DeviceRepository() { | |||||
setLocalDeviceUUID(); | |||||
startAlarmRecordingValue = false; | |||||
} | |||||
public static synchronized DeviceRepository getInstance() { | |||||
if (deviceRepositoryInstance == null){ | |||||
deviceRepositoryInstance = new DeviceRepository(); | |||||
} | |||||
return deviceRepositoryInstance; | |||||
} | |||||
public void setWiFiCommunication(WiFiCommunication wiFiCommunication) { | |||||
if (mWiFiCommunication == null) { | |||||
this.mWiFiCommunication = wiFiCommunication; | |||||
} | |||||
} | |||||
public MutableLiveData<List<Device>> getConnectedDeviceList() { | |||||
setMutableLiveDataDeviceList(); | |||||
return deviceList; | |||||
} | |||||
public MutableLiveData<List<Device>> getAlarmHistoryDeviceList() { | |||||
setMutableLiveDataAlarmHistoryList(); | |||||
return alarmHistoryList; | |||||
} | |||||
public MutableLiveData<Boolean> getStartAlarmRecording() { | |||||
setMutableLiveDataStartAlarmRecording(); | |||||
return startAlarmRecording; | |||||
} | |||||
public void createNewDevice(String timeStamp, String deviceID, boolean sensorStatus, String sensorType, float sensorMassage){ | |||||
Device newDevice = new Device(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage); | |||||
if (sensorStatus) { | |||||
setAlarmHistoryDeviceList(newDevice); | |||||
} | |||||
boolean newStartAlarmRecordingValue = checkDeviceStatus(); | |||||
if (startAlarmRecordingValue != newStartAlarmRecordingValue) { | |||||
startAlarmRecordingValue = newStartAlarmRecordingValue; | |||||
setMutableLiveDataStartAlarmRecording(); | |||||
} | |||||
addToConnectedDeviceList(newDevice.getDeviceID(), newDevice); | |||||
setMutableLiveDataDeviceList(); | |||||
} | |||||
public void getNewReceivedMessage(String newMessage) { | |||||
String[] messageString = messageStringSplitter(newMessage); | |||||
if(messageString[0].equals("1") && messageString.length == 7) { | |||||
String timeStamp = messageString[1]; | |||||
String deviceID = messageString[3]; | |||||
boolean sensorStatus = convertRecievedSensorStatus(messageString[4]); | |||||
String sensorType = messageString[5]; | |||||
float sensorMassage = Float.valueOf(messageString[6]); | |||||
if (deviceID.equals(checkDeviceID(localDeviceUUID))) { | |||||
return; | |||||
} | |||||
if (!connectedDevicesList.containsKey(deviceID)) { | |||||
createNewDevice(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage); | |||||
} else { | |||||
updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage); | |||||
} | |||||
} | |||||
} | |||||
private String messageStringBuilder(String deviceID) { | |||||
StringBuilder message = new StringBuilder(); | |||||
Device device = connectedDevicesList.get(deviceID); | |||||
if(device != null) { | |||||
message.append("1") | |||||
.append(delimiter) | |||||
.append(device.getTimeStamp()) | |||||
.append(delimiter) | |||||
.append("Gruppe3") | |||||
.append(delimiter) | |||||
.append(device.getDeviceID()) | |||||
.append(delimiter) | |||||
.append(convertSendSensorStatus(device.getSensorStatus())) | |||||
.append(delimiter) | |||||
.append(device.getSensorType()) | |||||
.append(delimiter) | |||||
.append(device.getSensorMassage()); | |||||
} | |||||
else { | |||||
message.append("1") | |||||
.append(delimiter) | |||||
.append("") | |||||
.append(delimiter) | |||||
.append("Gruppe3") | |||||
.append(delimiter) | |||||
.append("") | |||||
.append(delimiter) | |||||
.append("") | |||||
.append(delimiter) | |||||
.append("") | |||||
.append(delimiter) | |||||
.append(""); | |||||
} | |||||
return message.toString(); | |||||
} | |||||
public String getLocalDeviceUUID() { | |||||
return localDeviceUUID; | |||||
} | |||||
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
device.setTimeStamp(timeStamp); | |||||
device.setSensorType(sensorType); | |||||
device.setSensorMassage(sensorMassage); | |||||
if (!device.getSensorStatus() && sensorStatus) { | |||||
setAlarmHistoryDeviceList(device); | |||||
} | |||||
device.setSensorStatus(sensorStatus); | |||||
boolean newStartAlarmRecordingValue = checkDeviceStatus(); | |||||
if (startAlarmRecordingValue != newStartAlarmRecordingValue) { | |||||
startAlarmRecordingValue = newStartAlarmRecordingValue; | |||||
setMutableLiveDataStartAlarmRecording(); | |||||
} | |||||
addToConnectedDeviceList(checkedDeviceID, device); | |||||
setMutableLiveDataDeviceList(); | |||||
} | |||||
} | |||||
public void setTimeStamp(String deviceID, String timeStamp) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
device.setTimeStamp(timeStamp); | |||||
addToConnectedDeviceList(checkedDeviceID, device); | |||||
setMutableLiveDataDeviceList(); | |||||
} | |||||
} | |||||
public String getTimeStamp(String deviceID) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
return device.getTimeStamp(); | |||||
} | |||||
return ""; | |||||
} | |||||
public void setDeviceID(String deviceID, String newDeviceID) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
device.setDeviceID(newDeviceID); | |||||
setDeviceIDMapper(newDeviceID); | |||||
connectedDevicesList.remove(checkedDeviceID); | |||||
addToConnectedDeviceList(newDeviceID, device); | |||||
setMutableLiveDataDeviceList(); | |||||
} | |||||
} | |||||
public String getDeviceID(String deviceID) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
return device.getDeviceID(); | |||||
} | |||||
return ""; | |||||
} | |||||
public void setSensorStatus(String deviceID, boolean sensorStatus) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
if (!device.getSensorStatus() && sensorStatus) { | |||||
setAlarmHistoryDeviceList(device); | |||||
} | |||||
device.setSensorStatus(sensorStatus); | |||||
boolean newStartAlarmRecordingValue = checkDeviceStatus(); | |||||
if (startAlarmRecordingValue != newStartAlarmRecordingValue) { | |||||
startAlarmRecordingValue = newStartAlarmRecordingValue; | |||||
setMutableLiveDataStartAlarmRecording(); | |||||
} | |||||
addToConnectedDeviceList(checkedDeviceID, device); | |||||
setMutableLiveDataDeviceList(); | |||||
} | |||||
} | |||||
public boolean getSensorStatus(String deviceID) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
return device.getSensorStatus(); | |||||
} | |||||
return false; | |||||
} | |||||
public void setSensorType(String deviceID, String sensorType) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
device.setSensorType(sensorType); | |||||
addToConnectedDeviceList(checkedDeviceID, device); | |||||
setMutableLiveDataDeviceList(); | |||||
} | |||||
} | |||||
public String getSensorType(String deviceID) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
return device.getSensorType(); | |||||
} | |||||
return ""; | |||||
} | |||||
public void setSensorMassage(String deviceID, float sensorMessage) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
device.setSensorMassage(sensorMessage); | |||||
addToConnectedDeviceList(checkedDeviceID, device); | |||||
setMutableLiveDataDeviceList(); | |||||
} | |||||
} | |||||
public float getSensorMassage(String deviceID) { | |||||
String checkedDeviceID = checkDeviceID(deviceID); | |||||
Device device = connectedDevicesList.get(checkedDeviceID); | |||||
if(device != null) { | |||||
return device.getSensorMassage(); | |||||
} | |||||
return 0; | |||||
} | |||||
public String getSystemTimeStamp() { | |||||
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); | |||||
Date date = new Date(System.currentTimeMillis()); | |||||
return formatter.format(date); | |||||
} | |||||
private void setMutableLiveDataDeviceList() { | |||||
List<Device> list = new ArrayList<>(connectedDevicesList.values()); | |||||
if (Looper.myLooper() == Looper.getMainLooper()){ | |||||
deviceList.setValue(list); | |||||
} | |||||
else { | |||||
deviceList.postValue(list); | |||||
} | |||||
} | |||||
private void setMutableLiveDataAlarmHistoryList() { | |||||
alarmHistoryList.setValue(alarmHistoryDeviceList); | |||||
} | |||||
private void setMutableLiveDataStartAlarmRecording() { | |||||
startAlarmRecording.setValue(startAlarmRecordingValue); | |||||
} | |||||
private void addToConnectedDeviceList(String key, Device device) { | |||||
connectedDevicesList.put(key, device); | |||||
if (key.equals(checkDeviceID(localDeviceUUID))) { | |||||
mWiFiCommunication.setNewMessage(messageStringBuilder(device.getDeviceID()),true); | |||||
} | |||||
} | |||||
private String checkDeviceID(String deviceID) { | |||||
if(!deviceIDMapper.isEmpty() && deviceID.equals(localDeviceUUID)) { | |||||
return deviceIDMapper.get(deviceID); | |||||
} | |||||
return deviceID; | |||||
} | |||||
private void setDeviceIDMapper(String deviceID) { | |||||
deviceIDMapper.put(localDeviceUUID, deviceID); | |||||
} | |||||
private void setLocalDeviceUUID(){ | |||||
this.localDeviceUUID = UUID.randomUUID().toString(); | |||||
} | |||||
private String[] messageStringSplitter(String message) { | |||||
return message.split(delimiter); | |||||
} | |||||
private boolean convertRecievedSensorStatus(String status) { | |||||
return status.equals(sensorStatusKey); | |||||
} | |||||
private String convertSendSensorStatus(boolean status) { | |||||
if (status){ | |||||
return "An"; | |||||
} | |||||
else { | |||||
return "Aus"; | |||||
} | |||||
} | |||||
private void setAlarmHistoryDeviceList(Device device) { | |||||
if (alarmHistoryDeviceList.size() == maxAlarmHistoryListSize) { | |||||
alarmHistoryDeviceList.remove(alarmHistoryDeviceList.size() -1); | |||||
} | |||||
Device alarmHistoryDevice = new Device(device.getTimeStamp(), device.getDeviceID(), device.getSensorStatus(), device.getSensorType(), device.getSensorMassage()); | |||||
alarmHistoryDeviceList.add(0, alarmHistoryDevice); | |||||
setMutableLiveDataAlarmHistoryList(); | |||||
} | |||||
private boolean checkDeviceStatus() { | |||||
for (Device device : connectedDevicesList.values()) { | |||||
if (device.getSensorStatus()) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
} |
package com.example.greenwatch.sensors; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import java.util.ArrayList; | |||||
public class AccelerometerSensor { | |||||
private MutableLiveData<Boolean> mAccelerometerAlarmDetected = new MutableLiveData<>(); | |||||
private static AccelerometerSensor accelerometerSensorInstance; | |||||
private boolean accelerometerAlarmDetected; | |||||
private ArrayList<Float> Gesamt_be; | |||||
int arraySize = 500; | |||||
int functionCallCount; | |||||
float meanValue; | |||||
float offsetValue; | |||||
float thresholdValue; | |||||
boolean startMeasuring; | |||||
private AccelerometerSensor() { | |||||
initGesamtBE(); | |||||
accelerometerAlarmDetected = false; | |||||
setMutableLiveDataAccelerometerAlarmDetected(); | |||||
functionCallCount = 0; | |||||
meanValue = 0.0f; | |||||
offsetValue = 0.1f; | |||||
thresholdValue = 0.15f; | |||||
startMeasuring = false; | |||||
} | |||||
public static synchronized AccelerometerSensor getInstance() { | |||||
if (accelerometerSensorInstance == null){ | |||||
accelerometerSensorInstance = new AccelerometerSensor(); | |||||
} | |||||
return accelerometerSensorInstance; | |||||
} | |||||
public MutableLiveData<Boolean> getAccelerometerAlarmDetected() { | |||||
setMutableLiveDataAccelerometerAlarmDetected(); | |||||
return mAccelerometerAlarmDetected; | |||||
} | |||||
private void setMutableLiveDataAccelerometerAlarmDetected() { | |||||
mAccelerometerAlarmDetected.setValue(accelerometerAlarmDetected); | |||||
} | |||||
private void initGesamtBE() { | |||||
Gesamt_be = new ArrayList<>(arraySize); | |||||
for (int i = 0; i < arraySize; i++) { | |||||
Gesamt_be.add(0.0f); | |||||
} | |||||
} | |||||
public void addValueToGesamtBE(float newValue) { | |||||
if (Gesamt_be.size() == arraySize) { | |||||
Gesamt_be.remove(Gesamt_be.size() -1); | |||||
} | |||||
Gesamt_be.add(0, newValue); | |||||
functionCallCount++; | |||||
} | |||||
public void meanValueCalculation() { | |||||
for (float element : Gesamt_be) { | |||||
meanValue += Math.abs(element); | |||||
} | |||||
meanValue = meanValue/arraySize; | |||||
} | |||||
public void calibrateAccelerometerSensor() { | |||||
if (functionCallCount <= arraySize) { | |||||
offsetValue = meanValue; | |||||
} | |||||
else { | |||||
startMeasuring = true; | |||||
} | |||||
} | |||||
public void checkAlarmCondition() { | |||||
if (meanValue > (thresholdValue + offsetValue) && startMeasuring && !mAccelerometerAlarmDetected.getValue()) { | |||||
mAccelerometerAlarmDetected.setValue(true); | |||||
} | |||||
else if (meanValue < (thresholdValue + offsetValue) && mAccelerometerAlarmDetected.getValue()){ | |||||
mAccelerometerAlarmDetected.setValue(false); | |||||
} | |||||
} | |||||
public float getAccelerometerSensorMeanValue() { | |||||
return meanValue; | |||||
} | |||||
} |
package com.example.greenwatch.sensors; | |||||
import android.content.Context; | |||||
import android.graphics.ImageFormat; | |||||
import android.media.Image; | |||||
import android.os.Handler; | |||||
import android.util.Size; | |||||
import androidx.camera.core.CameraSelector; | |||||
import androidx.camera.core.ImageAnalysis; | |||||
import androidx.camera.lifecycle.ProcessCameraProvider; | |||||
import androidx.core.content.ContextCompat; | |||||
import androidx.lifecycle.LifecycleOwner; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import java.nio.ByteBuffer; | |||||
public class CameraSensor { | |||||
private final MutableLiveData<Boolean> mVideoAlarmDetected = new MutableLiveData<>(); | |||||
private static CameraSensor cameraSensorInstance; | |||||
private boolean videoAlarmDetected; | |||||
private boolean isMotionDetected; | |||||
private ByteBuffer previousBuffer; | |||||
private int previousWidth; | |||||
private int previousHeight; | |||||
private final int threshold = 50; | |||||
private int startX; | |||||
private int startY; | |||||
private int endX; | |||||
private int endY; | |||||
private static final long ALARM_RESET_DELAY = 5000; | |||||
private Runnable alarmResetRunnable; | |||||
private final Handler alarmResetHandler = new Handler(); | |||||
private CameraSensor() { | |||||
videoAlarmDetected = false; | |||||
} | |||||
public static synchronized CameraSensor getInstance() { | |||||
if (cameraSensorInstance == null){ | |||||
cameraSensorInstance = new CameraSensor(); | |||||
} | |||||
return cameraSensorInstance; | |||||
} | |||||
public MutableLiveData<Boolean> getVideoAlarmDetectedValue() { | |||||
setMutableLiveDataVideoAlarmDetected(); | |||||
return mVideoAlarmDetected; | |||||
} | |||||
private void setMutableLiveDataVideoAlarmDetected() { | |||||
mVideoAlarmDetected.setValue(videoAlarmDetected); | |||||
} | |||||
public void bindImageAnalysis(ProcessCameraProvider cameraProvider, LifecycleOwner lifecycleOwner, Context context) { | |||||
ImageAnalysis.Builder builder = new ImageAnalysis.Builder(); | |||||
builder.setTargetResolution(new Size(640, 480)); | |||||
builder.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST); | |||||
ImageAnalysis imageAnalysis = builder.build(); | |||||
imageAnalysis.setAnalyzer( | |||||
ContextCompat.getMainExecutor(context), | |||||
imageProxy -> { | |||||
int imageFormat = imageProxy.getFormat(); | |||||
if (imageFormat == ImageFormat.YUV_420_888) { | |||||
Image currentImage = imageProxy.getImage(); | |||||
if (previousHeight != 0) { | |||||
assert currentImage != null; | |||||
isMotionDetected = compareFrames(currentImage); | |||||
} | |||||
assert currentImage != null; | |||||
Image.Plane[] planes = currentImage.getPlanes(); | |||||
ByteBuffer buffer = planes[0].getBuffer().duplicate(); | |||||
previousBuffer = ByteBuffer.allocateDirect(buffer.remaining()); | |||||
previousBuffer.put(buffer); | |||||
previousWidth = currentImage.getWidth(); | |||||
previousHeight = currentImage.getHeight(); | |||||
currentImage.close(); | |||||
if (isMotionDetected) { | |||||
videoAlarmDetected = true; | |||||
if(alarmResetRunnable != null) { | |||||
alarmResetHandler.removeCallbacks(alarmResetRunnable); | |||||
} | |||||
alarmResetRunnable = this::resetAlarmStatus; | |||||
alarmResetHandler.postDelayed(alarmResetRunnable, ALARM_RESET_DELAY); | |||||
} | |||||
checkAlarmCondition(); | |||||
} | |||||
imageProxy.close(); | |||||
}); | |||||
CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build(); | |||||
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageAnalysis); | |||||
} | |||||
private boolean compareFrames(Image currentImage) { | |||||
Image.Plane[] planes = currentImage.getPlanes(); | |||||
ByteBuffer currentBuffer = planes[0].getBuffer(); | |||||
int currentWidth = currentImage.getWidth(); | |||||
int currentHeight = currentImage.getHeight(); | |||||
int yRowStride = planes[0].getRowStride(); | |||||
int yPixelStride = planes[0].getPixelStride(); | |||||
if (previousWidth != currentWidth || previousHeight != currentHeight) { | |||||
return false; | |||||
} | |||||
int blockSize = kleinstesQuadrat(previousHeight, previousWidth) / 8; | |||||
int numBlocksX = currentWidth / blockSize; | |||||
int numBlocksY = currentHeight / blockSize; | |||||
for (int blockY = 0; blockY < numBlocksY; blockY++) { | |||||
for (int blockX = 0; blockX < numBlocksX; blockX++) { | |||||
startX = blockX * blockSize; | |||||
startY = blockY * blockSize; | |||||
endX = startX + blockSize; | |||||
endY = startY + blockSize; | |||||
float currentLuminance = berechneMittlereLuminanz(currentBuffer, yRowStride, yPixelStride); | |||||
float previousLuminance = berechneMittlereLuminanz(previousBuffer, yRowStride, yPixelStride); | |||||
int pixelDifference = Math.abs((int) previousLuminance - (int) currentLuminance); | |||||
if (pixelDifference > threshold) { | |||||
System.out.println(pixelDifference); | |||||
return true; | |||||
} | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
private float berechneMittlereLuminanz(ByteBuffer buffer, int rowStride, int pixelStride) { | |||||
int sumLuminance = 0; | |||||
int countPixels = 0; | |||||
for (int row = startY; row < endY; row++) { | |||||
for (int col = startX; col < endX; col++) { | |||||
int bufferIndex = row * rowStride + col * pixelStride; | |||||
int currentPixel = buffer.get(bufferIndex) & 0xFF; | |||||
sumLuminance += currentPixel; | |||||
countPixels++; | |||||
} | |||||
} | |||||
return (float) sumLuminance / countPixels; | |||||
} | |||||
private int kleinstesQuadrat(int height, int width) { | |||||
if (height == width) { | |||||
return height; | |||||
} else if (height > width) { | |||||
return kleinstesQuadrat(height - width, width); | |||||
} else { | |||||
return kleinstesQuadrat(height, width - height); | |||||
} | |||||
} | |||||
private void resetAlarmStatus() { | |||||
videoAlarmDetected = false; | |||||
alarmResetRunnable = null; | |||||
} | |||||
public void checkAlarmCondition() { | |||||
if (videoAlarmDetected && !mVideoAlarmDetected.getValue()) { | |||||
setMutableLiveDataVideoAlarmDetected(); | |||||
} | |||||
else if (!videoAlarmDetected && mVideoAlarmDetected.getValue()){ | |||||
setMutableLiveDataVideoAlarmDetected(); | |||||
} | |||||
} | |||||
} |
package com.example.greenwatch.sensors.MicrofonHelperClasses; | |||||
public class GleitenderMittelwert { | |||||
private final float wichtungNeuerWert; | |||||
private final float wichtungAlterWert; | |||||
private float mittelwert = 0; | |||||
private boolean istMittelwertGesetzt = false; | |||||
public GleitenderMittelwert(float wichtungNeuerWert) { | |||||
this.wichtungNeuerWert = wichtungNeuerWert; | |||||
this.wichtungAlterWert = 1 - this.wichtungNeuerWert; | |||||
} | |||||
public float mittel(float wert) { | |||||
if (istMittelwertGesetzt) { | |||||
mittelwert = wert * wichtungNeuerWert + mittelwert * wichtungAlterWert; | |||||
} else { | |||||
mittelwert = wert; | |||||
istMittelwertGesetzt = true; | |||||
} | |||||
return mittelwert; | |||||
}} |
package com.example.greenwatch.sensors.MicrofonHelperClasses; | |||||
public class RingPuffer { | |||||
private short[] puffer; | |||||
private final int laenge; | |||||
private int anzahlEnthaltenerDaten; | |||||
private int position; | |||||
public RingPuffer(int n) { | |||||
laenge = n; | |||||
anzahlEnthaltenerDaten = 0; | |||||
position = 0; | |||||
puffer = new short[laenge]; | |||||
} | |||||
public void hinzufuegen(short wert) { | |||||
puffer[position] = wert; | |||||
position++; | |||||
if (position >= laenge) { | |||||
position = 0; | |||||
} | |||||
if (anzahlEnthaltenerDaten < laenge) { | |||||
anzahlEnthaltenerDaten++; | |||||
} | |||||
} | |||||
public short maximum() { | |||||
short max = 0; | |||||
for (int i = 0; i < anzahlEnthaltenerDaten; i++) { | |||||
if (puffer[i] > max) { | |||||
max = puffer[i]; | |||||
} | |||||
} | |||||
return max; | |||||
} | |||||
} |
package com.example.greenwatch.sensors.MicrofonHelperClasses; | |||||
public class Verarbeitungsergebnis { | |||||
private String status; | |||||
private short maxAmp; | |||||
private float db; | |||||
// | |||||
public Verarbeitungsergebnis(String status, short maxAmp, int db) { | |||||
this.status = status; | |||||
this.maxAmp = maxAmp; | |||||
this.db = db; | |||||
} | |||||
public String getStatus() { | |||||
return status; | |||||
} | |||||
public void setStatus(String status) { | |||||
this.status = status; | |||||
} | |||||
public short getMaxAmp() { | |||||
return maxAmp; | |||||
} | |||||
public void setMaxAmp(short maxAmp) { | |||||
this.maxAmp = maxAmp; | |||||
} | |||||
public float getDB() { | |||||
return db; | |||||
} | |||||
public void setDB(float db) { | |||||
this.db = db; | |||||
} | |||||
} |
package com.example.greenwatch.sensors; | |||||
import android.media.AudioFormat; | |||||
import android.media.AudioRecord; | |||||
import android.media.MediaRecorder; | |||||
import android.os.AsyncTask; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import com.example.greenwatch.sensors.MicrofonHelperClasses.GleitenderMittelwert; | |||||
import com.example.greenwatch.sensors.MicrofonHelperClasses.RingPuffer; | |||||
import com.example.greenwatch.sensors.MicrofonHelperClasses.Verarbeitungsergebnis; | |||||
public class MicrofonSensor { | |||||
private MutableLiveData<Boolean> mMicrofonAlarmDetected = new MutableLiveData<>(); | |||||
private AufnahmeTask aufnahmeTask; | |||||
private static MicrofonSensor microfonSensorInstance; | |||||
private boolean microfonAlarmDetected = false; | |||||
private boolean kalibrierung_do = true; | |||||
private float threshold = 40; | |||||
private float sensitivity = 10; | |||||
private float amplitudeInDB = 0; | |||||
private RingPuffer ringPuffer = new RingPuffer(10); | |||||
private MicrofonSensor() { | |||||
} | |||||
public static synchronized MicrofonSensor getInstance() { | |||||
if (microfonSensorInstance == null){ | |||||
microfonSensorInstance = new MicrofonSensor(); | |||||
} | |||||
return microfonSensorInstance; | |||||
} | |||||
public void start() { | |||||
aufnahmeTask = new AufnahmeTask(); | |||||
aufnahmeTask.execute(); | |||||
} | |||||
public void stop() { | |||||
if(aufnahmeTask !=null) { | |||||
aufnahmeTask.cancel(true); | |||||
aufnahmeTask = null; | |||||
} | |||||
} | |||||
public void doRecalibration() { | |||||
stop(); | |||||
microfonAlarmDetected = false; | |||||
kalibrierung_do = true; | |||||
threshold = 40; | |||||
sensitivity = 10; | |||||
amplitudeInDB = 0; | |||||
} | |||||
public float getAmplitudeInDB() { | |||||
return amplitudeInDB; | |||||
} | |||||
private void setAmplitudeInDB(float amplitudeInDB) { | |||||
this.amplitudeInDB = amplitudeInDB; | |||||
} | |||||
public MutableLiveData<Boolean> getAccelerometerAlarmDetected() { | |||||
setMutableLiveDataMicrofonAlarmDetected(); | |||||
return mMicrofonAlarmDetected; | |||||
} | |||||
private void setMutableLiveDataMicrofonAlarmDetected() { | |||||
mMicrofonAlarmDetected.setValue(microfonAlarmDetected); | |||||
} | |||||
class AufnahmeTask extends AsyncTask<Long, Verarbeitungsergebnis, Void> { | |||||
private AudioRecord recorder; | |||||
private final int sampleRateInHz = 44100; | |||||
private final int channelConfig = AudioFormat.CHANNEL_IN_MONO; | |||||
private final int audioFormat = AudioFormat.ENCODING_PCM_16BIT; | |||||
private int minPufferGroesseInBytes; | |||||
private int pufferGroesseInBytes; | |||||
public AufnahmeTask() { | |||||
minPufferGroesseInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); | |||||
pufferGroesseInBytes = minPufferGroesseInBytes * 2; | |||||
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, pufferGroesseInBytes); | |||||
} | |||||
public float kalibrieren(short[] puffer){ | |||||
try { | |||||
Thread.sleep(3000); | |||||
} catch (InterruptedException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
int anzahlIterationen = 100; | |||||
float sum = 0.0f; | |||||
for(int i = 0; i < anzahlIterationen; i++){ | |||||
int z = recorder.read(puffer, 0, puffer.length); | |||||
Verarbeitungsergebnis kalibrierung = verarbeiten(puffer, z); | |||||
sum += kalibrierung.getDB(); | |||||
} | |||||
return sum/anzahlIterationen; | |||||
} | |||||
public void Detektion(Verarbeitungsergebnis ergebnis){ | |||||
if(ergebnis.getDB() >= (threshold+sensitivity)){ | |||||
microfonAlarmDetected = true; | |||||
} | |||||
else if (ergebnis.getDB() <= (threshold)) { | |||||
microfonAlarmDetected = false; | |||||
} | |||||
} | |||||
@Override | |||||
protected Void doInBackground(Long... params) { | |||||
recorder.startRecording(); | |||||
short[] puffer = new short[pufferGroesseInBytes / 2]; | |||||
GleitenderMittelwert gleitenderMittelwertdB = new GleitenderMittelwert(0.2f); | |||||
float db = 0.0f; | |||||
//kalibrierung | |||||
if(kalibrierung_do){ | |||||
threshold = kalibrieren(puffer); | |||||
kalibrierung_do = false; | |||||
} | |||||
for (; ; ) { | |||||
if (isCancelled()) { | |||||
break; | |||||
} | |||||
else { | |||||
//ergebnis ermitteln | |||||
int n = recorder.read(puffer, 0, puffer.length); | |||||
Verarbeitungsergebnis ergebnis = verarbeiten(puffer, n); | |||||
//Mittelwertberechnnung | |||||
db = ergebnis.getDB(); | |||||
db = gleitenderMittelwertdB.mittel(db); | |||||
ergebnis.setDB(db); | |||||
//Db Wert mit Schwellwert vergleichen und Warnung setzen | |||||
Detektion(ergebnis); | |||||
publishProgress(ergebnis); | |||||
try { | |||||
Thread.sleep(10); | |||||
} catch (InterruptedException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} | |||||
recorder.release(); | |||||
return null; | |||||
} | |||||
private Verarbeitungsergebnis verarbeiten(short[] daten, int n) { | |||||
String status; | |||||
short maxAmp = -1; | |||||
int db = 0, db_wert = 0; | |||||
if (n == AudioRecord.ERROR_INVALID_OPERATION) { | |||||
status = "ERROR_INVALID_OPERATION"; | |||||
} else if (n == AudioRecord.ERROR_BAD_VALUE) { | |||||
status = "ERROR_BAD_VALUE"; | |||||
} else { | |||||
status = "OK"; | |||||
short max = 0; | |||||
for (int i = 0; i < n; i++) { | |||||
if (daten[i] > max) { | |||||
max = daten[i]; | |||||
} | |||||
} | |||||
ringPuffer.hinzufuegen(max); | |||||
maxAmp = ringPuffer.maximum(); | |||||
} | |||||
//Umwandlung Amplitudenwert in dB | |||||
db_wert = (int) (20*Math.log10(maxAmp)); | |||||
if (db_wert > 0){ | |||||
db = db_wert; | |||||
} | |||||
return new Verarbeitungsergebnis(status, maxAmp, db); | |||||
} | |||||
@Override | |||||
protected void onProgressUpdate(Verarbeitungsergebnis... progress) { | |||||
super.onProgressUpdate(progress); | |||||
setAmplitudeInDB(progress[0].getDB()); | |||||
if (microfonAlarmDetected != mMicrofonAlarmDetected.getValue()){ | |||||
setMutableLiveDataMicrofonAlarmDetected(); | |||||
} | |||||
//textViewMaxAmpdb.setText("" + progress[0].db); | |||||
} | |||||
} | |||||
} | |||||
package com.example.greenwatch.viewmodels; | |||||
import android.Manifest; | |||||
import android.app.Activity; | |||||
import android.content.Context; | |||||
import android.content.pm.PackageManager; | |||||
import android.view.SurfaceHolder; | |||||
import androidx.core.app.ActivityCompat; | |||||
import androidx.core.content.ContextCompat; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import androidx.lifecycle.ViewModel; | |||||
import com.example.greenwatch.alarmrecorder.AlarmRecorder; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.repositories.DeviceRepository; | |||||
import com.example.greenwatch.sensors.AccelerometerSensor; | |||||
import java.util.List; | |||||
public class AccelerometerViewModel extends ViewModel implements ViewModelInterface { | |||||
private MutableLiveData<List<Device>> mDeviceList; | |||||
private MutableLiveData<Boolean> mAccelerometerAlarmDetected; | |||||
private MutableLiveData<List<Device>> mAlarmHistoryList; | |||||
private MutableLiveData<Boolean> mStartAlarmRecording; | |||||
private AccelerometerSensor mAccelerometerSensor; | |||||
private AlarmRecorder mAlarmRecorder; | |||||
private DeviceRepository mDeviceRepository; | |||||
@Override | |||||
public void init(SurfaceHolder previewHolder) { | |||||
if (mDeviceRepository == null) { | |||||
mDeviceRepository = DeviceRepository.getInstance(); | |||||
} | |||||
if (mAccelerometerSensor == null) { | |||||
mAccelerometerSensor = AccelerometerSensor.getInstance(); | |||||
} | |||||
if (mAlarmRecorder == null) { | |||||
mAlarmRecorder = AlarmRecorder.getInstance(); | |||||
} | |||||
if (mDeviceList == null) { | |||||
mDeviceList = mDeviceRepository.getConnectedDeviceList(); | |||||
} | |||||
if (mAlarmHistoryList == null) { | |||||
mAlarmHistoryList = mDeviceRepository.getAlarmHistoryDeviceList(); | |||||
} | |||||
if (mStartAlarmRecording == null) { | |||||
mStartAlarmRecording = mDeviceRepository.getStartAlarmRecording(); | |||||
} | |||||
if (mAccelerometerAlarmDetected == null) { | |||||
mAccelerometerAlarmDetected = mAccelerometerSensor.getAccelerometerAlarmDetected(); | |||||
} | |||||
setAlarmRecordingPreviewHolder(previewHolder); | |||||
} | |||||
public void addValueToGesamtBE(float newValue) { | |||||
mAccelerometerSensor.addValueToGesamtBE(newValue); | |||||
} | |||||
public void meanValueCalculation() { | |||||
mAccelerometerSensor.meanValueCalculation(); | |||||
} | |||||
public void calibrateAccelerometerSensor() { | |||||
mAccelerometerSensor.calibrateAccelerometerSensor(); | |||||
} | |||||
public void checkAlarmCondition() { | |||||
mAccelerometerSensor.checkAlarmCondition(); | |||||
} | |||||
public float getAccelerometerSensorMeanValue() { | |||||
return mAccelerometerSensor.getAccelerometerSensorMeanValue(); | |||||
} | |||||
public LiveData<Boolean> getAccelerometerAlarmDetected() { | |||||
return mAccelerometerAlarmDetected; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getConnectedDeviceList() { | |||||
return mDeviceList; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getAlarmHistoryList() { | |||||
return mAlarmHistoryList; | |||||
} | |||||
@Override | |||||
public LiveData<Boolean> getStartAlarmRecording() { | |||||
return mStartAlarmRecording; | |||||
} | |||||
@Override | |||||
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage); | |||||
} | |||||
@Override | |||||
public void setTimeStamp(String deviceID, String timeStamp) { | |||||
mDeviceRepository.setTimeStamp(deviceID, timeStamp); | |||||
} | |||||
@Override | |||||
public String getTimeStamp(String deviceID) { | |||||
return mDeviceRepository.getTimeStamp(deviceID); | |||||
} | |||||
@Override | |||||
public void setDeviceID(String deviceID, String newDeviceID) { | |||||
mDeviceRepository.setDeviceID(deviceID, newDeviceID); | |||||
} | |||||
@Override | |||||
public String getDeviceID(String deviceID) { | |||||
return mDeviceRepository.getDeviceID(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorStatus(String deviceID, boolean sensorStatus) { | |||||
mDeviceRepository.setSensorStatus(deviceID, sensorStatus); | |||||
} | |||||
@Override | |||||
public boolean getSensorStatus(String deviceID) { | |||||
return mDeviceRepository.getSensorStatus(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorType(String deviceID, String sensorType) { | |||||
mDeviceRepository.setSensorType(deviceID, sensorType); | |||||
} | |||||
@Override | |||||
public String getSensorType(String deviceID) { | |||||
return mDeviceRepository.getSensorType(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorMassage(String deviceID, float sensorMessage) { | |||||
mDeviceRepository.setSensorMassage(deviceID, sensorMessage); | |||||
} | |||||
@Override | |||||
public float getSensorMassage(String deviceID) { | |||||
return mDeviceRepository.getSensorMassage(deviceID); | |||||
} | |||||
@Override | |||||
public String getLocalDeviceUUID() { | |||||
return mDeviceRepository.getLocalDeviceUUID(); | |||||
} | |||||
@Override | |||||
public String getSystemTimeStamp() { | |||||
return mDeviceRepository.getSystemTimeStamp(); | |||||
} | |||||
@Override | |||||
public void startAlarmRecording() { | |||||
mAlarmRecorder.startRecording(); | |||||
} | |||||
@Override | |||||
public void stopAlarmRecording(Context context) { | |||||
mAlarmRecorder.stopRecording(context); | |||||
} | |||||
@Override | |||||
public void setAlarmRecordingPreviewHolder(SurfaceHolder previewHolder) { | |||||
mAlarmRecorder.setPreviewHolder(previewHolder); | |||||
} | |||||
} |
package com.example.greenwatch.viewmodels; | |||||
import android.content.Context; | |||||
import android.view.SurfaceHolder; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModel; | |||||
import com.example.greenwatch.alarmrecorder.AlarmRecorder; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.repositories.DeviceRepository; | |||||
import com.example.greenwatch.sensors.AccelerometerSensor; | |||||
import com.example.greenwatch.sensors.MicrofonSensor; | |||||
import java.util.List; | |||||
public class AudiodetectionAndAccelerometerViewModel extends ViewModel implements ViewModelInterface { | |||||
private MutableLiveData<List<Device>> mDeviceList; | |||||
private MutableLiveData<Boolean> mAccelerometerAlarmDetected; | |||||
private MutableLiveData<Boolean> mMicrofonAlarmDetected; | |||||
private MutableLiveData<Boolean> mAudiodetectionAndAccelerometerAlarmDetected = new MutableLiveData<>(); | |||||
private MutableLiveData<List<Device>> mAlarmHistoryList; | |||||
private MutableLiveData<Boolean> mStartAlarmRecording; | |||||
private AccelerometerSensor mAccelerometerSensor; | |||||
private MicrofonSensor mMicrofonSensor; | |||||
private AlarmRecorder mAlarmRecorder; | |||||
private DeviceRepository mDeviceRepository; | |||||
private boolean microfonAlarmDetected; | |||||
private boolean accelerometerAlarmDetected; | |||||
private boolean microfondetectionAndAccelerometerAlarmDetected; | |||||
public void init() { | |||||
} | |||||
public void addValueToGesamtBE(float newValue) { | |||||
mAccelerometerSensor.addValueToGesamtBE(newValue); | |||||
} | |||||
public void meanValueCalculation() { | |||||
mAccelerometerSensor.meanValueCalculation(); | |||||
} | |||||
public void calibrateAccelerometerSensor() { | |||||
mAccelerometerSensor.calibrateAccelerometerSensor(); | |||||
} | |||||
public void checkAlarmCondition() { | |||||
mAccelerometerSensor.checkAlarmCondition(); | |||||
} | |||||
public float getAccelerometerSensorMeanValue() { | |||||
return mAccelerometerSensor.getAccelerometerSensorMeanValue(); | |||||
} | |||||
public LiveData<Boolean> getAudiodetectionAndAccelerometerAlarmDetected() { | |||||
setMutableLiveDataMicrofondetectionAndAccelerometerAlarmDetected(); | |||||
return mAudiodetectionAndAccelerometerAlarmDetected; | |||||
} | |||||
public void startMicrofonSensor() { | |||||
mMicrofonSensor.start(); | |||||
} | |||||
public void stopMicrofonSensor() { | |||||
mMicrofonSensor.stop(); | |||||
} | |||||
public void recalibrationMicrofonSensor() { | |||||
mMicrofonSensor.doRecalibration(); | |||||
} | |||||
public float getAmplitudeInDB() { | |||||
return mMicrofonSensor.getAmplitudeInDB(); | |||||
} | |||||
private void setMutableLiveDataMicrofondetectionAndAccelerometerAlarmDetected() { | |||||
mAudiodetectionAndAccelerometerAlarmDetected.setValue(microfondetectionAndAccelerometerAlarmDetected); | |||||
} | |||||
private void setAccelerometerAlarmDetected(boolean accelerometerAlarmDetected) { | |||||
this.accelerometerAlarmDetected = accelerometerAlarmDetected; | |||||
} | |||||
public boolean getAccelerometerAlarmDetected() { | |||||
return accelerometerAlarmDetected; | |||||
} | |||||
private void setMicrofonAlarmDetected(boolean microfonAlarmDetected) { | |||||
this.microfonAlarmDetected = microfonAlarmDetected; | |||||
} | |||||
public boolean getMicrofonAlarmDetected() { | |||||
return microfonAlarmDetected; | |||||
} | |||||
Observer<Boolean> observer = new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
setAccelerometerAlarmDetected(mAccelerometerAlarmDetected.getValue()); | |||||
setMicrofonAlarmDetected(mMicrofonAlarmDetected.getValue()); | |||||
if (microfonAlarmDetected || accelerometerAlarmDetected) { | |||||
microfondetectionAndAccelerometerAlarmDetected = true; | |||||
setMutableLiveDataMicrofondetectionAndAccelerometerAlarmDetected(); | |||||
} | |||||
else if (!microfonAlarmDetected && !accelerometerAlarmDetected) { | |||||
microfondetectionAndAccelerometerAlarmDetected = false; | |||||
setMutableLiveDataMicrofondetectionAndAccelerometerAlarmDetected(); | |||||
} | |||||
} | |||||
}; | |||||
private void registerAlarmObserver() { | |||||
mMicrofonAlarmDetected.observeForever(observer); | |||||
mAccelerometerAlarmDetected.observeForever(observer); | |||||
} | |||||
@Override | |||||
protected void onCleared() { | |||||
super.onCleared(); | |||||
mMicrofonAlarmDetected.removeObserver(observer); | |||||
mAccelerometerAlarmDetected.removeObserver(observer); | |||||
} | |||||
@Override | |||||
public void init(SurfaceHolder previewHolder) { | |||||
if (mDeviceRepository == null) { | |||||
mDeviceRepository = DeviceRepository.getInstance(); | |||||
} | |||||
if (mAccelerometerSensor == null) { | |||||
mAccelerometerSensor = AccelerometerSensor.getInstance(); | |||||
} | |||||
if (mMicrofonSensor == null) { | |||||
mMicrofonSensor = MicrofonSensor.getInstance(); | |||||
} | |||||
if (mAlarmRecorder == null) { | |||||
mAlarmRecorder = AlarmRecorder.getInstance(); | |||||
} | |||||
if (mDeviceList == null) { | |||||
mDeviceList = mDeviceRepository.getConnectedDeviceList(); | |||||
} | |||||
if (mAlarmHistoryList == null) { | |||||
mAlarmHistoryList = mDeviceRepository.getAlarmHistoryDeviceList(); | |||||
} | |||||
if (mStartAlarmRecording == null) { | |||||
mStartAlarmRecording = mDeviceRepository.getStartAlarmRecording(); | |||||
} | |||||
if (mAccelerometerAlarmDetected == null) { | |||||
mAccelerometerAlarmDetected = mAccelerometerSensor.getAccelerometerAlarmDetected(); | |||||
} | |||||
if (mMicrofonAlarmDetected == null) { | |||||
mMicrofonAlarmDetected = mMicrofonSensor.getAccelerometerAlarmDetected(); | |||||
} | |||||
microfondetectionAndAccelerometerAlarmDetected = false; | |||||
accelerometerAlarmDetected = false; | |||||
microfonAlarmDetected = false; | |||||
registerAlarmObserver(); | |||||
setAlarmRecordingPreviewHolder(previewHolder); | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getConnectedDeviceList() { | |||||
return mDeviceList; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getAlarmHistoryList() { | |||||
return mAlarmHistoryList; | |||||
} | |||||
@Override | |||||
public LiveData<Boolean> getStartAlarmRecording() { | |||||
return mStartAlarmRecording; | |||||
} | |||||
@Override | |||||
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage); | |||||
} | |||||
@Override | |||||
public void setTimeStamp(String deviceID, String timeStamp) { | |||||
mDeviceRepository.setTimeStamp(deviceID, timeStamp); | |||||
} | |||||
@Override | |||||
public String getTimeStamp(String deviceID) { | |||||
return mDeviceRepository.getTimeStamp(deviceID); | |||||
} | |||||
@Override | |||||
public void setDeviceID(String deviceID, String newDeviceID) { | |||||
mDeviceRepository.setDeviceID(deviceID, newDeviceID); | |||||
} | |||||
@Override | |||||
public String getDeviceID(String deviceID) { | |||||
return mDeviceRepository.getDeviceID(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorStatus(String deviceID, boolean sensorStatus) { | |||||
mDeviceRepository.setSensorStatus(deviceID, sensorStatus); | |||||
} | |||||
@Override | |||||
public boolean getSensorStatus(String deviceID) { | |||||
return mDeviceRepository.getSensorStatus(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorType(String deviceID, String sensorType) { | |||||
mDeviceRepository.setSensorType(deviceID, sensorType); | |||||
} | |||||
@Override | |||||
public String getSensorType(String deviceID) { | |||||
return mDeviceRepository.getSensorType(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorMassage(String deviceID, float sensorMessage) { | |||||
mDeviceRepository.setSensorMassage(deviceID, sensorMessage); | |||||
} | |||||
@Override | |||||
public float getSensorMassage(String deviceID) { | |||||
return mDeviceRepository.getSensorMassage(deviceID); | |||||
} | |||||
@Override | |||||
public String getLocalDeviceUUID() { | |||||
return mDeviceRepository.getLocalDeviceUUID(); | |||||
} | |||||
@Override | |||||
public String getSystemTimeStamp() { | |||||
return mDeviceRepository.getSystemTimeStamp(); | |||||
} | |||||
@Override | |||||
public void startAlarmRecording() { | |||||
mAlarmRecorder.startRecording(); | |||||
} | |||||
@Override | |||||
public void stopAlarmRecording(Context context) { | |||||
mAlarmRecorder.stopRecording(context); | |||||
} | |||||
@Override | |||||
public void setAlarmRecordingPreviewHolder(SurfaceHolder previewHolder) { | |||||
mAlarmRecorder.setPreviewHolder(previewHolder); | |||||
} | |||||
} |
package com.example.greenwatch.viewmodels; | |||||
import android.Manifest; | |||||
import android.app.Activity; | |||||
import android.content.Context; | |||||
import android.content.pm.PackageManager; | |||||
import android.view.SurfaceHolder; | |||||
import androidx.core.app.ActivityCompat; | |||||
import androidx.core.content.ContextCompat; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import androidx.lifecycle.ViewModel; | |||||
import com.example.greenwatch.alarmrecorder.AlarmRecorder; | |||||
import com.example.greenwatch.communication.WiFiCommunication; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.repositories.DeviceRepository; | |||||
import com.example.greenwatch.sensors.AccelerometerSensor; | |||||
import java.util.List; | |||||
public class MainActivityViewModel extends ViewModel implements ViewModelInterface { | |||||
private MutableLiveData<List<Device>> mDeviceList; | |||||
private MutableLiveData<List<Device>> mAlarmHistoryList; | |||||
private MutableLiveData<Boolean> mStartAlarmRecording; | |||||
private DeviceRepository mDeviceRepository; | |||||
private WiFiCommunication mWiFiCommunication; | |||||
private AlarmRecorder mAlarmRecorder; | |||||
@Override | |||||
public void init(SurfaceHolder previewHolder) { | |||||
if (mDeviceRepository == null) { | |||||
mDeviceRepository = DeviceRepository.getInstance(); | |||||
} | |||||
if (mWiFiCommunication == null) { | |||||
mWiFiCommunication = WiFiCommunication.getInstance(); | |||||
} | |||||
if (mAlarmRecorder == null) { | |||||
mAlarmRecorder = AlarmRecorder.getInstance(); | |||||
} | |||||
if (mDeviceList == null) { | |||||
mDeviceList = mDeviceRepository.getConnectedDeviceList(); | |||||
} | |||||
if (mAlarmHistoryList == null) { | |||||
mAlarmHistoryList = mDeviceRepository.getAlarmHistoryDeviceList(); | |||||
} | |||||
if (mStartAlarmRecording == null) { | |||||
mStartAlarmRecording = mDeviceRepository.getStartAlarmRecording(); | |||||
} | |||||
mWiFiCommunication.setDeviceRepository(mDeviceRepository); | |||||
mDeviceRepository.setWiFiCommunication(mWiFiCommunication); | |||||
mDeviceRepository.createNewDevice(mDeviceRepository.getSystemTimeStamp(), mDeviceRepository.getLocalDeviceUUID(), false, "No Sensor selected", 0.0f); | |||||
mDeviceRepository.setDeviceID(mDeviceRepository.getLocalDeviceUUID(), WiFiCommunication.getLocalIpAddress()); | |||||
setAlarmRecordingPreviewHolder(previewHolder); | |||||
mWiFiCommunication = null; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getConnectedDeviceList() { | |||||
return mDeviceList; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getAlarmHistoryList() { | |||||
return mAlarmHistoryList; | |||||
} | |||||
@Override | |||||
public LiveData<Boolean> getStartAlarmRecording() { | |||||
return mStartAlarmRecording; | |||||
} | |||||
@Override | |||||
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage); | |||||
} | |||||
@Override | |||||
public void setTimeStamp(String deviceID, String timeStamp) { | |||||
mDeviceRepository.setTimeStamp(deviceID, timeStamp); | |||||
} | |||||
@Override | |||||
public String getTimeStamp(String deviceID) { | |||||
return mDeviceRepository.getTimeStamp(deviceID); | |||||
} | |||||
@Override | |||||
public void setDeviceID(String deviceID, String newDeviceID) { | |||||
mDeviceRepository.setDeviceID(deviceID, newDeviceID); | |||||
} | |||||
@Override | |||||
public String getDeviceID(String deviceID) { | |||||
return mDeviceRepository.getDeviceID(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorStatus(String deviceID, boolean sensorStatus) { | |||||
mDeviceRepository.setSensorStatus(deviceID, sensorStatus); | |||||
} | |||||
@Override | |||||
public boolean getSensorStatus(String deviceID) { | |||||
return mDeviceRepository.getSensorStatus(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorType(String deviceID, String sensorType) { | |||||
mDeviceRepository.setSensorType(deviceID, sensorType); | |||||
} | |||||
@Override | |||||
public String getSensorType(String deviceID) { | |||||
return mDeviceRepository.getSensorType(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorMassage(String deviceID, float sensorMessage) { | |||||
mDeviceRepository.setSensorMassage(deviceID, sensorMessage); | |||||
} | |||||
@Override | |||||
public float getSensorMassage(String deviceID) { | |||||
return mDeviceRepository.getSensorMassage(deviceID); | |||||
} | |||||
@Override | |||||
public String getLocalDeviceUUID() { | |||||
return mDeviceRepository.getLocalDeviceUUID(); | |||||
} | |||||
@Override | |||||
public String getSystemTimeStamp() { | |||||
return mDeviceRepository.getSystemTimeStamp(); | |||||
} | |||||
@Override | |||||
public void startAlarmRecording() { | |||||
mAlarmRecorder.startRecording(); | |||||
} | |||||
@Override | |||||
public void stopAlarmRecording(Context context) { | |||||
mAlarmRecorder.stopRecording(context); | |||||
} | |||||
@Override | |||||
public void setAlarmRecordingPreviewHolder(SurfaceHolder previewHolder) { | |||||
mAlarmRecorder.setPreviewHolder(previewHolder); | |||||
} | |||||
} |
package com.example.greenwatch.viewmodels; | |||||
import android.content.Context; | |||||
import android.view.SurfaceHolder; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import androidx.lifecycle.ViewModel; | |||||
import com.example.greenwatch.alarmrecorder.AlarmRecorder; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.repositories.DeviceRepository; | |||||
import com.example.greenwatch.sensors.AccelerometerSensor; | |||||
import com.example.greenwatch.sensors.MicrofonSensor; | |||||
import java.util.List; | |||||
public class MicrofonViewModel extends ViewModel implements ViewModelInterface { | |||||
private MutableLiveData<List<Device>> mDeviceList; | |||||
private MutableLiveData<Boolean> mMicrofonAlarmDetected; | |||||
private MutableLiveData<List<Device>> mAlarmHistoryList; | |||||
private MutableLiveData<Boolean> mStartAlarmRecording; | |||||
private MicrofonSensor mMicrofonSensor; | |||||
private DeviceRepository mDeviceRepository; | |||||
private AlarmRecorder mAlarmRecorder; | |||||
public void startMicrofonSensor() { | |||||
mMicrofonSensor.start(); | |||||
} | |||||
public void stopMicrofonSensor() { | |||||
mMicrofonSensor.stop(); | |||||
} | |||||
public void recalibrationMicrofonSensor() { | |||||
mMicrofonSensor.doRecalibration(); | |||||
} | |||||
public float getAmplitudeInDB() { | |||||
return mMicrofonSensor.getAmplitudeInDB(); | |||||
} | |||||
public LiveData<Boolean> getMicrofonAlarmDetected() { | |||||
return mMicrofonAlarmDetected; | |||||
} | |||||
@Override | |||||
public void init(SurfaceHolder previewHolder) { | |||||
if (mDeviceRepository == null) { | |||||
mDeviceRepository = DeviceRepository.getInstance(); | |||||
} | |||||
if (mMicrofonSensor == null) { | |||||
mMicrofonSensor = MicrofonSensor.getInstance(); | |||||
} | |||||
if (mAlarmRecorder == null) { | |||||
mAlarmRecorder = AlarmRecorder.getInstance(); | |||||
} | |||||
if (mDeviceList == null) { | |||||
mDeviceList = mDeviceRepository.getConnectedDeviceList(); | |||||
} | |||||
if (mAlarmHistoryList == null) { | |||||
mAlarmHistoryList = mDeviceRepository.getAlarmHistoryDeviceList(); | |||||
} | |||||
if (mStartAlarmRecording == null) { | |||||
mStartAlarmRecording = mDeviceRepository.getStartAlarmRecording(); | |||||
} | |||||
if (mMicrofonAlarmDetected == null) { | |||||
mMicrofonAlarmDetected = mMicrofonSensor.getAccelerometerAlarmDetected(); | |||||
} | |||||
setAlarmRecordingPreviewHolder(previewHolder); | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getConnectedDeviceList() { | |||||
return mDeviceList; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getAlarmHistoryList() { | |||||
return mAlarmHistoryList; | |||||
} | |||||
@Override | |||||
public LiveData<Boolean> getStartAlarmRecording() { | |||||
return mStartAlarmRecording; | |||||
} | |||||
@Override | |||||
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage); | |||||
} | |||||
@Override | |||||
public void setTimeStamp(String deviceID, String timeStamp) { | |||||
mDeviceRepository.setTimeStamp(deviceID, timeStamp); | |||||
} | |||||
@Override | |||||
public String getTimeStamp(String deviceID) { | |||||
return mDeviceRepository.getTimeStamp(deviceID); | |||||
} | |||||
@Override | |||||
public void setDeviceID(String deviceID, String newDeviceID) { | |||||
mDeviceRepository.setDeviceID(deviceID, newDeviceID); | |||||
} | |||||
@Override | |||||
public String getDeviceID(String deviceID) { | |||||
return mDeviceRepository.getDeviceID(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorStatus(String deviceID, boolean sensorStatus) { | |||||
mDeviceRepository.setSensorStatus(deviceID, sensorStatus); | |||||
} | |||||
@Override | |||||
public boolean getSensorStatus(String deviceID) { | |||||
return mDeviceRepository.getSensorStatus(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorType(String deviceID, String sensorType) { | |||||
mDeviceRepository.setSensorType(deviceID, sensorType); | |||||
} | |||||
@Override | |||||
public String getSensorType(String deviceID) { | |||||
return mDeviceRepository.getSensorType(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorMassage(String deviceID, float sensorMessage) { | |||||
mDeviceRepository.setSensorMassage(deviceID, sensorMessage); | |||||
} | |||||
@Override | |||||
public float getSensorMassage(String deviceID) { | |||||
return mDeviceRepository.getSensorMassage(deviceID); | |||||
} | |||||
@Override | |||||
public String getLocalDeviceUUID() { | |||||
return mDeviceRepository.getLocalDeviceUUID(); | |||||
} | |||||
@Override | |||||
public String getSystemTimeStamp() { | |||||
return mDeviceRepository.getSystemTimeStamp(); | |||||
} | |||||
@Override | |||||
public void startAlarmRecording() { | |||||
mAlarmRecorder.startRecording(); | |||||
} | |||||
@Override | |||||
public void stopAlarmRecording(Context context) { | |||||
mAlarmRecorder.stopRecording(context); | |||||
} | |||||
@Override | |||||
public void setAlarmRecordingPreviewHolder(SurfaceHolder previewHolder) { | |||||
mAlarmRecorder.setPreviewHolder(previewHolder); | |||||
} | |||||
} |
package com.example.greenwatch.viewmodels; | |||||
import android.content.Context; | |||||
import android.view.SurfaceHolder; | |||||
import androidx.camera.lifecycle.ProcessCameraProvider; | |||||
import androidx.lifecycle.LifecycleOwner; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import androidx.lifecycle.Observer; | |||||
import androidx.lifecycle.ViewModel; | |||||
import com.example.greenwatch.alarmrecorder.AlarmRecorder; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.repositories.DeviceRepository; | |||||
import com.example.greenwatch.sensors.AccelerometerSensor; | |||||
import com.example.greenwatch.sensors.CameraSensor; | |||||
import java.util.List; | |||||
public class VideodetectionAndAccelerometerViewModel extends ViewModel implements ViewModelInterface{ | |||||
private MutableLiveData<List<Device>> mDeviceList; | |||||
private MutableLiveData<Boolean> mAccelerometerAlarmDetected; | |||||
private MutableLiveData<Boolean> mVideoAlarmDetected; | |||||
private MutableLiveData<Boolean> mVideodetectionAndAccelerometerAlarmDetected = new MutableLiveData<>(); | |||||
private MutableLiveData<List<Device>> mAlarmHistoryList; | |||||
private MutableLiveData<Boolean> mStartAlarmRecording; | |||||
private AccelerometerSensor mAccelerometerSensor; | |||||
private CameraSensor mCameraSensor; | |||||
private DeviceRepository mDeviceRepository; | |||||
private AlarmRecorder mAlarmRecorder; | |||||
private boolean videoAlarmDetected; | |||||
private boolean accelerometerAlarmDetected; | |||||
private boolean videodetectionAndAccelerometerAlarmDetected; | |||||
public void addValueToGesamtBE(float newValue) { | |||||
mAccelerometerSensor.addValueToGesamtBE(newValue); | |||||
} | |||||
public void meanValueCalculation() { | |||||
mAccelerometerSensor.meanValueCalculation(); | |||||
} | |||||
public void calibrateAccelerometerSensor() { | |||||
mAccelerometerSensor.calibrateAccelerometerSensor(); | |||||
} | |||||
public void checkAlarmCondition() { | |||||
mAccelerometerSensor.checkAlarmCondition(); | |||||
} | |||||
public float getAccelerometerSensorMeanValue() { | |||||
return mAccelerometerSensor.getAccelerometerSensorMeanValue(); | |||||
} | |||||
public void bindImageAnalysis(ProcessCameraProvider cameraProvider, LifecycleOwner lifecycleOwner, Context context) { | |||||
mCameraSensor.bindImageAnalysis(cameraProvider, lifecycleOwner, context); | |||||
} | |||||
public LiveData<Boolean> getVideodetectionAndAccelerometerAlarmDetected() { | |||||
setMutableLiveDataVideodetectionAndAccelerometerAlarmDetected(); | |||||
return mVideodetectionAndAccelerometerAlarmDetected; | |||||
} | |||||
private void setMutableLiveDataVideodetectionAndAccelerometerAlarmDetected() { | |||||
mVideodetectionAndAccelerometerAlarmDetected.setValue(videodetectionAndAccelerometerAlarmDetected); | |||||
} | |||||
private void setAccelerometerAlarmDetected(boolean accelerometerAlarmDetected) { | |||||
this.accelerometerAlarmDetected = accelerometerAlarmDetected; | |||||
} | |||||
public boolean getAccelerometerAlarmDetected() { | |||||
return accelerometerAlarmDetected; | |||||
} | |||||
private void setVideoAlarmDetected(boolean videoAlarmDetected) { | |||||
this.videoAlarmDetected = videoAlarmDetected; | |||||
} | |||||
public boolean getVideoAlarmDetected() { | |||||
return videoAlarmDetected; | |||||
} | |||||
Observer<Boolean> observer = new Observer<Boolean>() { | |||||
@Override | |||||
public void onChanged(Boolean aBoolean) { | |||||
setAccelerometerAlarmDetected(mAccelerometerAlarmDetected.getValue()); | |||||
setVideoAlarmDetected(mVideoAlarmDetected.getValue()); | |||||
if (videoAlarmDetected || accelerometerAlarmDetected && !videodetectionAndAccelerometerAlarmDetected) { | |||||
videodetectionAndAccelerometerAlarmDetected = true; | |||||
setMutableLiveDataVideodetectionAndAccelerometerAlarmDetected(); | |||||
} | |||||
else if (!videoAlarmDetected && !accelerometerAlarmDetected && videodetectionAndAccelerometerAlarmDetected) { | |||||
videodetectionAndAccelerometerAlarmDetected = false; | |||||
setMutableLiveDataVideodetectionAndAccelerometerAlarmDetected(); | |||||
} | |||||
} | |||||
}; | |||||
private void registerAlarmObserver() { | |||||
mVideoAlarmDetected.observeForever(observer); | |||||
mAccelerometerAlarmDetected.observeForever(observer); | |||||
} | |||||
@Override | |||||
protected void onCleared() { | |||||
super.onCleared(); | |||||
mVideoAlarmDetected.removeObserver(observer); | |||||
mAccelerometerAlarmDetected.removeObserver(observer); | |||||
} | |||||
@Override | |||||
public void init(SurfaceHolder previewHolder) { | |||||
if (mDeviceRepository == null) { | |||||
mDeviceRepository = DeviceRepository.getInstance(); | |||||
} | |||||
if (mAccelerometerSensor == null) { | |||||
mAccelerometerSensor = AccelerometerSensor.getInstance(); | |||||
} | |||||
if (mCameraSensor == null) { | |||||
mCameraSensor = CameraSensor.getInstance(); | |||||
} | |||||
if (mAlarmRecorder == null) { | |||||
mAlarmRecorder = AlarmRecorder.getInstance(); | |||||
} | |||||
if (mDeviceList == null) { | |||||
mDeviceList = mDeviceRepository.getConnectedDeviceList(); | |||||
} | |||||
if (mAlarmHistoryList == null) { | |||||
mAlarmHistoryList = mDeviceRepository.getAlarmHistoryDeviceList(); | |||||
} | |||||
if (mStartAlarmRecording == null) { | |||||
mStartAlarmRecording = mDeviceRepository.getStartAlarmRecording(); | |||||
} | |||||
if (mAccelerometerAlarmDetected == null) { | |||||
mAccelerometerAlarmDetected = mAccelerometerSensor.getAccelerometerAlarmDetected(); | |||||
} | |||||
if (mVideoAlarmDetected == null) { | |||||
mVideoAlarmDetected = mCameraSensor.getVideoAlarmDetectedValue(); | |||||
} | |||||
videodetectionAndAccelerometerAlarmDetected = false; | |||||
videoAlarmDetected = false; | |||||
accelerometerAlarmDetected = false; | |||||
registerAlarmObserver(); | |||||
setAlarmRecordingPreviewHolder(previewHolder); | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getConnectedDeviceList() { | |||||
return mDeviceList; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getAlarmHistoryList() { | |||||
return mAlarmHistoryList; | |||||
} | |||||
@Override | |||||
public LiveData<Boolean> getStartAlarmRecording() { | |||||
return mStartAlarmRecording; | |||||
} | |||||
@Override | |||||
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage); | |||||
} | |||||
@Override | |||||
public void setTimeStamp(String deviceID, String timeStamp) { | |||||
mDeviceRepository.setTimeStamp(deviceID, timeStamp); | |||||
} | |||||
@Override | |||||
public String getTimeStamp(String deviceID) { | |||||
return mDeviceRepository.getTimeStamp(deviceID); | |||||
} | |||||
@Override | |||||
public void setDeviceID(String deviceID, String newDeviceID) { | |||||
mDeviceRepository.setDeviceID(deviceID, newDeviceID); | |||||
} | |||||
@Override | |||||
public String getDeviceID(String deviceID) { | |||||
return mDeviceRepository.getDeviceID(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorStatus(String deviceID, boolean sensorStatus) { | |||||
mDeviceRepository.setSensorStatus(deviceID, sensorStatus); | |||||
} | |||||
@Override | |||||
public boolean getSensorStatus(String deviceID) { | |||||
return mDeviceRepository.getSensorStatus(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorType(String deviceID, String sensorType) { | |||||
mDeviceRepository.setSensorType(deviceID, sensorType); | |||||
} | |||||
@Override | |||||
public String getSensorType(String deviceID) { | |||||
return mDeviceRepository.getSensorType(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorMassage(String deviceID, float sensorMessage) { | |||||
mDeviceRepository.setSensorMassage(deviceID, sensorMessage); | |||||
} | |||||
@Override | |||||
public float getSensorMassage(String deviceID) { | |||||
return mDeviceRepository.getSensorMassage(deviceID); | |||||
} | |||||
@Override | |||||
public String getLocalDeviceUUID() { | |||||
return mDeviceRepository.getLocalDeviceUUID(); | |||||
} | |||||
@Override | |||||
public String getSystemTimeStamp() { | |||||
return mDeviceRepository.getSystemTimeStamp(); | |||||
} | |||||
@Override | |||||
public void startAlarmRecording() { | |||||
mAlarmRecorder.startRecording(); | |||||
} | |||||
@Override | |||||
public void stopAlarmRecording(Context context) { | |||||
mAlarmRecorder.stopRecording(context); | |||||
} | |||||
@Override | |||||
public void setAlarmRecordingPreviewHolder(SurfaceHolder previewHolder) { | |||||
mAlarmRecorder.setPreviewHolder(previewHolder); | |||||
} | |||||
} |
package com.example.greenwatch.viewmodels; | |||||
import android.content.Context; | |||||
import android.view.SurfaceHolder; | |||||
import androidx.camera.lifecycle.ProcessCameraProvider; | |||||
import androidx.lifecycle.LifecycleOwner; | |||||
import androidx.lifecycle.LiveData; | |||||
import androidx.lifecycle.MutableLiveData; | |||||
import androidx.lifecycle.ViewModel; | |||||
import com.example.greenwatch.alarmrecorder.AlarmRecorder; | |||||
import com.example.greenwatch.models.Device; | |||||
import com.example.greenwatch.repositories.DeviceRepository; | |||||
import com.example.greenwatch.sensors.CameraSensor; | |||||
import java.util.List; | |||||
public class VideodetectionViewModel extends ViewModel implements ViewModelInterface { | |||||
private MutableLiveData<List<Device>> mDeviceList; | |||||
private MutableLiveData<Boolean> mVideoAlarmDetected; | |||||
private MutableLiveData<List<Device>> mAlarmHistoryList; | |||||
private MutableLiveData<Boolean> mStartAlarmRecording; | |||||
private DeviceRepository mDeviceRepository; | |||||
private AlarmRecorder mAlarmRecorder; | |||||
private CameraSensor mCameraSensor; | |||||
public LiveData<Boolean> getVideoMovementDetectedValue() { | |||||
return mVideoAlarmDetected; | |||||
} | |||||
@Override | |||||
public void init(SurfaceHolder previewHolder) { | |||||
if (mDeviceRepository == null) { | |||||
mDeviceRepository = DeviceRepository.getInstance(); | |||||
} | |||||
if (mCameraSensor == null) { | |||||
mCameraSensor = CameraSensor.getInstance(); | |||||
} | |||||
if (mAlarmRecorder == null) { | |||||
mAlarmRecorder = AlarmRecorder.getInstance(); | |||||
} | |||||
if (mDeviceList == null) { | |||||
mDeviceList = mDeviceRepository.getConnectedDeviceList(); | |||||
} | |||||
if (mAlarmHistoryList == null) { | |||||
mAlarmHistoryList = mDeviceRepository.getAlarmHistoryDeviceList(); | |||||
} | |||||
if (mStartAlarmRecording == null) { | |||||
mStartAlarmRecording = mDeviceRepository.getStartAlarmRecording(); | |||||
} | |||||
if (mVideoAlarmDetected == null) { | |||||
mVideoAlarmDetected = mCameraSensor.getVideoAlarmDetectedValue(); | |||||
} | |||||
setAlarmRecordingPreviewHolder(previewHolder); | |||||
} | |||||
public void bindImageAnalysis(ProcessCameraProvider cameraProvider, LifecycleOwner lifecycleOwner, Context context) { | |||||
mCameraSensor.bindImageAnalysis(cameraProvider, lifecycleOwner, context); | |||||
} | |||||
public LiveData<Boolean> getVideoAlarmDetectedValue() { | |||||
return mVideoAlarmDetected; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getConnectedDeviceList() { | |||||
return mDeviceList; | |||||
} | |||||
@Override | |||||
public LiveData<List<Device>> getAlarmHistoryList() { | |||||
return mAlarmHistoryList; | |||||
} | |||||
@Override | |||||
public LiveData<Boolean> getStartAlarmRecording() { | |||||
return mStartAlarmRecording; | |||||
} | |||||
@Override | |||||
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage) { | |||||
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage); | |||||
} | |||||
@Override | |||||
public void setTimeStamp(String deviceID, String timeStamp) { | |||||
mDeviceRepository.setTimeStamp(deviceID, timeStamp); | |||||
} | |||||
@Override | |||||
public String getTimeStamp(String deviceID) { | |||||
return mDeviceRepository.getTimeStamp(deviceID); | |||||
} | |||||
@Override | |||||
public void setDeviceID(String deviceID, String newDeviceID) { | |||||
mDeviceRepository.setDeviceID(deviceID, newDeviceID); | |||||
} | |||||
@Override | |||||
public String getDeviceID(String deviceID) { | |||||
return mDeviceRepository.getDeviceID(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorStatus(String deviceID, boolean sensorStatus) { | |||||
mDeviceRepository.setSensorStatus(deviceID, sensorStatus); | |||||
} | |||||
@Override | |||||
public boolean getSensorStatus(String deviceID) { | |||||
return mDeviceRepository.getSensorStatus(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorType(String deviceID, String sensorType) { | |||||
mDeviceRepository.setSensorType(deviceID, sensorType); | |||||
} | |||||
@Override | |||||
public String getSensorType(String deviceID) { | |||||
return mDeviceRepository.getSensorType(deviceID); | |||||
} | |||||
@Override | |||||
public void setSensorMassage(String deviceID, float sensorMessage) { | |||||
mDeviceRepository.setSensorMassage(deviceID, sensorMessage); | |||||
} | |||||
@Override | |||||
public float getSensorMassage(String deviceID) { | |||||
return mDeviceRepository.getSensorMassage(deviceID); | |||||
} | |||||
@Override | |||||
public String getLocalDeviceUUID() { | |||||
return mDeviceRepository.getLocalDeviceUUID(); | |||||
} | |||||
@Override | |||||
public String getSystemTimeStamp() { | |||||
return mDeviceRepository.getSystemTimeStamp(); | |||||
} | |||||
@Override | |||||
public void startAlarmRecording() { | |||||
mAlarmRecorder.startRecording(); | |||||
} | |||||
@Override | |||||
public void stopAlarmRecording(Context context) { | |||||
mAlarmRecorder.stopRecording(context); | |||||
} | |||||
@Override | |||||
public void setAlarmRecordingPreviewHolder(SurfaceHolder previewHolder) { | |||||
mAlarmRecorder.setPreviewHolder(previewHolder); | |||||
} | |||||
} |
package com.example.greenwatch.viewmodels; | |||||
import android.content.Context; | |||||
import android.view.SurfaceHolder; | |||||
import androidx.lifecycle.LiveData; | |||||
import com.example.greenwatch.models.Device; | |||||
import java.util.List; | |||||
public interface ViewModelInterface { | |||||
void init(SurfaceHolder previewHolder); | |||||
LiveData<List<Device>> getConnectedDeviceList(); | |||||
LiveData<List<Device>> getAlarmHistoryList(); | |||||
LiveData<Boolean> getStartAlarmRecording(); | |||||
void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, float sensorMassage); | |||||
void setTimeStamp(String deviceID, String timeStamp); | |||||
String getTimeStamp(String deviceID); | |||||
void setDeviceID(String deviceID, String newDeviceID); | |||||
String getDeviceID(String deviceID); | |||||
void setSensorStatus(String deviceID, boolean sensorStatus); | |||||
boolean getSensorStatus(String deviceID); | |||||
void setSensorType(String deviceID, String sensorType); | |||||
String getSensorType(String deviceID); | |||||
void setSensorMassage(String deviceID, float sensorMessage); | |||||
float getSensorMassage(String deviceID); | |||||
String getLocalDeviceUUID(); | |||||
String getSystemTimeStamp(); | |||||
void startAlarmRecording(); | |||||
void stopAlarmRecording(Context context); | |||||
void setAlarmRecordingPreviewHolder(SurfaceHolder previewHolder); | |||||
} |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical" | |||||
android:padding="10dp" | |||||
tools:context=".AccelerometerActivity"> | |||||
<SurfaceView | |||||
android:id="@+id/surfaceViewAccelerometer" | |||||
android:layout_width="1dp" | |||||
android:layout_height="1dp" | |||||
android:visibility="visible"> | |||||
</SurfaceView> | |||||
<TextView | |||||
android:id="@+id/tvAccelerometerStatusmessage" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Accelerometer Activity"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvAccelerometerData" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text=""> | |||||
</TextView> | |||||
<Button | |||||
android:id="@+id/accelerometerBackToMainActivity" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text="Back to MainActivity"> | |||||
</Button> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/tvAccelerometerdeviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Registered Devices"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/deviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/device_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
<TextView | |||||
android:id="@+id/tvAccelerometeralarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Alarm History List"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/alarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/alarm_history_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
</LinearLayout> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical" | |||||
android:padding="10dp" | |||||
tools:context=".AudiodetectionActivity"> | |||||
<SurfaceView | |||||
android:id="@+id/surfaceViewAudio" | |||||
android:layout_width="1dp" | |||||
android:layout_height="1dp" | |||||
android:visibility="visible"> | |||||
</SurfaceView> | |||||
<TextView | |||||
android:id="@+id/tvAudiodetectionStatusmessage" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Audiodetection Activity"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvAudiodetectionData" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text=""> | |||||
</TextView> | |||||
<Button | |||||
android:id="@+id/audiodetectorBackToMainActivity" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text="Back to MainActivity"> | |||||
</Button> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/tvAudiodetectionDeviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Registered Devices"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/deviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/device_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
<TextView | |||||
android:id="@+id/tvAudiodetectionAlarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Alarm History List"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/alarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/alarm_history_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
</LinearLayout> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical" | |||||
android:padding="10dp" | |||||
tools:context=".AudiodetectionAndAccelerometerActivity"> | |||||
<SurfaceView | |||||
android:id="@+id/surfaceViewAudiodetectionAndAccelerometer" | |||||
android:layout_width="1dp" | |||||
android:layout_height="1dp" | |||||
android:visibility="visible"> | |||||
</SurfaceView> | |||||
<TextView | |||||
android:id="@+id/tvAudiodetectionAndAccelerometerStatusmessage" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Audiodetection+Accelerometer Activity"> | |||||
</TextView> | |||||
<Button | |||||
android:id="@+id/audiodetectionAndAccelerometerBackToMainActivity" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text="Back to MainActivity"> | |||||
</Button> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/tvAudiodetectionAndAccelerometerDeviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Registered Devices"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/deviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/device_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
<TextView | |||||
android:id="@+id/tvAudiodetectionAndAccelerometerAlarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Alarm History List"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/alarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/alarm_history_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
</LinearLayout> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
xmlns:tools="http://schemas.android.com/tools" | xmlns:tools="http://schemas.android.com/tools" | ||||
android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
android:layout_height="match_parent" | android:layout_height="match_parent" | ||||
android:orientation="vertical" | |||||
android:padding="5dp" | |||||
tools:context=".MainActivity"> | tools:context=".MainActivity"> | ||||
<TextView | <TextView | ||||
android:layout_width="wrap_content" | |||||
android:id="@+id/tvMainActivityDeviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="Hello World!" | |||||
app:layout_constraintBottom_toBottomOf="parent" | |||||
app:layout_constraintLeft_toLeftOf="parent" | |||||
app:layout_constraintRight_toRightOf="parent" | |||||
app:layout_constraintTop_toTopOf="parent" /> | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Registered Devices"> | |||||
</TextView> | |||||
</androidx.constraintlayout.widget.ConstraintLayout> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/deviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:layout_weight="3" | |||||
tools:listitem="@layout/device_item"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
<TextView | |||||
android:id="@+id/tvMainActivityAlarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Alarm History List"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/alarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:layout_weight="3" | |||||
tools:listitem="@layout/alarm_history_item"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
<SurfaceView | |||||
android:id="@+id/surfaceViewMainActivity" | |||||
android:layout_width="1dp" | |||||
android:layout_height="1dp"> | |||||
</SurfaceView> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical" | |||||
android:layout_weight="3"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="horizontal" | |||||
android:layout_weight="1"> | |||||
<Button | |||||
android:id="@+id/audiodetectionButton" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginEnd="2dp" | |||||
android:layout_gravity="center_vertical" | |||||
android:layout_weight="1" | |||||
android:text="Audiodetection"> | |||||
</Button> | |||||
<Button | |||||
android:id="@+id/videodetectionButton" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginStart="2dp" | |||||
android:layout_gravity="center_vertical" | |||||
android:layout_weight="1" | |||||
android:text="Videodetection"> | |||||
</Button> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="horizontal" | |||||
android:layout_weight="1"> | |||||
<Button | |||||
android:id="@+id/accelerometerButton" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_gravity="center_vertical" | |||||
android:layout_weight="1" | |||||
android:text="Accelerometer"> | |||||
</Button> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="horizontal" | |||||
android:layout_weight="1"> | |||||
<Button | |||||
android:id="@+id/audiodetectionAndAccelerometerButton" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginEnd="2dp" | |||||
android:layout_gravity="center_vertical" | |||||
android:layout_weight="1" | |||||
android:text="Audiodetection + Accelerometer"> | |||||
</Button> | |||||
<Button | |||||
android:id="@+id/videodetectionAndAccelerometerButton" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginStart="2dp" | |||||
android:layout_gravity="center_vertical" | |||||
android:layout_weight="1" | |||||
android:text="Videodetection + Accelerometer"> | |||||
</Button> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical" | |||||
android:padding="10dp" | |||||
tools:context=".VideodetectionActivity"> | |||||
<SurfaceView | |||||
android:id="@+id/surfaceViewVideodetection" | |||||
android:layout_width="1dp" | |||||
android:layout_height="1dp" | |||||
android:visibility="visible"> | |||||
</SurfaceView> | |||||
<TextView | |||||
android:id="@+id/tvVideodetectionStatusmessage" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Videodetection Activity"> | |||||
</TextView> | |||||
<Button | |||||
android:id="@+id/videodetectorBackToMainActivity" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text="Back to MainActivity"> | |||||
</Button> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/tvVideodetectionDeviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Registered Devices"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/deviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/device_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
<TextView | |||||
android:id="@+id/tvVideodetectionAlarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Alarm History List"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/alarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/alarm_history_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
</LinearLayout> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical" | |||||
android:padding="10dp" | |||||
tools:context=".VideodetectionAndAccelerometerActivity"> | |||||
<SurfaceView | |||||
android:id="@+id/surfaceViewVideodetectionAndAccelerometer" | |||||
android:layout_width="1dp" | |||||
android:layout_height="1dp" | |||||
android:visibility="visible"> | |||||
</SurfaceView> | |||||
<TextView | |||||
android:id="@+id/tvvideodetectionAndAccelerometerStatusmessage" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Videodetection+Accelerometer Activity"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvvideodetectionAndAccelerometerData" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text=""> | |||||
</TextView> | |||||
<Button | |||||
android:id="@+id/videodetectionAndAccelerometerBackToMainActivity" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:text="Back to MainActivity"> | |||||
</Button> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/tvVideodetectionAndAccelerometerDeviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Registered Devices"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/deviceListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/device_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
<TextView | |||||
android:id="@+id/tvVideodetectionAndAccelerometerAlarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:text="Alarm History List"> | |||||
</TextView> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/alarmHistoryListRecyclerView" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
tools:listitem="@layout/alarm_history_item" | |||||
android:layout_weight="1"> | |||||
</androidx.recyclerview.widget.RecyclerView> | |||||
</LinearLayout> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginEnd="8dp" | |||||
android:layout_marginStart="8dp" | |||||
android:layout_marginTop="8dp"> | |||||
<RelativeLayout | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:padding="8dp"> | |||||
<TextView | |||||
android:id="@+id/tvAlarmHistoryDeviceSensorType" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="@string/sensor_type_placeholder" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:maxLines="1" | |||||
android:layout_alignParentStart="true" | |||||
android:ellipsize="end"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvAlarmHistoryDeviceID" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@id/tvAlarmHistoryDeviceSensorType" | |||||
android:text="@string/deviceID_placeholder"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvAlarmHistoryDeviceTimeStamp" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@id/tvAlarmHistoryDeviceID" | |||||
android:text="@string/sensor_time_stamp_placeholder"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvAlarmHistoryDeviceSensorMassage" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@id/tvAlarmHistoryDeviceTimeStamp" | |||||
android:text="@string/sensor_message_placeholder"> | |||||
</TextView> | |||||
</RelativeLayout> | |||||
</androidx.cardview.widget.CardView> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginEnd="8dp" | |||||
android:layout_marginStart="8dp" | |||||
android:layout_marginTop="8dp"> | |||||
<RelativeLayout | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:padding="8dp"> | |||||
<TextView | |||||
android:id="@+id/tvDeviceSensorStatus" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_alignParentEnd="true" | |||||
android:text="@string/sensor_status_placeholder" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvDeviceSensorType" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="@string/sensor_type_placeholder" | |||||
android:textAppearance="@style/TextAppearance.AppCompat.Large" | |||||
android:maxLines="1" | |||||
android:layout_toStartOf="@id/tvDeviceSensorStatus" | |||||
android:layout_alignParentStart="true" | |||||
android:ellipsize="end"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvDeviceID" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@id/tvDeviceSensorType" | |||||
android:text="@string/deviceID_placeholder"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvDeviceTimeStamp" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@id/tvDeviceID" | |||||
android:text="@string/sensor_time_stamp_placeholder"> | |||||
</TextView> | |||||
<TextView | |||||
android:id="@+id/tvDeviceSensorMassage" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@id/tvDeviceTimeStamp" | |||||
android:text="@string/sensor_message_placeholder"> | |||||
</TextView> | |||||
</RelativeLayout> | |||||
</androidx.cardview.widget.CardView> |
<resources> | <resources> | ||||
<string name="app_name">GreenWatch</string> | <string name="app_name">GreenWatch</string> | ||||
<string name="sensor_type_placeholder">Sensortyp: %s</string> | |||||
<string name="sensor_status_placeholder">Sensorstatus: %s</string> | |||||
<string name="deviceID_placeholder">Sensor-ID: %s</string> | |||||
<string name="sensor_time_stamp_placeholder">Timestamp: %s</string> | |||||
<string name="sensor_message_placeholder">Sensormessage: %f</string> | |||||
</resources> | </resources> |