fix akkoma crash on list edit

closes sk22#352
This commit is contained in:
sk 2023-01-23 10:51:24 +01:00
parent a26ddfe70f
commit 5914ef8fad
5 changed files with 217 additions and 213 deletions

View File

@ -423,7 +423,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
} else if ((list = listItems.get(id)) != null) { } else if ((list = listItems.get(id)) != null) {
args.putString("listID", list.id); args.putString("listID", list.id);
args.putString("listTitle", list.title); args.putString("listTitle", list.title);
args.putInt("repliesPolicy", list.repliesPolicy.ordinal()); if (list.repliesPolicy != null) args.putInt("repliesPolicy", list.repliesPolicy.ordinal());
Nav.go(getActivity(), ListTimelineFragment.class, args); Nav.go(getActivity(), ListTimelineFragment.class, args);
} else if ((hashtag = hashtagsItems.get(id)) != null) { } else if ((hashtag = hashtagsItems.get(id)) != null) {
args.putString("hashtag", hashtag.name); args.putString("hashtag", hashtag.name);

View File

@ -2,16 +2,15 @@ package org.joinmastodon.android.fragments;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import android.view.HapticFeedbackConstants;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.Toast;
import org.joinmastodon.android.GlobalUserPreferences; import androidx.annotation.Nullable;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.lists.GetList; import org.joinmastodon.android.api.requests.lists.GetList;
import org.joinmastodon.android.api.requests.lists.UpdateList; import org.joinmastodon.android.api.requests.lists.UpdateList;
@ -23,7 +22,6 @@ import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ListTimelineEditor; import org.joinmastodon.android.ui.views.ListTimelineEditor;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import me.grishka.appkit.Nav; import me.grishka.appkit.Nav;
@ -36,6 +34,7 @@ import me.grishka.appkit.utils.V;
public class ListTimelineFragment extends PinnableStatusListFragment { public class ListTimelineFragment extends PinnableStatusListFragment {
private String listID; private String listID;
private String listTitle; private String listTitle;
@Nullable
private ListTimeline.RepliesPolicy repliesPolicy; private ListTimeline.RepliesPolicy repliesPolicy;
private ImageButton fab; private ImageButton fab;
@ -59,7 +58,9 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
public void onSuccess(ListTimeline listTimeline) { public void onSuccess(ListTimeline listTimeline) {
// TODO: save updated info // TODO: save updated info
if (!listTimeline.title.equals(listTitle)) setTitle(listTimeline.title); if (!listTimeline.title.equals(listTitle)) setTitle(listTimeline.title);
if (!listTimeline.repliesPolicy.equals(repliesPolicy)) repliesPolicy = listTimeline.repliesPolicy; if (listTimeline.repliesPolicy != null && !listTimeline.repliesPolicy.equals(repliesPolicy)) {
repliesPolicy = listTimeline.repliesPolicy;
}
} }
@Override @Override
@ -86,7 +87,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
.setTitle(R.string.sk_edit_list_title) .setTitle(R.string.sk_edit_list_title)
.setIcon(R.drawable.ic_fluent_people_list_28_regular) .setIcon(R.drawable.ic_fluent_people_list_28_regular)
.setView(editor) .setView(editor)
.setPositiveButton(R.string.save, (d, which) -> { .setPositiveButton(R.string.save, (d, which) ->
new UpdateList(listID, editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() { new UpdateList(listID, editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() {
@Override @Override
public void onSuccess(ListTimeline list) { public void onSuccess(ListTimeline list) {
@ -96,7 +97,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
Bundle result = new Bundle(); Bundle result = new Bundle();
result.putString("listID", listID); result.putString("listID", listID);
result.putString("listTitle", listTitle); result.putString("listTitle", listTitle);
result.putInt("repliesPolicy", repliesPolicy.ordinal()); if (repliesPolicy != null) result.putInt("repliesPolicy", repliesPolicy.ordinal());
setResult(true, result); setResult(true, result);
} }
@ -104,8 +105,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
public void onError(ErrorResponse error) { public void onError(ErrorResponse error) {
error.showToast(getContext()); error.showToast(getContext());
} }
}).exec(accountID); }).exec(accountID))
})
.setNegativeButton(R.string.cancel, (d, which) -> {}) .setNegativeButton(R.string.cancel, (d, which) -> {})
.show(); .show();
} else if (item.getItemId() == R.id.delete) { } else if (item.getItemId() == R.id.delete) {

View File

@ -21,7 +21,6 @@ import org.joinmastodon.android.api.requests.lists.RemoveAccountsFromList;
import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.model.ListTimeline;
import org.joinmastodon.android.ui.DividerItemDecoration; import org.joinmastodon.android.ui.DividerItemDecoration;
import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ListTimelineEditor; import org.joinmastodon.android.ui.views.ListTimelineEditor;
import java.util.ArrayList; import java.util.ArrayList;
@ -42,10 +41,8 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
private String accountId; private String accountId;
private String profileAccountId; private String profileAccountId;
private String profileDisplayUsername; private final HashMap<String, Boolean> userInListBefore = new HashMap<>();
private HashMap<String, Boolean> userInListBefore = new HashMap<>(); private final HashMap<String, Boolean> userInList = new HashMap<>();
private HashMap<String, Boolean> userInList = new HashMap<>();
private int inProgress = 0;
private ListsAdapter adapter; private ListsAdapter adapter;
public ListTimelinesFragment() { public ListTimelinesFragment() {
@ -61,7 +58,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
if(args.containsKey("profileAccount")){ if(args.containsKey("profileAccount")){
profileAccountId=args.getString("profileAccount"); profileAccountId=args.getString("profileAccount");
profileDisplayUsername=args.getString("profileDisplayUsername"); String profileDisplayUsername = args.getString("profileDisplayUsername");
setTitle(getString(R.string.sk_lists_with_user, profileDisplayUsername)); setTitle(getString(R.string.sk_lists_with_user, profileDisplayUsername));
} else { } else {
setTitle(R.string.sk_your_lists); setTitle(R.string.sk_your_lists);
@ -94,7 +91,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
.setTitle(R.string.sk_create_list_title) .setTitle(R.string.sk_create_list_title)
.setIcon(R.drawable.ic_fluent_people_add_28_regular) .setIcon(R.drawable.ic_fluent_people_add_28_regular)
.setView(editor) .setView(editor)
.setPositiveButton(R.string.sk_create, (d, which) -> { .setPositiveButton(R.string.sk_create, (d, which) ->
new CreateList(editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() { new CreateList(editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() {
@Override @Override
public void onSuccess(ListTimeline list) { public void onSuccess(ListTimeline list) {
@ -107,8 +104,8 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
public void onError(ErrorResponse error) { public void onError(ErrorResponse error) {
error.showToast(getContext()); error.showToast(getContext());
} }
}).exec(accountId); }).exec(accountId)
}) )
.setNegativeButton(R.string.cancel, (d, which) -> {}) .setNegativeButton(R.string.cancel, (d, which) -> {})
.show(); .show();
} }
@ -169,7 +166,9 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
adapter.notifyItemRemoved(i); adapter.notifyItemRemoved(i);
} else { } else {
item.title = result.getString("listTitle", item.title); item.title = result.getString("listTitle", item.title);
if (result.containsKey("repliesPolicy")) {
item.repliesPolicy = ListTimeline.RepliesPolicy.values()[result.getInt("repliesPolicy")]; item.repliesPolicy = ListTimeline.RepliesPolicy.values()[result.getInt("repliesPolicy")];
}
adapter.notifyItemChanged(i); adapter.notifyItemChanged(i);
} }
break; break;
@ -240,7 +239,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
args.putString("account", accountId); args.putString("account", accountId);
args.putString("listID", item.id); args.putString("listID", item.id);
args.putString("listTitle", item.title); args.putString("listTitle", item.title);
args.putInt("repliesPolicy", item.repliesPolicy.ordinal()); if (item.repliesPolicy != null) args.putInt("repliesPolicy", item.repliesPolicy.ordinal());
Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_CHANGED_RESULT, ListTimelinesFragment.this); Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_CHANGED_RESULT, ListTimelinesFragment.this);
} }
} }

