Merge branch 'merge-upstream'
# Conflicts: # mastodon/build.gradle # mastodon/src/androidTest/java/org/joinmastodon/android/utils/StatusFilterPredicateTest.java # mastodon/src/main/java/org/joinmastodon/android/ExternalShareActivity.java # mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java # mastodon/src/main/java/org/joinmastodon/android/MainActivity.java # mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java # mastodon/src/main/java/org/joinmastodon/android/api/MastodonAPIController.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/AddAccountsToList.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/CreateList.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/DeleteList.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/GetList.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/GetLists.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/RemoveAccountsFromList.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/UpdateList.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/GetStatusEditHistory.java # mastodon/src/main/java/org/joinmastodon/android/api/requests/timelines/GetPublicTimeline.java # mastodon/src/main/java/org/joinmastodon/android/api/session/AccountLocalPreferences.java # mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java # mastodon/src/main/java/org/joinmastodon/android/events/ListDeletedEvent.java # mastodon/src/main/java/org/joinmastodon/android/events/ListUpdatedCreatedEvent.java # mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/CustomLocalTimelineFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/ListsFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/PaginatedAccountListFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/discover/FederatedTimelineFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsAboutAppFragment.java # mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsMainFragment.java # mastodon/src/main/java/org/joinmastodon/android/model/Status.java # mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java # mastodon/src/main/java/org/joinmastodon/android/model/viewmodel/AccountViewModel.java # mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ExtendedFooterStatusDisplayItem.java # mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java # mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java # mastodon/src/main/java/org/joinmastodon/android/ui/photoviewer/PhotoViewer.java # mastodon/src/main/java/org/joinmastodon/android/ui/sheets/AccountSwitcherSheet.java # mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java # mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java # mastodon/src/main/java/org/joinmastodon/android/ui/utils/ActionModeHelper.java # mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java # mastodon/src/main/java/org/joinmastodon/android/ui/viewcontrollers/ComposeLanguageAlertViewController.java # mastodon/src/main/java/org/joinmastodon/android/ui/viewholders/AccountViewHolder.java # mastodon/src/main/java/org/joinmastodon/android/ui/views/ListEditor.java # mastodon/src/main/res/drawable/fg_link_card.xml # mastodon/src/main/res/drawable/ic_arrow_drop_down_24px.xml # mastodon/src/main/res/drawable/ic_arrow_right_24px.xml # mastodon/src/main/res/drawable/ic_arrow_upward_24px.xml # mastodon/src/main/res/drawable/ic_bookmark_fill1_24px.xml # mastodon/src/main/res/drawable/ic_boost_24px.xml # mastodon/src/main/res/drawable/ic_boost_private.xml # mastodon/src/main/res/drawable/ic_help_24px.xml # mastodon/src/main/res/drawable/ic_info_fill1_24px.xml # mastodon/src/main/res/drawable/ic_m3_cancel.xml # mastodon/src/main/res/layout/display_item_extended_footer.xml # mastodon/src/main/res/layout/display_item_link_card.xml # mastodon/src/main/res/layout/fragment_onboarding_follow_suggestions.xml # mastodon/src/main/res/layout/fragment_onboarding_profile_setup.xml # mastodon/src/main/res/layout/home_toolbar.xml # mastodon/src/main/res/layout/item_discover_account.xml # mastodon/src/main/res/layout/item_generic_list_content.xml # mastodon/src/main/res/menu/post.xml # mastodon/src/main/res/menu/profile.xml # mastodon/src/main/res/values-ar-rSA/strings.xml # mastodon/src/main/res/values-be-rBY/strings.xml # mastodon/src/main/res/values-ca-rES/strings.xml # mastodon/src/main/res/values-cs-rCZ/strings.xml # mastodon/src/main/res/values-da-rDK/strings.xml # mastodon/src/main/res/values-eu-rES/strings.xml # mastodon/src/main/res/values-fa-rIR/strings.xml # mastodon/src/main/res/values-fi-rFI/strings.xml # mastodon/src/main/res/values-fil-rPH/strings.xml # mastodon/src/main/res/values-fr-rFR/strings.xml # mastodon/src/main/res/values-gd-rGB/strings.xml # mastodon/src/main/res/values-gl-rES/strings.xml # mastodon/src/main/res/values-hu-rHU/strings.xml # mastodon/src/main/res/values-hy-rAM/strings.xml # mastodon/src/main/res/values-in-rID/strings.xml # mastodon/src/main/res/values-is-rIS/strings.xml # mastodon/src/main/res/values-it-rIT/strings.xml # mastodon/src/main/res/values-ja-rJP/strings.xml # mastodon/src/main/res/values-kab/strings.xml # mastodon/src/main/res/values-ko-rKR/strings.xml # mastodon/src/main/res/values-nl-rNL/strings.xml # mastodon/src/main/res/values-pl-rPL/strings.xml # mastodon/src/main/res/values-pt-rBR/strings.xml # mastodon/src/main/res/values-pt-rPT/strings.xml # mastodon/src/main/res/values-ro-rRO/strings.xml # mastodon/src/main/res/values-ru-rRU/strings.xml # mastodon/src/main/res/values-sl-rSI/strings.xml # mastodon/src/main/res/values-sv-rSE/strings.xml # mastodon/src/main/res/values-tr-rTR/strings.xml # mastodon/src/main/res/values-uk-rUA/strings.xml # mastodon/src/main/res/values-zh-rCN/strings.xml # mastodon/src/main/res/values/attrs.xml # mastodon/src/main/res/values/palettes.xml # mastodon/src/main/res/values/strings.xml # mastodon/src/main/res/values/styles.xml
This commit is contained in:
@@ -12,6 +12,7 @@ import org.joinmastodon.android.ui.utils.BlurHashDecoder;
|
||||
import org.joinmastodon.android.ui.utils.BlurHashDrawable;
|
||||
import org.parceler.Parcel;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
|
||||
@Parcel
|
||||
@@ -35,11 +36,14 @@ public class Card extends BaseModel{
|
||||
public String embedUrl;
|
||||
public String blurhash;
|
||||
public List<History> history;
|
||||
public Instant publishedAt;
|
||||
|
||||
public transient Drawable blurhashPlaceholder;
|
||||
|
||||
@Override
|
||||
public void postprocess() throws ObjectValidationException{
|
||||
if(type==null)
|
||||
type=Type.LINK;
|
||||
super.postprocess();
|
||||
if(blurhash!=null){
|
||||
Bitmap placeholder=BlurHashDecoder.decode(blurhash, 16, 16);
|
||||
@@ -72,6 +76,7 @@ public class Card extends BaseModel{
|
||||
", embedUrl='"+embedUrl+'\''+
|
||||
", blurhash='"+blurhash+'\''+
|
||||
", history="+history+
|
||||
", publishedAt="+publishedAt+
|
||||
'}';
|
||||
}
|
||||
|
||||
|
||||
@@ -5,4 +5,8 @@ package org.joinmastodon.android.model;
|
||||
*/
|
||||
public interface DisplayItemsParent{
|
||||
String getID();
|
||||
|
||||
default String getAccountID(){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package org.joinmastodon.android.model;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import org.joinmastodon.android.api.RequiredField;
|
||||
import org.parceler.Parcel;
|
||||
|
||||
@Parcel
|
||||
public class FollowList extends BaseModel {
|
||||
@RequiredField
|
||||
public String id;
|
||||
@RequiredField
|
||||
public String title;
|
||||
public RepliesPolicy repliesPolicy;
|
||||
public boolean exclusive;
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
return "List{" +
|
||||
"id='" + id + '\'' +
|
||||
", title='" + title + '\'' +
|
||||
", repliesPolicy=" + repliesPolicy +
|
||||
", exclusive=" + exclusive +
|
||||
'}';
|
||||
}
|
||||
|
||||
public enum RepliesPolicy{
|
||||
@SerializedName("followed")
|
||||
FOLLOWED,
|
||||
@SerializedName("list")
|
||||
LIST,
|
||||
@SerializedName("none")
|
||||
NONE
|
||||
}
|
||||
}
|
||||
@@ -46,4 +46,8 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
|
||||
public int hashCode(){
|
||||
return name.hashCode();
|
||||
}
|
||||
|
||||
public int getWeekPosts(){
|
||||
return history.stream().mapToInt(h->h.uses).sum();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,4 +21,10 @@ public class HeaderPaginationList<T> extends ArrayList<T>{
|
||||
public HeaderPaginationList(@NonNull Collection<? extends T> c){
|
||||
super(c);
|
||||
}
|
||||
|
||||
public String getNextPageMaxID(){
|
||||
if(nextPageUri==null)
|
||||
return null;
|
||||
return nextPageUri.getQueryParameter("max_id");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,11 @@ public class Notification extends BaseModel implements DisplayItemsParent{
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAccountID(){
|
||||
return status!=null ? account.id : null;
|
||||
}
|
||||
|
||||
public enum Type{
|
||||
@SerializedName("follow")
|
||||
FOLLOW,
|
||||
|
||||
@@ -34,10 +34,18 @@ public class SearchResult extends BaseModel implements DisplayItemsParent{
|
||||
generateID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getID(){
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAccountID(){
|
||||
if(type==Type.STATUS)
|
||||
return status.getAccountID();
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postprocess() throws ObjectValidationException{
|
||||
super.postprocess();
|
||||
|
||||
@@ -55,7 +55,7 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
public StatusPrivacy visibility;
|
||||
public boolean sensitive;
|
||||
@RequiredField
|
||||
public String spoilerText;
|
||||
public String spoilerText="";
|
||||
public List<Attachment> mediaAttachments;
|
||||
public Application application;
|
||||
@RequiredField
|
||||
@@ -186,6 +186,11 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAccountID(){
|
||||
return getContentStatus().account.id;
|
||||
}
|
||||
|
||||
public void update(StatusCountersUpdatedEvent ev){
|
||||
favouritesCount=ev.favorites;
|
||||
reblogsCount=ev.reblogs;
|
||||
@@ -225,7 +230,10 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
@NonNull
|
||||
@Override
|
||||
public Status clone(){
|
||||
return (Status) super.clone();
|
||||
Status copy=(Status) super.clone();
|
||||
copy.spoilerRevealed=false;
|
||||
copy.translationState=TranslationState.HIDDEN;
|
||||
return copy;
|
||||
}
|
||||
|
||||
public static final Pattern BOTTOM_TEXT_PATTERN = Pattern.compile("(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️)(?:\uD83D\uDC49\uD83D\uDC48(?:[\uD83E\uDEC2\uD83D\uDC96✨\uD83E\uDD7A,]+|❤️))*\uD83D\uDC49\uD83D\uDC48");
|
||||
|
||||
@@ -9,7 +9,6 @@ import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
|
||||
import org.joinmastodon.android.BuildConfig;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.fragments.CustomLocalTimelineFragment;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
@@ -53,7 +52,7 @@ public class TimelineDefinition {
|
||||
return def;
|
||||
}
|
||||
|
||||
public static TimelineDefinition ofList(ListTimeline list) {
|
||||
public static TimelineDefinition ofList(FollowList list) {
|
||||
return ofList(list.id, list.title, list.exclusive);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.joinmastodon.android.model.viewmodel;
|
||||
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.TextUtils;
|
||||
|
||||
@@ -9,6 +10,7 @@ import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.AccountField;
|
||||
import org.joinmastodon.android.ui.text.HtmlParser;
|
||||
import org.joinmastodon.android.ui.text.LinkSpan;
|
||||
import org.joinmastodon.android.ui.utils.CustomEmojiHelper;
|
||||
|
||||
import java.util.Collections;
|
||||
@@ -36,7 +38,7 @@ public class AccountViewModel{
|
||||
parsedName=HtmlParser.parseCustomEmoji(account.getDisplayName(), account.emojis);
|
||||
else
|
||||
parsedName=account.getDisplayName();
|
||||
parsedBio=HtmlParser.parse(account.note, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID);
|
||||
parsedBio=HtmlParser.parse(account.note, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID, account);
|
||||
SpannableStringBuilder ssb=new SpannableStringBuilder(parsedName);
|
||||
ssb.append(parsedBio);
|
||||
emojiHelper.setText(ssb);
|
||||
@@ -49,4 +51,13 @@ public class AccountViewModel{
|
||||
}
|
||||
this.verifiedLink=verifiedLink;
|
||||
}
|
||||
|
||||
public AccountViewModel stripLinksFromBio(){
|
||||
if(parsedBio instanceof Spannable spannable){
|
||||
for(LinkSpan span:spannable.getSpans(0, spannable.length(), LinkSpan.class)){
|
||||
spannable.removeSpan(span);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package org.joinmastodon.android.model.viewmodel;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
|
||||
|
||||
public class AvatarPileListItem<T> extends ListItem<T>{
|
||||
public List<ImageLoaderRequest> avatars;
|
||||
|
||||
public AvatarPileListItem(String title, String subtitle, List<ImageLoaderRequest> avatars, int iconRes, Consumer<AvatarPileListItem<T>> onClick, T parentObject, boolean dividerAfter){
|
||||
super(title, subtitle, iconRes, (Consumer<ListItem<T>>)(Object)onClick, parentObject, 0, dividerAfter);
|
||||
this.avatars=avatars;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(){
|
||||
return R.id.list_item_avatar_pile;
|
||||
}
|
||||
}
|
||||
@@ -55,6 +55,7 @@ public class CheckableListItem<T> extends ListItem<T>{
|
||||
case CHECKBOX -> R.id.list_item_checkbox;
|
||||
case RADIO -> R.id.list_item_radio;
|
||||
case SWITCH -> R.id.list_item_switch;
|
||||
case SWITCH_SEPARATED -> R.id.list_item_switch_separated;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -69,6 +70,7 @@ public class CheckableListItem<T> extends ListItem<T>{
|
||||
public enum Style{
|
||||
CHECKBOX,
|
||||
RADIO,
|
||||
SWITCH
|
||||
SWITCH,
|
||||
SWITCH_SEPARATED
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package org.joinmastodon.android.model.viewmodel;
|
||||
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class ListItemWithOptionsMenu<T> extends ListItem<T>{
|
||||
public OptionsMenuListener<T> listener;
|
||||
|
||||
public ListItemWithOptionsMenu(String title, String subtitle, OptionsMenuListener<T> listener, int iconRes, Consumer<ListItemWithOptionsMenu<T>> onClick, T parentObject, boolean dividerAfter){
|
||||
super(title, subtitle, iconRes, (Consumer<ListItem<T>>)(Object)onClick, parentObject, 0, dividerAfter);
|
||||
this.listener=listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(){
|
||||
return R.id.list_item_options;
|
||||
}
|
||||
|
||||
public void performConfigureMenu(Menu menu){
|
||||
listener.onConfigureListItemOptionsMenu(this, menu);
|
||||
}
|
||||
|
||||
public void performItemSelected(MenuItem item){
|
||||
listener.onListItemOptionSelected(this, item);
|
||||
}
|
||||
|
||||
public interface OptionsMenuListener<T>{
|
||||
void onConfigureListItemOptionsMenu(ListItemWithOptionsMenu<T> item, Menu menu);
|
||||
void onListItemOptionSelected(ListItemWithOptionsMenu<T> item, MenuItem menuItem);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user