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(); } } } } }