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: 'io.fabric'
android {
compileSdkVersion 21
......@@ -21,6 +31,7 @@ android {
repositories {
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
......@@ -29,4 +40,8 @@ dependencies {
compile project(':openCVLibrary2411')
compile 'com.parse.bolts:bolts-android:1.2.1'
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 @@
</intent-filter>
</activity>
<activity android:name=".intents.IntentSearchFeatures">
<activity android:name=".intents.IntentSearchFeatures"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="com.auriclon.search" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".intents.IntentTransferingFeatures">
<activity android:name=".intents.IntentTransferingFeatures"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="com.auriclon.features" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".activities.SelectFollowupActivity">
<activity android:name=".activities.SelectFollowupActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="com.auriclon.activity_select_user"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".activities.SIFTActivity">
<activity android:name=".activities.SIFTActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="com.auriclon.activity_sift"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<meta-data
android:name="io.fabric.ApiKey"
android:value="8f546553db41cde72b997b22a2d5d9639236a29b" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
......@@ -15,6 +15,8 @@ import com.aluxoft.earrecognition.R;
import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare;
import com.aluxoft.earrecognition.utils.ImageUtils;
import com.crashlytics.android.Crashlytics;
import io.fabric.sdk.android.Fabric;
import java.io.File;
import java.io.IOException;
......@@ -39,6 +41,7 @@ public class EarCaptureActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
setContentView(R.layout.activity_callout);
......
......@@ -13,9 +13,11 @@ import com.aluxoft.earrecognition.common.EarIdList;
import com.aluxoft.earrecognition.common.NameDistance;
import com.aluxoft.earrecognition.common.Person;
import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare;
import com.aluxoft.earrecognition.utils.FileCache;
import com.google.gson.Gson;
import java.io.File;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
......@@ -52,8 +54,19 @@ public class SIFTActivity extends Activity {
Bundle extras = intent.getExtras();
String imagePath = (String)extras.get("image_path");
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.
new File(imagePath).delete();
imageFile.delete();
// Compares the current features with the database.
EarData data = new EarDataLoaderCommcare().load(SIFTActivity.this);
......
......@@ -20,8 +20,6 @@ import com.google.gson.Gson;
*/
public class SelectFollowupActivity extends Activity {
public static String currentSerializedEar;
public EarIdList earIdList = null;
private static final int COMMCARE_REGISTER = 1;
......@@ -36,8 +34,6 @@ public class SelectFollowupActivity extends Activity {
String list = this.getIntent().getStringExtra("list");
this.earIdList = new Gson().fromJson(list, EarIdList.class);
SelectFollowupActivity.currentSerializedEar = this.earIdList.getCurrentFeature().serializeFeatures();
Button registerButton = (Button) findViewById(R.id.register_commcare);
ArrayAdapter<NameDistance> arrayAdapter = new ArrayAdapter<NameDistance>(
......
......@@ -68,7 +68,14 @@ public class EarFeature {
assert this._getFeatures().type() == feature2._getFeatures().type();
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();
double distance = 0;
......@@ -86,11 +93,18 @@ public class EarFeature {
features = gson.fromJson(featuresString, features.getClass());
Mat mFeatures = new Mat();
if (features == null || features.size() == 0) {
return null;
}
mFeatures.create(features.size(), kFeatureSize, CvType.CV_32F);
float buffer[] = new float[1];
for (int i=0;i<features.size();++i) {
ArrayList<Double> feature = features.get(i);
if (feature == null || feature.size() != kFeatureSize) {
return null;
}
for (int j=0;j<feature.size();++j) {
buffer[0] = feature.get(j).floatValue();
mFeatures.put(i, j, buffer);
......
......@@ -6,7 +6,6 @@ import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
......@@ -15,9 +14,6 @@ import android.widget.Toast;
import com.aluxoft.earrecognition.EarIdentifier;
import com.aluxoft.earrecognition.R;
import com.aluxoft.earrecognition.activities.SelectFollowupActivity;
<<<<<<< ours
=======
import com.aluxoft.earrecognition.common.EarIdList;
import com.aluxoft.earrecognition.loader.EarDataLoaderCommcare;
import com.aluxoft.earrecognition.utils.FileCache;
......@@ -25,14 +21,10 @@ import com.aluxoft.earrecognition.utils.ImageUtils;
import com.google.gson.Gson;
import org.apache.commons.io.FileUtils;
>>>>>>> theirs
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Callable;
import bolts.Continuation;
import bolts.Task;
/**
* Callout to transfer features to CommCare
......@@ -118,21 +110,6 @@ public class IntentTransferingFeatures extends Activity {
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 {
Intent intent = new Intent("com.auriclon.activity_sift");
intent.putExtra("image_path", path);
startActivityForResult(intent, KEY_SIFT_ACTIVITY_LOADER);
>>>>>>> theirs
}
} else if (requestCode == KEY_SIFT_ACTIVITY_LOADER) {
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