From a2b76716770af29152c0426e108adb49feb3ed31 Mon Sep 17 00:00:00 2001 From: Filip Strajnar Date: Wed, 23 Oct 2024 22:26:36 +0200 Subject: [PATCH] Initial implementation of OpenDocumentGuide. --- .../storageaccess/InputStreamHandler.java | 7 +++ .../storageaccess/OpenDocumentGuide.java | 57 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 common/src/main/java/com/proculite/androidagain/common/storageaccess/InputStreamHandler.java create mode 100644 common/src/main/java/com/proculite/androidagain/common/storageaccess/OpenDocumentGuide.java diff --git a/common/src/main/java/com/proculite/androidagain/common/storageaccess/InputStreamHandler.java b/common/src/main/java/com/proculite/androidagain/common/storageaccess/InputStreamHandler.java new file mode 100644 index 0000000..d8d967e --- /dev/null +++ b/common/src/main/java/com/proculite/androidagain/common/storageaccess/InputStreamHandler.java @@ -0,0 +1,7 @@ +package com.proculite.androidagain.common.storageaccess; + +import java.io.InputStream; + +public interface InputStreamHandler { + void handleInputStream(InputStream inputStream); +} diff --git a/common/src/main/java/com/proculite/androidagain/common/storageaccess/OpenDocumentGuide.java b/common/src/main/java/com/proculite/androidagain/common/storageaccess/OpenDocumentGuide.java new file mode 100644 index 0000000..dc4cb6d --- /dev/null +++ b/common/src/main/java/com/proculite/androidagain/common/storageaccess/OpenDocumentGuide.java @@ -0,0 +1,57 @@ +package com.proculite.androidagain.common.storageaccess; + +import android.content.Context; +import android.net.Uri; +import android.util.Log; + +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultCaller; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +public class OpenDocumentGuide implements ActivityResultCallback { + private final String TAG = ActivityResultContracts.OpenDocument.class.getName(); + private final ActivityResultLauncher openDocumentLauncher; + private final Context context; + private UriHandler uriHandler; + + public OpenDocumentGuide( + Context context, + ActivityResultCaller activityResultCaller + ) { + this.context = context; + ActivityResultContracts.OpenDocument openDocumentContract = + new ActivityResultContracts.OpenDocument(); + openDocumentLauncher = activityResultCaller.registerForActivityResult(openDocumentContract, this); + } + + @Override + public void onActivityResult(Uri o) { + uriHandler.handleUri(o); + } + + public void readFromInputStream(String[] suggestedMimeTypes, InputStreamHandler inputStreamHandler){ + uriHandler = uri -> { + try { + InputStream inputStream = context.getContentResolver().openInputStream(uri); + if(inputStream == null) + { + Log.e(TAG, "Obtained input stream is null."); + return; + } + inputStreamHandler.handleInputStream(inputStream); + inputStream.close(); + }catch (FileNotFoundException e){ + Log.e(TAG, "FileNotFoundException occurred on read from InputStream."); + } catch (IOException e) { + Log.e(TAG, "IOException occurred on read from InputStream."); + } + }; + + openDocumentLauncher.launch(suggestedMimeTypes); + } +}