add DirectoryFaceStorageBackend
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 150a43b..b08247b 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,7 +5,7 @@
<option name="OUTPUT_DIRECTORY" value="$USER_HOME$/Downloads/javadoc" />
<option name="OPTION_INCLUDE_LIBS" value="true" />
</component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
diff --git a/FaceShared/src/main/java/com/libremobileos/yifan/face/DirectoryFaceStorageBackend.java b/FaceShared/src/main/java/com/libremobileos/yifan/face/DirectoryFaceStorageBackend.java
new file mode 100644
index 0000000..5a3d8d6
--- /dev/null
+++ b/FaceShared/src/main/java/com/libremobileos/yifan/face/DirectoryFaceStorageBackend.java
@@ -0,0 +1,104 @@
+package com.libremobileos.yifan.face;
+
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+public class DirectoryFaceStorageBackend extends FaceStorageBackend {
+ private final File dir;
+
+ public DirectoryFaceStorageBackend(File dir) {
+ this.dir = dir;
+ if (!dir.exists()) {
+ throw new IllegalArgumentException("directory.exists() == false");
+ }
+ if (!dir.isDirectory()) {
+ throw new IllegalArgumentException("directory.isDirectory() == false");
+ }
+ if (!dir.canRead()) {
+ throw new IllegalArgumentException("directory.canRead() == false");
+ }
+ if (!dir.canWrite()) {
+ throw new IllegalArgumentException("directory.canWrite() == false");
+ }
+ }
+
+ @Override
+ protected Set<String> getNamesInternal() {
+ // Java...
+ return new HashSet<>(Arrays.asList(Objects.requireNonNull(dir.list())));
+ }
+
+ @Override
+ protected boolean registerInternal(String name, String data, boolean duplicate) {
+ File f = new File(dir, name);
+ try {
+ if (f.exists()) {
+ if (!duplicate)
+ throw new IOException("f.exists() && !duplicate == true");
+ } else {
+ if (!f.createNewFile())
+ throw new IOException("f.createNewFile() failed");
+ }
+ new OutputStreamWriter(new FileOutputStream(f)).write(data);
+ return true;
+ } catch (IOException e) {
+ Log.e("DirectoryFaceStorageBackend", Log.getStackTraceString(e));
+ }
+ return false;
+ }
+
+ @Override
+ protected String getInternal(String name) {
+ File f = new File(dir, name);
+ try {
+ if (!f.exists()) {
+ throw new IOException("f.exists() == false");
+ }
+ if (!f.canRead()) {
+ throw new IOException("f.canRead() == false");
+ }
+ try (InputStream inputStream = new FileInputStream(f)) {
+ // https://stackoverflow.com/a/35446009
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ for (int length; (length = inputStream.read(buffer)) != -1; ) {
+ result.write(buffer, 0, length);
+ }
+ // ignore the warning, api 33-only stuff right there :D
+ return result.toString(StandardCharsets.UTF_8.name());
+ }
+ } catch (IOException e) {
+ Log.e("DirectoryFaceStorageBackend", Log.getStackTraceString(e));
+ }
+ return null;
+ }
+
+ @Override
+ protected boolean deleteInternal(String name) {
+ File f = new File(dir, name);
+ try {
+ if (!f.exists()) {
+ throw new IOException("f.exists() == false");
+ }
+ if (!f.canWrite()) {
+ throw new IOException("f.canWrite() == false");
+ }
+ return f.delete();
+ } catch (IOException e) {
+ Log.e("DirectoryFaceStorageBackend", Log.getStackTraceString(e));
+ }
+ return false;
+ }
+}
diff --git a/app/src/main/java/com/libremobileos/facedetect/MainActivity.java b/app/src/main/java/com/libremobileos/facedetect/MainActivity.java
index 919ea43..ea3ab2d 100644
--- a/app/src/main/java/com/libremobileos/facedetect/MainActivity.java
+++ b/app/src/main/java/com/libremobileos/facedetect/MainActivity.java
@@ -27,6 +27,7 @@
import androidx.camera.core.ExperimentalGetImage;
import androidx.camera.core.ImageAnalysis;
+import com.libremobileos.yifan.face.DirectoryFaceStorageBackend;
import com.libremobileos.yifan.face.FaceRecognizer;
import com.libremobileos.yifan.face.FaceStorageBackend;
import com.libremobileos.yifan.face.SharedPreferencesFaceStorageBackend;
@@ -92,8 +93,9 @@
});
// Store registered Faces in Memory
- //faceStorage = new VolatileFaceStorageBackend();
- FaceStorageBackend faceStorage = new SharedPreferencesFaceStorageBackend(getSharedPreferences("faces", 0));
+ //FaceStorageBackend faceStorage = new VolatileFaceStorageBackend();
+ //FaceStorageBackend faceStorage = new SharedPreferencesFaceStorageBackend(getSharedPreferences("faces", 0));
+ FaceStorageBackend faceStorage = new DirectoryFaceStorageBackend(getFilesDir());
// Create AI-based face detection
faceRecognizer = FaceRecognizer.create(this,
diff --git a/app/src/main/java/com/libremobileos/facedetect/RemoteFaceServiceClient.java b/app/src/main/java/com/libremobileos/facedetect/RemoteFaceServiceClient.java
index 75bf953..6c5dac2 100644
--- a/app/src/main/java/com/libremobileos/facedetect/RemoteFaceServiceClient.java
+++ b/app/src/main/java/com/libremobileos/facedetect/RemoteFaceServiceClient.java
@@ -3,6 +3,7 @@
import android.content.Context;
import android.content.SharedPreferences;
+import com.libremobileos.yifan.face.DirectoryFaceStorageBackend;
import com.libremobileos.yifan.face.FaceDataEncoder;
import com.libremobileos.yifan.face.FaceStorageBackend;
import com.libremobileos.yifan.face.SharedPreferencesFaceStorageBackend;
@@ -14,7 +15,7 @@
new Thread(() -> {
//TODO replace with remote thing
SharedPreferences prefs2 = ctx.getSharedPreferences("faces2", 0);
- FaceStorageBackend s = new SharedPreferencesFaceStorageBackend(ctx.getSharedPreferences("faces", 0));
+ FaceStorageBackend s = new DirectoryFaceStorageBackend(ctx.getFilesDir());;
callback.accept(new RemoteFaceServiceClient() {
private static final String FACE = "Face";
private static final String SECURE = "secure";