diff options
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java')
-rw-r--r-- | app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java | 302 |
1 files changed, 146 insertions, 156 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java index 7d2e5dbd..5b2ee58c 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java @@ -24,12 +24,12 @@ package net.lacolaco.smileessence.view.dialog; -import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; @@ -42,18 +42,19 @@ import net.lacolaco.smileessence.command.CommandAddHashtag; import net.lacolaco.smileessence.command.CommandOpenURL; import net.lacolaco.smileessence.command.CommandOpenUserDetail; import net.lacolaco.smileessence.data.Account; -import net.lacolaco.smileessence.data.PostState; import net.lacolaco.smileessence.entity.RBinding; import net.lacolaco.smileessence.entity.Tweet; -import net.lacolaco.smileessence.notification.Notificator; +import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.twitter.task.TweetReactions; import net.lacolaco.smileessence.twitter.task.Tweets; +import net.lacolaco.smileessence.util.IntentUtils; +import net.lacolaco.smileessence.util.SystemServiceHelper; import net.lacolaco.smileessence.util.UIObserverBundle; import net.lacolaco.smileessence.view.DialogHelper; +import net.lacolaco.smileessence.view.Partials; import net.lacolaco.smileessence.view.ToggleableImageButton; -import net.lacolaco.smileessence.view.adapter.StatusListAdapter; -import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter; -import net.lacolaco.smileessence.viewmodel.StatusViewModel; +import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.adapter.TimelineAdapter; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -61,50 +62,117 @@ import java.util.LinkedHashSet; import java.util.List; public class StatusDetailDialogFragment extends StackableDialogFragment implements View.OnClickListener { - - // ------------------------------ FIELDS ------------------------------ - - private static final String KEY_STATUS_ID = "statusID"; + private static final String KEY_STATUS_ID = "status_id"; private Tweet tweet; - // --------------------- GETTER / SETTER METHODS --------------------- - - public long getStatusID() { - return getArguments().getLong(KEY_STATUS_ID); - } - - public void setStatusID(long statusID) { + public static StatusDetailDialogFragment newInstance(Tweet tweet) { + StatusDetailDialogFragment obj = new StatusDetailDialogFragment(); Bundle args = new Bundle(); - args.putLong(KEY_STATUS_ID, statusID); - setArguments(args); + args.putLong(KEY_STATUS_ID, tweet.getId()); + obj.setArguments(args); + return obj; } - // ------------------------ INTERFACE METHODS ------------------------ - - - // --------------------- Interface OnClickListener --------------------- - @Override public void onClick(final View v) { switch (v.getId()) { case R.id.button_status_detail_reply: { - replyToStatus(); + Tweet originalTweet = tweet.getOriginalTweet(); + + StringBuilder builder = new StringBuilder(); + builder.append("@" + originalTweet.getUser().getScreenName() + " "); + + for (String screenName : originalTweet.getMentions()) { + if (!screenName.equals(getWorld().getAccount().getUser().getScreenName())) + builder.append("@" + screenName + " "); + } + String text = builder.toString(); + int selStart = originalTweet.getUser().getScreenName().length() + 2; // "@" and " " + + getWorld().getPostState().beginTransaction() + .clear() + .insertText(0, text) + .setInReplyTo(originalTweet) + .setSelection(selStart, text.length()) + .commitWithOpen((MainActivity) getActivity()); break; } case R.id.button_status_detail_retweet: { - toggleRetweet(); + Account account = getWorld().getAccount(); + confirm(() -> { + if (tweet.isRetweetedBy(account.getUserId())) { + new Tweets.DestroyTask(account, tweet.getRetweetIdBy(account.getUserId())) + .onDone(t -> getWorld().notify(R.string.notice_status_delete_succeeded)) + .onFail(e -> getWorld().notifyError(R.string.notice_status_delete_failed)) + .execute(); + dismiss(); + } else { + new TweetReactions.RetweetTask(account, tweet.getId()) + .onDone(x -> getWorld().notify(R.string.notice_retweet_succeeded)) + .onFail(x -> getWorld().notifyError(R.string.notice_retweet_failed)) + .execute(); + } + }); break; } case R.id.button_status_detail_favorite: { - toggleFavorite(); + Account account = getWorld().getAccount(); + if (tweet.isFavoritedBy(account.getUserId())) { + new TweetReactions.UnfavoriteTask(account, tweet.getId()) + .onDone(x -> getWorld().notify(R.string.notice_unfavorite_succeeded)) + .onFail(x -> getWorld().notifyError(R.string.notice_unfavorite_failed)) + .execute(); + } else { + new TweetReactions.FavoriteTask(account, tweet.getId()) + .onDone(x -> getWorld().notify(R.string.notice_favorite_succeeded)) + .onFail(x -> getWorld().notifyError(R.string.notice_favorite_failed)) + .execute(); + } break; } case R.id.button_status_detail_delete: { - deleteStatus(); + confirm(() -> { + new Tweets.DestroyTask(getWorld().getAccount(), tweet.getOriginalTweet().getId()) + .onDone(t -> getWorld().notify(R.string.notice_status_delete_succeeded)) + .onFail(e -> getWorld().notifyError(R.string.notice_status_delete_failed)) + .execute(); + dismiss(); + }); break; } case R.id.button_status_detail_menu: { - openMenu(); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle("@" + tweet.getUser().getScreenName() + ": " + tweet.getText()) + .setItems(R.array.status_commands, (dialog, which) -> { + switch (which) { + case 0: + String text = String.format("@%s ", tweet.getOriginalTweet().getUser().getScreenName()); + getWorld().getPostState().beginTransaction().insertText(0, text).moveCursor(text.length()).commit(); + getWorld().notify(R.string.notice_add_to_reply); + break; + case 1: + TalkChainDialogFragment dialogFragment = new TalkChainDialogFragment(); + dialogFragment.setStatusID(tweet.getOriginalTweet().getId()); + DialogHelper.showDialog(getActivity(), dialogFragment); + break; + case 2: + IntentUtils.openUri(getActivity(), tweet.getOriginalTweet().getTwitterUrl()); + break; + case 3: + SystemServiceHelper.copyToClipboard(getActivity(), "tweet text", tweet.getOriginalTweet().getText()); + getWorld().notify(R.string.notice_copy_clipboard); + break; + case 4: + String statusURL = tweet.getOriginalTweet().getTwitterUrl(); + SystemServiceHelper.copyToClipboard(getActivity(), "tweet url", statusURL); + getWorld().notify(R.string.notice_copy_clipboard); + break; + default: + throw new IllegalStateException(); + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); break; } default: { @@ -113,62 +181,25 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen } } - // ------------------------ OVERRIDE METHODS ------------------------ - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - tweet = Tweet.fetch(getStatusID()); - } - @Override public Dialog onCreateDialog(Bundle savedInstanceState) { + tweet = Tweet.fetch(getArguments().getLong(KEY_STATUS_ID)); if (tweet == null) { // trying to open deleted tweet? - Notificator.getInstance().publish(R.string.notice_error_show_status); + getWorld().notifyError(R.string.notice_error_show_status); return new DisposeDialog(getActivity()); } - Account account = Application.getInstance().getCurrentAccount(); - - View header = getTitleView(); - - ListView listView = (ListView) header.findViewById(R.id.listview_status_detail_reply_to); - final StatusListAdapter adapter = new StatusListAdapter(getActivity()); - listView.setAdapter(adapter); - - View replyDivider = header.findViewById(R.id.detail_dialog_divider_top); - - if (tweet.getInReplyToStatusId() != -1) { - replyDivider.setVisibility(View.VISIBLE); - listView.setVisibility(View.VISIBLE); - Tweet.fetchTask(tweet.getInReplyToStatusId(), account) - .onDoneUI(replyTo -> { - adapter.addItem(new StatusViewModel(replyTo)); - adapter.update(); - }) - .execute(); - } else { - replyDivider.setVisibility(View.GONE); - listView.setVisibility(View.GONE); - } - - return new AlertDialog.Builder(getActivity()).setView(header).create(); - } - - private View getTitleView() { - MainActivity activity = ((MainActivity) getActivity()); - - View view = activity.getLayoutInflater().inflate(R.layout.dialog_status_detail, null); + View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_status_detail, null); UIObserverBundle bundle = new UIObserverBundle(); view.setTag(bundle); - View statusHeader = new StatusViewModel(tweet).getView(activity, activity.getLayoutInflater(), view.findViewById(R.id.layout_status_header)); + View statusHeader = Partials.getTweetView(tweet, getActivity(), view.findViewById(R.id.layout_status_header), true); statusHeader.setClickable(false); view.setBackgroundColor(((ColorDrawable) statusHeader.getBackground()).getColor()); updateViewReactions(view); updateViewButtons(view); - updateViewMenu(view); + setupViewMenu(view); final WeakReference<View> weakView = new WeakReference<>(view); bundle.attach(tweet.getOriginalTweet(), changes -> { @@ -181,11 +212,30 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen } }); - return view; + ListView listView = (ListView) view.findViewById(R.id.listview_status_detail_reply_to); + final TimelineAdapter adapter = new TimelineAdapter(getActivity()); + listView.setAdapter(adapter); + + View replyDivider = view.findViewById(R.id.detail_dialog_divider_top); + + if (tweet.getInReplyToStatusId() != -1) { + replyDivider.setVisibility(View.VISIBLE); + listView.setVisibility(View.VISIBLE); + Tweet.fetchTask(tweet.getInReplyToStatusId(), getWorld().getAccount()) + .onDoneUI(replyTo -> { + adapter.add(replyTo); + adapter.update(); + }) + .execute(); + } else { + replyDivider.setVisibility(View.GONE); + listView.setVisibility(View.GONE); + } + + return new AlertDialog.Builder(getActivity()).setView(view).create(); } private void updateViewReactions(View view) { - //--- favs/RTs count ImageView favCountIcon = (ImageView) view.findViewById(R.id.image_status_detail_fav_count); TextView favCountText = (TextView) view.findViewById(R.id.textview_status_detail_fav_count); if (tweet.getFavoriteCount() > 0) { @@ -210,7 +260,7 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen } private void updateViewButtons(View view) { - Account account = Application.getInstance().getCurrentAccount(); + Account account = getWorld().getAccount(); //--- buttons ImageButton reply = (ImageButton) view.findViewById(R.id.button_status_detail_reply); @@ -226,25 +276,37 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen ImageButton delete = (ImageButton) view.findViewById(R.id.button_status_detail_delete); delete.setOnClickListener(this); - delete.setVisibility(account.canDelete(tweet) ? View.VISIBLE : View.GONE); - } + delete.setVisibility(tweet.getOriginalTweet().getUser() == account.getUser() ? View.VISIBLE : View.GONE); - private void updateViewMenu(View view) { - MainActivity activity = ((MainActivity) getActivity()); - // -- menu dialog ImageButton menu = (ImageButton) view.findViewById(R.id.button_status_detail_menu); menu.setOnClickListener(this); + } - // -- menu embedded in dialog + private void setupViewMenu(View view) { View divider = view.findViewById(R.id.detail_dialog_divider_bottom); ListView listView = (ListView) view.findViewById(R.id.listview_status_detail_menu); List<Command> commands = getCommands(); if (commands.size() > 0) { divider.setVisibility(View.VISIBLE); listView.setVisibility(View.VISIBLE); - final UnorderedCustomListAdapter<Command> adapter = new UnorderedCustomListAdapter<>(activity); - adapter.addItemsToBottom(commands); - adapter.updateForce(); + final CustomListAdapter<Command> adapter = new CustomListAdapter<Command>() { + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = getActivity().getLayoutInflater().inflate(R.layout.menu_item_simple_text, null); + } + TextView textView = (TextView) convertView.findViewById(R.id.list_item_textview); + textView.setTextSize(UserPreferenceHelper.getInstance().getTextSize()); + textView.setText(getItem(position).getText()); + return convertView; + } + + @Override + protected List<Command> getList() { + return commands; + } + }; + adapter.update(); listView.setAdapter(adapter); listView.setOnItemClickListener((parent, view1, position, id) -> { Command command = (Command) parent.getItemAtPosition(position); @@ -260,20 +322,8 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen ConfirmDialogFragment.show(getActivity(), getString(R.string.dialog_confirm_commands), onYes); } - private void deleteStatus() { - confirm(() -> { - Account account = Application.getInstance().getCurrentAccount(); - - new Tweets.DestroyTask(account, tweet.getOriginalTweet().getId()) - .onDone(t -> Notificator.getInstance().publish(R.string.notice_status_delete_succeeded)) - .onFail(e -> Notificator.getInstance().alert(R.string.notice_status_delete_failed)) - .execute(); - dismiss(); - }); - } - private List<Command> getCommands() { - Activity activity = getActivity(); + MainActivity activity = (MainActivity) getActivity(); ArrayList<Command> commands = new ArrayList<>(); // Retweeter if (tweet.getRetweetedTweet() != null && tweet.getUser() != tweet.getRetweetedTweet().getUser()) @@ -295,64 +345,4 @@ public class StatusDetailDialogFragment extends StackableDialogFragment implemen } return commands; } - - private void openMenu() { - StatusMenuDialogFragment fragment = new StatusMenuDialogFragment(); - fragment.setStatusID(getStatusID()); - DialogHelper.showDialog(getActivity(), fragment); - } - - private void replyToStatus() { - Account account = Application.getInstance().getCurrentAccount(); - Tweet originalTweet = tweet.getOriginalTweet(); - - StringBuilder builder = new StringBuilder(); - builder.append("@" + originalTweet.getUser().getScreenName() + " "); - - for (String screenName : originalTweet.getMentions()) { - if (!screenName.equals(account.getUser().getScreenName())) - builder.append("@" + screenName + " "); - } - String text = builder.toString(); - int selStart = originalTweet.getUser().getScreenName().length() + 2; // "@" and " " - - PostState.newState().beginTransaction() - .insertText(0, text) - .setInReplyTo(originalTweet) - .setSelection(selStart, text.length()) - .commitWithOpen((MainActivity) getActivity()); - } - - private void toggleFavorite() { - Account account = Application.getInstance().getCurrentAccount(); - if (tweet.isFavoritedBy(account.getUserId())) { - new TweetReactions.UnfavoriteTask(account, tweet.getId()) - .onDone(x -> Notificator.getInstance().publish(R.string.notice_unfavorite_succeeded)) - .onFail(x -> Notificator.getInstance().alert(R.string.notice_unfavorite_failed)) - .execute(); - } else { - new TweetReactions.FavoriteTask(account, tweet.getId()) - .onDone(x -> Notificator.getInstance().publish(R.string.notice_favorite_succeeded)) - .onFail(x -> Notificator.getInstance().alert(R.string.notice_favorite_failed)) - .execute(); - } - } - - private void toggleRetweet() { - Account account = Application.getInstance().getCurrentAccount(); - confirm(() -> { - if (tweet.isRetweetedBy(account.getUserId())) { - new Tweets.DestroyTask(account, tweet.getRetweetIdBy(account.getUserId())) - .onDone(t -> Notificator.getInstance().publish(R.string.notice_status_delete_succeeded)) - .onFail(e -> Notificator.getInstance().alert(R.string.notice_status_delete_failed)) - .execute(); - dismiss(); - } else { - new TweetReactions.RetweetTask(account, tweet.getId()) - .onDone(x -> Notificator.getInstance().publish(R.string.notice_retweet_succeeded)) - .onFail(x -> Notificator.getInstance().alert(R.string.notice_retweet_failed)) - .execute(); - } - }); - } } |