mirror of
https://codeberg.org/gitnex/GitNex.git
synced 2023-12-13 20:50:18 +01:00
57ce453661
Merge branch 'master' of https://codeberg.org/gitnex/GitNex into fix-path-encoding-issues Fixing bug where path separators would be URL encoded. Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/832 Reviewed-by: M M Arif <mmarif@noreply.codeberg.org> Co-Authored-By: opyale <opyale@noreply.codeberg.org> Co-Committed-By: opyale <opyale@noreply.codeberg.org>
137 lines
2.2 KiB
Java
137 lines
2.2 KiB
Java
package org.mian.gitnex.helpers;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.net.URLEncoder;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.StringJoiner;
|
|
|
|
/**
|
|
* @author opyale
|
|
*/
|
|
|
|
public class Path {
|
|
|
|
private final List<String> segments;
|
|
private final List<OnChangedListener> onChangedListeners;
|
|
|
|
public Path(String... segments) {
|
|
|
|
this.segments = new ArrayList<>(Arrays.asList(segments));
|
|
this.onChangedListeners = new ArrayList<>();
|
|
|
|
}
|
|
|
|
public interface OnChangedListener { void onChanged(); }
|
|
|
|
public Path addListener(OnChangedListener onChangedListener) {
|
|
|
|
onChangedListeners.add(onChangedListener);
|
|
return this;
|
|
|
|
}
|
|
|
|
public Path removeListener(OnChangedListener onChangedListener) {
|
|
|
|
onChangedListeners.remove(onChangedListener);
|
|
return this;
|
|
|
|
}
|
|
|
|
private void pathChanged() {
|
|
|
|
for(OnChangedListener onChangedListener : onChangedListeners) {
|
|
onChangedListener.onChanged();
|
|
}
|
|
}
|
|
|
|
public Path add(String segment) {
|
|
|
|
if(segment != null && !segment.trim().isEmpty()) {
|
|
|
|
try {
|
|
segments.add(URLEncoder.encode(segment, "UTF-8"));
|
|
} catch(UnsupportedEncodingException ignored) {}
|
|
}
|
|
|
|
pathChanged();
|
|
return this;
|
|
|
|
}
|
|
|
|
public int size() {
|
|
|
|
return segments.size();
|
|
}
|
|
|
|
public Path join(Path path) {
|
|
|
|
this.segments.addAll(path.segments);
|
|
|
|
pathChanged();
|
|
return this;
|
|
|
|
}
|
|
|
|
public Path pop(int count) {
|
|
|
|
for(int i=0; i<count; i++)
|
|
segments.remove(segments.size() - 1);
|
|
|
|
pathChanged();
|
|
return this;
|
|
|
|
}
|
|
|
|
public Path remove(int index) {
|
|
|
|
segments.remove(index);
|
|
pathChanged();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
public Path clear() {
|
|
|
|
segments.clear();
|
|
pathChanged();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
public String[] segments() {
|
|
|
|
return segments.toArray(new String[]{});
|
|
}
|
|
|
|
public static Path of(String path) {
|
|
|
|
String[] parsed_segments = path.split("/");
|
|
|
|
return new Path(
|
|
Arrays
|
|
.stream(parsed_segments)
|
|
.filter(s -> !s.trim().isEmpty())
|
|
.toArray(String[]::new)
|
|
);
|
|
|
|
}
|
|
|
|
@NonNull
|
|
@Override
|
|
public String toString() {
|
|
|
|
StringJoiner stringJoiner = new StringJoiner("/");
|
|
|
|
for(String segment : segments)
|
|
stringJoiner.add(segment);
|
|
|
|
return stringJoiner.toString();
|
|
|
|
}
|
|
|
|
}
|