Re-implement some Akkoma specific things + hide filter settings (#729)

* Replace missing blurhash with accent color

* Correct Akkoma max account fields

* Skip discover on Akkoma

* Akkoma poll limits

* Hide filter settings on Akkoma

* clear search fragment on back

---------

Co-authored-by: sk <sk22@mailbox.org>
This commit is contained in:
Jacoco
2023-07-21 02:29:38 +02:00
committed by GitHub
parent 5b2d04e09d
commit 8404c79148
6 changed files with 62 additions and 21 deletions

View File

@@ -1,7 +1,5 @@
package org.joinmastodon.android.fragments; package org.joinmastodon.android.fragments;
import static org.joinmastodon.android.fragments.ProfileAboutFragment.MAX_FIELDS;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
@@ -175,6 +173,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private MenuItem editSaveMenuItem; private MenuItem editSaveMenuItem;
private boolean savingEdits; private boolean savingEdits;
private int maxFields = ProfileAboutFragment.MAX_FIELDS;
// from ProfileAboutFragment // from ProfileAboutFragment
public UsableRecyclerView list; public UsableRecyclerView list;
private AboutAdapter adapter; private AboutAdapter adapter;
@@ -200,6 +200,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
loaded=true; loaded=true;
if(!isOwnProfile) if(!isOwnProfile)
loadRelationship(); loadRelationship();
else if (isInstanceAkkoma()) {
maxFields = getInstance().get().pleroma.metadata.fieldsLimits.maxFields;
}
}else{ }else{
profileAccountID=getArguments().getString("profileAccountID"); profileAccountID=getArguments().getString("profileAccountID");
if(!getArguments().getBoolean("noAutoLoad", false)) if(!getArguments().getBoolean("noAutoLoad", false))
@@ -1385,7 +1388,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
public int getItemCount(){ public int getItemCount(){
if(isInEditMode){ if(isInEditMode){
int size=fields.size(); int size=fields.size();
if(size<MAX_FIELDS) if(size<maxFields)
size++; size++;
return size; return size;
} }
@@ -1510,7 +1513,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@Override @Override
public void onClick(){ public void onClick(){
fields.add(new AccountField()); fields.add(new AccountField());
if(fields.size()==MAX_FIELDS){ // replace this row with new row if(fields.size()==maxFields){ // replace this row with new row
adapter.notifyItemChanged(fields.size()-1); adapter.notifyItemChanged(fields.size()-1);
}else{ }else{
adapter.notifyItemInserted(fields.size()-1); adapter.notifyItemInserted(fields.size()-1);

View File

@@ -54,6 +54,8 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
private String accountID; private String accountID;
private String currentQuery; private String currentQuery;
private boolean disableDiscover;
@Override @Override
public void onCreate(Bundle savedInstanceState){ public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@@ -155,6 +157,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
} }
}); });
disableDiscover=getArguments().getBoolean("disableDiscover");
searchView=view.findViewById(R.id.search_fragment); searchView=view.findViewById(R.id.search_fragment);
if(searchFragment==null){ if(searchFragment==null){
searchFragment=new SearchFragment(); searchFragment=new SearchFragment();
@@ -170,8 +173,9 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
searchBack.setOnClickListener(v->{ searchBack.setOnClickListener(v->{
if(searchActive) exitSearch(); else openSearch(); if(searchActive) exitSearch(); else openSearch();
}); });
if(searchActive){ if(searchActive) searchBack.setImageResource(R.drawable.ic_fluent_arrow_left_24_regular);
searchBack.setImageResource(R.drawable.ic_fluent_arrow_left_24_regular); else searchBack.setEnabled(false);
if(searchActive || disableDiscover){
pager.setVisibility(View.GONE); pager.setVisibility(View.GONE);
tabLayout.setVisibility(View.GONE); tabLayout.setVisibility(View.GONE);
searchView.setVisibility(View.VISIBLE); searchView.setVisibility(View.VISIBLE);
@@ -232,15 +236,18 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
if(!searchActive) if(!searchActive)
return; return;
searchActive=false; searchActive=false;
pager.setVisibility(View.VISIBLE);
tabLayout.setVisibility(View.VISIBLE);
searchView.setVisibility(View.GONE);
searchText.setText(R.string.sk_search_fediverse); searchText.setText(R.string.sk_search_fediverse);
searchBack.setImageResource(R.drawable.ic_fluent_search_24_regular); searchBack.setImageResource(R.drawable.ic_fluent_search_24_regular);
searchBack.setEnabled(false); searchBack.setEnabled(false);
searchBack.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); searchBack.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
tabsDivider.setVisibility(View.VISIBLE);
currentQuery=null; currentQuery=null;
searchFragment.clear();
if(disableDiscover) return;
pager.setVisibility(View.VISIBLE);
tabLayout.setVisibility(View.VISIBLE);
searchView.setVisibility(View.GONE);
tabsDivider.setVisibility(View.VISIBLE);
} }
private Fragment getFragmentForPage(int page){ private Fragment getFragmentForPage(int page){

View File

@@ -54,7 +54,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N) if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N)
setRetainInstance(true); setRetainInstance(true);
setEmptyText(R.string.no_search_results); setEmptyText(R.string.sk_recent_searches_placeholder);
loadData(); loadData();
} }
@@ -173,13 +173,16 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
} }
public void setQuery(String q, SearchResult.Type filter){ public void setQuery(String q, SearchResult.Type filter){
if(q.isBlank()) if(q.isBlank()) {
setEmptyText(R.string.sk_recent_searches_placeholder);
return; return;
}
if(currentRequest!=null){ if(currentRequest!=null){
currentRequest.cancel(); currentRequest.cancel();
currentRequest=null; currentRequest=null;
} }
currentQuery=q; currentQuery=q;
setEmptyText(R.string.no_search_results);
if(filter==null) if(filter==null)
currentFilter=EnumSet.allOf(SearchResult.Type.class); currentFilter=EnumSet.allOf(SearchResult.Type.class);
else else
@@ -221,6 +224,13 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
} }
} }
public void clear() {
data.clear();
preloadedData.clear();
adapter.notifyDataSetChanged();
V.setVisibilityAnimated(content, View.GONE);
}
@Override @Override
public Uri getWebUri(Uri.Builder base) { public Uri getWebUri(Uri.Builder base) {
Uri.Builder searchUri = base.path("/search"); Uri.Builder searchUri = base.path("/search");

View File

@@ -16,6 +16,7 @@ import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent; import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.viewmodel.ListItem; import org.joinmastodon.android.model.viewmodel.ListItem;
import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.utils.HideableSingleViewRecyclerAdapter; import org.joinmastodon.android.ui.utils.HideableSingleViewRecyclerAdapter;
@@ -29,6 +30,7 @@ import me.grishka.appkit.Nav;
import me.grishka.appkit.utils.MergeRecyclerAdapter; import me.grishka.appkit.utils.MergeRecyclerAdapter;
public class SettingsMainFragment extends BaseSettingsFragment<Void>{ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
private AccountSession account;
private boolean loggedOut; private boolean loggedOut;
private HideableSingleViewRecyclerAdapter bannerAdapter; private HideableSingleViewRecyclerAdapter bannerAdapter;
private Button updateButton1, updateButton2; private Button updateButton1, updateButton2;
@@ -47,23 +49,27 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
@Override @Override
public void onCreate(Bundle savedInstanceState){ public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
account = AccountSessionManager.get(accountID);
setTitle(R.string.settings); setTitle(R.string.settings);
setSubtitle(AccountSessionManager.get(accountID).getFullUsername()); setSubtitle(account.getFullUsername());
onDataLoaded(List.of( onDataLoaded(List.of(
new ListItem<>(R.string.settings_behavior, 0, R.drawable.ic_fluent_settings_24_regular, this::onBehaviorClick), new ListItem<>(R.string.settings_behavior, 0, R.drawable.ic_fluent_settings_24_regular, this::onBehaviorClick),
new ListItem<>(R.string.settings_display, 0, R.drawable.ic_fluent_color_24_regular, this::onDisplayClick), new ListItem<>(R.string.settings_display, 0, R.drawable.ic_fluent_color_24_regular, this::onDisplayClick),
new ListItem<>(R.string.settings_filters, 0, R.drawable.ic_fluent_filter_24_regular, this::onFiltersClick),
new ListItem<>(R.string.settings_notifications, 0, R.drawable.ic_fluent_alert_24_regular, this::onNotificationsClick), new ListItem<>(R.string.settings_notifications, 0, R.drawable.ic_fluent_alert_24_regular, this::onNotificationsClick),
new ListItem<>(R.string.sk_settings_instance, 0, R.drawable.ic_fluent_server_24_regular, this::onInstanceClick), new ListItem<>(R.string.sk_settings_instance, 0, R.drawable.ic_fluent_server_24_regular, this::onInstanceClick),
new ListItem<>(getString(R.string.about_app, getString(R.string.sk_app_name)), null, R.drawable.ic_fluent_info_24_regular, this::onAboutClick, null, 0, true), new ListItem<>(getString(R.string.about_app, getString(R.string.sk_app_name)), null, R.drawable.ic_fluent_info_24_regular, this::onAboutClick, null, 0, true),
new ListItem<>(R.string.log_out, 0, R.drawable.ic_fluent_sign_out_24_regular, this::onLogOutClick, R.attr.colorM3Error, false) new ListItem<>(R.string.log_out, 0, R.drawable.ic_fluent_sign_out_24_regular, this::onLogOutClick, R.attr.colorM3Error, false)
)); ));
Instance instance = AccountSessionManager.getInstance().getInstanceInfo(account.domain);
if (!instance.isAkkoma())
data.add(2, new ListItem<>(R.string.settings_filters, 0, R.drawable.ic_fluent_filter_24_regular, this::onFiltersClick));
if(BuildConfig.DEBUG || BuildConfig.BUILD_TYPE.equals("appcenterPrivateBeta")){ if(BuildConfig.DEBUG || BuildConfig.BUILD_TYPE.equals("appcenterPrivateBeta")){
data.add(0, new ListItem<>("Debug settings", null, R.drawable.ic_fluent_wrench_screwdriver_24_regular, ()->Nav.go(getActivity(), SettingsDebugFragment.class, makeFragmentArgs()), null, 0, true)); data.add(0, new ListItem<>("Debug settings", null, R.drawable.ic_fluent_wrench_screwdriver_24_regular, ()->Nav.go(getActivity(), SettingsDebugFragment.class, makeFragmentArgs()), null, 0, true));
} }
AccountSessionManager.get(accountID).reloadPreferences(null); account.reloadPreferences(null);
E.register(this); E.register(this);
} }
@@ -80,7 +86,7 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
protected void onHidden(){ protected void onHidden(){
super.onHidden(); super.onHidden();
if(!loggedOut) if(!loggedOut)
AccountSessionManager.get(accountID).savePreferencesIfPending(); account.savePreferencesIfPending();
} }
@Override @Override
@@ -147,7 +153,7 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID); AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
new M3AlertDialogBuilder(getActivity()) new M3AlertDialogBuilder(getActivity())
.setMessage(getString(R.string.confirm_log_out, session.getFullUsername())) .setMessage(getString(R.string.confirm_log_out, session.getFullUsername()))
.setPositiveButton(R.string.log_out, (dialog, which)->AccountSessionManager.get(accountID).logOut(getActivity(), ()->{ .setPositiveButton(R.string.log_out, (dialog, which)->account.logOut(getActivity(), ()->{
loggedOut=true; loggedOut=true;
getActivity().finish(); getActivity().finish();
Intent intent=new Intent(getActivity(), MainActivity.class); Intent intent=new Intent(getActivity(), MainActivity.class);

View File

@@ -3,6 +3,7 @@ package org.joinmastodon.android.ui.displayitems;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableStringBuilder; import android.text.SpannableStringBuilder;
import android.text.TextUtils; import android.text.TextUtils;
@@ -30,6 +31,7 @@ import org.joinmastodon.android.model.ScheduledStatus;
import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.PhotoLayoutHelper; import org.joinmastodon.android.ui.PhotoLayoutHelper;
import org.joinmastodon.android.ui.text.HtmlParser; import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.viewholders.AccountViewHolder; import org.joinmastodon.android.ui.viewholders.AccountViewHolder;
import org.joinmastodon.android.utils.StatusFilterPredicate; import org.joinmastodon.android.utils.StatusFilterPredicate;
import org.parceler.Parcels; import org.parceler.Parcels;
@@ -253,6 +255,12 @@ public abstract class StatusDisplayItem{
List<Attachment> imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage()).collect(Collectors.toList()); List<Attachment> imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage()).collect(Collectors.toList());
if(!imageAttachments.isEmpty()){ if(!imageAttachments.isEmpty()){
int color = UiUtils.getThemeColor(fragment.getContext(), R.attr.colorM3SurfaceVariant);
for (Attachment att : imageAttachments) {
if (att.blurhashPlaceholder == null) {
att.blurhashPlaceholder = new ColorDrawable(color);
}
}
PhotoLayoutHelper.TiledLayoutResult layout=PhotoLayoutHelper.processThumbs(imageAttachments); PhotoLayoutHelper.TiledLayoutResult layout=PhotoLayoutHelper.processThumbs(imageAttachments);
MediaGridStatusDisplayItem mediaGrid=new MediaGridStatusDisplayItem(parentID, fragment, layout, imageAttachments, statusForContent); MediaGridStatusDisplayItem mediaGrid=new MediaGridStatusDisplayItem(parentID, fragment, layout, imageAttachments, statusForContent);
if((flags & FLAG_MEDIA_FORCE_HIDDEN)!=0) if((flags & FLAG_MEDIA_FORCE_HIDDEN)!=0)

View File

@@ -74,10 +74,17 @@ public class ComposePollViewController{
pollWrap=view.findViewById(R.id.poll_wrap); pollWrap=view.findViewById(R.id.poll_wrap);
Instance instance=fragment.instance; Instance instance=fragment.instance;
if (!instance.isAkkoma()) {
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0) if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0)
maxPollOptions=instance.configuration.polls.maxOptions; maxPollOptions=instance.configuration.polls.maxOptions;
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0) if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption; maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption;
} else {
if (instance.pollLimits!=null && instance.pollLimits.maxOptions>0)
maxPollOptions=instance.pollLimits.maxOptions;
if(instance.pollLimits!=null && instance.pollLimits.maxOptionChars>0)
maxPollOptionLength=instance.pollLimits.maxOptionChars;
}
pollOptionsView=pollWrap.findViewById(R.id.poll_options); pollOptionsView=pollWrap.findViewById(R.id.poll_options);
addPollOptionBtn=pollWrap.findViewById(R.id.add_poll_option); addPollOptionBtn=pollWrap.findViewById(R.id.add_poll_option);