diff --git a/android/application_snippets.xml b/android/application_snippets.xml index 4b05a19..d2f6caf 100644 --- a/android/application_snippets.xml +++ b/android/application_snippets.xml @@ -45,6 +45,9 @@ + + + diff --git a/androidsrc/org/julianfamily/keepassgo/SharedVaultImportActivity.java b/androidsrc/org/julianfamily/keepassgo/SharedVaultImportActivity.java index b669fa7..778b50c 100644 --- a/androidsrc/org/julianfamily/keepassgo/SharedVaultImportActivity.java +++ b/androidsrc/org/julianfamily/keepassgo/SharedVaultImportActivity.java @@ -1,6 +1,7 @@ package org.julianfamily.keepassgo; import android.app.Activity; +import android.content.ClipData; import android.content.Intent; import android.database.Cursor; import android.net.Uri; @@ -10,9 +11,11 @@ import android.util.Log; import java.io.File; import java.io.FileOutputStream; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; public final class SharedVaultImportActivity extends Activity { private static final String TAG = "KeePassGOImport"; @@ -36,6 +39,7 @@ public final class SharedVaultImportActivity extends Activity { } private void handleIntent(Intent intent) { + logIntent(intent); Uri uri = resolveSharedUri(intent); if (uri == null) { Log.i(TAG, "no shared vault URI on intent"); @@ -55,10 +59,29 @@ public final class SharedVaultImportActivity extends Activity { } String action = intent.getAction(); if (Intent.ACTION_SEND.equals(action)) { - return intent.getParcelableExtra(Intent.EXTRA_STREAM); + Uri extraStream = intent.getParcelableExtra(Intent.EXTRA_STREAM); + if (extraStream != null) { + return extraStream; + } + } + if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { + ArrayList streams = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + if (streams != null && !streams.isEmpty()) { + return streams.get(0); + } } if (Intent.ACTION_VIEW.equals(action)) { - return intent.getData(); + Uri data = intent.getData(); + if (data != null) { + return data; + } + } + ClipData clipData = intent.getClipData(); + if (clipData != null && clipData.getItemCount() > 0) { + Uri clipUri = clipData.getItemAt(0).getUri(); + if (clipUri != null) { + return clipUri; + } } return null; } @@ -69,7 +92,7 @@ public final class SharedVaultImportActivity extends Activity { throw new IOException("failed to create " + dir.getAbsolutePath()); } File pendingFile = new File(dir, "pending-shared-vault.kdbx"); - try (InputStream in = getContentResolver().openInputStream(uri)) { + try (InputStream in = openSharedInputStream(uri)) { if (in == null) { throw new IOException("failed to open shared vault stream"); } @@ -88,6 +111,17 @@ public final class SharedVaultImportActivity extends Activity { } } + private InputStream openSharedInputStream(Uri uri) throws IOException { + if ("file".equalsIgnoreCase(uri.getScheme())) { + String path = uri.getPath(); + if (path == null || path.trim().isEmpty()) { + throw new IOException("file URI is missing a path"); + } + return new FileInputStream(new File(path)); + } + return getContentResolver().openInputStream(uri); + } + private String resolveDisplayName(Uri uri) { String displayName = queryDisplayName(uri); if (!displayName.isEmpty()) { @@ -123,6 +157,20 @@ public final class SharedVaultImportActivity extends Activity { return ""; } + private void logIntent(Intent intent) { + if (intent == null) { + return; + } + Log.i(TAG, "intent action=" + intent.getAction() + + " type=" + intent.getType() + + " data=" + intent.getData() + + " flags=0x" + Integer.toHexString(intent.getFlags())); + ClipData clipData = intent.getClipData(); + if (clipData != null) { + Log.i(TAG, "intent clip items=" + clipData.getItemCount()); + } + } + private void launchMainActivity() { Intent launch = new Intent(); launch.setClassName(this, "org.gioui.GioActivity");