Merge remote-tracking branch 'megalodon_main/main'
# Conflicts: # mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java # mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java
This commit is contained in:
@@ -3,6 +3,7 @@ package org.joinmastodon.android.model;
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -21,6 +22,7 @@ import org.joinmastodon.android.fragments.discover.BubbleTimelineFragment;
|
||||
import org.joinmastodon.android.fragments.discover.FederatedTimelineFragment;
|
||||
import org.joinmastodon.android.fragments.discover.LocalTimelineFragment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -36,6 +38,10 @@ public class TimelineDefinition {
|
||||
|
||||
private @Nullable String domain;
|
||||
private @Nullable String hashtagName;
|
||||
private @Nullable List<String> hashtagAny;
|
||||
private @Nullable List<String> hashtagAll;
|
||||
private @Nullable List<String> hashtagNone;
|
||||
private boolean hashtagLocalOnly;
|
||||
|
||||
public static TimelineDefinition ofList(String listId, String listTitle, boolean listIsExclusive) {
|
||||
TimelineDefinition def = new TimelineDefinition(TimelineType.LIST);
|
||||
@@ -88,10 +94,50 @@ public class TimelineDefinition {
|
||||
return title;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getHashtagName() {
|
||||
return hashtagName;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public List<String> getHashtagAny() {
|
||||
return hashtagAny;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public List<String> getHashtagAll() {
|
||||
return hashtagAll;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public List<String> getHashtagNone() {
|
||||
return hashtagNone;
|
||||
}
|
||||
|
||||
public boolean isHashtagLocalOnly() {
|
||||
return hashtagLocalOnly;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title == null || title.isBlank() ? null : title;
|
||||
}
|
||||
|
||||
private List<String> sanitizeTagList(List<String> tags) {
|
||||
return tags.stream()
|
||||
.map(String::trim)
|
||||
.filter(str -> !TextUtils.isEmpty(str))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public void setTagOptions(String main, List<String> any, List<String> all, List<String> none, boolean localOnly) {
|
||||
this.hashtagName = main;
|
||||
this.hashtagAny = sanitizeTagList(any);
|
||||
this.hashtagAll = sanitizeTagList(all);
|
||||
this.hashtagNone = sanitizeTagList(none);
|
||||
this.hashtagLocalOnly = localOnly;
|
||||
}
|
||||
|
||||
|
||||
public String getDefaultTitle(Context ctx) {
|
||||
return switch (type) {
|
||||
case HOME -> ctx.getString(R.string.sk_timeline_home);
|
||||
@@ -152,19 +198,18 @@ public class TimelineDefinition {
|
||||
TimelineDefinition that = (TimelineDefinition) o;
|
||||
if (type != that.type) return false;
|
||||
if (type == TimelineType.LIST) return Objects.equals(listId, that.listId);
|
||||
if (type == TimelineType.HASHTAG) return Objects.equals(hashtagName.toLowerCase(), that.hashtagName.toLowerCase());
|
||||
if (type == TimelineType.CUSTOM_LOCAL_TIMELINE) return Objects.equals(domain.toLowerCase(), that.domain.toLowerCase());
|
||||
if (type == TimelineType.HASHTAG) {
|
||||
if (hashtagName == null && that.hashtagName == null) return true;
|
||||
if (hashtagName == null || that.hashtagName == null) return false;
|
||||
return Objects.equals(hashtagName.toLowerCase(), that.hashtagName.toLowerCase());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = type.ordinal();
|
||||
result = 31 * result + (listId != null ? listId.hashCode() : 0);
|
||||
result = 31 * result + (hashtagName.toLowerCase() != null ? hashtagName.toLowerCase().hashCode() : 0);
|
||||
result = 31 * result + (domain.toLowerCase() != null ? domain.toLowerCase().hashCode() : 0);
|
||||
|
||||
return result;
|
||||
return Objects.hash(type, title, listId, hashtagName, hashtagAny, hashtagAll, hashtagNone);
|
||||
}
|
||||
|
||||
public TimelineDefinition copy() {
|
||||
@@ -175,6 +220,9 @@ public class TimelineDefinition {
|
||||
def.listIsExclusive = listIsExclusive;
|
||||
def.hashtagName = hashtagName;
|
||||
def.domain = domain;
|
||||
def.hashtagAny = hashtagAny;
|
||||
def.hashtagAll = hashtagAll;
|
||||
def.hashtagNone = hashtagNone;
|
||||
def.icon = icon == null ? null : Icon.values()[icon.ordinal()];
|
||||
return def;
|
||||
}
|
||||
@@ -186,6 +234,10 @@ public class TimelineDefinition {
|
||||
args.putBoolean("listIsExclusive", listIsExclusive);
|
||||
} else if (type == TimelineType.HASHTAG) {
|
||||
args.putString("hashtag", hashtagName);
|
||||
args.putBoolean("localOnly", hashtagLocalOnly);
|
||||
args.putStringArrayList("any", hashtagAny == null ? new ArrayList<>() : new ArrayList<>(hashtagAny));
|
||||
args.putStringArrayList("all", hashtagAll == null ? new ArrayList<>() : new ArrayList<>(hashtagAll));
|
||||
args.putStringArrayList("none", hashtagNone == null ? new ArrayList<>() : new ArrayList<>(hashtagNone));
|
||||
} else if (type == TimelineType.CUSTOM_LOCAL_TIMELINE) {
|
||||
args.putString("domain", domain);
|
||||
}
|
||||
@@ -250,6 +302,13 @@ public class TimelineDefinition {
|
||||
GAUGE(R.drawable.ic_fluent_gauge_24_regular, R.string.sk_icon_gauge),
|
||||
HEADPHONES(R.drawable.ic_fluent_headphones_sound_wave_24_regular, R.string.sk_icon_headphones),
|
||||
HUMAN(R.drawable.ic_fluent_accessibility_24_regular, R.string.sk_icon_human),
|
||||
BEAKER(R.drawable.ic_fluent_beaker_24_regular, R.string.sk_icon_beaker),
|
||||
BED(R.drawable.ic_fluent_bed_24_regular, R.string.sk_icon_bed),
|
||||
RECYCLE_BIN(R.drawable.ic_fluent_bin_recycle_24_regular, R.string.sk_icon_recycle_bin),
|
||||
VERIFIED(R.drawable.ic_fluent_checkmark_starburst_24_regular, R.string.sk_icon_verified),
|
||||
DOCTOR(R.drawable.ic_fluent_doctor_24_regular, R.string.sk_icon_doctor),
|
||||
DIAMOND(R.drawable.ic_fluent_premium_24_regular, R.string.sk_icon_diamond),
|
||||
UMBRELLA(R.drawable.ic_fluent_umbrella_24_regular, R.string.sk_icon_umbrella),
|
||||
|
||||
HOME(R.drawable.ic_fluent_home_24_regular, R.string.sk_timeline_home, true),
|
||||
LOCAL(R.drawable.ic_fluent_people_community_24_regular, R.string.sk_timeline_local, true),
|
||||
|
||||
Reference in New Issue
Block a user