package org.spin.gaitlib.gaitlogger;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
/**
* This class creates the SQLite database from the CSV files generated by GaitLogger on the
* smartphone. The files to be used for feature extractions, one "study" file and one or more
* "accel" files should be grouped in a single folder under the gaitlogger application data folder.<br>
* *
*
* @author LL; note: most of scanForFiles, createDumpFile, and extractFeatures were translated from
* Python and/or re-implemented and streamlined by LL
*/
public class FeatureExtractionActivity extends Activity {
public static final String SELECTED_DATA_FOLDER = "org.spin.gaitlib.gaitlogger.selecteddatafolder";
public static final String PARAM_WINDOW_SIZE = "org.spin.gaitlib.gaitlogger.windowsize";
public static final String PARAM_SAMPLING_INTERVAL = "org.spin.gaitlib.gaitlogger.samplinginterval";
public static final String PARAM_MIN_DATA_POINTS = "org.spin.gaitlib.gaitlogger.mindatapoints";
public static final String UPDATE_TYPE_ADDITION = "org.spin.gaitlib.gaitlogger.status.addition";
public static final String UPDATE_TYPE_REPLACEMENT = "org.spin.gaitlib.gaitlogger.status.replacement";
private Intent featureExtractionService;
private final FeatureExtractionServiceReceiver featureExtractionServiceReceiver = new FeatureExtractionServiceReceiver();
/**
* A list of status messages to be shown on the screen.
*/
private final ArrayList<String> progressDetails = new ArrayList<String>();
private ArrayAdapter<String> progressListAdapter;
private Button featureExtractionButton;
/**
* The name of the folder selected by user.
*/
private String dataFolderName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feature_extraction);
setUpFolerSelectionSpinner();
featureExtractionButton = (Button) findViewById(R.id.btnPerformFeatureExtraction);
setUpLaunchFeatureExtractButton();
ListView progressListView = (ListView) findViewById(R.id.progressDetails);
progressListAdapter = new ArrayAdapter<String>(FeatureExtractionActivity.this,
android.R.layout.simple_list_item_1, progressDetails);
progressListView.setAdapter(progressListAdapter);
}
/**
* Populate drop down list with the names of all the gaitlogger folders (i.e. the folders that
* contain CSV files).
*/
private void setUpFolerSelectionSpinner() {
FilenameFilter dataFolderFiler = new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return filename.startsWith(FileManagerUtil.DATA_FOLDER_PREFIX);
}
};
String[] dataFolderNames = FileManagerUtil.getDataFoldersParentDirectory().list(
dataFolderFiler);
Spinner spinner = (Spinner) findViewById(R.id.spinnerFolders);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, dataFolderNames);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
dataFolderName = (String) parent.getItemAtPosition(pos);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void setUpLaunchFeatureExtractButton() {
featureExtractionButton.setText(R.string.LaunchFeatureExtractionText);
featureExtractionButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
progressDetails.clear();
if (dataFolderName == null) {
progressDetails.add("No Data.");
return;
}
featureExtractionService = new Intent(FeatureExtractionActivity.this,
FeatureExtractionService.class);
featureExtractionService.putExtra(SELECTED_DATA_FOLDER, dataFolderName);
featureExtractionService.putExtra(PARAM_WINDOW_SIZE, 2000);
featureExtractionService.putExtra(PARAM_SAMPLING_INTERVAL, 1000);
featureExtractionService.putExtra(PARAM_MIN_DATA_POINTS, 30);
startService(featureExtractionService);
setUpCancelFeatureExtractionButton();
}
});
}
private void setUpCancelFeatureExtractionButton() {
featureExtractionButton.setText(R.string.CancelFeatureExtractionText);
featureExtractionButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopService(featureExtractionService);
setUpLaunchFeatureExtractButton();
}
});
}
@Override
protected void onResume() {
registerReceiver(featureExtractionServiceReceiver, new IntentFilter(
FeatureExtractionService.STATUS_UPDATE));
super.onResume();
}
@Override
protected void onPause() {
unregisterReceiver(featureExtractionServiceReceiver);
super.onPause();
}
@Override
protected void onDestroy() {
unregisterReceiver(featureExtractionServiceReceiver);
stopService(featureExtractionService);
super.onDestroy();
}
public class FeatureExtractionServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action == null) {
return;
}
if (FeatureExtractionService.STATUS_UPDATE.equals(action)) {
String statusMessage = intent
.getStringExtra(FeatureExtractionService.STATUS_MESSAGE);
String updateType = intent
.getStringExtra(FeatureExtractionService.STATUS_UPDATE_TYPE);
if (UPDATE_TYPE_REPLACEMENT.equals(updateType)) {
progressDetails.set(progressDetails.size() - 1, statusMessage);
} else {
progressDetails.add(statusMessage);
}
progressListAdapter.notifyDataSetChanged();
if (getString(R.string.ServiceStoppedText).equals(statusMessage)){
setUpLaunchFeatureExtractButton();
}
}
}
}
}