1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-17 04:00:48 +01:00

added repost for fanfou

This commit is contained in:
Mariotaku Lee 2016-03-12 00:14:10 +08:00
parent d945dfca01
commit 5acd195ba0
10 changed files with 103 additions and 62 deletions

View File

@ -37,6 +37,10 @@ public class StatusUpdate extends SimpleValueMap {
put("in_reply_to_status_id", inReplyToStatusId);
}
public void setRepostStatusId(final String repostStatusId) {
put("repost_status_id", repostStatusId);
}
public void setLocation(final GeoLocation location) {
remove("lat");
remove("long");

View File

@ -51,9 +51,12 @@ public class ParcelableStatusUpdate implements Parcelable {
@JsonField(name = "in_reply_to_status")
@ParcelableThisPlease
public ParcelableStatus in_reply_to_status;
@JsonField(name = "boolean")
@JsonField(name = "is_possibly_sensitive")
@ParcelableThisPlease
public boolean is_possibly_sensitive;
@JsonField(name = "repost_status_id")
@ParcelableThisPlease
public String repost_status_id;
public ParcelableStatusUpdate() {
}
@ -67,6 +70,7 @@ public class ParcelableStatusUpdate implements Parcelable {
", location=" + location +
", in_reply_to_status=" + in_reply_to_status +
", is_possibly_sensitive=" + is_possibly_sensitive +
", repost_status_id='" + repost_status_id + '\'' +
'}';
}

View File

@ -21,6 +21,9 @@ public class UpdateStatusActionExtra implements ActionExtra {
@ParcelableThisPlease
@JsonField(name = "is_possibly_sensitive")
boolean isPossiblySensitive;
@ParcelableThisPlease
@JsonField(name = "repost_status_id")
String repostStatusId;
public ParcelableStatus getInReplyToStatus() {
return inReplyToStatus;
@ -38,6 +41,13 @@ public class UpdateStatusActionExtra implements ActionExtra {
this.isPossiblySensitive = isPossiblySensitive;
}
public String isRepostStatusId() {
return repostStatusId;
}
public void setRepostStatusId(String repostStatusId) {
this.repostStatusId = repostStatusId;
}
@Override
public int describeContents() {

View File

@ -40,10 +40,13 @@ import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.twitter.Validator;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.DummyStatusHolderAdapter;
import org.mariotaku.twidere.model.Draft;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableStatusUpdate;
@ -63,37 +66,11 @@ import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import static org.mariotaku.twidere.util.Utils.isMyRetweet;
public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implements
Constants, DialogInterface.OnClickListener {
public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implements Constants {
public static final String FRAGMENT_TAG = "retweet_quote";
private PopupMenu mPopupMenu;
@Override
public void onClick(final DialogInterface dialog, final int which) {
final ParcelableStatus status = getStatus();
if (status == null) return;
switch (which) {
case DialogInterface.BUTTON_POSITIVE: {
final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return;
retweetOrQuote(twitter, status);
break;
}
case DialogInterface.BUTTON_NEUTRAL: {
final Intent intent = new Intent(INTENT_ACTION_QUOTE);
final Menu menu = mPopupMenu.getMenu();
final MenuItem quoteOriginalStatus = menu.findItem(R.id.quote_original_status);
intent.putExtra(EXTRA_STATUS, status);
intent.putExtra(EXTRA_QUOTE_ORIGINAL_STATUS, quoteOriginalStatus.isChecked());
startActivity(intent);
break;
}
default:
break;
}
}
@NonNull
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
@ -113,11 +90,31 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
builder.setView(view);
builder.setTitle(R.string.retweet_quote_confirm_title);
if (isMyRetweet(status)) {
builder.setPositiveButton(R.string.cancel_retweet, this);
builder.setPositiveButton(R.string.cancel_retweet, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mTwitterWrapper.cancelRetweetAsync(status.account_key, status.id, status.my_retweet_id);
}
});
} else if (!status.user_is_protected) {
builder.setPositiveButton(R.string.retweet, this);
builder.setPositiveButton(R.string.retweet, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
retweetOrQuote(mTwitterWrapper, credentials, status);
}
});
}
builder.setNeutralButton(R.string.quote, this);
builder.setNeutralButton(R.string.quote, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final Intent intent = new Intent(INTENT_ACTION_QUOTE);
final Menu menu = mPopupMenu.getMenu();
final MenuItem quoteOriginalStatus = menu.findItem(R.id.quote_original_status);
intent.putExtra(EXTRA_STATUS, status);
intent.putExtra(EXTRA_QUOTE_ORIGINAL_STATUS, quoteOriginalStatus.isChecked());
startActivity(intent);
}
});
builder.setNegativeButton(android.R.string.cancel, null);
holder.displayStatus(status, false, true);
@ -146,7 +143,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
final AsyncTwitterWrapper twitter = mTwitterWrapper;
final ParcelableStatus status = getStatus();
if (twitter == null || status == null) return false;
retweetOrQuote(twitter, status);
retweetOrQuote(twitter, credentials, status);
dismiss();
return true;
}
@ -159,7 +156,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
updateTextCount(getDialog(), s, status);
updateTextCount(getDialog(), s, status, credentials);
}
@Override
@ -197,24 +194,26 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
updateTextCount(dialog, editComment.getText(), status);
updateTextCount(dialog, editComment.getText(), status, credentials);
}
});
return dialog;
}
private void updateTextCount(DialogInterface dialog, CharSequence s, ParcelableStatus status) {
private void updateTextCount(DialogInterface dialog, CharSequence s, ParcelableStatus status,
ParcelableAccount account) {
if (!(dialog instanceof AlertDialog)) return;
final AlertDialog alertDialog = (AlertDialog) dialog;
final Button positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
if (positiveButton == null) return;
if (s.length() > 0) {
if (useQuote(s.length() > 0, account)) {
positiveButton.setText(R.string.comment);
} else {
positiveButton.setText(isMyRetweet(status) ? R.string.cancel_retweet : R.string.retweet);
}
final String statusLink = LinkCreator.getStatusWebLink(status).toString();
final StatusTextCountView textCountView = (StatusTextCountView) alertDialog.findViewById(R.id.comment_text_count);
assert textCountView != null;
textCountView.setTextCount(mValidator.getTweetLength(s + " " + statusLink));
}
@ -224,36 +223,61 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
return args.getParcelable(EXTRA_STATUS);
}
private void retweetOrQuote(AsyncTwitterWrapper twitter, ParcelableStatus status) {
private void retweetOrQuote(AsyncTwitterWrapper twitter, ParcelableAccount account, ParcelableStatus status) {
final Dialog dialog = getDialog();
if (dialog == null) return;
final EditText editComment = ((EditText) dialog.findViewById(R.id.edit_comment));
if (editComment.length() > 0) {
if (useQuote(editComment.length() > 0, account)) {
final Menu menu = mPopupMenu.getMenu();
final MenuItem quoteOriginalStatus = menu.findItem(R.id.quote_original_status);
final MenuItem linkToQuotedStatus = menu.findItem(R.id.link_to_quoted_status);
final MenuItem itemQuoteOriginalStatus = menu.findItem(R.id.quote_original_status);
final Uri statusLink;
if (!status.is_quote || !quoteOriginalStatus.isChecked()) {
statusLink = LinkCreator.getTwitterStatusLink(status.user_screen_name, status.id);
} else {
statusLink = LinkCreator.getTwitterStatusLink(status.quoted_user_screen_name, status.quoted_id);
final boolean quoteOriginalStatus = itemQuoteOriginalStatus.isChecked();
String commentText;
final ParcelableStatusUpdate update = new ParcelableStatusUpdate();
update.accounts = new ParcelableAccount[]{account};
final String editingComment = String.valueOf(editComment.getText());
switch (ParcelableAccountUtils.getAccountType(account)) {
case ParcelableAccount.Type.FANFOU: {
if (!status.is_quote || !quoteOriginalStatus) {
commentText = getString(R.string.fanfou_repost_format, editingComment,
status.user_screen_name, status.text_plain);
update.repost_status_id = status.id;
} else {
commentText = getString(R.string.fanfou_repost_format, editingComment,
status.quoted_user_screen_name, status.quoted_text_plain);
update.repost_status_id = status.quoted_id;
}
if (commentText.length() > Validator.MAX_TWEET_LENGTH) {
commentText = commentText.substring(0, Math.max(Validator.MAX_TWEET_LENGTH,
editingComment.length()));
}
break;
}
default: {
if (!status.is_quote || !quoteOriginalStatus) {
statusLink = LinkCreator.getTwitterStatusLink(status.user_screen_name,
status.id);
} else {
statusLink = LinkCreator.getTwitterStatusLink(status.quoted_user_screen_name,
status.quoted_id);
}
commentText = editingComment + " " + statusLink;
break;
}
}
final String commentText = editComment.getText() + " " + statusLink;
ParcelableStatusUpdate update = new ParcelableStatusUpdate();
update.text = commentText;
update.accounts = ParcelableAccountUtils.getAccounts(getContext(), status.account_key);
if (linkToQuotedStatus.isChecked()) {
update.in_reply_to_status = status;
}
update.is_possibly_sensitive = status.is_possibly_sensitive;
BackgroundOperationService.updateStatusesAsync(getContext(), Draft.Action.QUOTE, update);
} else if (isMyRetweet(status)) {
twitter.cancelRetweetAsync(status.account_key, status.id, status.my_retweet_id);
} else {
twitter.retweetStatusAsync(status.account_key, status.id);
}
}
private boolean useQuote(boolean hasComment, ParcelableAccount account) {
return hasComment || ParcelableAccount.Type.FANFOU.equals(account.account_type);
}
public static RetweetQuoteDialogFragment show(final FragmentManager fm, final ParcelableStatus status) {
final Bundle args = new Bundle();
args.putParcelable(EXTRA_STATUS, status);

View File

@ -368,6 +368,7 @@ public class BackgroundOperationService extends IntentService implements Constan
final UpdateStatusActionExtra extra = new UpdateStatusActionExtra();
extra.setInReplyToStatus(item.in_reply_to_status);
extra.setIsPossiblySensitive(item.is_possibly_sensitive);
extra.setRepostStatusId(item.repost_status_id);
draft.action_extras = extra;
final ContentResolver resolver = getContentResolver();
final Uri draftUri = resolver.insert(Drafts.CONTENT_URI, DraftValuesCreator.create(draft));
@ -644,6 +645,9 @@ public class BackgroundOperationService extends IntentService implements Constan
if (statusUpdate.in_reply_to_status != null) {
status.inReplyToStatusId(statusUpdate.in_reply_to_status.id);
}
if (statusUpdate.repost_status_id != null) {
status.setRepostStatusId(statusUpdate.repost_status_id);
}
if (statusUpdate.location != null) {
status.location(ParcelableLocationUtils.toGeoLocation(statusUpdate.location));
}

View File

@ -106,7 +106,7 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
final ResponseList<Activity> activities = getActivities(twitter, credentials, paging);
storeActivities(cr, loadItemLimit, accountKey, noItemsBefore, activities, sinceId, maxId);
if (saveReadPosition) {
saveReadPosition(accountKey,credentials, twitter);
saveReadPosition(accountKey, credentials, twitter);
}
errorInfoStore.remove(getErrorInfoKey(), accountKey);
} catch (TwitterException e) {
@ -161,7 +161,7 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
String.valueOf(deleteBound[1])};
int rowsDeleted = cr.delete(getContentUri(), where.getSQL(), whereArgs);
boolean insertGap = valuesList.size() >= loadItemLimit && !noItemsBefore
&& rowsDeleted <= 0;
&& rowsDeleted <= 0 && activities.size() > 1;
if (insertGap && !valuesList.isEmpty()) {
valuesList.get(valuesList.size() - 1).put(Activities.IS_GAP, true);
}

View File

@ -222,7 +222,7 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
final boolean deletedOldGap = rowsDeleted > 0 && ArrayUtils.contains(statusIds, maxId);
final boolean noRowsDeleted = rowsDeleted == 0;
final boolean insertGap = minIdx != -1 && (noRowsDeleted || deletedOldGap) && !noItemsBefore
&& !hasIntersection;
&& !hasIntersection && statuses.size() > 1;
if (insertGap) {
values[minIdx].put(Statuses.IS_GAP, true);
}

View File

@ -172,7 +172,7 @@
android:layout_alignStart="@+id/profile_container"
android:layout_below="@id/profile_container"
android:layout_marginBottom="@dimen/element_spacing_small"
android:layout_marginTop="@dimen/element_spacing_normal"
android:layout_marginTop="@dimen/element_spacing_small"
android:paddingLeft="@dimen/element_spacing_normal"
android:paddingRight="@dimen/element_spacing_normal"
android:textAppearance="?android:textAppearanceMedium"

View File

@ -18,11 +18,6 @@
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/link_to_quoted_status"
android:checkable="true"
android:checked="true"
android:title="@string/link_to_quoted_status" />
<item
android:id="@+id/quote_original_status"
android:checkable="true"

View File

@ -14,5 +14,5 @@
<string name="easter_egg_triggered_message" translatable="false">不二对你的膝盖发动了会心一击!</string>
<string name="sample_status_text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam faucibus quis purus ac malesuada. Duis id vulputate magna, a eleifend amet.</string>
<string name="unsupported_activity_action_title"><xliff:g id="action">%s</xliff:g> action</string>
<string name="fanfou_repost_format"><xliff:g id="text">%1$s</xliff:g> 转 \@<xliff:g id="screen_name">%2$s</xliff:g> <xliff:g id="orig_text">%3$s</xliff:g></string>
</resources>