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";