mirror of
https://github.com/M66B/FairEmail.git
synced 2025-02-22 06:01:12 +00:00
Improved attachment error handling
This commit is contained in:
parent
a3c9b1738a
commit
4f31e65cf0
2 changed files with 53 additions and 54 deletions
|
@ -3026,47 +3026,7 @@ public class FragmentCompose extends FragmentBase {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onException(Bundle args, Throwable ex) {
|
protected void onException(Bundle args, Throwable ex) {
|
||||||
// External app sending absolute file
|
handleException(ex);
|
||||||
if (ex instanceof NoStreamException)
|
|
||||||
((NoStreamException) ex).report(getActivity());
|
|
||||||
else if (ex instanceof FileNotFoundException ||
|
|
||||||
ex instanceof IllegalArgumentException ||
|
|
||||||
ex instanceof IllegalStateException) {
|
|
||||||
/*
|
|
||||||
java.lang.IllegalStateException: Failed to mount
|
|
||||||
at android.os.Parcel.createException(Parcel.java:2079)
|
|
||||||
at android.os.Parcel.readException(Parcel.java:2039)
|
|
||||||
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
|
|
||||||
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:151)
|
|
||||||
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:705)
|
|
||||||
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1687)
|
|
||||||
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503)
|
|
||||||
at android.content.ContentResolver.openInputStream(ContentResolver.java:1187)
|
|
||||||
at eu.faircode.email.FragmentCompose.addAttachment(SourceFile:27)
|
|
||||||
*/
|
|
||||||
Snackbar.make(view, ex.toString(), Snackbar.LENGTH_LONG)
|
|
||||||
.setGestureInsetBottomIgnored(true).show();
|
|
||||||
} else {
|
|
||||||
if (ex instanceof IOException &&
|
|
||||||
ex.getCause() instanceof ErrnoException &&
|
|
||||||
((ErrnoException) ex.getCause()).errno == ENOSPC)
|
|
||||||
ex = new IOException(getContext().getString(R.string.app_cake), ex);
|
|
||||||
Log.unexpectedError(getParentFragmentManager(), ex,
|
|
||||||
!(ex instanceof IOException || ex.getCause() instanceof IOException));
|
|
||||||
/*
|
|
||||||
java.lang.IllegalStateException: java.io.IOException: Failed to redact /storage/emulated/0/Download/97203830-piston-vecteur-icône-simple-symbole-plat-sur-fond-blanc.jpg
|
|
||||||
at android.os.Parcel.createExceptionOrNull(Parcel.java:2381)
|
|
||||||
at android.os.Parcel.createException(Parcel.java:2357)
|
|
||||||
at android.os.Parcel.readException(Parcel.java:2340)
|
|
||||||
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)
|
|
||||||
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:153)
|
|
||||||
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:804)
|
|
||||||
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:2002)
|
|
||||||
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1817)
|
|
||||||
at android.content.ContentResolver.openInputStream(ContentResolver.java:1494)
|
|
||||||
at eu.faircode.email.FragmentCompose.addAttachment(SourceFile:27)
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}.setExecutor(executor).execute(this, args, "compose:attachment:add");
|
}.setExecutor(executor).execute(this, args, "compose:attachment:add");
|
||||||
}
|
}
|
||||||
|
@ -3122,10 +3082,7 @@ public class FragmentCompose extends FragmentBase {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onException(Bundle args, Throwable ex) {
|
protected void onException(Bundle args, Throwable ex) {
|
||||||
if (ex instanceof NoStreamException)
|
handleException(ex);
|
||||||
((NoStreamException) ex).report(getActivity());
|
|
||||||
else
|
|
||||||
Log.unexpectedError(getParentFragmentManager(), ex);
|
|
||||||
}
|
}
|
||||||
}.execute(this, args, "compose:shared");
|
}.execute(this, args, "compose:shared");
|
||||||
}
|
}
|
||||||
|
@ -5565,16 +5522,8 @@ public class FragmentCompose extends FragmentBase {
|
||||||
protected void onException(Bundle args, Throwable ex) {
|
protected void onException(Bundle args, Throwable ex) {
|
||||||
pbWait.setVisibility(View.GONE);
|
pbWait.setVisibility(View.GONE);
|
||||||
|
|
||||||
// External app sending absolute file
|
|
||||||
if (ex instanceof MessageRemovedException)
|
if (ex instanceof MessageRemovedException)
|
||||||
finish();
|
finish();
|
||||||
if (ex instanceof NoStreamException)
|
|
||||||
((NoStreamException) ex).report(getActivity());
|
|
||||||
else if (ex instanceof FileNotFoundException ||
|
|
||||||
ex instanceof IllegalArgumentException ||
|
|
||||||
ex instanceof IllegalStateException)
|
|
||||||
Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_LONG)
|
|
||||||
.setGestureInsetBottomIgnored(true).show();
|
|
||||||
else if (ex instanceof OperationCanceledException) {
|
else if (ex instanceof OperationCanceledException) {
|
||||||
Snackbar snackbar = Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_INDEFINITE)
|
Snackbar snackbar = Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_INDEFINITE)
|
||||||
.setGestureInsetBottomIgnored(true);
|
.setGestureInsetBottomIgnored(true);
|
||||||
|
@ -5589,10 +5538,59 @@ public class FragmentCompose extends FragmentBase {
|
||||||
});
|
});
|
||||||
snackbar.show();
|
snackbar.show();
|
||||||
} else
|
} else
|
||||||
Log.unexpectedError(getParentFragmentManager(), ex);
|
handleException(ex);
|
||||||
}
|
}
|
||||||
}.setExecutor(executor);
|
}.setExecutor(executor);
|
||||||
|
|
||||||
|
private void handleException(Throwable ex) {
|
||||||
|
// External app sending absolute file
|
||||||
|
if (ex instanceof NoStreamException)
|
||||||
|
((NoStreamException) ex).report(getActivity());
|
||||||
|
else if (ex instanceof FileNotFoundException ||
|
||||||
|
ex instanceof IllegalArgumentException ||
|
||||||
|
ex instanceof IllegalStateException) {
|
||||||
|
/*
|
||||||
|
java.lang.IllegalStateException: Failed to mount
|
||||||
|
at android.os.Parcel.createException(Parcel.java:2079)
|
||||||
|
at android.os.Parcel.readException(Parcel.java:2039)
|
||||||
|
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
|
||||||
|
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:151)
|
||||||
|
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:705)
|
||||||
|
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1687)
|
||||||
|
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503)
|
||||||
|
at android.content.ContentResolver.openInputStream(ContentResolver.java:1187)
|
||||||
|
at eu.faircode.email.FragmentCompose.addAttachment(SourceFile:27)
|
||||||
|
*/
|
||||||
|
Snackbar.make(view, ex.toString(), Snackbar.LENGTH_LONG)
|
||||||
|
.setGestureInsetBottomIgnored(true).show();
|
||||||
|
} else {
|
||||||
|
if (ex instanceof IOException &&
|
||||||
|
ex.getCause() instanceof ErrnoException &&
|
||||||
|
((ErrnoException) ex.getCause()).errno == ENOSPC)
|
||||||
|
ex = new IOException(getContext().getString(R.string.app_cake), ex);
|
||||||
|
|
||||||
|
// External app didn't grant URI permissions
|
||||||
|
if (ex instanceof SecurityException)
|
||||||
|
ex = new Throwable(getString(R.string.title_no_permissions), ex);
|
||||||
|
|
||||||
|
Log.unexpectedError(getParentFragmentManager(), ex,
|
||||||
|
!(ex instanceof IOException || ex.getCause() instanceof IOException));
|
||||||
|
/*
|
||||||
|
java.lang.IllegalStateException: java.io.IOException: Failed to redact /storage/emulated/0/Download/97203830-piston-vecteur-icône-simple-symbole-plat-sur-fond-blanc.jpg
|
||||||
|
at android.os.Parcel.createExceptionOrNull(Parcel.java:2381)
|
||||||
|
at android.os.Parcel.createException(Parcel.java:2357)
|
||||||
|
at android.os.Parcel.readException(Parcel.java:2340)
|
||||||
|
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)
|
||||||
|
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:153)
|
||||||
|
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:804)
|
||||||
|
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:2002)
|
||||||
|
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1817)
|
||||||
|
at android.content.ContentResolver.openInputStream(ContentResolver.java:1494)
|
||||||
|
at eu.faircode.email.FragmentCompose.addAttachment(SourceFile:27)
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private SimpleTask<EntityMessage> actionLoader = new SimpleTask<EntityMessage>() {
|
private SimpleTask<EntityMessage> actionLoader = new SimpleTask<EntityMessage>() {
|
||||||
@Override
|
@Override
|
||||||
protected void onPreExecute(Bundle args) {
|
protected void onPreExecute(Bundle args) {
|
||||||
|
|
|
@ -1230,6 +1230,7 @@
|
||||||
<string name="title_no_saf">Storage access framework not available</string>
|
<string name="title_no_saf">Storage access framework not available</string>
|
||||||
<string name="title_no_stream">FairEmail does not have permission to read this file directly</string>
|
<string name="title_no_stream">FairEmail does not have permission to read this file directly</string>
|
||||||
<string name="title_no_stream_help">This can be solved by selecting the file with a more modern file manager app or by granting permission to read files</string>
|
<string name="title_no_stream_help">This can be solved by selecting the file with a more modern file manager app or by granting permission to read files</string>
|
||||||
|
<string name="title_no_permissions">The app used to select a file did not grant permission to read the file</string>
|
||||||
<string name="title_no_internet">No or no suitable internet connection</string>
|
<string name="title_no_internet">No or no suitable internet connection</string>
|
||||||
<string name="title_no_connection">Connecting to one or more accounts …</string>
|
<string name="title_no_connection">Connecting to one or more accounts …</string>
|
||||||
<string name="title_no_folder">Folder does not exist</string>
|
<string name="title_no_folder">Folder does not exist</string>
|
||||||
|
|
Loading…
Reference in a new issue