Skip to content

Commit dbd11a6

Browse files
committed
SubscriptionImportWorker: inputs as sealed class
1 parent 21973b3 commit dbd11a6

4 files changed

Lines changed: 96 additions & 57 deletions

File tree

app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import androidx.fragment.app.DialogFragment;
1212
import androidx.fragment.app.Fragment;
1313
import androidx.work.Constraints;
14-
import androidx.work.Data;
1514
import androidx.work.ExistingWorkPolicy;
1615
import androidx.work.NetworkType;
1716
import androidx.work.OneTimeWorkRequest;
@@ -22,31 +21,19 @@
2221
import com.livefront.bridge.Bridge;
2322

2423
import org.schabi.newpipe.R;
24+
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput;
2525
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportWorker;
26-
import org.schabi.newpipe.util.Constants;
2726

2827
public class ImportConfirmationDialog extends DialogFragment {
2928
@State
30-
protected int mode;
31-
@State
32-
protected String value;
33-
@State
34-
protected int serviceId;
29+
protected SubscriptionImportInput input;
3530

36-
public static void show(@NonNull final Fragment fragment, final int mode,
37-
@Nullable final String value, final int serviceId) {
31+
public static void show(@NonNull final Fragment fragment, final SubscriptionImportInput input) {
3832
final var confirmationDialog = new ImportConfirmationDialog();
39-
confirmationDialog.setData(mode, value, serviceId);
33+
confirmationDialog.input = input;
4034
confirmationDialog.show(fragment.getParentFragmentManager(), null);
4135
}
4236

43-
@SuppressWarnings("HiddenField")
44-
public void setData(final int mode, final String value, final int serviceId) {
45-
this.mode = mode;
46-
this.value = value;
47-
this.serviceId = serviceId;
48-
}
49-
5037
@NonNull
5138
@Override
5239
public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
@@ -57,17 +44,12 @@ public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
5744
.setCancelable(true)
5845
.setNegativeButton(R.string.cancel, null)
5946
.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
60-
final var inputData = new Data.Builder()
61-
.putString(SubscriptionImportWorker.KEY_VALUE, value)
62-
.putInt(SubscriptionImportWorker.KEY_MODE, mode)
63-
.putInt(Constants.KEY_SERVICE_ID, serviceId)
64-
.build();
6547
final var constraints = new Constraints.Builder()
6648
.setRequiredNetworkType(NetworkType.CONNECTED)
6749
.build();
6850

6951
final var req = new OneTimeWorkRequest.Builder(SubscriptionImportWorker.class)
70-
.setInputData(inputData)
52+
.setInputData(input.toData())
7153
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
7254
.setConstraints(constraints)
7355
.build();
@@ -85,10 +67,6 @@ public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
8567
public void onCreate(@Nullable final Bundle savedInstanceState) {
8668
super.onCreate(savedInstanceState);
8769

88-
if (mode == 0 && value == null && serviceId == 0) {
89-
throw new IllegalStateException("Input data not provided");
90-
}
91-
9270
Bridge.restoreInstanceState(this, savedInstanceState);
9371
}
9472

app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,10 @@ import org.schabi.newpipe.local.subscription.item.GroupsHeader
4949
import org.schabi.newpipe.local.subscription.item.Header
5050
import org.schabi.newpipe.local.subscription.item.ImportSubscriptionsHintPlaceholderItem
5151
import org.schabi.newpipe.local.subscription.workers.SubscriptionExportWorker
52-
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportWorker
52+
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput
5353
import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard
5454
import org.schabi.newpipe.streams.io.StoredFileHelper
5555
import org.schabi.newpipe.ui.emptystate.setEmptyStateComposable
56-
import org.schabi.newpipe.util.NO_SERVICE_ID
5756
import org.schabi.newpipe.util.NavigationHelper
5857
import org.schabi.newpipe.util.OnClickGesture
5958
import org.schabi.newpipe.util.ServiceHelper
@@ -231,7 +230,7 @@ class SubscriptionFragment : BaseStateFragment<SubscriptionState>() {
231230
val data = result.data?.dataString
232231
if (data != null && result.resultCode == Activity.RESULT_OK) {
233232
ImportConfirmationDialog.show(
234-
this, SubscriptionImportWorker.PREVIOUS_EXPORT_MODE, data, NO_SERVICE_ID
233+
this, SubscriptionImportInput.PreviousExportMode(data)
235234
)
236235
}
237236
}

app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportFragment.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.schabi.newpipe.extractor.NewPipe;
3434
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
3535
import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;
36-
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportWorker;
36+
import org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput;
3737
import org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;
3838
import org.schabi.newpipe.streams.io.StoredFileHelper;
3939
import org.schabi.newpipe.util.Constants;
@@ -164,8 +164,8 @@ private void onImportClicked() {
164164
}
165165

166166
public void onImportUrl(final String value) {
167-
ImportConfirmationDialog.show(this, SubscriptionImportWorker.CHANNEL_URL_MODE, value,
168-
currentServiceId);
167+
ImportConfirmationDialog.show(this,
168+
new SubscriptionImportInput.ChannelUrlMode(currentServiceId, value));
169169
}
170170

171171
public void onImportFile() {
@@ -182,8 +182,8 @@ public void onImportFile() {
182182
private void requestImportFileResult(final ActivityResult result) {
183183
final String data = result.getData() != null ? result.getData().getDataString() : null;
184184
if (result.getResultCode() == Activity.RESULT_OK && data != null) {
185-
ImportConfirmationDialog.show(this, SubscriptionImportWorker.INPUT_STREAM_MODE,
186-
data, currentServiceId);
185+
ImportConfirmationDialog.show(this,
186+
new SubscriptionImportInput.InputStreamMode(currentServiceId, data));
187187
}
188188
}
189189

app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionImportWorker.kt

Lines changed: 84 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package org.schabi.newpipe.local.subscription.workers
33
import android.content.Context
44
import android.content.pm.ServiceInfo
55
import android.os.Build
6+
import android.os.Parcelable
67
import android.webkit.MimeTypeMap
78
import android.widget.Toast
89
import androidx.core.app.NotificationCompat
910
import androidx.core.net.toUri
1011
import androidx.work.CoroutineWorker
12+
import androidx.work.Data
1113
import androidx.work.ForegroundInfo
1214
import androidx.work.WorkManager
1315
import androidx.work.WorkerParameters
@@ -18,12 +20,11 @@ import kotlinx.coroutines.rx3.await
1820
import kotlinx.coroutines.sync.Mutex
1921
import kotlinx.coroutines.sync.withLock
2022
import kotlinx.coroutines.withContext
23+
import kotlinx.parcelize.Parcelize
2124
import org.schabi.newpipe.R
2225
import org.schabi.newpipe.extractor.NewPipe
2326
import org.schabi.newpipe.local.subscription.SubscriptionManager
2427
import org.schabi.newpipe.util.ExtractorHelper
25-
import org.schabi.newpipe.util.KEY_SERVICE_ID
26-
import org.schabi.newpipe.util.NO_SERVICE_ID
2728

2829
class SubscriptionImportWorker(
2930
appContext: Context,
@@ -35,27 +36,29 @@ class SubscriptionImportWorker(
3536
}
3637

3738
override suspend fun doWork(): Result {
38-
val mode = inputData.getInt(KEY_MODE, CHANNEL_URL_MODE)
39-
val serviceId = inputData.getInt(KEY_SERVICE_ID, NO_SERVICE_ID)
40-
val value = inputData.getString(KEY_VALUE)!!
39+
val input = SubscriptionImportInput.fromData(inputData)
4140

4241
val subscriptions = withContext(Dispatchers.IO) {
43-
if (mode == CHANNEL_URL_MODE) {
44-
NewPipe.getService(serviceId).subscriptionExtractor
45-
.fromChannelUrl(value)
46-
.map { SubscriptionItem(it.serviceId, it.url, it.name) }
47-
} else {
48-
applicationContext.contentResolver.openInputStream(value.toUri())?.use {
49-
if (mode == INPUT_STREAM_MODE) {
50-
val contentType = MimeTypeMap.getFileExtensionFromUrl(value).ifEmpty { DEFAULT_MIME }
51-
NewPipe.getService(serviceId).subscriptionExtractor
42+
when (input) {
43+
is SubscriptionImportInput.ChannelUrlMode ->
44+
NewPipe.getService(input.serviceId).subscriptionExtractor
45+
.fromChannelUrl(input.url)
46+
.map { SubscriptionItem(it.serviceId, it.url, it.name) }
47+
48+
is SubscriptionImportInput.InputStreamMode ->
49+
applicationContext.contentResolver.openInputStream(input.url.toUri())?.use {
50+
val contentType =
51+
MimeTypeMap.getFileExtensionFromUrl(input.url).ifEmpty { DEFAULT_MIME }
52+
NewPipe.getService(input.serviceId).subscriptionExtractor
5253
.fromInputStream(it, contentType)
5354
.map { SubscriptionItem(it.serviceId, it.url, it.name) }
54-
} else {
55+
}
56+
57+
is SubscriptionImportInput.PreviousExportMode ->
58+
applicationContext.contentResolver.openInputStream(input.url.toUri())?.use {
5559
ImportExportJsonHelper.readFrom(it)
5660
}
57-
} ?: emptyList()
58-
}
61+
} ?: emptyList()
5962
}
6063

6164
val mutex = Mutex()
@@ -146,10 +149,69 @@ class SubscriptionImportWorker(
146149
private const val BUFFER_COUNT_BEFORE_INSERT = 50
147150

148151
const val WORK_NAME = "SubscriptionImportWorker"
149-
const val CHANNEL_URL_MODE = 0
150-
const val INPUT_STREAM_MODE = 1
151-
const val PREVIOUS_EXPORT_MODE = 2
152-
const val KEY_MODE = "key_mode"
153-
const val KEY_VALUE = "key_value"
152+
}
153+
}
154+
155+
sealed class SubscriptionImportInput : Parcelable {
156+
@Parcelize
157+
data class ChannelUrlMode(val serviceId: Int, val url: String) : SubscriptionImportInput()
158+
@Parcelize
159+
data class InputStreamMode(val serviceId: Int, val url: String) : SubscriptionImportInput()
160+
@Parcelize
161+
data class PreviousExportMode(val url: String) : SubscriptionImportInput()
162+
163+
fun toData(): Data {
164+
return when (this) {
165+
is ChannelUrlMode -> Data.Builder()
166+
.putInt("mode", CHANNEL_URL_MODE)
167+
.putInt("service_id", serviceId)
168+
.putString("url", url)
169+
.build()
170+
is InputStreamMode ->
171+
Data.Builder()
172+
.putInt("mode", INPUT_STREAM_MODE)
173+
.putInt("service_id", serviceId)
174+
.putString("url", url)
175+
.build()
176+
is PreviousExportMode ->
177+
Data.Builder()
178+
.putInt("mode", PREVIOUS_EXPORT_MODE)
179+
.putString("url", url)
180+
.build()
181+
}
182+
}
183+
184+
companion object {
185+
186+
private const val CHANNEL_URL_MODE = 0
187+
private const val INPUT_STREAM_MODE = 1
188+
private const val PREVIOUS_EXPORT_MODE = 2
189+
190+
fun fromData(data: Data): SubscriptionImportInput {
191+
val mode = data.getInt("mode", PREVIOUS_EXPORT_MODE)
192+
when (mode) {
193+
CHANNEL_URL_MODE -> {
194+
val serviceId = data.getInt("service_id", -1)
195+
if (serviceId == -1) {
196+
throw IllegalArgumentException("No service id provided")
197+
}
198+
val url = data.getString("url")!!
199+
return ChannelUrlMode(serviceId, url)
200+
}
201+
INPUT_STREAM_MODE -> {
202+
val serviceId = data.getInt("service_id", -1)
203+
if (serviceId == -1) {
204+
throw IllegalArgumentException("No service id provided")
205+
}
206+
val url = data.getString("url")!!
207+
return InputStreamMode(serviceId, url)
208+
}
209+
PREVIOUS_EXPORT_MODE -> {
210+
val url = data.getString("url")!!
211+
return PreviousExportMode(url)
212+
}
213+
else -> throw IllegalArgumentException("Unknown mode: $mode")
214+
}
215+
}
154216
}
155217
}

0 commit comments

Comments
 (0)