From 75adacf800c3880677820b467cc2519eba19546f Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Thu, 22 Oct 2020 10:53:10 +0200 Subject: [PATCH] fixed alert dialogs, added cursor system for lists --- .../nuclearfog/twidda/activity/ListPopup.java | 32 ++++--- .../twidda/activity/TweetActivity.java | 35 ++++--- .../twidda/activity/TweetPopup.java | 69 ++++++++------ .../twidda/backend/TweetUploader.java | 17 ++-- .../twidda/backend/TwitterListLoader.java | 65 ++++++------- .../twidda/backend/engine/TwitterEngine.java | 37 +++++++- .../twidda/backend/holder/UserListList.java | 68 ++++++++++++++ .../twidda/fragment/ListFragment.java | 93 +++++++++++-------- 8 files changed, 282 insertions(+), 134 deletions(-) create mode 100644 app/src/main/java/org/nuclearfog/twidda/backend/holder/UserListList.java diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java index 1b2ea638..788d962a 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/ListPopup.java @@ -1,5 +1,6 @@ package org.nuclearfog.twidda.activity; +import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -23,6 +24,7 @@ import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.backend.utils.FontTool; import org.nuclearfog.twidda.database.GlobalSettings; +import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.RUNNING; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; @@ -36,7 +38,7 @@ import static org.nuclearfog.twidda.activity.TwitterList.RET_LIST_CREATED; /** * Popup activity for the list editor */ -public class ListPopup extends AppCompatActivity implements OnClickListener { +public class ListPopup extends AppCompatActivity implements OnClickListener, DialogInterface.OnClickListener { /** * Key for the list ID of the list if an existing list should be updated @@ -62,6 +64,7 @@ public class ListPopup extends AppCompatActivity implements OnClickListener { private EditText titleInput, subTitleInput; private CompoundButton visibility; private View progressCircle; + private Dialog leaveDialog; private long listId = -1; private String title = ""; @@ -108,16 +111,15 @@ public class ListPopup extends AppCompatActivity implements OnClickListener { && subTitleInput.getText().toString().equals(description)) { super.onBackPressed(); } else { - Builder alertDialog = new Builder(this, R.style.ConfirmDialog); - alertDialog.setMessage(R.string.confirm_discard); - alertDialog.setNegativeButton(R.string.confirm_no, null); - alertDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }); - alertDialog.show(); + if (leaveDialog == null) { + Builder builder = new Builder(this, R.style.ConfirmDialog); + builder.setMessage(R.string.confirm_discard); + builder.setNegativeButton(R.string.confirm_no, null); + builder.setPositiveButton(R.string.confirm_yes, this); + leaveDialog = builder.show(); + } else if (!leaveDialog.isShowing()) { + leaveDialog.show(); + } } } @@ -145,6 +147,14 @@ public class ListPopup extends AppCompatActivity implements OnClickListener { } } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == BUTTON_POSITIVE && dialog == leaveDialog) { + finish(); + } + } + /** * called when an update starts */ diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java b/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java index 417863b5..2625d047 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/TweetActivity.java @@ -1,5 +1,6 @@ package org.nuclearfog.twidda.activity; +import android.app.Dialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.DialogInterface; @@ -43,6 +44,7 @@ import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.regex.Pattern; +import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.RUNNING; import static android.view.View.GONE; import static android.view.View.VISIBLE; @@ -65,7 +67,7 @@ import static org.nuclearfog.twidda.fragment.TweetFragment.RETURN_TWEET_CHANGED; * Tweet Activity for tweet and user informations */ public class TweetActivity extends AppCompatActivity implements OnClickListener, - OnLongClickListener, OnTagClickListener { + OnLongClickListener, OnTagClickListener, DialogInterface.OnClickListener { /** * ID of the tweet to open. required @@ -86,6 +88,7 @@ public class TweetActivity extends AppCompatActivity implements OnClickListener, private Button rtwButton, favButton, replyName, tweetLocGPS; private ImageView profile_img, mediaButton; private View header, footer, sensitive_media; + private Dialog deleteDialog; private FragmentAdapter adapter; private GlobalSettings settings; @@ -188,17 +191,16 @@ public class TweetActivity extends AppCompatActivity implements OnClickListener, if (statusAsync != null && tweet != null && statusAsync.getStatus() != RUNNING) { switch (item.getItemId()) { case R.id.delete_tweet: - Builder deleteDialog = new Builder(this, R.style.ConfirmDialog); - deleteDialog.setMessage(R.string.confirm_delete_tweet); - deleteDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - statusAsync = new TweetLoader(TweetActivity.this, Action.DELETE); - statusAsync.execute(tweet.getId()); - } - }); - deleteDialog.setNegativeButton(R.string.confirm_no, null); - deleteDialog.show(); + if (deleteDialog == null) { + Builder builder = new Builder(this, R.style.ConfirmDialog); + builder.setMessage(R.string.confirm_delete_tweet); + builder.setPositiveButton(R.string.confirm_yes, this); + builder.setNegativeButton(R.string.confirm_no, null); + deleteDialog = builder.create(); + } + if (!deleteDialog.isShowing()) { + deleteDialog.show(); + } break; case R.id.tweet_link: @@ -229,6 +231,15 @@ public class TweetActivity extends AppCompatActivity implements OnClickListener, } + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == BUTTON_POSITIVE && dialog == deleteDialog && tweet != null) { + statusAsync = new TweetLoader(TweetActivity.this, Action.DELETE); + statusAsync.execute(tweet.getId()); + } + } + + @Override public void onClick(View v) { if (statusAsync != null && tweet != null && statusAsync.getStatus() != RUNNING) { diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java b/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java index 1eef96d8..1bdd327c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/TweetPopup.java @@ -20,7 +20,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AppCompatActivity; @@ -37,6 +36,7 @@ import java.util.List; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; +import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.content.Intent.ACTION_PICK; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.AsyncTask.Status.RUNNING; @@ -55,7 +55,8 @@ import static org.nuclearfog.twidda.activity.MediaViewer.MEDIAVIEWER_VIDEO; /** * Activity to create a tweet */ -public class TweetPopup extends AppCompatActivity implements OnClickListener, LocationListener, OnDismissListener { +public class TweetPopup extends AppCompatActivity implements OnClickListener, LocationListener, + OnDismissListener, DialogInterface.OnClickListener { /** * key for the replied tweet if any @@ -90,12 +91,13 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo private List mediaPath; private ImageButton mediaBtn, previewBtn, locationBtn; private View locationProg; - private Dialog loadingCircle; + private Dialog loadingCircle, errorDialog, closingDialog; private EditText tweetText; private MediaType selectedFormat = MediaType.NONE; private String prefix = ""; private long inReplyId = 0; + private TweetHolder tweet; @Override protected void onCreate(@Nullable Bundle b) { @@ -244,15 +246,15 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo if (tweetStr.trim().isEmpty() && mediaPath.isEmpty()) { Toast.makeText(this, R.string.error_empty_tweet, LENGTH_SHORT).show(); } else if (locationProg.getVisibility() == INVISIBLE) { - TweetHolder tweet = new TweetHolder(tweetStr, inReplyId); + tweet = new TweetHolder(tweetStr, inReplyId); if (selectedFormat == MediaType.IMAGE || selectedFormat == MediaType.GIF) tweet.addMedia(mediaPath.toArray(new String[0]), TweetHolder.MediaType.IMAGE); else if (selectedFormat == MediaType.VIDEO) tweet.addMedia(mediaPath.toArray(new String[0]), TweetHolder.MediaType.VIDEO); if (location != null) tweet.addLocation(location); - uploaderAsync = new TweetUploader(this, tweet); - uploaderAsync.execute(); + uploaderAsync = new TweetUploader(this); + uploaderAsync.execute(tweet); } break; @@ -325,6 +327,19 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo } } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == BUTTON_POSITIVE) { + if (dialog == errorDialog) { + uploaderAsync = new TweetUploader(this); + uploaderAsync.execute(tweet); + } else if (dialog == closingDialog) { + finish(); + } + } + } + /** * enable or disable loading dialog * @@ -348,21 +363,18 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo /** * Show confirmation dialog if an error occurs while sending tweet - * - * @param tweet tweet to re-send */ - public void onError(final TweetHolder tweet, EngineException error) { + public void onError(EngineException error) { ErrorHandler.handleFailure(this, error); - AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.ConfirmDialog); - builder.setTitle(R.string.info_error).setMessage(R.string.error_sending_tweet) - .setPositiveButton(R.string.confirm_retry, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - uploaderAsync = new TweetUploader(TweetPopup.this, tweet); - uploaderAsync.execute(); - } - }) - .setNegativeButton(android.R.string.cancel, null).show(); + if (errorDialog == null) { + Builder builder = new Builder(this, R.style.ConfirmDialog); + builder.setTitle(R.string.info_error).setMessage(R.string.error_sending_tweet); + builder.setPositiveButton(R.string.confirm_retry, this); + builder.setNegativeButton(android.R.string.cancel, null); + errorDialog = builder.show(); + } else if (!errorDialog.isShowing()) { + errorDialog.show(); + } } @@ -371,16 +383,15 @@ public class TweetPopup extends AppCompatActivity implements OnClickListener, Lo */ private void showClosingMsg() { if (!prefix.equals(tweetText.getText().toString()) || !mediaPath.isEmpty()) { - Builder closeDialog = new Builder(this, R.style.ConfirmDialog); - closeDialog.setMessage(R.string.confirm_cancel_tweet); - closeDialog.setNegativeButton(R.string.confirm_no, null); - closeDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }); - closeDialog.show(); + if (closingDialog == null) { + Builder builder = new Builder(this, R.style.ConfirmDialog); + builder.setMessage(R.string.confirm_cancel_tweet); + builder.setNegativeButton(R.string.confirm_no, null); + builder.setPositiveButton(R.string.confirm_yes, this); + closingDialog = builder.show(); + } else if (!closingDialog.isShowing()) { + closingDialog.show(); + } } else { finish(); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/TweetUploader.java b/app/src/main/java/org/nuclearfog/twidda/backend/TweetUploader.java index 454026c1..c0de248d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/TweetUploader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/TweetUploader.java @@ -13,27 +13,25 @@ import java.lang.ref.WeakReference; /** * Background task for uploading tweet + * * @see TweetPopup */ -public class TweetUploader extends AsyncTask { +public class TweetUploader extends AsyncTask { @Nullable private EngineException twException; - private WeakReference callback; - private TwitterEngine mTwitter; - private TweetHolder tweet; + private final WeakReference callback; + private final TwitterEngine mTwitter; /** * initialize task * * @param callback Activity context - * @param tweet tweet information */ - public TweetUploader(TweetPopup callback, TweetHolder tweet) { + public TweetUploader(TweetPopup callback) { super(); this.callback = new WeakReference<>(callback); mTwitter = TwitterEngine.getInstance(callback); - this.tweet = tweet; } @@ -46,8 +44,9 @@ public class TweetUploader extends AsyncTask { @Override - protected Boolean doInBackground(Void[] v) { + protected Boolean doInBackground(TweetHolder[] param) { try { + TweetHolder tweet = param[0]; mTwitter.uploadStatus(tweet); return true; } catch (EngineException twException) { @@ -66,7 +65,7 @@ public class TweetUploader extends AsyncTask { if (success) { callback.get().onSuccess(); } else if (twException != null) { - callback.get().onError(tweet, twException); + callback.get().onError(twException); } } } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterListLoader.java b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterListLoader.java index bae64a39..0e9eef85 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/TwitterListLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/TwitterListLoader.java @@ -6,11 +6,11 @@ import androidx.annotation.Nullable; import org.nuclearfog.twidda.backend.engine.EngineException; import org.nuclearfog.twidda.backend.engine.TwitterEngine; +import org.nuclearfog.twidda.backend.holder.UserListList; import org.nuclearfog.twidda.backend.items.TwitterList; import org.nuclearfog.twidda.fragment.ListFragment; import java.lang.ref.WeakReference; -import java.util.List; /** @@ -18,7 +18,9 @@ import java.util.List; * * @see ListFragment */ -public class TwitterListLoader extends AsyncTask> { +public class TwitterListLoader extends AsyncTask { + + public static final long NO_CURSOR = -1; public enum Action { LOAD, @@ -32,39 +34,37 @@ public class TwitterListLoader extends AsyncTask(callback); this.action = action; + this.ownerName = ownerName; + this.id = id; } @Override - protected List doInBackground(Object[] param) { + protected UserListList doInBackground(Long[] param) { try { switch (action) { case LOAD: - if (param[0] instanceof Long) { - long ownerId = (long) param[0]; - return mTwitter.getUserList(ownerId); + long cursor = param[0]; + if (id > 0) { + return mTwitter.getUserList(id, cursor); } else { - String ownerName = (String) param[0]; - return mTwitter.getUserList(ownerName); + return mTwitter.getUserList(ownerName, cursor); } case FOLLOW: - long listId = (long) param[0]; - TwitterList result = mTwitter.followUserList(listId); - publishProgress(result); - break; + return new UserListList(mTwitter.followUserList(id)); case DELETE: - listId = (long) param[0]; - TwitterList deletedList = mTwitter.deleteUserList(listId); - publishProgress(deletedList); - break; + return new UserListList(mTwitter.deleteUserList(id)); } } catch (EngineException twException) { this.twException = twException; @@ -76,23 +76,24 @@ public class TwitterListLoader extends AsyncTask result) { + protected void onPostExecute(UserListList result) { if (callback.get() != null) { if (result != null) { - callback.get().setData(result); + switch (action) { + case LOAD: + callback.get().setData(result); + break; + + case FOLLOW: + TwitterList list = result.get(0); + callback.get().updateItem(list); + break; + + case DELETE: + long id = result.get(0).getId(); + callback.get().removeItem(id); + break; + } } else { callback.get().onError(twException); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java b/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java index 7c183304..bdc55176 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/engine/TwitterEngine.java @@ -12,6 +12,7 @@ import org.nuclearfog.twidda.backend.holder.MessageHolder; import org.nuclearfog.twidda.backend.holder.TweetHolder; import org.nuclearfog.twidda.backend.holder.TwitterUserList; import org.nuclearfog.twidda.backend.holder.UserHolder; +import org.nuclearfog.twidda.backend.holder.UserListList; import org.nuclearfog.twidda.backend.items.Message; import org.nuclearfog.twidda.backend.items.TrendLocation; import org.nuclearfog.twidda.backend.items.Tweet; @@ -903,13 +904,16 @@ public class TwitterEngine { * get user list * * @param userId id of the list owner + * @param cursor list cursor to set the start point * @return list information * @throws EngineException if access is unavailable */ - public List getUserList(long userId) throws EngineException { + public UserListList getUserList(long userId, long cursor) throws EngineException { try { - List result = new LinkedList<>(); // TODO add a paging system List lists = twitter.getUserLists(userId); + long prevCursor = cursor > 0 ? cursor : 0; + long nextCursor = 0; + UserListList result = new UserListList(0, 0); // todo add paging system for (UserList list : lists) result.add(new TwitterList(list, twitterID)); return result; @@ -923,13 +927,16 @@ public class TwitterEngine { * get user list * * @param username id of the list owner + * @param cursor list cursor to set the start point * @return list information * @throws EngineException if access is unavailable */ - public List getUserList(String username) throws EngineException { + public UserListList getUserList(String username, long cursor) throws EngineException { try { - List result = new LinkedList<>(); List lists = twitter.getUserLists(username); + long prevCursor = cursor > 0 ? cursor : 0; + long nextCursor = 0; + UserListList result = new UserListList(prevCursor, nextCursor); // todo add paging system for (UserList list : lists) result.add(new TwitterList(list, twitterID)); return result; @@ -938,6 +945,28 @@ public class TwitterEngine { } } + /** + * get the lists the user has been added to + * + * @param userId ID of the user + * @param cursor list cursor + * @return a list of user lists + * @throws EngineException if access is unavailable + */ + public UserListList getUserListMemberships(long userId, long cursor) throws EngineException { + try { + int count = settings.getListSize(); + PagableResponseList lists = twitter.getUserListMemberships(userId, count, cursor); + long prevCursor = cursor > 0 ? cursor : 0; + long nextCursor = lists.getNextCursor(); + UserListList result = new UserListList(prevCursor, nextCursor); + for (UserList list : lists) + result.add(new TwitterList(list, twitterID)); + return result; + } catch (TwitterException err) { + throw new EngineException(err); + } + } /** * Follow action for twitter list diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/holder/UserListList.java b/app/src/main/java/org/nuclearfog/twidda/backend/holder/UserListList.java new file mode 100644 index 00000000..e6799b82 --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/backend/holder/UserListList.java @@ -0,0 +1,68 @@ +package org.nuclearfog.twidda.backend.holder; + +import androidx.annotation.NonNull; + +import org.nuclearfog.twidda.backend.items.TwitterList; + +import java.util.LinkedList; + +/** + * Container class for user lists containing extra cursors for paging + */ +public class UserListList extends LinkedList { + + private long prevCursor = 0; + private long nextCursor = 0; + + /** + * @param list single list item + */ + public UserListList(TwitterList list) { + super(); + add(list); + } + + /** + * @param prevCursor previous list cursor or 0 if list starts + * @param nextCursor next cursor or 0 if list ends + */ + public UserListList(long prevCursor, long nextCursor) { + super(); + this.prevCursor = prevCursor; + this.nextCursor = nextCursor; + } + + + /** + * check if list is linked to a previous list + * + * @return true if list is linked + */ + public boolean hasPrevious() { + return prevCursor != 0; + } + + /** + * check if list has a successor + * + * @return true if list has a successor + */ + public boolean hasNext() { + return nextCursor != 0; + } + + /** + * get next link to a list + * + * @return cursor + */ + public long getNext() { + return nextCursor; + } + + @Override + @NonNull + public String toString() { + return "size=" + size() + " pre=" + prevCursor + " pos=" + nextCursor; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java b/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java index 18609260..9f9d3613 100644 --- a/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java +++ b/app/src/main/java/org/nuclearfog/twidda/fragment/ListFragment.java @@ -1,5 +1,6 @@ package org.nuclearfog.twidda.fragment; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -32,6 +33,7 @@ import org.nuclearfog.twidda.database.GlobalSettings; import java.util.List; +import static android.content.DialogInterface.BUTTON_POSITIVE; import static android.os.AsyncTask.Status.FINISHED; import static android.os.AsyncTask.Status.RUNNING; import static org.nuclearfog.twidda.activity.ListDetail.KEY_CURRENT_USER_OWNS; @@ -46,11 +48,13 @@ import static org.nuclearfog.twidda.activity.UserProfile.KEY_PROFILE_ID; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.DELETE; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.FOLLOW; import static org.nuclearfog.twidda.backend.TwitterListLoader.Action.LOAD; +import static org.nuclearfog.twidda.backend.TwitterListLoader.NO_CURSOR; /** * Fragment class for user lists */ -public class ListFragment extends Fragment implements OnRefreshListener, ListClickListener, FragmentChangeObserver { +public class ListFragment extends Fragment implements OnRefreshListener, ListClickListener, + FragmentChangeObserver, DialogInterface.OnClickListener { /** * Key for the owner ID @@ -69,6 +73,10 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli private RecyclerView list; private ListAdapter adapter; + private Dialog followDialog, deleteDialog; + + private long selectedList; + @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle param) { Context context = inflater.getContext(); @@ -94,7 +102,7 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli super.onStart(); if (listTask == null) { setRefresh(true); - load(); + load(NO_CURSOR); } } @@ -110,7 +118,7 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli @Override public void onRefresh() { if (listTask != null && listTask.getStatus() != RUNNING) { - load(); + load(NO_CURSOR); } } @@ -127,19 +135,19 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli case FOLLOW: if (listItem.isFollowing()) { - Builder confirmDialog = new Builder(getContext(), R.style.ConfirmDialog); - confirmDialog.setMessage(R.string.confirm_unfollow_list); - confirmDialog.setNegativeButton(R.string.confirm_no, null); - confirmDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - listTask = new TwitterListLoader(ListFragment.this, FOLLOW); - listTask.execute(listItem.getId()); - } - }); - confirmDialog.show(); + if (followDialog == null) { + Builder confirmDialog = new Builder(getContext(), R.style.ConfirmDialog); + confirmDialog.setMessage(R.string.confirm_unfollow_list); + confirmDialog.setNegativeButton(R.string.confirm_no, null); + confirmDialog.setPositiveButton(R.string.confirm_yes, this); + followDialog = confirmDialog.create(); + } + if (!followDialog.isShowing()) { + selectedList = listItem.getId(); + followDialog.show(); + } } else { - listTask = new TwitterListLoader(this, FOLLOW); + listTask = new TwitterListLoader(this, FOLLOW, listItem.getId(), ""); listTask.execute(listItem.getId()); } break; @@ -164,29 +172,43 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli break; case DELETE: - Builder confirmDialog = new Builder(getContext(), R.style.ConfirmDialog); - confirmDialog.setMessage(R.string.confirm_delete_list); - confirmDialog.setNegativeButton(R.string.confirm_no, null); - confirmDialog.setPositiveButton(R.string.confirm_yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - listTask = new TwitterListLoader(ListFragment.this, DELETE); - listTask.execute(listItem.getId()); - } - }); - confirmDialog.show(); + if (deleteDialog == null) { + Builder confirmDialog = new Builder(requireContext(), R.style.ConfirmDialog); + confirmDialog.setMessage(R.string.confirm_delete_list); + confirmDialog.setNegativeButton(R.string.confirm_no, null); + confirmDialog.setPositiveButton(R.string.confirm_yes, this); + deleteDialog = confirmDialog.create(); + } + if (!deleteDialog.isShowing()) { + selectedList = listItem.getId(); + deleteDialog.show(); + } break; } } } + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == BUTTON_POSITIVE) { + if (dialog == followDialog) { + listTask = new TwitterListLoader(this, FOLLOW, selectedList, ""); + listTask.execute(); + } else if (dialog == deleteDialog) { + listTask = new TwitterListLoader(this, DELETE, selectedList, ""); + listTask.execute(); + } + } + } + + @Override public void onReset() { if (list != null) { list.setAdapter(adapter); setRefresh(true); - load(); + load(NO_CURSOR); } } @@ -225,9 +247,10 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli /** * called from {@link TwitterListLoader} to enable or disable RefreshLayout + * * @param enable true to enable RefreshLayout with delay */ - public void setRefresh(boolean enable) { + private void setRefresh(boolean enable) { if (enable) { reloadLayout.postDelayed(new Runnable() { @Override @@ -256,17 +279,13 @@ public class ListFragment extends Fragment implements OnRefreshListener, ListCli /** * load content into the list */ - private void load() { + private void load(long cursor) { Bundle param = getArguments(); if (param != null) { - listTask = new TwitterListLoader(this, LOAD); - if (param.containsKey(KEY_FRAG_LIST_OWNER_ID)) { - long ownerId = param.getLong(KEY_FRAG_LIST_OWNER_ID); - listTask.execute(ownerId); - } else if (param.containsKey(KEY_FRAG_LIST_OWNER_NAME)) { - String ownerName = param.getString(KEY_FRAG_LIST_OWNER_NAME); - listTask.execute(ownerName); - } + long id = param.getLong(KEY_FRAG_LIST_OWNER_ID, 0); + String ownerName = param.getString(KEY_FRAG_LIST_OWNER_NAME, ""); + listTask = new TwitterListLoader(this, LOAD, id, ownerName); + listTask.execute(cursor); } } } \ No newline at end of file