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:
@@ -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);
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0)
|
if (!instance.isAkkoma()) {
|
||||||
maxPollOptions=instance.configuration.polls.maxOptions;
|
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0)
|
||||||
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
|
maxPollOptions=instance.configuration.polls.maxOptions;
|
||||||
maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption;
|
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
|
||||||
|
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user