Skip to content

Commit 80fd46a

Browse files
Merge branch 'ShareASmile:dev' into reapply-local-list-header-fix-by-j-haldane
2 parents 738338d + 77d62de commit 80fd46a

File tree

109 files changed

+1330
-1238
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+1330
-1238
lines changed

.github/workflows/backport-pr.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: Backport merged pull request
2+
on:
3+
issue_comment:
4+
types: [created]
5+
permissions:
6+
contents: write # for comment creation on original PR
7+
pull-requests: write
8+
jobs:
9+
backport:
10+
name: Backport pull request
11+
runs-on: ubuntu-latest
12+
13+
# Only run when the comment starts with the `/backport` command on a PR and
14+
# the commenter has write access to the repository. We do not want to allow
15+
# everybody to trigger backports and create branches in our repository.
16+
if: >
17+
github.event.issue.pull_request &&
18+
startsWith(github.event.comment.body, '/backport ') &&
19+
(
20+
github.event.comment.author_association == 'OWNER' ||
21+
github.event.comment.author_association == 'COLLABORATOR' ||
22+
github.event.comment.author_association == 'MEMBER'
23+
)
24+
steps:
25+
- uses: actions/checkout@v4
26+
- name: Get backport metadata
27+
# the target branch is the first argument after `/backport`
28+
run: |
29+
set -euo pipefail
30+
body="${{ github.event.comment.body }}"
31+
32+
line=${body%%$'\n'*} # Get the first line
33+
if [[ $line =~ ^/backport[[:space:]]+([^[:space:]]+) ]]; then
34+
echo "BACKPORT_TARGET=${BASH_REMATCH[1]}" >> "$GITHUB_ENV"
35+
else
36+
echo "Usage: /backport <target-branch>" >&2
37+
exit 1
38+
fi
39+
40+
- name: Create backport pull request
41+
uses: korthout/backport-action@v4
42+
with:
43+
add_labels: 'backport'
44+
copy_labels_pattern: '.*'
45+
label_pattern: ''
46+
target_branches: ${{ env.BACKPORT_TARGET }}

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ android {
4242
minSdk = 21
4343
targetSdk = 35
4444

45-
versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1005
45+
versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1006
4646

47-
versionName = "0.28.0"
47+
versionName = "0.28.1"
4848
System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it }
4949

5050
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

app/proguard-rules.pro

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
-dontwarn javax.script.**
1717
-keep class jdk.dynalink.** { *; }
1818
-dontwarn jdk.dynalink.**
19+
# Rules for jsoup
20+
# Ignore intended-to-be-optional re2j classes - only needed if using re2j for jsoup regex
21+
# jsoup safely falls back to JDK regex if re2j not on classpath, but has concrete re2j refs
22+
# See https://github.com/jhy/jsoup/issues/2459 - may be resolved in future, then this may be removed
23+
-dontwarn com.google.re2j.**
1924

2025
## Rules for ExoPlayer
2126
-keep class com.google.android.exoplayer2.** { *; }

app/src/main/java/org/schabi/newpipe/database/Migrations.kt

Lines changed: 285 additions & 301 deletions
Large diffs are not rendered by default.

app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,7 @@ private void continueSelectedDownload(@NonNull final StoredFileHelper storage) {
11331133
}
11341134

11351135
DownloadManagerService.startMission(context, urls, storage, kind, threads,
1136-
currentInfo.getUrl(), psName, psArgs, nearLength, new ArrayList<>(recoveryInfo));
1136+
currentInfo, psName, psArgs, nearLength, new ArrayList<>(recoveryInfo));
11371137

11381138
Toast.makeText(context, getString(R.string.download_has_started),
11391139
Toast.LENGTH_SHORT).show();

app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.schabi.newpipe.local.bookmark;
22

33
import static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMergedOrderedPlaylists;
4+
import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout;
45

56
import android.content.DialogInterface;
67
import android.os.Bundle;
@@ -417,10 +418,11 @@ public void saveImmediate() {
417418
}
418419

