From 1c2c6f404adeeea21509fcba1d9b86a911e109f3 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 6 Jun 2025 11:29:00 +0200 Subject: [PATCH] Add/Remove featured tags from profile editor --- .../activities/EditProfileActivity.java | 14 +++++- .../viewmodel/mastodon/AccountsVM.java | 50 ++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/EditProfileActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/EditProfileActivity.java index f6149311..36a2d2b6 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/activities/EditProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/EditProfileActivity.java @@ -38,6 +38,7 @@ import com.bumptech.glide.Glide; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.textfield.TextInputEditText; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -396,6 +397,16 @@ public class EditProfileActivity extends BaseBarActivity { return fields; } + + List getFeaturedHashtags() { + List featuredHashtags = new ArrayList<>(); + for (int i = 0; i < binding.featuredHashtagsContainer.getChildCount(); i++) { + String name = Objects.requireNonNull(((TextInputEditText) binding.featuredHashtagsContainer.getChildAt(i).findViewById(R.id.name)).getText()).toString().trim(); + featuredHashtags.add(name); + } + return featuredHashtags; + } + @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { @@ -411,7 +422,8 @@ public class EditProfileActivity extends BaseBarActivity { getPrivacy(), binding.sensitive.isChecked(), null, - getFields() + getFields(), + getFeaturedHashtags() ) .observe(EditProfileActivity.this, account -> { if (account != null) { diff --git a/app/src/main/java/app/fedilab/android/mastodon/viewmodel/mastodon/AccountsVM.java b/app/src/main/java/app/fedilab/android/mastodon/viewmodel/mastodon/AccountsVM.java index 30e9861c..9473c1dc 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/viewmodel/mastodon/AccountsVM.java +++ b/app/src/main/java/app/fedilab/android/mastodon/viewmodel/mastodon/AccountsVM.java @@ -20,12 +20,14 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; + import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import java.net.IDN; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -251,6 +253,7 @@ public class AccountsVM extends AndroidViewModel { * @param sensitive Whether to mark authored statuses as sensitive by default. * @param language Default language to use for authored statuses. (ISO 6391) * @param fields Profile metadata name (By default, max 4 fields and 255 characters per property/value) + * @param featuredHashtags Featured hashtags that will be displayed on the profile * @return {@link LiveData} containing an {@link Account} */ public LiveData updateCredentials(@NonNull String instance, String token, @@ -262,10 +265,15 @@ public class AccountsVM extends AndroidViewModel { String privacy, Boolean sensitive, String language, - LinkedHashMap fields + LinkedHashMap fields, + List featuredHashtags ) { MastodonAccountsService mastodonAccountsService = init(instance); accountMutableLiveData = new MutableLiveData<>(); + if(featuredHashtags == null) { + featuredHashtags = new ArrayList<>(); + } + List finalFeaturedHashtags = featuredHashtags; new Thread(() -> { Account account = null; Account.AccountParams accountParams = new Account.AccountParams(); @@ -291,6 +299,46 @@ public class AccountsVM extends AndroidViewModel { e.printStackTrace(); } } + Call> featuredTagsCall = mastodonAccountsService.getFeaturedTags(token); + try { + Response> featuredTagsResponse = featuredTagsCall.execute(); + if (featuredTagsResponse.isSuccessful()) { + List currentFeaturedTags = featuredTagsResponse.body(); + if(currentFeaturedTags == null) { + currentFeaturedTags = new ArrayList<>(); + } + List currentTags = new ArrayList<>(); + for(FeaturedTag featuredTag: currentFeaturedTags) { + currentTags.add(featuredTag.name); + } + List toRemove = new ArrayList<>(); + List toAdd = new ArrayList<>(); + for(String value: currentTags) { + if(!finalFeaturedHashtags.contains(value)){ + toRemove.add(value); + } + } + for(String value: finalFeaturedHashtags) { + if(!currentTags.contains(value)){ + toAdd.add(value); + } + } + for(String remove: toRemove) { + for(FeaturedTag featuredTag: currentFeaturedTags) { + if(featuredTag.name.trim().equalsIgnoreCase(remove.trim())) { + mastodonAccountsService.removeFeaturedTag(token, featuredTag.id).execute(); + break; + } + } + } + for(String add: toAdd) { + mastodonAccountsService.addFeaturedTag(token, add).execute(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + Handler mainHandler = new Handler(Looper.getMainLooper()); Account finalAccount = account; Runnable myRunnable = () -> accountMutableLiveData.setValue(finalAccount);