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 @@ + + + + + +