Adds support for virtual file urls.

This commit is contained in:
2021-08-15 19:42:17 -07:00
committed by Tom Hicks
parent 1d335e9a37
commit 10bca503e5

View File

@@ -1,8 +1,11 @@
package com.majinnaibu.monstercards; package com.majinnaibu.monstercards;
import android.content.ContentResolver;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.provider.DocumentsContract;
import android.view.MenuItem; import android.view.MenuItem;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -21,6 +24,7 @@ import com.majinnaibu.monstercards.init.FlipperInitializer;
import com.majinnaibu.monstercards.utils.Logger; import com.majinnaibu.monstercards.utils.Logger;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
@@ -81,7 +85,9 @@ public class MainActivity extends AppCompatActivity {
String type = intent.getType(); String type = intent.getType();
String json; String json;
Uri uri = null; Uri uri = null;
if ("android.intent.action.SEND".equals(action) && "text/plain".equals(type)) { if ("android.intent.action.MAIN".equals(action)) {
return null;
} else if ("android.intent.action.SEND".equals(action) && "text/plain".equals(type)) {
uri = extras.getParcelable("android.intent.extra.STREAM"); uri = extras.getParcelable("android.intent.extra.STREAM");
} else if ("android.intent.action.VIEW".equals(action) && ("text/plain".equals(type) || "application/octet-stream".equals(type))) { } else if ("android.intent.action.VIEW".equals(action) && ("text/plain".equals(type) || "application/octet-stream".equals(type))) {
uri = intent.getData(); uri = intent.getData();
@@ -101,10 +107,10 @@ public class MainActivity extends AppCompatActivity {
@Nullable @Nullable
private String readContentsOfUri(Uri uri) { private String readContentsOfUri(Uri uri) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
try (InputStream inputStream = try (
getContentResolver().openInputStream(uri); InputStream inputStream = openInputStream(uri);
BufferedReader reader = new BufferedReader( BufferedReader reader = new BufferedReader(new InputStreamReader(Objects.requireNonNull(inputStream)))
new InputStreamReader(Objects.requireNonNull(inputStream)))) { ) {
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
builder.append(line); builder.append(line);
@@ -115,4 +121,36 @@ public class MainActivity extends AppCompatActivity {
} }
return builder.toString(); return builder.toString();
} }
private boolean isVirtualFile(Uri uri) {
if (!DocumentsContract.isDocumentUri(this, uri)) {
return false;
}
Cursor cursor = getContentResolver().query(
uri,
new String[]{DocumentsContract.Document.COLUMN_FLAGS},
null, null, null);
int flags = 0;
if (cursor.moveToFirst()) {
flags = cursor.getInt(0);
}
cursor.close();
return (flags & DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT) != 0;
}
private InputStream openInputStream(Uri uri) throws IOException {
ContentResolver resolver = getContentResolver();
if (isVirtualFile(uri)) {
String[] openableMimeTypes = resolver.getStreamTypes(uri, "*/*");
if (openableMimeTypes == null || openableMimeTypes.length <= 0) {
throw new FileNotFoundException();
}
return resolver.openTypedAssetFileDescriptor(uri, openableMimeTypes[0], null).createInputStream();
} else {
return resolver.openInputStream(uri);
}
}
} }