diff --git a/app/src/main/java/eu/faircode/email/ActivitySignature.java b/app/src/main/java/eu/faircode/email/ActivitySignature.java index 92db7bd51f..be90d15fba 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySignature.java +++ b/app/src/main/java/eu/faircode/email/ActivitySignature.java @@ -20,6 +20,7 @@ package eu.faircode.email; */ import android.content.ClipboardManager; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -55,6 +56,8 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import java.io.FileNotFoundException; +import java.io.InputStream; import java.util.Objects; public class ActivitySignature extends ActivityBase { @@ -69,6 +72,7 @@ public class ActivitySignature extends ActivityBase { private boolean dirty = false; private static final int REQUEST_IMAGE = 1; + private static final int REQUEST_FILE = 2; @Override protected void onCreate(Bundle savedInstanceState) { @@ -239,6 +243,9 @@ public class ActivitySignature extends ActivityBase { item.setChecked(!item.isChecked()); html(item.isChecked()); return true; + } else if (itemId == R.id.menu_import_file) { + onMenuSelectFile(); + return true; } return super.onOptionsItemSelected(item); } @@ -247,6 +254,14 @@ public class ActivitySignature extends ActivityBase { Helper.viewFAQ(this, 57); } + private void onMenuSelectFile() { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("text/*"); + Helper.openAdvanced(intent); + startActivityForResult(intent, REQUEST_FILE); + } + @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -257,6 +272,10 @@ public class ActivitySignature extends ActivityBase { if (resultCode == RESULT_OK && data != null) onImageSelected(data.getData()); break; + case REQUEST_FILE: + if (resultCode == RESULT_OK && data != null) + onFileSelected(data.getData()); + break; } } catch (Throwable ex) { Log.e(ex); @@ -413,4 +432,36 @@ public class ActivitySignature extends ActivityBase { Log.unexpectedError(getSupportFragmentManager(), ex); } } + + private void onFileSelected(Uri uri) { + Bundle args = new Bundle(); + args.putParcelable("uri", uri); + + new SimpleTask() { + @Override + protected String onExecute(Context context, Bundle args) throws Throwable { + try (InputStream is = getContentResolver().openInputStream(uri)) { + if (is == null) + throw new FileNotFoundException(uri.toString()); + return Helper.readStream(is); + } + } + + @Override + protected void onExecuted(Bundle args, String text) { + int start = etText.getSelectionStart(); + if (start < 0) + start = 0; + etText.getText().insert(start, text); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + if (ex instanceof NoStreamException) + ((NoStreamException) ex).report(ActivitySignature.this); + else + Log.unexpectedError(getSupportFragmentManager(), ex); + } + }.execute(this, args, "signature:file"); + } } diff --git a/app/src/main/res/menu/menu_signature.xml b/app/src/main/res/menu/menu_signature.xml index fd8cf6449c..33ae0bcc26 100644 --- a/app/src/main/res/menu/menu_signature.xml +++ b/app/src/main/res/menu/menu_signature.xml @@ -11,4 +11,8 @@ android:checkable="true" android:title="@string/title_edit_html" app:showAsAction="never" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 267bacebef..a570b53df4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1017,6 +1017,7 @@ Delete this account permanently? Delete this identity permanently? Edit as HTML + Import file Sign key: %1$s Created: %1$s Last connected: %1$s