Fix OPML export not working with API 29+

This commit is contained in:
Shinokuni 2021-07-16 17:34:03 +02:00
parent 440e6ea810
commit d51c7ed90a
3 changed files with 21 additions and 19 deletions

View File

@ -65,11 +65,7 @@ dependencies {
exclude group: 'moshi', module: 'moshi' // moshi converter uses moshi 1.8.0 which breaks codegen 1.9.2 exclude group: 'moshi', module: 'moshi' // moshi converter uses moshi 1.8.0 which breaks codegen 1.9.2
} }
implementation ('com.squareup.retrofit2:converter-simplexml:2.9.0') { implementation ('com.squareup.retrofit2:converter-simplexml:2.9.0')
exclude module: 'stax'
exclude module: 'stax-api'
exclude module: 'xpp3'
}
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'

View File

@ -24,6 +24,7 @@ import com.readrops.api.opml.OPMLHelper;
import com.readrops.api.opml.OPMLParser; import com.readrops.api.opml.OPMLParser;
import com.readrops.app.R; import com.readrops.app.R;
import com.readrops.app.ReadropsApp; import com.readrops.app.ReadropsApp;
import com.readrops.app.account.AccountViewModel;
import com.readrops.app.account.AddAccountActivity; import com.readrops.app.account.AddAccountActivity;
import com.readrops.app.feedsfolders.ManageFeedsFoldersActivity; import com.readrops.app.feedsfolders.ManageFeedsFoldersActivity;
import com.readrops.app.notifications.NotificationPermissionActivity; import com.readrops.app.notifications.NotificationPermissionActivity;
@ -31,12 +32,16 @@ import com.readrops.app.utils.FileUtils;
import com.readrops.app.utils.PermissionManager; import com.readrops.app.utils.PermissionManager;
import com.readrops.app.utils.SharedPreferencesManager; import com.readrops.app.utils.SharedPreferencesManager;
import com.readrops.app.utils.Utils; import com.readrops.app.utils.Utils;
import com.readrops.app.account.AccountViewModel; import com.readrops.db.entities.Feed;
import com.readrops.db.entities.Folder;
import com.readrops.db.entities.account.Account; import com.readrops.db.entities.account.Account;
import com.readrops.db.entities.account.AccountType; import com.readrops.db.entities.account.AccountType;
import org.koin.androidx.viewmodel.compat.ViewModelCompat; import org.koin.androidx.viewmodel.compat.ViewModelCompat;
import java.util.List;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.observers.DisposableCompletableObserver; import io.reactivex.observers.DisposableCompletableObserver;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
@ -239,13 +244,14 @@ public class AccountSettingsFragment extends PreferenceFragmentCompat {
String fileName = "subscriptions.opml"; String fileName = "subscriptions.opml";
try { try {
String path = FileUtils.writeDownloadFile(getContext(), fileName, "text/xml", outputStream -> { String path = FileUtils.writeDownloadFile(getContext(), fileName, "text/x-opml", outputStream -> {
viewModel.getFoldersWithFeeds() Map<Folder, List<Feed>> folderListMap = viewModel.getFoldersWithFeeds()
.flatMapCompletable(folderListMap -> OPMLParser.write(folderListMap, outputStream))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .blockingGet();
.doOnError(e -> Utils.showSnackbar(getView(), e.getMessage()))
.subscribe();
OPMLParser.write(folderListMap, outputStream)
.blockingAwait();
return Unit.INSTANCE; return Unit.INSTANCE;
}); });

View File

@ -34,20 +34,20 @@ object FileUtils {
val contentUri = resolver.insert(downloadsUri, fileDetails) val contentUri = resolver.insert(downloadsUri, fileDetails)
resolver.openFileDescriptor(contentUri!!, "w", null).use { pfd -> resolver.openOutputStream(contentUri!!)!!.use { stream ->
val outputStream = FileOutputStream(pfd?.fileDescriptor!!)
try { try {
listener(outputStream) listener(stream)
} catch (e: Exception) { } catch (e: Exception) {
throw e throw e
} finally { } finally {
outputStream.flush() stream.flush()
outputStream.close() stream.close()
} }
fileDetails.put(MediaStore.Downloads.IS_PENDING, 0)
resolver.update(contentUri, fileDetails, null, null)
} }
fileDetails.clear()
fileDetails.put(MediaStore.Downloads.IS_PENDING, 0) fileDetails.put(MediaStore.Downloads.IS_PENDING, 0)
resolver.update(contentUri, fileDetails, null, null) resolver.update(contentUri, fileDetails, null, null)