Skip to content

Commit a0a3909

Browse files
settings: add UI options to import/export subscriptions
1 parent 8c4a789 commit a0a3909

3 files changed

Lines changed: 92 additions & 0 deletions

File tree

app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import org.schabi.newpipe.streams.io.StoredFileHelper;
3535
import org.schabi.newpipe.util.NavigationHelper;
3636
import org.schabi.newpipe.util.ZipHelper;
37+
import org.schabi.newpipe.local.subscription.services.SubscriptionsExportService;
38+
import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService;
3739

3840
import java.io.File;
3941
import java.io.IOException;
@@ -56,6 +58,13 @@ public class BackupRestoreSettingsFragment extends BasePreferenceFragment {
5658
private final ActivityResultLauncher<Intent> requestExportPathLauncher =
5759
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
5860
this::requestExportPathResult);
61+
private final ActivityResultLauncher<Intent> requestExportSubsLauncher =
62+
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
63+
this::requestExportSubsResult);
64+
65+
private final ActivityResultLauncher<Intent> requestImportSubsLauncher =
66+
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
67+
this::requestImportSubsResult);
5968

6069

6170
@Override
@@ -123,6 +132,42 @@ ZIP_MIME_TYPE, getImportExportDataUri()),
123132
alertDialog.show();
124133
return true;
125134
});
135+
136+
final Preference exportSubsPreference = findPreference("export_subscriptions");
137+
if (exportSubsPreference != null) {
138+
exportSubsPreference.setOnPreferenceClickListener(preference -> {
139+
NoFileManagerSafeGuard.launchSafe(
140+
requestExportSubsLauncher,
141+
StoredFileHelper.getNewPicker(
142+
requireContext(),
143+
"newpipe_subscriptions_" + exportDateFormat.format(new Date())
144+
+ ".json",
145+
"application/json",
146+
null
147+
),
148+
TAG,
149+
getContext()
150+
);
151+
return true;
152+
});
153+
}
154+
155+
final Preference importSubsPreference = findPreference("import_subscriptions");
156+
if (importSubsPreference != null) {
157+
importSubsPreference.setOnPreferenceClickListener(preference -> {
158+
NoFileManagerSafeGuard.launchSafe(
159+
requestImportSubsLauncher,
160+
StoredFileHelper.getPicker(
161+
requireContext(),
162+
"application/json"
163+
),
164+
TAG,
165+
getContext()
166+
);
167+
return true;
168+
});
169+
}
170+
126171
}
127172

128173
private void requestExportPathResult(final ActivityResult result) {
@@ -157,6 +202,36 @@ private void requestImportPathResult(final ActivityResult result) {
157202
}
158203
}
159204

205+
private void requestExportSubsResult(final ActivityResult result) {
206+
if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
207+
final Uri fileUri = result.getData().getData();
208+
if (fileUri != null) {
209+
final Intent intent = new Intent(
210+
requireContext(), SubscriptionsExportService.class);
211+
intent.putExtra(SubscriptionsExportService.KEY_FILE_PATH, fileUri);
212+
requireContext().startService(intent);
213+
Toast.makeText(requireContext(), R.string.exporting, Toast.LENGTH_SHORT).show();
214+
}
215+
}
216+
}
217+
218+
private void requestImportSubsResult(final ActivityResult result) {
219+
if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
220+
final Uri fileUri = result.getData().getData();
221+
if (fileUri != null) {
222+
final Intent intent = new Intent(
223+
requireContext(), SubscriptionsImportService.class);
224+
intent.putExtra(
225+
SubscriptionsImportService.KEY_MODE,
226+
SubscriptionsImportService.PREVIOUS_EXPORT_MODE
227+
);
228+
intent.putExtra(SubscriptionsImportService.KEY_VALUE, fileUri);
229+
requireContext().startService(intent);
230+
Toast.makeText(requireContext(), R.string.importing, Toast.LENGTH_SHORT).show();
231+
}
232+
}
233+
}
234+
160235
private void exportDatabase(final StoredFileHelper file, final Uri exportDataUri) {
161236
try {
162237
//checkpoint before export

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,4 +862,7 @@
862862
<string name="show_more">Show more</string>
863863
<string name="show_less">Show less</string>
864864
<string name="import_settings_vulnerable_format">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.</string>
865+
<string name="exporting">Exporting subscriptions…</string>
866+
<string name="importing">Importing subscriptions…</string>
867+
865868
</resources>

app/src/main/res/xml/backup_restore_settings.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,18 @@
2222
android:summary="@string/reset_settings_summary"
2323
app:singleLineTitle="false"
2424
app:iconSpaceReserved="false" />
25+
26+
<Preference
27+
android:key="export_subscriptions"
28+
android:title="Export subscriptions"
29+
android:summary="Export your subscriptions to a .json file"
30+
app:singleLineTitle="false"
31+
app:iconSpaceReserved="false" />
32+
33+
<Preference
34+
android:key="import_subscriptions"
35+
android:title="Import subscriptions"
36+
android:summary="Import subscriptions from a previous .json export"
37+
app:singleLineTitle="false"
38+
app:iconSpaceReserved="false" />
2539
</PreferenceScreen>

0 commit comments

Comments
 (0)