new icon is not ready so roll back now
made menu in tweet list clickable again
@ -28,6 +28,7 @@ import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.PorterDuff.Mode;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
@ -292,16 +293,17 @@ public class CustomTabEditorActivity extends BaseSupportDialogActivity implement
|
||||
}
|
||||
if (!isEditMode()) {
|
||||
mTabConfiguration = conf;
|
||||
final boolean has_secondary_field = conf.getSecondaryFieldType() != CustomTabConfiguration.FIELD_TYPE_NONE;
|
||||
final boolean account_id_none = conf.getAccountRequirement() == CustomTabConfiguration.ACCOUNT_NONE;
|
||||
mAccountContainer.setVisibility(account_id_none ? View.GONE : View.VISIBLE);
|
||||
mSecondaryFieldContainer.setVisibility(has_secondary_field ? View.VISIBLE : View.GONE);
|
||||
final boolean hasSecondaryField = conf.getSecondaryFieldType() != CustomTabConfiguration.FIELD_TYPE_NONE;
|
||||
final boolean accountIdNone = conf.getAccountRequirement() == CustomTabConfiguration.ACCOUNT_NONE;
|
||||
mAccountContainer.setVisibility(accountIdNone ? View.GONE : View.VISIBLE);
|
||||
mSecondaryFieldContainer.setVisibility(hasSecondaryField ? View.VISIBLE : View.GONE);
|
||||
final boolean accountIdRequired = conf.getAccountRequirement() == CustomTabConfiguration.ACCOUNT_REQUIRED;
|
||||
if (!accountIdRequired) {
|
||||
mAccountsAdapter.add(ParcelableAccount.dummyInstance());
|
||||
}
|
||||
final boolean officialKeyOnly = intent.getBooleanExtra(EXTRA_OFFICIAL_KEY_ONLY, false);
|
||||
mAccountsAdapter.addAll(ParcelableAccount.getAccountsList(this, false, officialKeyOnly));
|
||||
mAccountsAdapter.setDummyItemText(R.string.activated_accounts);
|
||||
switch (conf.getSecondaryFieldType()) {
|
||||
case CustomTabConfiguration.FIELD_TYPE_USER: {
|
||||
mSecondaryFieldLabel.setText(R.string.user);
|
||||
@ -425,6 +427,7 @@ public class CustomTabEditorActivity extends BaseSupportDialogActivity implement
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(final Bundle savedInstanceState) {
|
||||
final Bundle args = getArguments();
|
||||
|
@ -37,6 +37,8 @@ public class AccountsSpinnerAdapter extends ArrayAdapter<ParcelableAccount> {
|
||||
|
||||
private final MediaLoaderWrapper mImageLoader;
|
||||
private final boolean mDisplayProfileImage;
|
||||
private final Context mContext;
|
||||
private String mDummyItemText;
|
||||
|
||||
public AccountsSpinnerAdapter(final Context context) {
|
||||
this(context, R.layout.list_item_user);
|
||||
@ -44,6 +46,7 @@ public class AccountsSpinnerAdapter extends ArrayAdapter<ParcelableAccount> {
|
||||
|
||||
public AccountsSpinnerAdapter(final Context context, int itemViewResource) {
|
||||
super(context, itemViewResource);
|
||||
mContext = context;
|
||||
mImageLoader = TwidereApplication.getInstance(context).getImageLoaderWrapper();
|
||||
mDisplayProfileImage = context.getSharedPreferences(DirectMessagesConversationFragment.SHARED_PREFERENCES_NAME,
|
||||
Context.MODE_PRIVATE).getBoolean(DirectMessagesConversationFragment.KEY_DISPLAY_PROFILE_IMAGE, true);
|
||||
@ -99,8 +102,18 @@ public class AccountsSpinnerAdapter extends ArrayAdapter<ParcelableAccount> {
|
||||
}
|
||||
}
|
||||
} else if (text1 != null) {
|
||||
text1.setText(R.string.none);
|
||||
text1.setText(mDummyItemText);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void setDummyItemText(int textRes) {
|
||||
setDummyItemText(mContext.getString(textRes));
|
||||
}
|
||||
|
||||
public void setDummyItemText(String text) {
|
||||
mDummyItemText = text;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,10 +15,12 @@ import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
|
||||
import android.support.v7.widget.FixedLinearLayoutManager;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.PopupMenu;
|
||||
import android.support.v7.widget.PopupMenu.OnMenuItemClickListener;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.RecyclerView.OnScrollListener;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.ViewGroup;
|
||||
@ -73,6 +75,15 @@ public abstract class AbsStatusesFragment<Data> extends BaseSupportFragment impl
|
||||
private int mControlBarOffsetPixels;
|
||||
private PopupMenu mPopupMenu;
|
||||
private ReadStateManager mReadStateManager;
|
||||
private ParcelableStatus mSelectedStatus;
|
||||
private OnMenuItemClickListener mOnStatusMenuItemClickListener = new OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
final ParcelableStatus status = mSelectedStatus;
|
||||
if (status == null) return false;
|
||||
return Utils.handleMenuItemClick(getActivity(), getFragmentManager(), getTwitterWrapper(), status, item);
|
||||
}
|
||||
};
|
||||
|
||||
protected AbsStatusesFragment() {
|
||||
mStatusesBusCallback = createMessageBusCallback();
|
||||
@ -372,10 +383,13 @@ public abstract class AbsStatusesFragment<Data> extends BaseSupportFragment impl
|
||||
}
|
||||
final PopupMenu popupMenu = new PopupMenu(mAdapter.getContext(), menuView,
|
||||
Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0);
|
||||
popupMenu.setOnMenuItemClickListener(mOnStatusMenuItemClickListener);
|
||||
popupMenu.inflate(R.menu.action_status);
|
||||
setMenuForStatus(mAdapter.getContext(), popupMenu.getMenu(), mAdapter.getStatus(position));
|
||||
final ParcelableStatus status = mAdapter.getStatus(position);
|
||||
setMenuForStatus(mAdapter.getContext(), popupMenu.getMenu(), status);
|
||||
popupMenu.show();
|
||||
mPopupMenu = popupMenu;
|
||||
mSelectedStatus = status;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -133,7 +133,7 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<Cursor>
|
||||
mContentObserver = new ContentObserver(new Handler()) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange) {
|
||||
// reloadStatuses();
|
||||
reloadStatuses();
|
||||
}
|
||||
};
|
||||
cr.registerContentObserver(Accounts.CONTENT_URI, true, mContentObserver);
|
||||
|
@ -20,7 +20,6 @@
|
||||
package org.mariotaku.twidere.fragment.support;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
@ -28,7 +27,6 @@ import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
import android.nfc.NdefMessage;
|
||||
import android.nfc.NdefRecord;
|
||||
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
|
||||
@ -52,7 +50,6 @@ import android.support.v7.widget.RecyclerView.LayoutParams;
|
||||
import android.support.v7.widget.RecyclerView.ViewHolder;
|
||||
import android.text.Html;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
@ -64,9 +61,7 @@ import android.widget.LinearLayout;
|
||||
import android.widget.Space;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.apache.http.protocol.HTTP;
|
||||
import org.mariotaku.twidere.R;
|
||||
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
|
||||
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
|
||||
import org.mariotaku.twidere.adapter.AbsStatusesAdapter.StatusAdapterListener;
|
||||
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
|
||||
@ -85,7 +80,6 @@ import org.mariotaku.twidere.task.TwidereAsyncTask;
|
||||
import org.mariotaku.twidere.task.TwidereAsyncTask.Status;
|
||||
import org.mariotaku.twidere.text.method.StatusContentMovementMethod;
|
||||
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
|
||||
import org.mariotaku.twidere.util.ClipboardUtils;
|
||||
import org.mariotaku.twidere.util.CompareUtils;
|
||||
import org.mariotaku.twidere.util.ImageLoadingHandler;
|
||||
import org.mariotaku.twidere.util.LinkCreator;
|
||||
@ -104,8 +98,6 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.StatusViewHolder;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
@ -116,7 +108,6 @@ import twitter4j.TwitterException;
|
||||
|
||||
import static android.text.TextUtils.isEmpty;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.clearUserColor;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.clearUserNickname;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.getUserColor;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.getUserNickname;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.setUserColor;
|
||||
@ -312,9 +303,13 @@ public class StatusFragment extends BaseSupportFragment
|
||||
Utils.openMediaDirectly(getActivity(), accountId, status, media, status.media);
|
||||
//spice
|
||||
SpiceProfilingUtil.log(getActivity(),
|
||||
status.id + ",Clicked," + accountId + "," + status.user_id + "," + status.text_plain.length() + "," + media.media_url + "," + TypeMappingUtil.getMediaType(media.type) + "," + status.timestamp);
|
||||
status.id + ",Clicked," + accountId + "," + status.user_id + ","
|
||||
+ status.text_plain.length() + "," + media.media_url + ","
|
||||
+ TypeMappingUtil.getMediaType(media.type) + "," + status.timestamp);
|
||||
SpiceProfilingUtil.profile(getActivity(), accountId,
|
||||
status.id + ",Clicked," + accountId + "," + status.user_id + "," + status.text_plain.length() + "," + media.media_url + "," + TypeMappingUtil.getMediaType(media.type) + "," + status.timestamp);
|
||||
status.id + ",Clicked," + accountId + "," + status.user_id + ","
|
||||
+ status.text_plain.length() + "," + media.media_url + ","
|
||||
+ TypeMappingUtil.getMediaType(media.type) + "," + status.timestamp);
|
||||
//end
|
||||
}
|
||||
|
||||
@ -384,28 +379,38 @@ public class StatusFragment extends BaseSupportFragment
|
||||
//spice
|
||||
if (status.media == null) {
|
||||
SpiceProfilingUtil.profile(getActivity(), status.account_id,
|
||||
status.id + ",Words," + status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
status.id + ",Words," + status.account_id + "," + status.user_id + "," + status.reply_count
|
||||
+ "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + status.timestamp);
|
||||
SpiceProfilingUtil.log(getActivity(), status.id + ",Words," + status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
SpiceProfilingUtil.log(getActivity(), status.id + ",Words," + status.account_id + "," + status.user_id
|
||||
+ "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + status.timestamp);
|
||||
} else {
|
||||
for (final ParcelableMedia spiceMedia : status.media) {
|
||||
if (TypeMappingUtil.getMediaType(spiceMedia.type).equals("image")) {
|
||||
SpiceProfilingUtil.profile(getActivity(), status.account_id,
|
||||
status.id + ",PreviewM," + status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type) + "," + spiceMedia.media_url + "," + spiceMedia.width + "x" + spiceMedia.height + ","
|
||||
+ status.timestamp);
|
||||
status.id + ",PreviewM," + status.account_id + "," + status.user_id
|
||||
+ "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type)
|
||||
+ "," + spiceMedia.media_url + "," + spiceMedia.width + "x" + spiceMedia.height
|
||||
+ "," + status.timestamp);
|
||||
SpiceProfilingUtil.log(getActivity(),
|
||||
status.id + ",PreviewM," + status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type) + "," + spiceMedia.media_url + "," + spiceMedia.width + "x" + spiceMedia.height + ","
|
||||
+ status.timestamp);
|
||||
status.id + ",PreviewM," + status.account_id + "," + status.user_id
|
||||
+ "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type)
|
||||
+ "," + spiceMedia.media_url + "," + spiceMedia.width + "x" + spiceMedia.height
|
||||
+ "," + status.timestamp);
|
||||
} else {
|
||||
SpiceProfilingUtil.profile(getActivity(), status.account_id,
|
||||
status.id + ",PreviewO," + status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type) + "," + spiceMedia.media_url + "," + status.timestamp);
|
||||
status.id + ",PreviewO," + status.account_id + "," + status.user_id
|
||||
+ "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type)
|
||||
+ "," + spiceMedia.media_url + "," + status.timestamp);
|
||||
SpiceProfilingUtil.log(getActivity(),
|
||||
status.id + ",PreviewO," + status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type) + "," + spiceMedia.media_url + "," + status.timestamp);
|
||||
status.id + ",PreviewO," + status.account_id + "," + status.user_id
|
||||
+ "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.text_plain.length() + "," + TypeMappingUtil.getMediaType(spiceMedia.type)
|
||||
+ "," + spiceMedia.media_url + "," + status.timestamp);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -494,6 +499,15 @@ public class StatusFragment extends BaseSupportFragment
|
||||
}
|
||||
}
|
||||
|
||||
public void addConversation(ParcelableStatus status, int position) {
|
||||
if (mConversation == null) {
|
||||
mConversation = new ArrayList<>();
|
||||
}
|
||||
mConversation.add(position, status);
|
||||
notifyDataSetChanged();
|
||||
updateItemDecoration();
|
||||
}
|
||||
|
||||
public int findPositionById(long itemId) {
|
||||
for (int i = 0, j = getItemCount(); i < j; i++) {
|
||||
if (getItemId(i) == itemId) return i;
|
||||
@ -870,11 +884,17 @@ public class StatusFragment extends BaseSupportFragment
|
||||
|
||||
@Override
|
||||
protected void onProgressUpdate(ParcelableStatus... values) {
|
||||
super.onProgressUpdate(values);
|
||||
for (ParcelableStatus status : values) {
|
||||
// fragment.addConversation(status, 0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void addConversation(ParcelableStatus status, int position) {
|
||||
mStatusAdapter.addConversation(status, position);
|
||||
}
|
||||
|
||||
private static class SpaceViewHolder extends ViewHolder {
|
||||
|
||||
public SpaceViewHolder(View itemView) {
|
||||
@ -981,127 +1001,8 @@ public class StatusFragment extends BaseSupportFragment
|
||||
if (status == null || fragment == null) return false;
|
||||
final AsyncTwitterWrapper twitter = fragment.getTwitterWrapper();
|
||||
final FragmentActivity activity = fragment.getActivity();
|
||||
switch (item.getItemId()) {
|
||||
case MENU_COPY: {
|
||||
if (ClipboardUtils.setText(activity, status.text_plain)) {
|
||||
showOkMessage(activity, R.string.text_copied, false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_RETWEET: {
|
||||
if (isMyRetweet(status)) {
|
||||
twitter.cancelRetweetAsync(status.account_id, status.id, status.my_retweet_id);
|
||||
} else {
|
||||
twitter.retweetStatusAsync(status.account_id, status.id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_QUOTE: {
|
||||
final Intent intent = new Intent(INTENT_ACTION_QUOTE);
|
||||
intent.putExtra(EXTRA_STATUS, status);
|
||||
fragment.startActivity(intent);
|
||||
break;
|
||||
}
|
||||
case MENU_REPLY: {
|
||||
final Intent intent = new Intent(INTENT_ACTION_REPLY);
|
||||
intent.putExtra(EXTRA_STATUS, status);
|
||||
fragment.startActivity(intent);
|
||||
break;
|
||||
}
|
||||
case MENU_FAVORITE: {
|
||||
if (status.is_favorite) {
|
||||
twitter.destroyFavoriteAsync(status.account_id, status.id);
|
||||
//spice
|
||||
SpiceProfilingUtil.profile(adapter.getContext(),
|
||||
status.account_id, status.id + ",Unfavor,"
|
||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||
SpiceProfilingUtil.log(adapter.getContext(), status.id + ",Unfavor,"
|
||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||
//end
|
||||
} else {
|
||||
twitter.createFavoriteAsync(status.account_id, status.id);
|
||||
//spice
|
||||
SpiceProfilingUtil.profile(adapter.getContext(),
|
||||
status.account_id, status.id + ",Favor,"
|
||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||
SpiceProfilingUtil.log(adapter.getContext(), status.id + ",Favor,"
|
||||
+ status.account_id + "," + status.user_id + "," + status.reply_count + "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||
//end
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_DELETE: {
|
||||
DestroyStatusDialogFragment.show(fragment.getFragmentManager(), status);
|
||||
break;
|
||||
}
|
||||
case MENU_ADD_TO_FILTER: {
|
||||
AddStatusFilterDialogFragment.show(fragment.getFragmentManager(), status);
|
||||
break;
|
||||
}
|
||||
case MENU_SET_COLOR: {
|
||||
final Intent intent = new Intent(activity, ColorPickerDialogActivity.class);
|
||||
final int color = getUserColor(activity, status.user_id, true);
|
||||
if (color != 0) {
|
||||
intent.putExtra(EXTRA_COLOR, color);
|
||||
}
|
||||
intent.putExtra(EXTRA_CLEAR_BUTTON, color != 0);
|
||||
intent.putExtra(EXTRA_ALPHA_SLIDER, false);
|
||||
fragment.startActivityForResult(intent, REQUEST_SET_COLOR);
|
||||
break;
|
||||
}
|
||||
case MENU_CLEAR_NICKNAME: {
|
||||
clearUserNickname(activity, status.user_id);
|
||||
adapter.notifyDataSetChanged();
|
||||
break;
|
||||
}
|
||||
case MENU_SET_NICKNAME: {
|
||||
final String nick = getUserNickname(activity, status.user_id, true);
|
||||
SetUserNicknameDialogFragment.show(fragment.getFragmentManager(), status.user_id, nick);
|
||||
break;
|
||||
}
|
||||
case MENU_TRANSLATE: {
|
||||
final ParcelableCredentials account
|
||||
= ParcelableAccount.getCredentials(activity, status.account_id);
|
||||
if (Utils.isOfficialCredentials(activity, account)) {
|
||||
StatusTranslateDialogFragment.show(fragment.getFragmentManager(), status);
|
||||
} else {
|
||||
final Resources resources = fragment.getResources();
|
||||
final Locale locale = resources.getConfiguration().locale;
|
||||
try {
|
||||
final String template = "http://translate.google.com/#%s|%s|%s";
|
||||
final String sourceLang = "auto";
|
||||
final String targetLang = URLEncoder.encode(locale.getLanguage(), HTTP.UTF_8);
|
||||
final String text = URLEncoder.encode(status.text_unescaped, HTTP.UTF_8);
|
||||
final Uri uri = Uri.parse(String.format(Locale.ROOT, template, sourceLang, targetLang, text));
|
||||
final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
|
||||
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
||||
fragment.startActivity(intent);
|
||||
} catch (UnsupportedEncodingException ignore) {
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_OPEN_WITH_ACCOUNT: {
|
||||
final Intent intent = new Intent(INTENT_ACTION_SELECT_ACCOUNT);
|
||||
intent.setClass(activity, AccountSelectorActivity.class);
|
||||
intent.putExtra(EXTRA_SINGLE_SELECTION, true);
|
||||
fragment.startActivityForResult(intent, REQUEST_SELECT_ACCOUNT);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
if (item.getIntent() != null) {
|
||||
try {
|
||||
fragment.startActivity(item.getIntent());
|
||||
} catch (final ActivityNotFoundException e) {
|
||||
Log.w(LOGTAG, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
final FragmentManager fm = fragment.getFragmentManager();
|
||||
return Utils.handleMenuItemClick(activity, fm, twitter, status, item);
|
||||
}
|
||||
|
||||
public void showStatus(ParcelableStatus status) {
|
||||
|
@ -22,6 +22,7 @@ package org.mariotaku.twidere.util;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
@ -109,6 +110,7 @@ import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.http.protocol.HTTP;
|
||||
import org.json.JSONException;
|
||||
import org.mariotaku.jsonserializer.JSONSerializer;
|
||||
import org.mariotaku.querybuilder.AllColumns;
|
||||
@ -127,21 +129,27 @@ import org.mariotaku.twidere.BuildConfig;
|
||||
import org.mariotaku.twidere.Constants;
|
||||
import org.mariotaku.twidere.R;
|
||||
import org.mariotaku.twidere.activity.CameraCropActivity;
|
||||
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
|
||||
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
|
||||
import org.mariotaku.twidere.activity.support.MediaViewerActivity;
|
||||
import org.mariotaku.twidere.adapter.iface.IBaseAdapter;
|
||||
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter;
|
||||
import org.mariotaku.twidere.app.TwidereApplication;
|
||||
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
|
||||
import org.mariotaku.twidere.fragment.support.AddStatusFilterDialogFragment;
|
||||
import org.mariotaku.twidere.fragment.support.DestroyStatusDialogFragment;
|
||||
import org.mariotaku.twidere.fragment.support.DirectMessagesConversationFragment;
|
||||
import org.mariotaku.twidere.fragment.support.IncomingFriendshipsFragment;
|
||||
import org.mariotaku.twidere.fragment.support.MutesUsersListFragment;
|
||||
import org.mariotaku.twidere.fragment.support.SavedSearchesListFragment;
|
||||
import org.mariotaku.twidere.fragment.support.SearchFragment;
|
||||
import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment;
|
||||
import org.mariotaku.twidere.fragment.support.SetUserNicknameDialogFragment;
|
||||
import org.mariotaku.twidere.fragment.support.StatusFavoritersListFragment;
|
||||
import org.mariotaku.twidere.fragment.support.StatusFragment;
|
||||
import org.mariotaku.twidere.fragment.support.StatusRepliesListFragment;
|
||||
import org.mariotaku.twidere.fragment.support.StatusRetweetersListFragment;
|
||||
import org.mariotaku.twidere.fragment.support.StatusTranslateDialogFragment;
|
||||
import org.mariotaku.twidere.fragment.support.StatusesListFragment;
|
||||
import org.mariotaku.twidere.fragment.support.UserBlocksListFragment;
|
||||
import org.mariotaku.twidere.fragment.support.UserFavoritesFragment;
|
||||
@ -208,6 +216,7 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
import java.net.SocketAddress;
|
||||
@ -229,6 +238,7 @@ import java.util.zip.CRC32;
|
||||
import javax.net.ssl.SSLException;
|
||||
|
||||
import edu.tsinghua.spice.SpiceService;
|
||||
import edu.tsinghua.spice.Utilies.SpiceProfilingUtil;
|
||||
import edu.ucdavis.earlybird.UCDService;
|
||||
import twitter4j.DirectMessage;
|
||||
import twitter4j.RateLimitStatus;
|
||||
@ -259,6 +269,9 @@ import static org.mariotaku.twidere.provider.TwidereDataStore.DIRECT_MESSAGES_UR
|
||||
import static org.mariotaku.twidere.provider.TwidereDataStore.STATUSES_URIS;
|
||||
import static org.mariotaku.twidere.util.TwidereLinkify.PATTERN_TWITTER_PROFILE_IMAGES;
|
||||
import static org.mariotaku.twidere.util.TwidereLinkify.TWITTER_PROFILE_IMAGES_AVAILABLE_SIZES;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.clearUserNickname;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.getUserColor;
|
||||
import static org.mariotaku.twidere.util.UserColorNameUtils.getUserNickname;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class Utils implements Constants, TwitterConstants {
|
||||
@ -3874,6 +3887,136 @@ public final class Utils implements Constants, TwitterConstants {
|
||||
return pm.getDrawable(info.packageName, info.metaData.getInt(key), info.applicationInfo);
|
||||
}
|
||||
|
||||
public static boolean handleMenuItemClick(FragmentActivity activity, FragmentManager fm, AsyncTwitterWrapper twitter, ParcelableStatus status, MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case MENU_COPY: {
|
||||
if (ClipboardUtils.setText(activity, status.text_plain)) {
|
||||
showOkMessage(activity, R.string.text_copied, false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_RETWEET: {
|
||||
if (isMyRetweet(status)) {
|
||||
twitter.cancelRetweetAsync(status.account_id, status.id, status.my_retweet_id);
|
||||
} else {
|
||||
twitter.retweetStatusAsync(status.account_id, status.id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_QUOTE: {
|
||||
final Intent intent = new Intent(INTENT_ACTION_QUOTE);
|
||||
intent.putExtra(EXTRA_STATUS, status);
|
||||
activity.startActivity(intent);
|
||||
break;
|
||||
}
|
||||
case MENU_REPLY: {
|
||||
final Intent intent = new Intent(INTENT_ACTION_REPLY);
|
||||
intent.putExtra(EXTRA_STATUS, status);
|
||||
activity.startActivity(intent);
|
||||
break;
|
||||
}
|
||||
case MENU_FAVORITE: {
|
||||
if (status.is_favorite) {
|
||||
twitter.destroyFavoriteAsync(status.account_id, status.id);
|
||||
//spice
|
||||
SpiceProfilingUtil.profile(activity,
|
||||
status.account_id, status.id + ",Unfavor," + status.account_id
|
||||
+ "," + status.user_id + "," + status.reply_count
|
||||
+ "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.timestamp);
|
||||
SpiceProfilingUtil.log(activity, status.id + ",Unfavor," + status.account_id
|
||||
+ "," + status.user_id + "," + status.reply_count
|
||||
+ "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.timestamp);
|
||||
//end
|
||||
} else {
|
||||
twitter.createFavoriteAsync(status.account_id, status.id);
|
||||
//spice
|
||||
SpiceProfilingUtil.profile(activity,
|
||||
status.account_id, status.id + ",Favor,"
|
||||
+ status.account_id + "," + status.user_id + "," + status.reply_count
|
||||
+ "," + status.retweet_count + "," + status.favorite_count
|
||||
+ "," + status.timestamp);
|
||||
SpiceProfilingUtil.log(activity, status.id + ",Favor,"
|
||||
+ status.account_id + "," + status.user_id + "," + status.reply_count
|
||||
+ "," + status.retweet_count + "," + status.favorite_count + "," + status.timestamp);
|
||||
//end
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_DELETE: {
|
||||
DestroyStatusDialogFragment.show(fm, status);
|
||||
break;
|
||||
}
|
||||
case MENU_ADD_TO_FILTER: {
|
||||
AddStatusFilterDialogFragment.show(fm, status);
|
||||
break;
|
||||
}
|
||||
case MENU_SET_COLOR: {
|
||||
final Intent intent = new Intent(activity, ColorPickerDialogActivity.class);
|
||||
final int color = getUserColor(activity, status.user_id, true);
|
||||
if (color != 0) {
|
||||
intent.putExtra(EXTRA_COLOR, color);
|
||||
}
|
||||
intent.putExtra(EXTRA_CLEAR_BUTTON, color != 0);
|
||||
intent.putExtra(EXTRA_ALPHA_SLIDER, false);
|
||||
activity.startActivityForResult(intent, REQUEST_SET_COLOR);
|
||||
break;
|
||||
}
|
||||
case MENU_CLEAR_NICKNAME: {
|
||||
clearUserNickname(activity, status.user_id);
|
||||
break;
|
||||
}
|
||||
case MENU_SET_NICKNAME: {
|
||||
final String nick = getUserNickname(activity, status.user_id, true);
|
||||
SetUserNicknameDialogFragment.show(fm, status.user_id, nick);
|
||||
break;
|
||||
}
|
||||
case MENU_TRANSLATE: {
|
||||
final ParcelableCredentials account
|
||||
= ParcelableAccount.getCredentials(activity, status.account_id);
|
||||
if (isOfficialCredentials(activity, account)) {
|
||||
StatusTranslateDialogFragment.show(fm, status);
|
||||
} else {
|
||||
final Resources resources = activity.getResources();
|
||||
final Locale locale = resources.getConfiguration().locale;
|
||||
try {
|
||||
final String template = "http://translate.google.com/#%s|%s|%s";
|
||||
final String sourceLang = "auto";
|
||||
final String targetLang = URLEncoder.encode(locale.getLanguage(), HTTP.UTF_8);
|
||||
final String text = URLEncoder.encode(status.text_unescaped, HTTP.UTF_8);
|
||||
final Uri uri = Uri.parse(String.format(Locale.ROOT, template, sourceLang, targetLang, text));
|
||||
final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
|
||||
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
||||
activity.startActivity(intent);
|
||||
} catch (UnsupportedEncodingException ignore) {
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_OPEN_WITH_ACCOUNT: {
|
||||
final Intent intent = new Intent(INTENT_ACTION_SELECT_ACCOUNT);
|
||||
intent.setClass(activity, AccountSelectorActivity.class);
|
||||
intent.putExtra(EXTRA_SINGLE_SELECTION, true);
|
||||
activity.startActivityForResult(intent, REQUEST_SELECT_ACCOUNT);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
if (item.getIntent() != null) {
|
||||
try {
|
||||
activity.startActivity(item.getIntent());
|
||||
} catch (final ActivityNotFoundException e) {
|
||||
Log.w(LOGTAG, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean isErrorCodeMessageSupported(final TwitterException te) {
|
||||
if (te == null) return false;
|
||||
return StatusCodeMessageUtils.containsHttpStatus(te.getStatusCode())
|
||||
|
@ -27,6 +27,7 @@
|
||||
<com.sothree.slidinguppanel.SlidingUpPanelLayout
|
||||
android:id="@+id/activities_drawer"
|
||||
android:layout_width="match_parent"
|
||||
android:visibility="gone"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="bottom"
|
||||
app:umanoDragView="@+id/activities_header_title"
|
||||
|
@ -79,6 +79,8 @@
|
||||
android:id="@+id/profile_type"
|
||||
android:layout_width="@dimen/icon_size_profile_type_detail"
|
||||
android:layout_height="@dimen/icon_size_profile_type_detail"
|
||||
android:layout_marginRight="@dimen/element_spacing_minus_small"
|
||||
android:layout_marginBottom="@dimen/element_spacing_minus_small"
|
||||
android:layout_alignBottom="@id/profile_image"
|
||||
android:layout_alignRight="@id/profile_image"
|
||||
android:scaleType="fitCenter"/>
|
||||
|
@ -124,6 +124,8 @@
|
||||
style="@style/Widget.ProfileType"
|
||||
android:layout_width="@dimen/icon_size_profile_type_user_profile"
|
||||
android:layout_height="@dimen/icon_size_profile_type_user_profile"
|
||||
android:layout_marginRight="@dimen/element_spacing_minus_msmall"
|
||||
android:layout_marginBottom="@dimen/element_spacing_minus_msmall"
|
||||
android:layout_alignBottom="@id/profile_image"
|
||||
android:layout_alignRight="@id/profile_image"
|
||||
android:scaleType="fitCenter"/>
|
||||
|
BIN
twidere/src/main/res/mipmap-hdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 4.7 KiB |
BIN
twidere/src/main/res/mipmap-mdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 2.7 KiB |
BIN
twidere/src/main/res/mipmap-xhdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 7.6 KiB |
BIN
twidere/src/main/res/mipmap-xxhdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 15 KiB |
BIN
twidere/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Executable file → Normal file
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 22 KiB |
@ -84,7 +84,7 @@
|
||||
|
||||
<dimen name="icon_size_profile_type">16dp</dimen>
|
||||
<dimen name="icon_size_profile_type_detail">22dp</dimen>
|
||||
<dimen name="icon_size_profile_type_user_profile">28dp</dimen>
|
||||
<dimen name="icon_size_profile_type_user_profile">26dp</dimen>
|
||||
<dimen name="icon_size_activity_type">16dp</dimen>
|
||||
|
||||
<!-- Elevation values -->
|
||||
|
@ -738,5 +738,6 @@
|
||||
<string name="from_name_and_name">From <xliff:g id="name">%1$s</xliff:g> and <xliff:g id="name">%2$s</xliff:g></string>
|
||||
<string name="from_name_and_N_others">From <xliff:g id="name">%1$s</xliff:g> and <xliff:g id="name">%2$d</xliff:g> others</string>
|
||||
<string name="projects_we_took_part">Projects we took part</string>
|
||||
<string name="activated_accounts">Activated accounts</string>
|
||||
|
||||
</resources>
|
@ -41,11 +41,9 @@
|
||||
android:summary="@string/pay_via_paypal_summary"
|
||||
android:title="@string/pay_via_paypal">
|
||||
</Preference>
|
||||
<Preference android:title="@string/donate_via_alipay">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:data="https://me.alipay.com/mariotaku"/>
|
||||
</Preference>
|
||||
<Preference
|
||||
android:title="@string/donate_via_alipay"
|
||||
android:summary="mariotaku.lee@gmail.com"/>
|
||||
<Preference
|
||||
android:summary="@string/contributors_list_summary"
|
||||
android:title="@string/donators">
|
||||
|
BIN
twidere/web_hi_res_512.png
Executable file → Normal file
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 95 KiB |