diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallable.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallable.java index f35ad024c..a8ac50f2f 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallable.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallable.java @@ -84,13 +84,13 @@ public class WriteTextFileCallable implements Callable { DocumentFile documentFile = DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); if (documentFile != null && documentFile.exists() && documentFile.canWrite()) { - outputStream = contentResolver.openOutputStream(fileAbstraction.uri); + outputStream = contentResolver.openOutputStream(fileAbstraction.uri, "wt"); } else { destFile = FileUtils.fromContentUri(fileAbstraction.uri); outputStream = openFile(destFile, context.get()); } } else { - outputStream = contentResolver.openOutputStream(fileAbstraction.uri); + outputStream = contentResolver.openOutputStream(fileAbstraction.uri, "wt"); } break; case FILE: diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java index 082a453ab..89eb2aad0 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java @@ -27,6 +27,30 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.robolectric.Shadows.shadowOf; +import android.content.ContentResolver; +import android.content.Context; +import android.net.Uri; +import android.os.Environment; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.amaze.filemanager.file_operations.exceptions.ShellNotRunningException; +import com.amaze.filemanager.file_operations.exceptions.StreamNotFoundException; +import com.amaze.filemanager.filesystem.EditableFileAbstraction; +import com.amaze.filemanager.filesystem.FileUtil; +import com.amaze.filemanager.filesystem.root.ConcatenateFileCommand; +import com.amaze.filemanager.shadows.ShadowContentResolver; +import com.amaze.filemanager.shadows.ShadowMultiDex; + +import org.apache.ftpserver.util.IoUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.shadow.api.Shadow; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -38,31 +62,9 @@ import java.io.OutputStream; import java.io.StringReader; import java.nio.charset.StandardCharsets; -import org.apache.ftpserver.util.IoUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; - -import com.amaze.filemanager.file_operations.exceptions.ShellNotRunningException; -import com.amaze.filemanager.file_operations.exceptions.StreamNotFoundException; -import com.amaze.filemanager.filesystem.EditableFileAbstraction; -import com.amaze.filemanager.filesystem.FileUtil; -import com.amaze.filemanager.filesystem.root.ConcatenateFileCommand; -import com.amaze.filemanager.shadows.ShadowMultiDex; - -import android.content.ContentResolver; -import android.content.Context; -import android.net.Uri; -import android.os.Environment; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - @RunWith(AndroidJUnit4.class) @Config( - shadows = {ShadowMultiDex.class}, + shadows = {ShadowMultiDex.class, ShadowContentResolver.class}, sdk = {JELLY_BEAN, KITKAT, P}) public class WriteTextFileCallableTest { @@ -75,7 +77,8 @@ public class WriteTextFileCallableTest { Context ctx = ApplicationProvider.getApplicationContext(); ContentResolver cr = ctx.getContentResolver(); ByteArrayOutputStream bout = new ByteArrayOutputStream(); - shadowOf(cr).registerOutputStream(uri, bout); + ShadowContentResolver scr = Shadow.extract(cr); + scr.registerOutputStream(uri, bout); WriteTextFileCallable task = new WriteTextFileCallable( diff --git a/app/src/test/java/com/amaze/filemanager/shadows/ShadowContentResolver.kt b/app/src/test/java/com/amaze/filemanager/shadows/ShadowContentResolver.kt new file mode 100644 index 000000000..953b812ed --- /dev/null +++ b/app/src/test/java/com/amaze/filemanager/shadows/ShadowContentResolver.kt @@ -0,0 +1,26 @@ +package com.amaze.filemanager.shadows + +import android.content.ContentResolver +import android.net.Uri +import org.robolectric.annotation.Implementation +import org.robolectric.annotation.Implements +import org.robolectric.shadows.ShadowContentResolver +import java.io.OutputStream + +/** + * [ShadowContentResolver] implementation to include + * [ContentResolver.openOutputStream] with Uri and open mode arguments. + * + * @see ContentResolver.openOutputStream(uri, String) + */ +@Implements(ContentResolver::class) +class ShadowContentResolver : ShadowContentResolver() { + + /** + * Implements [ContentResolver.openOutputStream] with open mode parameter. + * + * Simply delegate to one without open mode. + */ + @Implementation + fun openOutputStream(uri: Uri, mode: String): OutputStream? = super.openOutputStream(uri) +}