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:
LucasGGamerM
2023-06-21 15:50:10 -03:00
43 changed files with 3253 additions and 99 deletions

View File

@@ -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),