View File

@ -1,5 +1,7 @@
package org.joinmastodon.android.model; package org.joinmastodon.android.model;
import androidx.annotation.NonNull;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import org.joinmastodon.android.api.RequiredField; import org.joinmastodon.android.api.RequiredField;
@ -11,9 +13,9 @@ public class ListTimeline extends BaseModel {
public String id; public String id;
@RequiredField @RequiredField
public String title; public String title;
@RequiredField
public RepliesPolicy repliesPolicy; public RepliesPolicy repliesPolicy;
@NonNull
@Override @Override
public String toString() { public String toString() {
return "List{" + return "List{" +

View File

@ -10,6 +10,9 @@ import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.model.ListTimeline;
@ -37,9 +40,9 @@ public class ListTimelineEditor extends LinearLayout {
setRepliesPolicy(ListTimeline.RepliesPolicy.LIST); setRepliesPolicy(ListTimeline.RepliesPolicy.LIST);
} }
public void applyList(String title, ListTimeline.RepliesPolicy policy) { public void applyList(String title, @Nullable ListTimeline.RepliesPolicy policy) {
input.getEditText().setText(title); input.getEditText().setText(title);
setRepliesPolicy(policy); if (policy != null) setRepliesPolicy(policy);
} }
public String getTitle() { public String getTitle() {
@ -50,7 +53,7 @@ public class ListTimelineEditor extends LinearLayout {
return policy; return policy;
} }
public void setRepliesPolicy(ListTimeline.RepliesPolicy policy) { public void setRepliesPolicy(@NonNull ListTimeline.RepliesPolicy policy) {
this.policy = policy; this.policy = policy;
switch (policy) { switch (policy) {
case FOLLOWED -> button.setText(R.string.sk_list_replies_policy_followed); case FOLLOWED -> button.setText(R.string.sk_list_replies_policy_followed);