419420
private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
420-
// if adding grid layout, also include ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
421-
// with an `if (shouldUseGridLayout()) ...`
422-
return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
423-
ItemTouchHelper.ACTION_STATE_IDLE) {
421+
int directions = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
422+
if (shouldUseGridLayout(requireContext())) {
423+
directions |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
424+
}
425+
return new ItemTouchHelper.SimpleCallback(directions, ItemTouchHelper.ACTION_STATE_IDLE) {
424426
@Override
425427
public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView,
426428
final int viewSize,

app/src/main/java/org/schabi/newpipe/local/history/HistoryEntryAdapter.java

Lines changed: 0 additions & 108 deletions
This file was deleted.

app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
111111
private MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter = null;
112112

113113
public static LocalPlaylistFragment getInstance(final long playlistId, final String name) {
114-
final LocalPlaylistFragment instance = new LocalPlaylistFragment();
114+
final var instance = new LocalPlaylistFragment();
115115
instance.setInitialData(playlistId, name);
116116
return instance;
117117
}
@@ -180,9 +180,8 @@ protected void initListeners() {
180180
itemListAdapter.setSelectedListener(new OnClickGesture<>() {
181181
@Override
182182
public void selected(final LocalItem selectedItem) {
183-
if (selectedItem instanceof PlaylistStreamEntry) {
184-
final StreamEntity item =
185-
((PlaylistStreamEntry) selectedItem).getStreamEntity();
183+
if (selectedItem instanceof PlaylistStreamEntry entry) {
184+
final StreamEntity item = entry.getStreamEntity();
186185
NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),
187186
item.getServiceId(), item.getUrl(), item.getTitle(), null, false);
188187
}
@@ -496,6 +495,7 @@ public void removeWatchedStreams(final boolean removePartiallyWatched) {
496495
itemListAdapter.clearStreamItemList();
497496
itemListAdapter.addItems(itemsToKeep);
498497
debounceSaver.setHasChangesToSave();
498+
saveImmediate();
499499

500500
if (thumbnailVideoRemoved) {
501501
updateThumbnailUrl();
@@ -560,8 +560,7 @@ private void createRenameDialog() {
560560
return;
561561
}
562562

563-
final DialogEditTextBinding dialogBinding =
564-
DialogEditTextBinding.inflate(getLayoutInflater());
563+
final var dialogBinding = DialogEditTextBinding.inflate(getLayoutInflater());
565564
dialogBinding.dialogEditText.setHint(R.string.name);
566565
dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT);
567566
dialogBinding.dialogEditText.setSelection(dialogBinding.dialogEditText.getText().length());
@@ -667,6 +666,7 @@ private void removeDuplicatesInPlaylist() {
667666
itemListAdapter.addItems(itemsToKeep);
668667
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
669668
debounceSaver.setHasChangesToSave();
669+
saveImmediate();
670670

671671
hideLoading();
672672
isRewritingPlaylist = false;
@@ -686,6 +686,7 @@ private void deleteItem(final PlaylistStreamEntry item) {
686686

687687
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
688688
debounceSaver.setHasChangesToSave();
689+
saveImmediate();
689690
}
690691

691692
/**
@@ -708,8 +709,8 @@ public void saveImmediate() {
708709
final List<LocalItem> items = itemListAdapter.getItemsList();
709710
final List<Long> streamIds = new ArrayList<>(items.size());
710711
for (final LocalItem item : items) {
711-
if (item instanceof PlaylistStreamEntry) {
712-
streamIds.add(((PlaylistStreamEntry) item).getStreamId());
712+
if (item instanceof PlaylistStreamEntry entry) {
713+
streamIds.add(entry.getStreamId());
713714
}
714715
}
715716

@@ -771,6 +772,13 @@ public boolean onMove(@NonNull final RecyclerView recyclerView,
771772
return isSwapped;
772773
}
773774

775+
@Override
776+
public void clearView(@NonNull final RecyclerView recyclerView,
777+
@NonNull final RecyclerView.ViewHolder viewHolder) {
778+
super.clearView(recyclerView, viewHolder);
779+
saveImmediate();
780+
}
781+
774782
@Override
775783
public boolean isLongPressDragEnabled() {
776784
return false;

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

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,23 @@
1010
import androidx.fragment.app.DialogFragment;
1111
import androidx.fragment.app.Fragment;
1212

13-
import com.evernote.android.state.State;
1413
import com.livefront.bridge.Bridge;
1514

1615
import org.schabi.newpipe.R;
1716

1817
public class ImportConfirmationDialog extends DialogFragment {
19-
@State
2018
protected Intent resultServiceIntent;
19+
private static final String EXTRA_RESULT_SERVICE_INTENT = "extra_result_service_intent";
2120

2221
public static void show(@NonNull final Fragment fragment,
2322
@NonNull final Intent resultServiceIntent) {
2423
final ImportConfirmationDialog confirmationDialog = new ImportConfirmationDialog();
25-
confirmationDialog.setResultServiceIntent(resultServiceIntent);
24+
final Bundle args = new Bundle();
25+
args.putParcelable(EXTRA_RESULT_SERVICE_INTENT, resultServiceIntent);
26+
confirmationDialog.setArguments(args);
2627
confirmationDialog.show(fragment.getParentFragmentManager(), null);
2728
}
2829

29-
public void setResultServiceIntent(final Intent resultServiceIntent) {
30-
this.resultServiceIntent = resultServiceIntent;
31-
}
32-
3330
@NonNull
3431
@Override
3532
public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
@@ -38,9 +35,7 @@ public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
3835
.setCancelable(true)
3936
.setNegativeButton(R.string.cancel, null)
4037
.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
41-
if (resultServiceIntent != null && getContext() != null) {
42-
getContext().startService(resultServiceIntent);
43-
}
38+
requireContext().startService(resultServiceIntent);
4439
dismiss();
4540
})
4641
.create();
@@ -50,11 +45,7 @@ public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {
5045
public void onCreate(@Nullable final Bundle savedInstanceState) {
5146
super.onCreate(savedInstanceState);
5247

53-
if (resultServiceIntent == null) {
54-
throw new IllegalStateException("Result intent is null");
55-
}
56-
57-
Bridge.restoreInstanceState(this, savedInstanceState);
48+
resultServiceIntent = requireArguments().getParcelable(EXTRA_RESULT_SERVICE_INTENT);
5849
}
5950

6051
@Override

app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
2323
import io.reactivex.rxjava3.core.BackpressureStrategy;
2424
import io.reactivex.rxjava3.core.Flowable;
25-
import io.reactivex.rxjava3.subjects.BehaviorSubject;
25+
import io.reactivex.rxjava3.subjects.PublishSubject;
2626

2727
/**
2828
* PlayQueue is responsible for keeping track of a list of streams and the index of
@@ -45,7 +45,7 @@ public abstract class PlayQueue implements Serializable {
4545
private List<PlayQueueItem> backup;
4646
private List<PlayQueueItem> streams;
4747

48-
private transient BehaviorSubject<PlayQueueEvent> eventBroadcast;
48+
private transient PublishSubject<PlayQueueEvent> eventBroadcast;
4949
private transient Flowable<PlayQueueEvent> broadcastReceiver;
5050
private transient boolean disposed = false;
5151

@@ -70,7 +70,7 @@ public abstract class PlayQueue implements Serializable {
7070
* </p>
7171
*/
7272
public void init() {
73-
eventBroadcast = BehaviorSubject.create();
73+
eventBroadcast = PublishSubject.create();
7474

7575
broadcastReceiver = eventBroadcast.toFlowable(BackpressureStrategy.BUFFER)
7676
.observeOn(AndroidSchedulers.mainThread())

0 commit comments

Comments
 (0)