aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.java
diff options
context:
space:
mode:
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.java302
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();
- }
- });
- }
}