From 3b30708954e4e9cb32f6145f333755276ae3976f Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 17 Jan 2023 16:41:39 +0100 Subject: [PATCH] Some fixes --- .../android/activities/AboutActivity.java | 2 +- .../android/activities/ComposeActivity.java | 16 ++- .../activities/PartnerShipActivity.java | 2 +- .../android/activities/ProfileActivity.java | 70 +++++++++- .../endpoints/MastodonAccountsService.java | 3 +- .../client/entities/api/RelationShip.java | 4 + .../android/helper/CrossActionHelper.java | 2 +- .../app/fedilab/android/helper/Helper.java | 2 +- .../android/ui/drawer/AccountAdapter.java | 2 +- .../android/ui/drawer/StatusAdapter.java | 2 - .../android/ui/drawer/SuggestionAdapter.java | 2 +- .../viewmodel/mastodon/AccountsVM.java | 12 +- app/src/main/res/menu/activity_profile.xml | 5 + app/src/main/res/menu/option_toot.xml | 131 +++++++++++------- app/src/main/res/values-night/themes.xml | 8 +- app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/themes.xml | 4 +- .../metadata/android/en/changelogs/469.txt | 2 + 18 files changed, 193 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/activities/AboutActivity.java b/app/src/main/java/app/fedilab/android/activities/AboutActivity.java index f71715050..25965d478 100644 --- a/app/src/main/java/app/fedilab/android/activities/AboutActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/AboutActivity.java @@ -113,7 +113,7 @@ public class AboutActivity extends BaseBarActivity { if (relationShips != null && relationShips.size() > 0) { if (!relationShips.get(0).following) { binding.accountFollow.setVisibility(View.VISIBLE); - binding.accountFollow.setOnClickListener(v -> accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false) + binding.accountFollow.setOnClickListener(v -> accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false, null) .observe(AboutActivity.this, relationShip -> binding.accountFollow.setVisibility(View.GONE))); } } diff --git a/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java b/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java index 36040bb31..0b80a0ee1 100644 --- a/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java @@ -65,6 +65,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.TimeUnit; @@ -641,7 +642,20 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana } } if (statusReply.language != null && !statusReply.language.isEmpty()) { - statusDraftList.get(0).language = statusReply.language; + Set storedLanguages = sharedpreferences.getStringSet(getString(R.string.SET_SELECTED_LANGUAGE), null); + if (storedLanguages == null || storedLanguages.size() == 0) { + statusDraftList.get(0).language = statusReply.language; + } else { + if (storedLanguages.contains(statusReply.language)) { + statusDraftList.get(0).language = statusReply.language; + } else { + String currentCode = sharedpreferences.getString(getString(R.string.SET_COMPOSE_LANGUAGE) + account.user_id + account.instance, Locale.getDefault().getLanguage()); + if (currentCode.isEmpty()) { + currentCode = "EN"; + } + statusDraftList.get(0).language = currentCode; + } + } } //StatusDraftList at this point should only have one element statusList.addAll(statusDraftList); diff --git a/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java b/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java index 6df015f6a..f525363c3 100644 --- a/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java @@ -93,7 +93,7 @@ public class PartnerShipActivity extends BaseBarActivity { if (relationShips != null && relationShips.size() > 0) { if (!relationShips.get(0).following) { binding.accountFollow.setVisibility(View.VISIBLE); - binding.accountFollow.setOnClickListener(v -> accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false) + binding.accountFollow.setOnClickListener(v -> accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false, null) .observe(PartnerShipActivity.this, relationShip -> binding.accountFollow.setVisibility(View.GONE))); } } diff --git a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java index 7e9bf5302..ce62c6718 100644 --- a/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ProfileActivity.java @@ -83,6 +83,7 @@ import app.fedilab.android.client.entities.api.Field; import app.fedilab.android.client.entities.api.IdentityProof; import app.fedilab.android.client.entities.api.MastodonList; import app.fedilab.android.client.entities.api.RelationShip; +import app.fedilab.android.client.entities.app.Languages; import app.fedilab.android.client.entities.app.Pinned; import app.fedilab.android.client.entities.app.PinnedTimeline; import app.fedilab.android.client.entities.app.RemoteInstance; @@ -467,7 +468,7 @@ public class ProfileActivity extends BaseActivity { Toasty.info(ProfileActivity.this, getString(R.string.nothing_to_do), Toast.LENGTH_LONG).show(); } else if (doAction == action.FOLLOW) { binding.accountFollow.setEnabled(false); - accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false) + accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false, null) .observe(ProfileActivity.this, relationShip -> { this.relationship = relationShip; updateAccount(); @@ -660,7 +661,7 @@ public class ProfileActivity extends BaseActivity { binding.accountNotification.setOnClickListener(v -> { if (relationship != null && relationship.following) { relationship.notifying = !relationship.notifying; - accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, relationship.showing_reblogs, relationship.notifying) + accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, relationship.showing_reblogs, relationship.notifying, relationship.languages) .observe(ProfileActivity.this, relationShip -> { this.relationship = relationShip; updateAccount(); @@ -726,6 +727,7 @@ public class ProfileActivity extends BaseActivity { menu.findItem(R.id.action_direct_message).setVisible(false); menu.findItem(R.id.action_add_to_list).setVisible(false); menu.findItem(R.id.action_mute_home).setVisible(false); + menu.findItem(R.id.action_subscribed_language).setVisible(false); } else { menu.findItem(R.id.action_block).setVisible(true); menu.findItem(R.id.action_mute).setVisible(true); @@ -739,6 +741,7 @@ public class ProfileActivity extends BaseActivity { menu.findItem(R.id.action_hide_boost).setVisible(false); menu.findItem(R.id.action_endorse).setVisible(false); menu.findItem(R.id.action_mute_home).setVisible(false); + menu.findItem(R.id.action_subscribed_language).setVisible(false); } if (relationship.blocking) { menu.findItem(R.id.action_block).setTitle(R.string.action_unblock); @@ -898,13 +901,70 @@ public class ProfileActivity extends BaseActivity { .observe(ProfileActivity.this, relationShip -> this.relationship = relationShip); } return true; + } else if (itemId == R.id.action_subscribed_language) { + if (relationship != null) { + List subscribedLanguages = relationship.languages; + Set storedLanguages = sharedpreferences.getStringSet(getString(R.string.SET_SELECTED_LANGUAGE), null); + List languages = Languages.get(ProfileActivity.this); + if (languages == null) { + return true; + } + String[] codesArr; + String[] languagesArr; + boolean[] presentArr; + if (storedLanguages != null && storedLanguages.size() > 0) { + int i = 0; + codesArr = new String[storedLanguages.size()]; + languagesArr = new String[storedLanguages.size()]; + presentArr = new boolean[storedLanguages.size()]; + for (String code : storedLanguages) { + for (Languages.Language language : languages) { + if (language.code.equalsIgnoreCase(code)) { + languagesArr[i] = language.language; + } + } + codesArr[i] = code; + presentArr[i] = subscribedLanguages != null && subscribedLanguages.contains(code); + i++; + } + } else { + codesArr = new String[languages.size()]; + presentArr = new boolean[languages.size()]; + languagesArr = new String[languages.size()]; + int i = 0; + for (Languages.Language language : languages) { + codesArr[i] = language.code; + languagesArr[i] = language.language; + if (subscribedLanguages != null && subscribedLanguages.contains(language.code)) { + presentArr[i] = true; + } + i++; + } + } + AlertDialog.Builder builder = new MaterialAlertDialogBuilder(ProfileActivity.this, Helper.dialogStyle()); + builder.setTitle(getString(R.string.filter_languages)); + builder.setMultiChoiceItems(languagesArr, presentArr, (dialog, which, isChecked) -> { + List languagesFilter = new ArrayList<>(); + for (int i = 0; i < codesArr.length; i++) { + if (presentArr[i]) { + languagesFilter.add(codesArr[i]); + } + } + + accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, relationship.showing_reblogs, relationship.notifying, languagesFilter) + .observe(ProfileActivity.this, relationShip -> this.relationship = relationShip); + }); + builder.setNegativeButton(R.string.close, (dialog, which) -> dialog.dismiss()); + builder.create().show(); + } + return true; } else if (itemId == R.id.action_hide_boost) { if (relationship != null) if (relationship.showing_reblogs) { - accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, false, relationship.notifying) + accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, false, relationship.notifying, relationship.languages) .observe(ProfileActivity.this, relationShip -> this.relationship = relationShip); } else { - accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, relationship.notifying) + accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, relationship.notifying, relationship.languages) .observe(ProfileActivity.this, relationShip -> this.relationship = relationShip); } return true; @@ -949,7 +1009,7 @@ public class ProfileActivity extends BaseActivity { } builderSingle.setMultiChoiceItems(listsArray, presentArray, (dialog, which, isChecked) -> { if (relationship == null || !relationship.following) { - accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false) + accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false, null) .observe(ProfileActivity.this, newRelationShip -> { if (newRelationShip != null) { relationship = newRelationShip; diff --git a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java index b7cba8995..7d2eb2fd9 100644 --- a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java +++ b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java @@ -174,7 +174,8 @@ public interface MastodonAccountsService { @Header("Authorization") String app_token, @Path("id") String id, @Field("reblogs") boolean reblogs, - @Field("notify") boolean notify + @Field("notify") boolean notify, + @Field("languages[]") List languages ); //Follow account diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/RelationShip.java b/app/src/main/java/app/fedilab/android/client/entities/api/RelationShip.java index 1849605b2..fbfa93223 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/RelationShip.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/RelationShip.java @@ -16,6 +16,8 @@ package app.fedilab.android.client.entities.api; import com.google.gson.annotations.SerializedName; +import java.util.List; + public class RelationShip { @SerializedName("id") @@ -40,6 +42,8 @@ public class RelationShip { public boolean requested; @SerializedName("domain_blocking") public boolean domain_blocking; + @SerializedName("languages") + public List languages; @SerializedName("endorsed") public boolean endorsed; @SerializedName("note") diff --git a/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java b/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java index 9b28645c4..9e5de4405 100644 --- a/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java @@ -203,7 +203,7 @@ public class CrossActionHelper { break; case FOLLOW_ACTION: assert accountsVM != null; - accountsVM.follow(ownerAccount.instance, ownerAccount.token, targetedAccount.id, true, false) + accountsVM.follow(ownerAccount.instance, ownerAccount.token, targetedAccount.id, true, false, null) .observe((LifecycleOwner) context, relationShip -> Toasty.info(context, context.getString(R.string.toast_follow), Toasty.LENGTH_SHORT).show()); break; case UNFOLLOW_ACTION: diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index 63e2aa86d..1f46300b2 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -1861,7 +1861,7 @@ public class Helper { if (!relationShips.get(0).following) { binding.acccountContainer.setVisibility(View.VISIBLE); binding.accountFollow.setVisibility(View.VISIBLE); - binding.accountFollow.setOnClickListener(v -> accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false) + binding.accountFollow.setOnClickListener(v -> accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false, null) .observe((LifecycleOwner) activity, relationShip -> binding.accountFollow.setVisibility(View.GONE))); } } diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/AccountAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/AccountAdapter.java index 604da1681..7b36fefda 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/AccountAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/AccountAdapter.java @@ -229,7 +229,7 @@ public class AccountAdapter extends RecyclerView.Adapter { account.relationShip = relationShip; adapter.notifyItemChanged(position); diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java index 769eccac7..849d58731 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java @@ -49,7 +49,6 @@ import android.os.Looper; import android.text.Html; import android.text.SpannableString; import android.text.TextUtils; -import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -693,7 +692,6 @@ public class StatusAdapter extends RecyclerView.Adapter holder.binding.actionButtonMaths.setOnClickListener(v -> { status.mathsShown = !status.mathsShown; - Log.v(Helper.TAG, "notifyItemChanged: " + holder.getBindingAdapterPosition()); adapter.notifyItemChanged(holder.getBindingAdapterPosition()); }); holder.binding.actionButtonFavorite.setActiveImage(R.drawable.ic_round_star_24); diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java index 58eb17123..4c6289b7b 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java @@ -112,7 +112,7 @@ public class SuggestionAdapter extends RecyclerView.Adapter { suggestionList.remove(position); notifyItemRemoved(position); - accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false); + accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false, null); }); holder.binding.notInterested.setOnClickListener(view -> { suggestionList.remove(position); diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java index 1567a5024..b33897a41 100644 --- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java +++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java @@ -602,21 +602,23 @@ public class AccountsVM extends AndroidViewModel { /** * Follow the given account. Can also be used to update whether to show reblogs or enable notifications. * - * @param id The id of the account - * @param reblogs Receive this account's reblogs in home timeline? Defaults to true. - * @param notify Receive notifications when this account posts a status? Defaults to false. + * @param id The id of the account + * @param reblogs Receive this account's reblogs in home timeline? Defaults to true. + * @param notify Receive notifications when this account posts a status? Defaults to false. + * @param languages Filter received statuses for these languages. * @return {@link LiveData} containing the {@link RelationShip} to the given account */ - public LiveData follow(@NonNull String instance, String token, @NonNull String id, boolean reblogs, boolean notify) { + public LiveData follow(@NonNull String instance, String token, @NonNull String id, boolean reblogs, boolean notify, List languages) { relationShipMutableLiveData = new MutableLiveData<>(); MastodonAccountsService mastodonAccountsService = init(instance); new Thread(() -> { RelationShip relationShip = null; - Call followCall = mastodonAccountsService.follow(token, id, reblogs, notify); + Call followCall = mastodonAccountsService.follow(token, id, reblogs, notify, languages); if (followCall != null) { try { Response followResponse = followCall.execute(); if (followResponse.isSuccessful()) { + relationShip = followResponse.body(); } } catch (Exception e) { diff --git a/app/src/main/res/menu/activity_profile.xml b/app/src/main/res/menu/activity_profile.xml index cd17ac2c5..4f0c5af76 100644 --- a/app/src/main/res/menu/activity_profile.xml +++ b/app/src/main/res/menu/activity_profile.xml @@ -16,6 +16,11 @@ android:icon="@drawable/ic_baseline_open_with_24" android:title="@string/action_open_in_web" app:showAsAction="never" /> + - + + app:showAsAction="never"> + + + + + + + + + + + + - - - + app:showAsAction="never"> + + + + + + + + - + android:id="@+id/action_block_menu" + android:title="@string/more_action_3" + app:showAsAction="never"> + + + + + + + - - - - - - + diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index a77b7b9ad..b2a1a6bbb 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -100,7 +100,7 @@ true - - - - - -