diff --git a/Aikuma/AndroidManifest.xml b/Aikuma/AndroidManifest.xml
index 1a66e4b0f74ded731ffd43ca4075906ede33ea0b..e78099314a652bbfbf9591b201b552ea2f25b8ef 100644
--- a/Aikuma/AndroidManifest.xml
+++ b/Aikuma/AndroidManifest.xml
@@ -3,7 +3,7 @@
package="org.lp20.aikuma2"
android:versionCode="010005"
android:versionName="0.8.4">
-
+
@@ -197,6 +197,8 @@
+
+
+
+
+
+
+
+
diff --git a/Aikuma/res/layout-xlarge/elicitation_image.xml b/Aikuma/res/layout-xlarge/elicitation_image.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5a6335953cb50ba24d4d764cff4fd41c3445e863
--- /dev/null
+++ b/Aikuma/res/layout-xlarge/elicitation_image.xml
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Aikuma/res/layout/elicitation_image.xml b/Aikuma/res/layout/elicitation_image.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5a6335953cb50ba24d4d764cff4fd41c3445e863
--- /dev/null
+++ b/Aikuma/res/layout/elicitation_image.xml
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Aikuma/res/values/strings.xml b/Aikuma/res/values/strings.xml
index 7fd11b6861aad6effaf1e2b63320bbdc22ea46d0..f0a44b939bc055967980cb928b2cff376f4056b3 100644
--- a/Aikuma/res/values/strings.xml
+++ b/Aikuma/res/values/strings.xml
@@ -138,4 +138,5 @@
currentLine
duration
translation
+ selectedFileType
diff --git a/Aikuma/src/org/lp20/aikuma/ui/ElicitationMode.java b/Aikuma/src/org/lp20/aikuma/ui/ElicitationMode.java
index 70c4787ccde5cc8e4542559d744d7c1cbab9348e..b34d1955615e67b0b0533011cc08041fb13f83a5 100644
--- a/Aikuma/src/org/lp20/aikuma/ui/ElicitationMode.java
+++ b/Aikuma/src/org/lp20/aikuma/ui/ElicitationMode.java
@@ -1,6 +1,7 @@
package org.lp20.aikuma.ui;
import java.io.File;
+import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
@@ -27,8 +28,11 @@ import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
+import android.widget.AdapterView;
import android.widget.Button;
+import android.widget.ListView;
import android.widget.Toast;
+import android.widget.AdapterView.OnItemClickListener;
public class ElicitationMode extends AikumaActivity{
@@ -41,6 +45,16 @@ public class ElicitationMode extends AikumaActivity{
private String fileType;
private String title;
+ public static final int TEXT_MODE = 0;
+ public static final int IMAGE_MODE = 1;
+ public static final int VIDEO_MODE = 2;
+
+ /**
+ * used to know if the user press text, image or video button
+ * this field contains 0 (text), 1 (image) or 2(video)
+ */
+ private int selectedFileType;
+
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -51,6 +65,7 @@ public class ElicitationMode extends AikumaActivity{
public void onImportClick(View _view) {
switch (_view.getId()) {
case R.id.button_byText:
+ selectedFileType = TEXT_MODE;
Log.i(TAG, "Import text; view id: " + _view.getId());
mPath = Environment.getExternalStorageDirectory();
fileType = ".txt";
@@ -58,14 +73,15 @@ public class ElicitationMode extends AikumaActivity{
importContent();
break;
case R.id.button_byImage:
+ selectedFileType = IMAGE_MODE;
Log.i(TAG, "Import image; view id: " + _view.getId());
mPath = Environment.getExternalStorageDirectory();
fileType = ".jpg";
title = "Import image file";
- Toast.makeText(this, "This feature is not yet available...", Toast.LENGTH_LONG).show();
-// importContent();
+ importContent();
break;
case R.id.button_byVideo:
+ selectedFileType = VIDEO_MODE;
Log.i(TAG, "Import video; view id: " + _view.getId());
mPath = Environment.getExternalStorageDirectory();
fileType = ".avi";
@@ -98,7 +114,16 @@ public class ElicitationMode extends AikumaActivity{
return filename.contains(fileType) || sel.isDirectory();
}
};
- mFileList = mPath.list(filter);
+ if (selectedFileType == ElicitationMode.TEXT_MODE)
+ mFileList = mPath.list(filter);
+ else {
+ mFileList = mPath.list(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String filename) {
+ return new File(dir, filename).isDirectory();
+ }
+ });
+ }
}
else {
mFileList= new String[0];
@@ -120,50 +145,94 @@ public class ElicitationMode extends AikumaActivity{
* Copied from RespeakingSelection.java
*/
public class FilebrowserDialogFragment extends DialogFragment {
+ ListView listElement;
+
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- Dialog dialog = null;
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-
- builder.setTitle(title);
- if(mFileList == null) {
- Log.e(TAG, "import file - Showing file picker before loading the file list");
- dialog = builder.create();
- return dialog;
- }
- builder.setItems(mFileList, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- mChosenFile = mFileList[which];
+ View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_select_file_frag, null);
+ listElement = (ListView) view.findViewById(R.id.listItemFile);
+ ListFolderAdapter adapter = new ListFolderAdapter(getActivity(), mFileList, mPath, selectedFileType);
+ listElement.setAdapter(adapter);;
+
+ listElement.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ dismiss();
+ mChosenFile = mFileList[position];
Log.i(TAG, "mChosenFile: " + mChosenFile);
mPath = new File(mPath, mChosenFile);
if (mPath.isDirectory()) {
- loadFileList(mPath, fileType);
- showAudioFilebrowserDialog();
- } else {
- if (fileType==".txt") {
- Toast.makeText(ElicitationMode.this, "Selected text: " + mPath, Toast.LENGTH_LONG).show();
+ if (!isSelectionnable(mPath)) {
+ Log.d("mPath", mPath.getAbsolutePath() + " is not selectionnable");
+ loadFileList(mPath, fileType);
+ showAudioFilebrowserDialog();
+ } else {
+ Log.d("mPath", mPath.getAbsolutePath() + " is selectionnable");
+ actionSelectedFile();
}
+ } else {
if (fileType==".jpg") {
- Toast.makeText(ElicitationMode.this, "Selected image: " + mPath, Toast.LENGTH_LONG).show();
+ Toast.makeText(ElicitationMode.this, "Selected folder: " + mPath, Toast.LENGTH_LONG).show();
}
if (fileType==".avi") {
Toast.makeText(ElicitationMode.this, "Selected video: " + mPath, Toast.LENGTH_LONG).show();
}
-
- Intent intent = new Intent(getActivity(), RecordingMetadataLig.class);
- intent.putExtra(importFileName, mPath.getAbsolutePath());
- Log.i(TAG, "selected file: " + mPath.getAbsolutePath());
- intent.putExtra(ELICITATION, true);
- startActivity(intent);
-
+ actionSelectedFile();
}
}
});
- dialog = builder.show();
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle(title);
+ Dialog dialog = new Dialog(getActivity());
+
+ if(mFileList == null) {
+ Toast.makeText(getActivity(), "No files to display", Toast.LENGTH_SHORT).show();
+ Log.e(TAG, "import file - Showing file picker before loading the file list");
+ dialog = builder.create();
+ return dialog;
+ }
+
+ dialog.setContentView(view);
+ dialog.show();
return dialog;
}
}
+
+ /**
+ * Function called when we need to know if an entity is queryable
+ * @param f the selected file (the entity)
+ * @return true if the file is queryable, false if not.
+ */
+ private boolean isSelectionnable(File f) {
+ int i = 0;
+ File[] files = f.listFiles();
+ switch (selectedFileType) {
+ case 1:
+ while( i < files.length && files[i].isFile() && (files[i].getAbsolutePath().contains(".jpg") || files[i].getAbsolutePath().contains("jpeg"))) {
+ i++;
+ }
+ return files.length == i && i>0;
+ case 2:
+ while(files[i].isFile() && files[i].getAbsolutePath().contains(".mp4")) {
+ i++;
+ }
+ return files.length == i;
+ default :
+ return false;
+ }
+ }
+
+ private void actionSelectedFile() {
+ Intent intent = new Intent(this, RecordingMetadataLig.class);
+ intent.putExtra(importFileName, mPath.getAbsolutePath());
+ Log.i(TAG, "selected file: " + mPath.getAbsolutePath());
+ intent.putExtra(ELICITATION, true);
+ intent.putExtra(getString(R.string.selectedFileType), selectedFileType);
+ startActivity(intent);
+ }
+
public void onBackPressed(View v) {
this.finish();
}
diff --git a/Aikuma/src/org/lp20/aikuma/ui/ListFolderAdapter.java b/Aikuma/src/org/lp20/aikuma/ui/ListFolderAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..6acf69f7a87e5634a12867f8d8adb2a7d60f21e9
--- /dev/null
+++ b/Aikuma/src/org/lp20/aikuma/ui/ListFolderAdapter.java
@@ -0,0 +1,112 @@
+package org.lp20.aikuma.ui;
+
+import java.io.File;
+
+import org.lp20.aikuma2.R;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.AsyncTask;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+public class ListFolderAdapter extends ArrayAdapter {
+ private LayoutInflater layoutInflater;
+ private File parentFile;
+ private int mode;
+
+ static class ViewFolderHolder {
+ public TextView textFolderName;
+ public ImageView imageType;
+ public ImageView imageTypeOfFolder;
+ }
+
+ public ListFolderAdapter(Context context, String[] files, File parentFile, int mode) {
+ super(context, R.layout.content_dialog_selected_folder_frag, files);
+ this.layoutInflater = LayoutInflater.from(context);
+ this.parentFile = parentFile;
+ this.mode = mode;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewFolderHolder holder;
+ View rowView = convertView;
+
+ if (rowView == null) {
+ rowView = this.layoutInflater.inflate(R.layout.content_dialog_selected_folder_frag, null);
+ holder = new ViewFolderHolder();
+ holder.textFolderName = (TextView) rowView.findViewById(R.id.textFolderName);
+ holder.imageType = (ImageView) rowView.findViewById(R.id.image_file_type);
+ holder.imageTypeOfFolder = (ImageView) rowView.findViewById(R.id.image_folder_type);
+ rowView.setTag(holder);
+ } else {
+ holder = (ViewFolderHolder) rowView.getTag();
+ }
+
+ String fileName = (String) getItem(position);
+ File file = new File(parentFile.getAbsolutePath()+"/"+fileName);
+ holder.textFolderName.setText(fileName);
+ RelativeLayout relativeListFile = (RelativeLayout) rowView.findViewById(R.id.layoutListView);
+ holder.imageType.setVisibility(ImageView.INVISIBLE);
+
+ if (!file.isDirectory()) {
+ holder.imageType.setImageResource(R.drawable.file_icon);
+ holder.imageType.setVisibility(ImageView.VISIBLE);
+ holder.imageTypeOfFolder.setVisibility(ImageView.INVISIBLE);
+ } else {
+ relativeListFile.setBackgroundColor(Color.TRANSPARENT);
+ holder.imageType.setImageResource(R.drawable.folder_close_icon);
+ holder.imageType.setVisibility(ImageView.VISIBLE);
+ ListFolderTask task = new ListFolderTask();
+ task.setHolder(holder);
+ task.setMode(this.mode);
+ task.execute(file);
+ }
+ return rowView;
+ }
+
+ private class ListFolderTask extends AsyncTask {
+ ViewFolderHolder holder;
+ int mode;
+ protected void setHolder (ViewFolderHolder viewHolder) {
+ holder = viewHolder;
+ }
+
+ protected void setMode(int mode) {
+ this.mode = mode;
+ }
+ @Override
+ protected File[] doInBackground(File... f) {
+ return f[0].listFiles();
+ }
+
+ @Override
+ protected void onPostExecute(File[] files) {
+ int i = 0;
+
+ switch (this.mode) {
+ case 1:
+ while(i < files.length && (files[i].isFile() && (files[i].getAbsolutePath().contains(".jpg") || files[i].getAbsolutePath().contains(".jpeg")))) {
+ i++;
+ }
+ if (i == files.length && i>0)
+ holder.imageTypeOfFolder.setVisibility(ImageView.VISIBLE);
+ else
+ holder.imageTypeOfFolder.setVisibility(ImageView.INVISIBLE);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+}
+
+
diff --git a/Aikuma/src/org/lp20/aikuma/ui/RecordElicitation.java b/Aikuma/src/org/lp20/aikuma/ui/RecordElicitation.java
index a9d03216af017b52137e75d502db44ebbabad1b6..ad791393bce19c88f65b1de1ab152174d48f8838 100644
--- a/Aikuma/src/org/lp20/aikuma/ui/RecordElicitation.java
+++ b/Aikuma/src/org/lp20/aikuma/ui/RecordElicitation.java
@@ -9,6 +9,8 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.lang.ref.WeakReference;
+import java.security.spec.EllipticCurve;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -32,85 +34,94 @@ import org.lp20.aikuma.util.AikumaSettings;
import org.lp20.aikuma.util.FileIO;
import org.lp20.aikuma2.R;
-import android.app.Activity;
import android.app.AlertDialog;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
-import android.view.ViewDebug.FlagToString;
import android.widget.ImageButton;
+import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
public class RecordElicitation extends AikumaActivity {
-
public static final String TAG = "RecordElicitation";
private UUID recordUUID;
private Recorder recorder;
protected long sampleRate = 16000l;
private boolean recording = false;
private BufferedReader reader;
- private int phraseId = 0;
- private String eliciTextFile;
+ private int entityId = 0;
+ private String ptrSelectedReference;
private ListenFragment fragment;
-
+ private File[] images;
private Boolean isNewSession = true;
private Date date;
private SharedPreferences prefsUserSession;
private String strFolderDate;
private RecordingLig recordingLig;
+
+ private int choiceMode;
/**
* the progress bar used to display the user's progression.
*/
private InterleavedSeekBar progressBar;
- private int numberOfLines;
+ private int numberOfEntities;
private Language recordLang;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.elicitation);
+
recordUUID = UUID.randomUUID();
- ImageButton nextButton = (ImageButton) findViewById(R.id.btn_next);
- nextButton.setEnabled(false);
// retrieving metadata
prefsUserSession = getSharedPreferences(getString(R.string.userSession), MODE_PRIVATE);
initSession();
- initProgressBars();
-
+ switch (choiceMode) {
+ case ElicitationMode.TEXT_MODE:
+ setContentView(R.layout.elicitation);
+ break;
+ case ElicitationMode.IMAGE_MODE:
+ setContentView(R.layout.elicitation_image);
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ break;
+ default:
+ setContentView(R.layout.elicitation);
+ break;
+ }
+
+
+ ImageButton nextButton = (ImageButton) findViewById(R.id.btn_next);
+ nextButton.setEnabled(false);
+ setProgressBarsAtNotTouchableState();
try {
-
-// String phrase = reader.readLine();
- // test on the lines read:
- // check that the file is not empty by ensuring that the phrase is not null (end of file reached)
- // check that the sentence is correctly formatted (no empty line and '##' delimited found)
- String phrase;
- while ((phrase = reader.readLine()) != null && (phrase.isEmpty() || phrase.split("##").length <= 1)) { continue; }
- if (phrase == null) { throw new IOException("Empty text file"); }
- numberOfLines = countNumberOfLines();
- TextView tv = (TextView) findViewById(R.id.elicit_phrase_number);
- tv.setText("" + phraseId);
-
- TextView tv_total = (TextView) findViewById(R.id.elicit_total_number);
- tv_total.setText(" / " + numberOfLines);
-
-// progressBar.setProgress((int) ((float)phraseId/(float)numberOfLines * 100));
-
- String[] phrasePair = phrase.split("##");
- TextView tvFrPhrase = (TextView) findViewById(R.id.tv_elicit_phrase);
- tvFrPhrase.setText(phrasePair[0]);
- tvFrPhrase = (TextView) findViewById(R.id.tv_orig_phrase);
- tvFrPhrase.setText(phrasePair[1]);
- TextView tv2 = (TextView) findViewById(R.id.phrase_x);
- tv2.setText("Phrase" + phraseId);
+ switch (choiceMode) {
+ case ElicitationMode.TEXT_MODE:
+ initProgressText();
+ loadTextViews();
+ break;
+ case ElicitationMode.IMAGE_MODE:
+ initProgressText();
+ loadImage();
+ break;
+ default:
+ initProgressText();
+ loadTextViews();
+ break;
+ }
+ updateProgressBar();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
Log.e(TAG,"text file could not be found: " + e1);
@@ -125,6 +136,68 @@ public class RecordElicitation extends AikumaActivity {
fragment = (ListenFragment) getFragmentManager().findFragmentById(R.id.phrase_player);
}
+ private void updateProgressBar() {
+ progressBar.setProgress((int) (((float)entityId)/(float)numberOfEntities * 100));
+ }
+
+ private void initProgressText() throws IOException {
+ numberOfEntities = countNumberOfEntities();
+ TextView tv = (TextView) findViewById(R.id.elicit_phrase_number);
+ tv.setText("" + entityId);
+
+ TextView tv_total = (TextView) findViewById(R.id.elicit_total_number);
+ tv_total.setText(" / " + numberOfEntities);
+ }
+
+ private void loadTextViews() throws IOException {
+ String phrase;
+ while ((phrase = reader.readLine()) != null && (phrase.isEmpty() || phrase.split("##").length <= 1)) { continue; }
+ if (phrase == null) { throw new IOException("Empty text file"); }
+
+ String[] phrasePair = phrase.split("##");
+ TextView tvFrPhrase = (TextView) findViewById(R.id.tv_elicit_phrase);
+ tvFrPhrase.setText(phrasePair[0]);
+ tvFrPhrase = (TextView) findViewById(R.id.tv_orig_phrase);
+ tvFrPhrase.setText(phrasePair[1]);
+ TextView tv2 = (TextView) findViewById(R.id.phrase_x);
+ tv2.setText("Phrase" + entityId);
+ }
+
+ private void loadImage() {
+ if (entityId >= numberOfEntities){
+ Toast.makeText(this, "No more images to display", Toast.LENGTH_LONG).show();
+ this.finish();
+ } else {
+ ImageView selected_photo = (ImageView) findViewById(R.id.img_orig);
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inPreferredConfig = Bitmap.Config.ARGB_8888;
+ //Bitmap bitmap = BitmapFactory.decodeFile(images[entityId].getAbsolutePath(), options);
+ //Bitmap bitmap = decodeSampledBitmapFromResource(images[entityId], 800, 450);
+ //int nh = (int) ( bitmap.getHeight() * (512.0 / bitmap.getWidth()) );
+ //Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 512, nh, true);
+ BitmapWorkerTask task = new BitmapWorkerTask(selected_photo);
+ task.execute(images[entityId]);
+
+ //selected_photo.setImageBitmap(scaled);
+ }
+ }
+
+ public static Bitmap decodeSampledBitmapFromResource(File file,
+ int reqWidth, int reqHeight) {
+
+ // First decode with inJustDecodeBounds=true to check dimensions
+ final BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeFile(file.getAbsolutePath(), options);
+
+ // Calculate inSampleSize
+ options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
+
+ // Decode bitmap with inSampleSize set
+ options.inJustDecodeBounds = false;
+ return BitmapFactory.decodeFile(file.getAbsolutePath(), options);
+ }
+
@SuppressWarnings("unchecked")
private void initSession() {
@@ -141,25 +214,46 @@ public class RecordElicitation extends AikumaActivity {
SharedPreferences.Editor ed = prefsUserSession.edit();
- eliciTextFile = prefsUserSession.getString(getString(R.string.sessionInputFile), "");
- phraseId = prefsUserSession.getInt(getString(R.string.currentLine), 0);
+ ptrSelectedReference = prefsUserSession.getString(getString(R.string.sessionInputFile), "");
+ entityId = prefsUserSession.getInt(getString(R.string.currentLine), 0);
+ choiceMode = prefsUserSession.getInt(getString(R.string.selectedFileType), ElicitationMode.TEXT_MODE);
+
ed.clear();
ed.commit();
try {
- reader = new BufferedReader(new InputStreamReader(new FileInputStream(eliciTextFile)));
+ reader = new BufferedReader(new InputStreamReader(new FileInputStream(ptrSelectedReference)));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
-
- goToPreviousState();
+
+ if (choiceMode == ElicitationMode.IMAGE_MODE) {
+ File f = new File(ptrSelectedReference);
+ images = f.listFiles();
+ }
+
+ try {
+ numberOfEntities = countNumberOfEntities();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ if (choiceMode == ElicitationMode.TEXT_MODE)
+ goToPreviousState();
+
isNewSession = false;
} else {
- eliciTextFile = getIntent().getStringExtra(ElicitationMode.importFileName);
- Log.i(TAG, "Selected file: " + eliciTextFile);
-
+ ptrSelectedReference = getIntent().getStringExtra(ElicitationMode.importFileName);
+ Log.i(TAG, "Selected file: " + ptrSelectedReference);
+ choiceMode = getIntent().getIntExtra(getString(R.string.selectedFileType), 0);
+ if (choiceMode == ElicitationMode.IMAGE_MODE) {
+ File f = new File(ptrSelectedReference);
+ images = f.listFiles();
+ }
+
try {
- reader = new BufferedReader(new InputStreamReader(new FileInputStream(eliciTextFile)));
+ reader = new BufferedReader(new InputStreamReader(new FileInputStream(ptrSelectedReference)));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
@@ -173,26 +267,30 @@ public class RecordElicitation extends AikumaActivity {
} catch (ParseException e1) {
date = new Date();
}
+
strFolderDate = new SimpleDateFormat("yyMMdd-HHmmss").format(date);
}
}
/**
- * Called to going to the previous state (phraseID and others graphical attributes
+ * Called to going to the previous state (phraseID and others graphical attributes)
*/
private void goToPreviousState() {
- String phrase;
- int i = 0;
- while (i 0) {
+ if (entityId > 0) {
File metadataFile = new File(FileIO.getOwnerPath().getAbsolutePath() + "/"+ "recordings" + "/" +this.strFolderDate + "_"+recordLang.getCode()+"_"+Aikuma.getDeviceId(),
- this.strFolderDate + "_" + recordLang.getCode() + "_" + Aikuma.getDeviceId() + "_" + (phraseId-1) + RecordingLig.METADATA_SUFFIX);
+ this.strFolderDate + "_" + recordLang.getCode() + "_" + Aikuma.getDeviceId() + "_" + (entityId-1) + RecordingLig.METADATA_SUFFIX);
Log.d("metadataFile : ", "metadataFile : " + metadataFile.getAbsolutePath());
try {
recordingLig = RecordingLig.read(metadataFile);
@@ -326,6 +437,8 @@ public class RecordElicitation extends AikumaActivity {
ArrayList speakerIds = new ArrayList();
Double latitude = MainActivity.locationDetector.getLatitude();
Double longitude = MainActivity.locationDetector.getLongitude();
+ String suffix = new File(ptrSelectedReference).getName().replace(".txt", "").length() >= 10 ? new File(ptrSelectedReference).getName().substring(0, 10)
+ : new File(ptrSelectedReference).getName().replace(".txt", "");
String idDevice = Aikuma.getDeviceId();
String name = strFolderDate + "_" +
MetadataSession.getMetadataSession().getRecordLanguage().getCode()
@@ -342,18 +455,15 @@ public class RecordElicitation extends AikumaActivity {
recordingLig = new RecordingLig(recordUUID, name, date,
AikumaSettings.getLatestVersion(),
- AikumaSettings.getCurrentUserId(), recordLang, MetadataSession.getMetadataSession().getMotherTongue(),
+ AikumaSettings.getCurrentUserId(), MetadataSession.getMetadataSession().getRecordLanguage(),
+ MetadataSession.getMetadataSession().getMotherTongue(),
MetadataSession.getMetadataSession().getExtraLanguages(), speakerIds, deviceName, androidID,
null, null, sampleRate, duration,
recorder.getFormat(), recorder.getNumChannels(),
recorder.getBitsPerSample(), latitude, longitude,
- MetadataSession.getMetadataSession().getRegionOrigin(),
- MetadataSession.getMetadataSession().getSpeakerName(),
+ MetadataSession.getMetadataSession().getRegionOrigin(), MetadataSession.getMetadataSession().getSpeakerName(),
MetadataSession.getMetadataSession().getSpeakerAge(), gender);
-
- Log.d("passage", "setRecordingLig first session");
} else{
- Log.d("passage", "setRecordingLig restore session");
restoreMetaDataFromJson();
}
}
@@ -372,22 +482,22 @@ public class RecordElicitation extends AikumaActivity {
}
setRecordingLig();
-
+
if (recorder != null && recorder.getFile().getPayloadSize() == 0) {
Log.d("recorder1", "recorder <= 50");
return false;
}
-
+
try {
// Move the wave file from the nosync directory to
// the synced directory and write the metadata
recordingLig.write();
String filename = recordingLig.getFile().getAbsolutePath();
FileUtils.copyFile(recordingLig.getFile(),
- new File(filename.replace(".wav", "_" + phraseId + ".wav")));
+ new File(filename.replace(".wav", "_" + entityId + ".wav")));
FileIO.delete(new File(filename));
FileUtils.copyFile(new File(filename.replace(".wav", "-metadata.json")),
- new File(filename.replace(".wav", "_" + phraseId + "-metadata.json")));
+ new File(filename.replace(".wav", "_" + entityId + "-metadata.json")));
FileIO.delete(new File(filename.replace(".wav", "-metadata.json")));
recorder.release();
recorder = null;
@@ -464,14 +574,19 @@ public class RecordElicitation extends AikumaActivity {
* @return the number of lines in good format in a txt file.
* @throws IOException if the file cannot be read
*/
- public int countNumberOfLines() throws IOException {
+ public int countNumberOfEntities() throws IOException {
int nbLine = 0;
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(eliciTextFile)));
- String phrase;
- while ((phrase = bufferedReader.readLine()) != null) {
- if (!phrase.isEmpty() && phrase.split("##").length > 1)
- nbLine++;
- }
+ if (choiceMode == ElicitationMode.TEXT_MODE) {
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(ptrSelectedReference)));
+ String phrase;
+ while ((phrase = bufferedReader.readLine()) != null) {
+ if (!phrase.isEmpty() && phrase.split("##").length > 1)
+ nbLine++;
+ }
+ } else if (choiceMode == ElicitationMode.IMAGE_MODE) {
+ File f = new File(ptrSelectedReference);
+ return f.listFiles().length;
+ }
return nbLine;
}
@@ -488,10 +603,22 @@ public class RecordElicitation extends AikumaActivity {
ed.putString(getString(R.string.language_name), recordLang.getName());
ed.putString(getString(R.string.languageCode), recordLang.getCode());
ed.putString(getString(R.string.sessionDate), strFolderDate);
- ed.putInt(getString(R.string.currentLine), phraseId);
- ed.putString(getString(R.string.sessionInputFile), eliciTextFile);
- ed.putString(getString(R.string.sessionProgress), phraseId + " / " + numberOfLines);
- ed.putString(getString(R.string.session_submode), "Text");
+ ed.putInt(getString(R.string.currentLine), entityId);
+ ed.putString(getString(R.string.sessionInputFile), ptrSelectedReference);
+ ed.putString(getString(R.string.sessionProgress), entityId + " / " + numberOfEntities);
+ ed.putInt(getString(R.string.selectedFileType), choiceMode);
+ switch (choiceMode) {
+ case ElicitationMode.IMAGE_MODE:
+ ed.putString(getString(R.string.session_submode), "image");
+ break;
+ case ElicitationMode.TEXT_MODE:
+ ed.putString(getString(R.string.session_submode), "text");
+ break;
+
+ default:
+ ed.putString(getString(R.string.session_submode), "text");
+ break;
+ }
ed.commit();
}
@@ -508,7 +635,7 @@ public class RecordElicitation extends AikumaActivity {
@Override
public void onClick(DialogInterface dialog,
int which) {
- if (phraseId reqHeight || width > reqWidth) {
+
+ final int halfHeight = height / 2;
+ final int halfWidth = width / 2;
+
+ // Calculate the largest inSampleSize value that is a power of 2 and keeps both
+ // height and width larger than the requested height and width.
+ while ((halfHeight / inSampleSize) > reqHeight
+ && (halfWidth / inSampleSize) > reqWidth) {
+ inSampleSize *= 2;
+ }
+ }
+
+ return inSampleSize;
+ }
+}
+
+class BitmapWorkerTask extends AsyncTask {
+ private final WeakReference imageViewReference;
+
+ public BitmapWorkerTask(ImageView imageView) {
+ // Use a WeakReference to ensure the ImageView can be garbage collected
+ imageViewReference = new WeakReference(imageView);
+ }
+
+ // Decode image in background.
+ @Override
+ protected Bitmap doInBackground(File... params) {
+ return RecordElicitation.decodeSampledBitmapFromResource(params[0], 800, 450);
+ }
+
+ // Once complete, see if ImageView is still around and set bitmap.
+ @Override
+ protected void onPostExecute(Bitmap bitmap) {
+ if (imageViewReference != null && bitmap != null) {
+ final ImageView imageView = imageViewReference.get();
+ if (imageView != null) {
+ imageView.setImageBitmap(bitmap);
+ }
+ }
+ }
}
diff --git a/Aikuma/src/org/lp20/aikuma/ui/RecordingMetadataLig.java b/Aikuma/src/org/lp20/aikuma/ui/RecordingMetadataLig.java
index cac87f788ef48fded49179fb998fffe58bfffaef..b9ba0fd1186d159ed33f1218c67a41c6720bdd0d 100644
--- a/Aikuma/src/org/lp20/aikuma/ui/RecordingMetadataLig.java
+++ b/Aikuma/src/org/lp20/aikuma/ui/RecordingMetadataLig.java
@@ -508,6 +508,8 @@ public class RecordingMetadataLig extends AikumaActivity implements OnClickListe
startActivity(intent);
} else if (!respeak && elicitation) {
intent = new Intent(RecordingMetadataLig.this, RecordElicitation.class);
+ int choiceMode = getIntent().getIntExtra(getString(R.string.selectedFileType), 0);
+
Bundle metadataBundle = new Bundle();
metadataBundle.putParcelable(metaRecordLang, recordLang);
metadataBundle.putParcelable(metaMotherTong, motherTongue);
@@ -518,6 +520,7 @@ public class RecordingMetadataLig extends AikumaActivity implements OnClickListe
metadataBundle.putInt(metaSpkrGender, speakerGender);
metadataBundle.putString(RecordingMetadataLig.metaDate, metaDate);
intent.putExtra(metaBundle, metadataBundle);
+ intent.putExtra(getString(R.string.selectedFileType), choiceMode);
intent.putExtra(ElicitationMode.importFileName, getIntent().getStringExtra(ElicitationMode.importFileName));
Log.i(TAG, "Selected file: " + getIntent().getStringExtra(ElicitationMode.importFileName));
startActivity(intent);
diff --git a/Aikuma/src/org/lp20/aikuma/ui/RespeakingSelection.java b/Aikuma/src/org/lp20/aikuma/ui/RespeakingSelection.java
index 91ce640e3514e5103b9823ccd32feb1ad5b03b36..0bbb4b1efef20975c96a77535251e49c91a11eed 100644
--- a/Aikuma/src/org/lp20/aikuma/ui/RespeakingSelection.java
+++ b/Aikuma/src/org/lp20/aikuma/ui/RespeakingSelection.java
@@ -151,7 +151,6 @@ public class RespeakingSelection extends AikumaActivity {
Dialog dialog = new Dialog(getActivity());
dialog.setTitle("Import audio file");
if (mFileList == null) {
- Log.d("passage", "mFileList==null");
dialog = builder.create();
return dialog;
}