Commit 6c47e90f authored by Josejulio Martínez Magaña's avatar Josejulio Martínez Magaña

Merge remote-tracking branch 'origin/develop' into take-picture-refactoring

# Conflicts:
#	app/src/main/java/com/aluxoft/earrecognition/intents/IntentTransferingFeatures.java
parents 6dd8bdcc 0f35f231
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
android { android {
compileSdkVersion 21 compileSdkVersion 21
...@@ -21,6 +31,7 @@ android { ...@@ -21,6 +31,7 @@ android {
repositories { repositories {
mavenCentral() mavenCentral()
maven { url 'https://maven.fabric.io/public' }
} }
dependencies { dependencies {
...@@ -29,4 +40,8 @@ dependencies { ...@@ -29,4 +40,8 @@ dependencies {
compile project(':openCVLibrary2411') compile project(':openCVLibrary2411')
compile 'com.parse.bolts:bolts-android:1.2.1' compile 'com.parse.bolts:bolts-android:1.2.1'
compile 'com.google.code.gson:gson:2.3' compile 'com.google.code.gson:gson:2.3'
compile group: 'commons-io', name: 'commons-io', version: '2.0.1'
compile('com.crashlytics.sdk.android:crashlytics:2.5.3@aar') {
transitive = true;
}
} }
...@@ -41,34 +41,42 @@ ...@@ -41,34 +41,42 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".intents.IntentSearchFeatures"> <activity android:name=".intents.IntentSearchFeatures"
android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="com.auriclon.search" /> <action android:name="com.auriclon.search" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".intents.IntentTransferingFeatures"> <activity android:name=".intents.IntentTransferingFeatures"
android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="com.auriclon.features" /> <action android:name="com.auriclon.features" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".activities.SelectFollowupActivity"> <activity android:name=".activities.SelectFollowupActivity"
android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="com.auriclon.activity_select_user"/> <action android:name="com.auriclon.activity_select_user"/>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".activities.SIFTActivity"> <activity android:name=".activities.SIFTActivity"
android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="com.auriclon.activity_sift"/> <action android:name="com.auriclon.activity_sift"/>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<meta-data
android:name="io.fabric.ApiKey"
android:value="8f546553db41cde72b997b22a2d5d9639236a29b" />
</application> </application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest> </manifest>
...@@ -15,6 +15,8 @@ import com.aluxoft.earrecognition.R; ...@@ -15,6 +15,8 @@ import com.aluxoft.earrecognition.R;
import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare; import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare;
import com.aluxoft.earrecognition.utils.ImageUtils; import com.aluxoft.earrecognition.utils.ImageUtils;
import com.crashlytics.android.Crashlytics;
import io.fabric.sdk.android.Fabric;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -39,6 +41,7 @@ public class EarCaptureActivity extends Activity { ...@@ -39,6 +41,7 @@ public class EarCaptureActivity extends Activity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
setContentView(R.layout.activity_callout); setContentView(R.layout.activity_callout);
......
...@@ -13,9 +13,11 @@ import com.aluxoft.earrecognition.common.EarIdList; ...@@ -13,9 +13,11 @@ import com.aluxoft.earrecognition.common.EarIdList;
import com.aluxoft.earrecognition.common.NameDistance; import com.aluxoft.earrecognition.common.NameDistance;
import com.aluxoft.earrecognition.common.Person; import com.aluxoft.earrecognition.common.Person;
import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare; import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare;
import com.aluxoft.earrecognition.utils.FileCache;
import com.google.gson.Gson; import com.google.gson.Gson;
import java.io.File; import java.io.File;
import java.nio.channels.FileChannel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
...@@ -52,8 +54,19 @@ public class SIFTActivity extends Activity { ...@@ -52,8 +54,19 @@ public class SIFTActivity extends Activity {
Bundle extras = intent.getExtras(); Bundle extras = intent.getExtras();
String imagePath = (String)extras.get("image_path"); String imagePath = (String)extras.get("image_path");
EarFeature earFeature = identifier.computeFeatures(imagePath); EarFeature earFeature = identifier.computeFeatures(imagePath);
File imageFile = new File(imagePath);
FileCache.getFile(
SIFTActivity.this.getApplicationContext(),
FileCache.FileCacheType.Image)
.replaceContent(imageFile);
FileCache
.getFile(SIFTActivity.this, FileCache.FileCacheType.Features)
.replaceContent(earFeature.serializeFeatures());
// Once we have the features, we can delete the image. // Once we have the features, we can delete the image.
new File(imagePath).delete(); imageFile.delete();
// Compares the current features with the database. // Compares the current features with the database.
EarData data = new EarDataLoaderCommcare().load(SIFTActivity.this); EarData data = new EarDataLoaderCommcare().load(SIFTActivity.this);
......
...@@ -20,8 +20,6 @@ import com.google.gson.Gson; ...@@ -20,8 +20,6 @@ import com.google.gson.Gson;
*/ */
public class SelectFollowupActivity extends Activity { public class SelectFollowupActivity extends Activity {
public static String currentSerializedEar;
public EarIdList earIdList = null; public EarIdList earIdList = null;
private static final int COMMCARE_REGISTER = 1; private static final int COMMCARE_REGISTER = 1;
...@@ -36,8 +34,6 @@ public class SelectFollowupActivity extends Activity { ...@@ -36,8 +34,6 @@ public class SelectFollowupActivity extends Activity {
String list = this.getIntent().getStringExtra("list"); String list = this.getIntent().getStringExtra("list");
this.earIdList = new Gson().fromJson(list, EarIdList.class); this.earIdList = new Gson().fromJson(list, EarIdList.class);
SelectFollowupActivity.currentSerializedEar = this.earIdList.getCurrentFeature().serializeFeatures();
Button registerButton = (Button) findViewById(R.id.register_commcare); Button registerButton = (Button) findViewById(R.id.register_commcare);
ArrayAdapter<NameDistance> arrayAdapter = new ArrayAdapter<NameDistance>( ArrayAdapter<NameDistance> arrayAdapter = new ArrayAdapter<NameDistance>(
......
...@@ -68,7 +68,14 @@ public class EarFeature { ...@@ -68,7 +68,14 @@ public class EarFeature {
assert this._getFeatures().type() == feature2._getFeatures().type(); assert this._getFeatures().type() == feature2._getFeatures().type();
MatOfDMatch matches = new MatOfDMatch(); MatOfDMatch matches = new MatOfDMatch();
matcher.match(this._getFeatures(), feature2._getFeatures(), matches); Mat features1 = this._getFeatures();
Mat features2 = feature2._getFeatures();
if (features1 == null || features2 == null) {
return Double.MAX_VALUE;
}
matcher.match(features1, features2, matches);
DMatch[] aMatches = matches.toArray(); DMatch[] aMatches = matches.toArray();
double distance = 0; double distance = 0;
...@@ -86,11 +93,18 @@ public class EarFeature { ...@@ -86,11 +93,18 @@ public class EarFeature {
features = gson.fromJson(featuresString, features.getClass()); features = gson.fromJson(featuresString, features.getClass());
Mat mFeatures = new Mat(); Mat mFeatures = new Mat();
if (features == null || features.size() == 0) {
return null;
}
mFeatures.create(features.size(), kFeatureSize, CvType.CV_32F); mFeatures.create(features.size(), kFeatureSize, CvType.CV_32F);
float buffer[] = new float[1]; float buffer[] = new float[1];
for (int i=0;i<features.size();++i) { for (int i=0;i<features.size();++i) {
ArrayList<Double> feature = features.get(i); ArrayList<Double> feature = features.get(i);
if (feature == null || feature.size() != kFeatureSize) {
return null;
}
for (int j=0;j<feature.size();++j) { for (int j=0;j<feature.size();++j) {
buffer[0] = feature.get(j).floatValue(); buffer[0] = feature.get(j).floatValue();
mFeatures.put(i, j, buffer); mFeatures.put(i, j, buffer);
......
...@@ -6,7 +6,6 @@ import android.content.ActivityNotFoundException; ...@@ -6,7 +6,6 @@ import android.content.ActivityNotFoundException;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
...@@ -15,9 +14,6 @@ import android.widget.Toast; ...@@ -15,9 +14,6 @@ import android.widget.Toast;
import com.aluxoft.earrecognition.EarIdentifier; import com.aluxoft.earrecognition.EarIdentifier;
import com.aluxoft.earrecognition.R; import com.aluxoft.earrecognition.R;
import com.aluxoft.earrecognition.activities.SelectFollowupActivity;
<<<<<<< ours
=======
import com.aluxoft.earrecognition.common.EarIdList; import com.aluxoft.earrecognition.common.EarIdList;
import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare; import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare;
import com.aluxoft.earrecognition.utils.FileCache; import com.aluxoft.earrecognition.utils.FileCache;
...@@ -25,14 +21,10 @@ import com.aluxoft.earrecognition.utils.ImageUtils; ...@@ -25,14 +21,10 @@ import com.aluxoft.earrecognition.utils.ImageUtils;
import com.google.gson.Gson; import com.google.gson.Gson;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
>>>>>>> theirs
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.Callable;
import bolts.Continuation;
import bolts.Task;
/** /**
* Callout to transfer features to CommCare * Callout to transfer features to CommCare
...@@ -118,21 +110,6 @@ public class IntentTransferingFeatures extends Activity { ...@@ -118,21 +110,6 @@ public class IntentTransferingFeatures extends Activity {
Toast.makeText(IntentTransferingFeatures.this, "No Camera", Toast.LENGTH_SHORT).show(); Toast.makeText(IntentTransferingFeatures.this, "No Camera", Toast.LENGTH_SHORT).show();
} }
} }
<<<<<<< ours
}).continueWith(new Continuation<Object, Object>() {
@Override
public Object then(Task<Object> task) throws Exception {
Intent returningIntent = new Intent(getIntent());
returningIntent.putExtra(
"odk_intent_data",
//"Hello World"
SelectFollowupActivity.currentSerializedEar
);
IntentTransferingFeatures.this.setResult(Activity.RESULT_OK, returningIntent);
finish();
return null;
=======
}); });
...@@ -161,7 +138,6 @@ public class IntentTransferingFeatures extends Activity { ...@@ -161,7 +138,6 @@ public class IntentTransferingFeatures extends Activity {
Intent intent = new Intent("com.auriclon.activity_sift"); Intent intent = new Intent("com.auriclon.activity_sift");
intent.putExtra("image_path", path); intent.putExtra("image_path", path);
startActivityForResult(intent, KEY_SIFT_ACTIVITY_LOADER); startActivityForResult(intent, KEY_SIFT_ACTIVITY_LOADER);
>>>>>>> theirs
} }
} else if (requestCode == KEY_SIFT_ACTIVITY_LOADER) { } else if (requestCode == KEY_SIFT_ACTIVITY_LOADER) {
String list = data.getStringExtra("list"); String list = data.getStringExtra("list");
......
package com.aluxoft.earrecognition.utils;
import android.app.Application;
import android.content.Context;
import android.os.Environment;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.channels.FileChannel;
/**
* Created by josejuliomartinez on 25/11/15.
*/
public class FileCache extends File {
private static final long invalidationThreshold;
static {
// One hour.
invalidationThreshold = 1000 * 60 * 60;
}
public enum FileCacheType {
Image("Auriclon_image_file.jpg"),
Features("Auriclon_features_file.json");
private String filename;
private FileCacheType(String filename) {
this.filename = filename;
}
}
private FileCache(File dir, String name) {
super(dir, name);
}
public static FileCache getFile(Context context, FileCacheType type) {
File dir = context.getCacheDir();
return new FileCache(dir, type.filename);
}
public boolean isValid() {
return (System.currentTimeMillis() - this.lastModified()) < FileCache.invalidationThreshold;
}
public boolean replaceContent(String content) {
try {
this.delete();
this.createNewFile();
FileUtils.writeStringToFile(this, content);
} catch (IOException e) {
return false;
}
return true;
}
public boolean replaceContent(File imageFile) {
try {
this.delete();
this.createNewFile();
FileUtils.copyFile(imageFile, this, false);
return true;
} catch(IOException exception) {
return false;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment