diff --git a/android-project/app/src/main/AndroidManifest.xml b/android-project/app/src/main/AndroidManifest.xml
index cc417db7b..5eedbd4eb 100644
--- a/android-project/app/src/main/AndroidManifest.xml
+++ b/android-project/app/src/main/AndroidManifest.xml
@@ -79,11 +79,19 @@
-->
+
+
+
+
+
diff --git a/android-project/app/src/main/java/org/diasurgical/devilutionx/ImportActivity.java b/android-project/app/src/main/java/org/diasurgical/devilutionx/ImportActivity.java
new file mode 100644
index 000000000..a7ca99215
--- /dev/null
+++ b/android-project/app/src/main/java/org/diasurgical/devilutionx/ImportActivity.java
@@ -0,0 +1,93 @@
+package org.diasurgical.devilutionx;
+
+import android.app.Activity;
+import android.content.ClipData;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.annotation.Nullable;
+import android.os.Bundle;
+import android.support.v4.provider.DocumentFile;
+import android.util.Log;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Objects;
+
+public class ImportActivity extends Activity {
+
+ private static final int IMPORT_REQUEST_CODE = 0xD1AB70;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
+ intent.setType("*/*");
+ startActivityForResult(intent, IMPORT_REQUEST_CODE);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ if (requestCode != IMPORT_REQUEST_CODE)
+ return;
+
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ importFile(data.getData());
+ handleClipData(data.getClipData());
+ }
+
+ finish();
+ }
+
+ private void handleClipData(ClipData clipData) {
+ if (clipData == null)
+ return;
+
+ for (int i = 0; i < clipData.getItemCount(); i++) {
+ ClipData.Item item = clipData.getItemAt(i);
+ if (item == null)
+ continue;
+
+ importFile(item.getUri());
+ }
+ }
+
+ private void importFile(Uri fileUri) {
+ if (fileUri == null)
+ return;
+
+ DocumentFile file = DocumentFile.fromSingleUri(getApplicationContext(), fileUri);
+ String fileName = file.getName();
+ String externalFilesDir = getExternalFilesDir(null).getAbsolutePath();
+ String externalFilesPath = externalFilesDir + "/" + fileName;
+
+ try {
+ InputStream inputStream = null;
+ OutputStream outputStream = null;
+
+ try {
+ ContentResolver contentResolver = getContentResolver();
+ inputStream = contentResolver.openInputStream(fileUri);
+ outputStream = new FileOutputStream(externalFilesPath);
+
+ // Transfer bytes from in to out
+ byte[] buf = new byte[4096];
+ int len;
+ while ((len = inputStream.read(buf)) > 0) {
+ outputStream.write(buf, 0, len);
+ }
+ } finally {
+ if (inputStream != null)
+ inputStream.close();
+ if (outputStream != null)
+ outputStream.close();
+ }
+ } catch (IOException exception) {
+ Log.e("importFile", Objects.requireNonNull(exception.getMessage()));
+ }
+ }
+}
diff --git a/android-project/app/src/main/res/mipmap-hdpi/ic_launcher_import_data.png b/android-project/app/src/main/res/mipmap-hdpi/ic_launcher_import_data.png
new file mode 100644
index 000000000..ff35a00e6
Binary files /dev/null and b/android-project/app/src/main/res/mipmap-hdpi/ic_launcher_import_data.png differ
diff --git a/android-project/app/src/main/res/mipmap-mdpi/ic_launcher_import_data.png b/android-project/app/src/main/res/mipmap-mdpi/ic_launcher_import_data.png
new file mode 100644
index 000000000..610ff6db9
Binary files /dev/null and b/android-project/app/src/main/res/mipmap-mdpi/ic_launcher_import_data.png differ
diff --git a/android-project/app/src/main/res/mipmap-xhdpi/ic_launcher_import_data.png b/android-project/app/src/main/res/mipmap-xhdpi/ic_launcher_import_data.png
new file mode 100644
index 000000000..dce275725
Binary files /dev/null and b/android-project/app/src/main/res/mipmap-xhdpi/ic_launcher_import_data.png differ
diff --git a/android-project/app/src/main/res/mipmap-xxhdpi/ic_launcher_import_data.png b/android-project/app/src/main/res/mipmap-xxhdpi/ic_launcher_import_data.png
new file mode 100644
index 000000000..b3381dbf5
Binary files /dev/null and b/android-project/app/src/main/res/mipmap-xxhdpi/ic_launcher_import_data.png differ
diff --git a/android-project/app/src/main/res/mipmap-xxxhdpi/ic_launcher_import_data.png b/android-project/app/src/main/res/mipmap-xxxhdpi/ic_launcher_import_data.png
new file mode 100644
index 000000000..7d4190858
Binary files /dev/null and b/android-project/app/src/main/res/mipmap-xxxhdpi/ic_launcher_import_data.png differ
diff --git a/android-project/app/src/main/res/values/strings.xml b/android-project/app/src/main/res/values/strings.xml
index 2e695fafc..b4ad488bf 100644
--- a/android-project/app/src/main/res/values/strings.xml
+++ b/android-project/app/src/main/res/values/strings.xml
@@ -11,4 +11,5 @@
Game data missing
Download started
Diablo Demo Data
+ Import Data
diff --git a/android-project/app/src/main/res/xml/shortcuts.xml b/android-project/app/src/main/res/xml/shortcuts.xml
new file mode 100644
index 000000000..fa7825eb5
--- /dev/null
+++ b/android-project/app/src/main/res/xml/shortcuts.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+