Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ public void onViewCreated(@NonNull final View view,
}

dialogBinding.fileName.setText(FilenameUtils.createFilename(getContext(),
currentInfo.getName()));
getFileName()));
selectedAudioIndex = ListHelper.getDefaultAudioFormat(getContext(),
getWrappedAudioStreams().getStreamsList());

Expand Down Expand Up @@ -612,7 +612,7 @@ public void onItemSelected(final AdapterView<?> parent,
}

private void onItemSelectedSetFileName() {
final String fileName = FilenameUtils.createFilename(getContext(), currentInfo.getName());
final String fileName = FilenameUtils.createFilename(getContext(), getFileName());
final String prevFileName = Optional.ofNullable(dialogBinding.fileName.getText())
.map(Object::toString)
.orElse("");
Expand Down Expand Up @@ -743,7 +743,24 @@ private String getNameEditText() {
final String str = Objects.requireNonNull(dialogBinding.fileName.getText()).toString()
.trim();

return FilenameUtils.createFilename(context, str.isEmpty() ? currentInfo.getName() : str);
return FilenameUtils.createFilename(context, str.isEmpty() ? getFileName() : str);
}

private String getFileName() {
final SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(context);

final boolean includeUploader = sharedPreferences.getBoolean(
context.getString(R.string.settings_file_name_include_uploader_key), false);

final String name = currentInfo.getName();
if (includeUploader) {
final String uploader = currentInfo.getUploaderName();
if (uploader != null && !uploader.isEmpty()) {
return name + " - " + uploader;
}
}
return name;
}

private void showFailedDialog(@StringRes final int msg) {
Expand Down
28 changes: 28 additions & 0 deletions app/src/main/java/us/shandian/giga/service/DownloadManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

import us.shandian.giga.get.DownloadMission;
import us.shandian.giga.get.FinishedMission;
Expand Down Expand Up @@ -600,12 +601,25 @@ public class MissionIterator extends DiffUtil.Callback {

boolean hasFinished = false;

private boolean filteringEnabled = false;
private String currentFilter = "";

private MissionIterator() {
hidden = new ArrayList<>(2);
current = null;
snapshot = getSpecialItems();
}

public void filter(String query) {
currentFilter = query.trim().toLowerCase(Locale.getDefault());
filteringEnabled = !currentFilter.isEmpty();
}

public void clearFilter() {
currentFilter = "";
filteringEnabled = false;
}

private ArrayList<Object> getSpecialItems() {
synchronized (DownloadManager.this) {
ArrayList<Mission> pending = new ArrayList<>(mMissionsPending);
Expand All @@ -620,6 +634,11 @@ private ArrayList<Object> getSpecialItems() {
return pending.remove(mission) || finished.remove(mission);
});

if (filteringEnabled && currentFilter != null && !currentFilter.isEmpty()) {
pending.removeIf(m -> !matchesFilter(m, currentFilter));
finished.removeIf(m -> !matchesFilter(m, currentFilter));
}

int fakeTotal = pending.size();
if (fakeTotal > 0) fakeTotal++;

Expand All @@ -642,6 +661,11 @@ private ArrayList<Object> getSpecialItems() {
}
}

private boolean matchesFilter(Mission mission, String query) {
String name = mission.storage.getName().toLowerCase(Locale.getDefault());
return name.contains(query);
}

public MissionItem getItem(int position) {
Object object = snapshot.get(position);

Expand Down Expand Up @@ -729,6 +753,10 @@ public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
Object x = snapshot.get(oldItemPosition);
Object y = current.get(newItemPosition);

// Necessary to avoid flickering of headers when filtering
if (x == PENDING && y == PENDING) return true;
if (x == FINISHED && y == FINISHED) return true;

if (x instanceof Mission && y instanceof Mission) {
return ((Mission) x).storage.equals(((Mission) y).storage);
}
Expand Down
37 changes: 31 additions & 6 deletions app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callb
private final View mView;
private final ArrayList<Mission> mHidden;
private Snackbar mSnackbar;
private boolean showButtons = true;

private final CompositeDisposable compositeDisposable = new CompositeDisposable();

Expand Down Expand Up @@ -185,7 +186,7 @@ public void onBindViewHolder(@NonNull ViewHolder view, @SuppressLint("RecyclerVi
str = R.string.missions_header_pending;
} else {
str = R.string.missions_header_finished;
if (mClear != null) mClear.setVisible(true);
if (mClear != null) mClear.setVisible(showButtons);
}

((ViewHolderHeader) view).header.setText(str);
Expand Down Expand Up @@ -727,13 +728,25 @@ private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem opt
}
}

public void filter(String query) {
if (query == null) return;

String currentFilter = query.trim();
if (currentFilter.isEmpty()) {
mIterator.clearFilter();
} else {
mIterator.filter(currentFilter);
}
applyChanges();
}

public void applyChanges() {
mIterator.start();
DiffUtil.calculateDiff(mIterator, true).dispatchUpdatesTo(this);
mIterator.end();

checkEmptyMessageVisibility();
if (mClear != null) mClear.setVisible(mIterator.hasFinishedMissions());
if (mClear != null) mClear.setVisible(showButtons && mIterator.hasFinishedMissions());
}

public void forceUpdate() {
Expand All @@ -753,7 +766,7 @@ public void setLinear(boolean isLinear) {

public void setClearButton(MenuItem clearButton) {
if (mClear == null)
clearButton.setVisible(mIterator.hasFinishedMissions());
clearButton.setVisible(showButtons && mIterator.hasFinishedMissions());

mClear = clearButton;
}
Expand All @@ -767,6 +780,18 @@ public void setMasterButtons(MenuItem startButton, MenuItem pauseButton) {
if (init) checkMasterButtonsVisibility();
}

public void showMenuButtons() {
showButtons = true;
if (mClear != null) mClear.setVisible(mIterator.hasFinishedMissions());
checkMasterButtonsVisibility();
}

public void hideMenuButtons() {
showButtons = false;
if (mClear != null) mClear.setVisible(false);
checkMasterButtonsVisibility();
}

private void checkEmptyMessageVisibility() {
int flag = mIterator.getOldListSize() > 0 ? View.GONE : View.VISIBLE;
if (mEmptyMessage.getVisibility() != flag) mEmptyMessage.setVisibility(flag);
Expand All @@ -775,12 +800,12 @@ private void checkEmptyMessageVisibility() {
public void checkMasterButtonsVisibility() {
boolean[] state = mIterator.hasValidPendingMissions();
Log.d(TAG, "checkMasterButtonsVisibility() running=" + state[0] + " paused=" + state[1]);
setButtonVisible(mPauseButton, state[0]);
setButtonVisible(mStartButton, state[1]);
setButtonVisible(mPauseButton, showButtons && state[0]);
setButtonVisible(mStartButton, showButtons && state[1]);
}

private static void setButtonVisible(MenuItem button, boolean visible) {
if (button.isVisible() != visible)
if (button != null && button.isVisible() != visible)
button.setVisible(visible);
}

Expand Down
Loading