diff --git a/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java index 97df1549b2e..b1ed48ad652 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java @@ -34,6 +34,8 @@ import org.schabi.newpipe.streams.io.StoredFileHelper; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ZipHelper; +import org.schabi.newpipe.local.subscription.services.SubscriptionsExportService; +import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService; import java.io.File; import java.io.IOException; @@ -56,6 +58,13 @@ public class BackupRestoreSettingsFragment extends BasePreferenceFragment { private final ActivityResultLauncher requestExportPathLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), this::requestExportPathResult); + private final ActivityResultLauncher requestExportSubsLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + this::requestExportSubsResult); + + private final ActivityResultLauncher requestImportSubsLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + this::requestImportSubsResult); @Override @@ -123,6 +132,42 @@ ZIP_MIME_TYPE, getImportExportDataUri()), alertDialog.show(); return true; }); + + final Preference exportSubsPreference = findPreference("export_subscriptions"); + if (exportSubsPreference != null) { + exportSubsPreference.setOnPreferenceClickListener(preference -> { + NoFileManagerSafeGuard.launchSafe( + requestExportSubsLauncher, + StoredFileHelper.getNewPicker( + requireContext(), + "newpipe_subscriptions_" + exportDateFormat.format(new Date()) + + ".json", + "application/json", + null + ), + TAG, + getContext() + ); + return true; + }); + } + + final Preference importSubsPreference = findPreference("import_subscriptions"); + if (importSubsPreference != null) { + importSubsPreference.setOnPreferenceClickListener(preference -> { + NoFileManagerSafeGuard.launchSafe( + requestImportSubsLauncher, + StoredFileHelper.getPicker( + requireContext(), + "application/json" + ), + TAG, + getContext() + ); + return true; + }); + } + } private void requestExportPathResult(final ActivityResult result) { @@ -157,6 +202,36 @@ private void requestImportPathResult(final ActivityResult result) { } } + private void requestExportSubsResult(final ActivityResult result) { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + final Uri fileUri = result.getData().getData(); + if (fileUri != null) { + final Intent intent = new Intent( + requireContext(), SubscriptionsExportService.class); + intent.putExtra(SubscriptionsExportService.KEY_FILE_PATH, fileUri); + requireContext().startService(intent); + Toast.makeText(requireContext(), R.string.exporting, Toast.LENGTH_SHORT).show(); + } + } + } + + private void requestImportSubsResult(final ActivityResult result) { + if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { + final Uri fileUri = result.getData().getData(); + if (fileUri != null) { + final Intent intent = new Intent( + requireContext(), SubscriptionsImportService.class); + intent.putExtra( + SubscriptionsImportService.KEY_MODE, + SubscriptionsImportService.PREVIOUS_EXPORT_MODE + ); + intent.putExtra(SubscriptionsImportService.KEY_VALUE, fileUri); + requireContext().startService(intent); + Toast.makeText(requireContext(), R.string.importing, Toast.LENGTH_SHORT).show(); + } + } + } + private void exportDatabase(final StoredFileHelper file, final Uri exportDataUri) { try { //checkpoint before export diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1015dea08e2..466ae58e54a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -862,4 +862,7 @@ Show more Show less The settings in the export being imported use a vulnerable format that was deprecated since NewPipe 0.27.0. Make sure the export being imported is from a trusted source, and prefer using only exports obtained from NewPipe 0.27.0 or newer in the future. Support for importing settings in this vulnerable format will soon be removed completely, and then old versions of NewPipe will not be able to import settings of exports from new versions anymore. + Exporting subscriptions… + Importing subscriptions… + diff --git a/app/src/main/res/xml/backup_restore_settings.xml b/app/src/main/res/xml/backup_restore_settings.xml index ef6a3cde3a6..e967a909e93 100644 --- a/app/src/main/res/xml/backup_restore_settings.xml +++ b/app/src/main/res/xml/backup_restore_settings.xml @@ -22,4 +22,18 @@ android:summary="@string/reset_settings_summary" app:singleLineTitle="false" app:iconSpaceReserved="false" /> + + + + \ No newline at end of file