implement editing lists

re: sk22#30
This commit is contained in:
sk
2023-01-10 09:56:37 -03:00
committed by LucasGGamerM
parent 83b089457e
commit 3713063ce3
5 changed files with 68 additions and 27 deletions

View File

@@ -10,13 +10,20 @@ import android.view.ViewGroup;
import android.widget.ImageButton; import android.widget.ImageButton;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.lists.CreateList;
import org.joinmastodon.android.api.requests.lists.UpdateList;
import org.joinmastodon.android.api.requests.timelines.GetListTimeline; import org.joinmastodon.android.api.requests.timelines.GetListTimeline;
import org.joinmastodon.android.model.ListTimeline;
import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.Status;
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 java.util.List; import java.util.List;
import me.grishka.appkit.Nav; import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.api.SimpleCallback; import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.utils.V; import me.grishka.appkit.utils.V;
@@ -24,6 +31,7 @@ import me.grishka.appkit.utils.V;
public class ListTimelineFragment extends StatusListFragment { public class ListTimelineFragment extends StatusListFragment {
private String listID; private String listID;
private String listTitle; private String listTitle;
private ListTimeline.RepliesPolicy repliesPolicy;
private ImageButton fab; private ImageButton fab;
public ListTimelineFragment() { public ListTimelineFragment() {
@@ -33,8 +41,11 @@ public class ListTimelineFragment extends StatusListFragment {
@Override @Override
public void onAttach(Activity activity){ public void onAttach(Activity activity){
super.onAttach(activity); super.onAttach(activity);
listID=getArguments().getString("listID"); Bundle args = getArguments();
listTitle=getArguments().getString("listTitle"); listID = args.getString("listID");
listTitle = args.getString("listTitle");
repliesPolicy = ListTimeline.RepliesPolicy.values()[args.getInt("repliesPolicy", 0)];
setTitle(listTitle); setTitle(listTitle);
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }
@@ -47,12 +58,37 @@ public class ListTimelineFragment extends StatusListFragment {
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
Bundle args = new Bundle();
args.putString("listID", listID);
if (item.getItemId() == R.id.edit) { if (item.getItemId() == R.id.edit) {
ListTimelineEditor editor = new ListTimelineEditor(getContext());
editor.applyList(listTitle, repliesPolicy);
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_edit_list_title)
.setView(editor)
.setPositiveButton(R.string.save, (d, which) -> {
new UpdateList(listID, editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() {
@Override
public void onSuccess(ListTimeline list) {
setTitle(list.title);
listTitle = list.title;
repliesPolicy = list.repliesPolicy;
args.putString("listTitle", listTitle);
args.putInt("repliesPolicy", repliesPolicy.ordinal());
setResult(true, args);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getContext());
}
}).exec(accountID);
})
.setNegativeButton(R.string.cancel, (d, which) -> {})
.show();
} else if (item.getItemId() == R.id.delete) { } else if (item.getItemId() == R.id.delete) {
UiUtils.confirmDeleteList(getActivity(), accountID, listID, () -> { UiUtils.confirmDeleteList(getActivity(), accountID, listID, () -> {
Bundle args = new Bundle(); args.putBoolean("deleted", true);
args.putString("listID", listID);
setResult(true, args); setResult(true, args);
Nav.finish(this); Nav.finish(this);
}); });

View File

@@ -36,7 +36,7 @@ import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.views.UsableRecyclerView; import me.grishka.appkit.views.UsableRecyclerView;
public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> implements ScrollableToTop { public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> implements ScrollableToTop {
private static final int LIST_DELETED_RESULT = 987; private static final int LIST_CHANGED_RESULT = 987;
private String accountId; private String accountId;
private String profileAccountId; private String profileAccountId;
@@ -147,14 +147,20 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
} }
@Override @Override
public void onFragmentResult(int reqCode, boolean listDeleted, Bundle result){ public void onFragmentResult(int reqCode, boolean listChanged, Bundle result){
if (reqCode == LIST_DELETED_RESULT && listDeleted) { if (reqCode == LIST_CHANGED_RESULT && listChanged) {
String listID = result.getString("listID"); String listID = result.getString("listID");
for (int i = 0; i < data.size(); i++) { for (int i = 0; i < data.size(); i++) {
if (data.get(i).id.equals(listID)) { ListTimeline item = data.get(i);
data.remove(i); if (item.id.equals(listID)) {
adapter.notifyItemRemoved(i); if (result.getBoolean("deleted")) {
data.remove(i);
adapter.notifyItemRemoved(i);
} else {
item.title = result.getString("listTitle", item.title);
item.repliesPolicy = ListTimeline.RepliesPolicy.values()[result.getInt("repliesPolicy")];
adapter.notifyItemChanged(i);
}
break; break;
} }
} }
@@ -223,7 +229,8 @@ 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);
Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_DELETED_RESULT, ListTimelinesFragment.this); args.putInt("repliesPolicy", item.repliesPolicy.ordinal());
Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_CHANGED_RESULT, ListTimelinesFragment.this);
} }
} }
} }

View File

@@ -15,8 +15,8 @@ import org.joinmastodon.android.model.ListTimeline;
public class ListTimelineEditor extends LinearLayout { public class ListTimelineEditor extends LinearLayout {
private ListTimeline.RepliesPolicy policy = null; private ListTimeline.RepliesPolicy policy = null;
private TextInputFrameLayout input; private final TextInputFrameLayout input;
private Button button; private final Button button;
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
public ListTimelineEditor(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { public ListTimelineEditor(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
@@ -37,10 +37,9 @@ public class ListTimelineEditor extends LinearLayout {
setRepliesPolicy(ListTimeline.RepliesPolicy.LIST); setRepliesPolicy(ListTimeline.RepliesPolicy.LIST);
} }
public void applyList(ListTimeline list) { public void applyList(String title, ListTimeline.RepliesPolicy policy) {
policy = list.repliesPolicy; input.getEditText().setText(title);
input.getEditText().setText(list.title); setRepliesPolicy(policy);
setRepliesPolicy(list.repliesPolicy);
} }
public String getTitle() { public String getTitle() {

View File

@@ -4,7 +4,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout <org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
@@ -12,11 +11,12 @@
<TextView <TextView
android:id="@+id/text" android:id="@+id/text"
android:text="@string/sk_list_replies_policy" android:text="@string/sk_list_replies_policy"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:paddingVertical="8dp" android:paddingVertical="8dp"
android:singleLine="true"
android:ellipsize="none"
android:gravity="center_vertical" android:gravity="center_vertical"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textSize="16sp" /> android:textSize="16sp" />
@@ -25,11 +25,9 @@
android:id="@+id/button" android:id="@+id/button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="32dp" android:layout_height="32dp"
android:layout_weight="0"
android:maxWidth="140dp"
android:background="@drawable/bg_inline_button" android:background="@drawable/bg_inline_button"
android:elevation="0dp" android:elevation="0dp"
android:ellipsize="middle" android:ellipsize="none"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:singleLine="true" android:singleLine="true"
android:stateListAnimator="@null" android:stateListAnimator="@null"

View File

@@ -148,11 +148,12 @@
<string name="sk_create_list_title">Create list</string> <string name="sk_create_list_title">Create list</string>
<string name="sk_list_name_hint">List name</string> <string name="sk_list_name_hint">List name</string>
<string name="sk_list_replies_policy">Show replies to</string> <string name="sk_list_replies_policy">Show replies to</string>
<string name="sk_list_replies_policy_list">List members</string> <string name="sk_list_replies_policy_list">list members</string>
<string name="sk_list_replies_policy_followed">Any followed user</string> <string name="sk_list_replies_policy_followed">followed users</string>
<string name="sk_list_replies_policy_none">No one</string> <string name="sk_list_replies_policy_none">no one</string>
<string name="sk_delete_list">Delete list</string> <string name="sk_delete_list">Delete list</string>
<string name="sk_delete_list_confirm">Are you sure you want to delete this list?</string> <string name="sk_delete_list_confirm">Are you sure you want to delete this list?</string>
<string name="sk_edit_list_title">Edit list</string>
<!-- accessibility labels--> <!-- accessibility labels-->
<string name="sk_poll_option_add">Add new poll option</string> <string name="sk_poll_option_add">Add new poll option</string>