improved status fav/retweet state - close #250

This commit is contained in:
Mariotaku Lee 2015-11-25 10:30:37 +08:00
parent ffeb5c999e
commit 6752f2d1d8
33 changed files with 375 additions and 172 deletions

View File

@ -74,6 +74,16 @@ public class ObjectCursor<E> extends AbstractList<E> {
mCursor.close();
}
public CursorIndices<E> getIndices() {
return mIndices;
}
public Cursor getCursor(int position) {
ensureCursor();
mCursor.moveToPosition(position);
return mCursor;
}
public static abstract class CursorIndices<T> {
public CursorIndices(@NonNull Cursor cursor) {

View File

@ -27,6 +27,7 @@ import android.support.annotation.Nullable;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.api.twitter.model.GeoLocation;
@ -85,8 +86,8 @@ public class ParcelableLocation implements Parcelable {
latitude = Double.NaN;
longitude = Double.NaN;
} else {
latitude = ParseUtils.parseDouble(longlat[0], Double.NaN);
longitude = ParseUtils.parseDouble(longlat[1], Double.NaN);
latitude = NumberUtils.toDouble(longlat[0], Double.NaN);
longitude = NumberUtils.toDouble(longlat[1], Double.NaN);
}
}

View File

@ -11,6 +11,7 @@ import com.bluelinelabs.logansquare.LoganSquare;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.api.twitter.model.CardEntity;
import org.mariotaku.twidere.api.twitter.model.CardEntity.BindingValue;
import org.mariotaku.twidere.api.twitter.model.CardEntity.ImageValue;
@ -23,7 +24,6 @@ import org.mariotaku.twidere.api.twitter.model.MediaEntity.Type;
import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.api.twitter.model.UrlEntity;
import org.mariotaku.twidere.util.MediaPreviewUtils;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.TwidereArrayUtils;
import org.mariotaku.twidere.util.TwitterContentUtils;
@ -276,8 +276,8 @@ public class ParcelableMedia implements Parcelable {
final BindingValue player_width = card.getBindingValue("player_width");
final BindingValue player_height = card.getBindingValue("player_height");
if (player_width instanceof StringValue && player_height instanceof StringValue) {
media.width = ParseUtils.parseInt(((StringValue) player_width).getValue());
media.height = ParseUtils.parseInt(((StringValue) player_height).getValue());
media.width = NumberUtils.toInt(((StringValue) player_width).getValue(), -1);
media.height = NumberUtils.toInt(((StringValue) player_height).getValue(), -1);
}
if (entities != null) {
for (UrlEntity entity : entities) {

View File

@ -0,0 +1,39 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.Collections;
import java.util.List;
/**
* Created by mariotaku on 15/11/25.
*/
public class Nullables {
@NonNull
public static <T> List<T> list(@Nullable List<T> list) {
if (list == null) return Collections.emptyList();
return list;
}
}

View File

@ -113,71 +113,12 @@ public final class ParseUtils {
Log.w(TwidereConstants.LOGTAG, "Unknown type " + value.getClass().getSimpleName() + " in arguments key " + key);
}
}
} catch (final JSONException e) {
e.printStackTrace();
} catch (final ClassCastException e) {
} catch (final JSONException | ClassCastException e) {
e.printStackTrace();
}
return bundle;
}
public static double parseDouble(final String source) {
return parseDouble(source, -1);
}
public static double parseDouble(final String source, final double def) {
if (source == null) return def;
try {
return Double.parseDouble(source);
} catch (final NumberFormatException e) {
// Wrong number format? Ignore them.
}
return def;
}
public static float parseFloat(final String source) {
return parseFloat(source, -1);
}
public static float parseFloat(final String source, final float def) {
if (source == null) return def;
try {
return Float.parseFloat(source);
} catch (final NumberFormatException e) {
// Wrong number format? Ignore them.
}
return def;
}
public static int parseInt(final String source) {
return parseInt(source, -1);
}
public static int parseInt(final String source, final int def) {
if (source == null) return def;
try {
return Integer.valueOf(source);
} catch (final NumberFormatException e) {
// Wrong number format? Ignore them.
}
return def;
}
public static long parseLong(final String source) {
return parseLong(source, -1);
}
public static long parseLong(final String source, final long def) {
if (source == null) return def;
try {
return Long.parseLong(source);
} catch (final NumberFormatException e) {
// Wrong number format? Ignore them.
}
return def;
}
@Deprecated
public static String parseString(final String object) {
return object;
}

View File

@ -24,6 +24,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
import org.apache.commons.lang3.text.translate.EntityArrays;
import org.apache.commons.lang3.text.translate.LookupTranslator;
@ -188,7 +189,8 @@ public class TwitterContentUtils {
for (int i = entities.length - 1; i >= 0; i--) {
final Matcher m = PATTERN_TWITTER_STATUS_LINK.matcher(entities[i].getExpandedUrl());
if (!m.matches()) continue;
final long quoteId = ParseUtils.parseLong(m.group(3), -1);
final long def = -1;
final long quoteId = NumberUtils.toLong(m.group(3), def);
if (quoteId > 0) {
quotes.put(quoteId, status);
}

View File

@ -13,9 +13,9 @@ import android.text.TextUtils;
import android.util.Pair;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.IntentSupport;
@ -222,7 +222,8 @@ public class TwitterLinkHandlerActivity extends Activity implements Constants {
}
}
} else if (segsSize >= 3) {
if ("status".equals(pathSegments.get(1)) && ParseUtils.parseLong(pathSegments.get(2), -1) != -1) {
final long def = -1;
if ("status".equals(pathSegments.get(1)) && NumberUtils.toLong(pathSegments.get(2), def) != -1) {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_STATUS);

View File

@ -37,9 +37,9 @@ import android.widget.Toast;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.TwitterAPIFactory;
import static org.mariotaku.twidere.util.ParseUtils.parseString;
import static org.mariotaku.twidere.util.Utils.getNonEmptyString;
import static org.mariotaku.twidere.util.Utils.trim;
@ -113,12 +113,12 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements OnCh
@Override
public void onSaveInstanceState(final Bundle outState) {
final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText());
final String apiUrlFormat = ParseUtils.parseString(mEditAPIUrlFormat.getText());
final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId());
final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked();
final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked();
final String consumerKey = parseString(mEditConsumerKey.getText());
final String consumerSecret = parseString(mEditConsumerSecret.getText());
final String consumerKey = ParseUtils.parseString(mEditConsumerKey.getText());
final String consumerSecret = ParseUtils.parseString(mEditConsumerSecret.getText());
outState.putString(Accounts.API_URL_FORMAT, apiUrlFormat);
outState.putInt(Accounts.AUTH_TYPE, authType);
outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl);
@ -129,12 +129,12 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements OnCh
}
public void saveAndFinish() {
final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText());
final String apiUrlFormat = ParseUtils.parseString(mEditAPIUrlFormat.getText());
final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId());
final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked();
final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked();
final String consumerKey = parseString(mEditConsumerKey.getText());
final String consumerSecret = parseString(mEditConsumerSecret.getText());
final String consumerKey = ParseUtils.parseString(mEditConsumerKey.getText());
final String consumerSecret = ParseUtils.parseString(mEditConsumerSecret.getText());
final Intent intent = new Intent();
intent.putExtra(Accounts.API_URL_FORMAT, apiUrlFormat);
intent.putExtra(Accounts.AUTH_TYPE, authType);

View File

@ -63,6 +63,7 @@ import com.meizu.flyme.reflect.StatusBarProxy;
import com.squareup.otto.Subscribe;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.SettingsWizardActivity;
@ -87,7 +88,6 @@ import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.MathUtils;
import org.mariotaku.twidere.util.MultiSelectEventHandler;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
@ -697,7 +697,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
final String tabType = uri != null ? Utils.matchTabType(uri) : null;
int initialTab = -1;
if (tabType != null) {
final long accountId = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID));
final long accountId = NumberUtils.toLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), -1);
for (int i = mPagerAdapter.getCount() - 1; i > -1; i--) {
final SupportTabSpec tab = mPagerAdapter.getTab(i);
if (tabType.equals(tab.type)) {

View File

@ -52,13 +52,13 @@ import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.SingleResponse;
import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.TwitterAPIFactory;
import java.util.ArrayList;
import java.util.List;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.ParseUtils.parseString;
import static org.mariotaku.twidere.util.Utils.getAccountScreenName;
public class UserListSelectorActivity extends BaseSupportDialogActivity implements OnClickListener, OnItemClickListener {
@ -88,7 +88,7 @@ public class UserListSelectorActivity extends BaseSupportDialogActivity implemen
public void onClick(final View v) {
switch (v.getId()) {
case R.id.screen_name_confirm: {
final String screen_name = parseString(mEditScreenName.getText());
final String screen_name = ParseUtils.parseString(mEditScreenName.getText());
if (isEmpty(screen_name)) return;
searchUser(screen_name);
break;

View File

@ -331,12 +331,16 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
@Override
public void onItemActionClick(ViewHolder holder, int id, int position) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onStatusActionClick(((StatusViewHolder) holder), id, position);
}
}
@Override
public void onItemMenuClick(ViewHolder holder, View menuView, int position) {
if (mActivityAdapterListener != null) {
mActivityAdapterListener.onStatusMenuClick((StatusViewHolder) holder, menuView, position);
}
}
@Override
@ -372,6 +376,10 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
void onGapClick(GapViewHolder holder, int position);
void onActivityClick(ActivityTitleSummaryViewHolder holder, int position);
void onStatusActionClick(StatusViewHolder holder, int id, int position);
void onStatusMenuClick(StatusViewHolder holder, View menuView, int position);
}
private static class StubViewHolder extends ViewHolder {

View File

@ -20,7 +20,9 @@
package org.mariotaku.twidere.adapter;
import android.content.Context;
import android.database.Cursor;
import org.mariotaku.twidere.model.ObjectCursor;
import org.mariotaku.twidere.model.ParcelableStatus;
import java.util.List;
@ -62,9 +64,25 @@ public abstract class AbsParcelableStatusesAdapter extends AbsStatusesAdapter<Li
@Override
public long getStatusId(int position) {
if (position == getStatusesCount()) return -1;
if (mData instanceof ObjectCursor) {
final Cursor cursor = ((ObjectCursor) mData).getCursor(position);
final ParcelableStatus.CursorIndices indices = (ParcelableStatus.CursorIndices) ((ObjectCursor) mData).getIndices();
return cursor.getLong(indices.status_id);
}
return mData.get(position).id;
}
@Override
public long getAccountId(int position) {
if (position == getStatusesCount()) return -1;
if (mData instanceof ObjectCursor) {
final Cursor cursor = ((ObjectCursor) mData).getCursor(position);
final ParcelableStatus.CursorIndices indices = (ParcelableStatus.CursorIndices) ((ObjectCursor) mData).getIndices();
return cursor.getLong(indices.account_id);
}
return mData.get(position).account_id;
}
@Override
public void setData(List<ParcelableStatus> data) {
mData = data;

View File

@ -2,6 +2,7 @@ package org.mariotaku.twidere.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
@ -288,6 +289,16 @@ public abstract class AbsStatusesAdapter<D> extends LoadMoreSupportAdapter<ViewH
notifyDataSetChanged();
}
@Nullable
@Override
public ParcelableStatus findStatusById(long accountId, long statusId) {
for (int i = 0, j = getStatusesCount(); i < j; i++) {
if (accountId == getAccountId(i) && statusId == getStatusId(i)) return getStatus(i);
}
return null;
}
protected void bindStatus(IStatusViewHolder holder, int position) {
holder.displayStatus(getStatus(position), isShowInReplyTo());
}

View File

@ -1,5 +1,7 @@
package org.mariotaku.twidere.adapter.iface;
import android.support.annotation.Nullable;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.TwidereLinkify;
@ -21,6 +23,11 @@ public interface IStatusesAdapter<Data> extends IContentCardAdapter, IStatusView
long getStatusId(int position);
long getAccountId(int position);
@Nullable
ParcelableStatus findStatusById(long accountId, long statusId);
int getStatusesCount();
TwidereLinkify getTwidereLinkify();

View File

@ -43,6 +43,7 @@ import org.mariotaku.twidere.util.RecyclerViewNavigationHelper;
import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback;
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder;
import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.StatusViewHolder;
/**
* Created by mariotaku on 14/11/5.
@ -169,6 +170,16 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
return new StatusesBusCallback();
}
@Override
public void onStatusActionClick(StatusViewHolder holder, int id, int position) {
}
@Override
public void onStatusMenuClick(StatusViewHolder holder, View menuView, int position) {
}
protected final class StatusesBusCallback {
protected StatusesBusCallback() {

View File

@ -53,8 +53,6 @@ import edu.tsinghua.hotmobi.model.MediaEvent;
import edu.tsinghua.hotmobi.model.ScrollRecord;
import edu.tsinghua.hotmobi.model.TimelineType;
import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
/**
* Created by mariotaku on 14/11/5.
*/
@ -375,7 +373,7 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
popupMenu.setOnMenuItemClickListener(mOnStatusMenuItemClickListener);
popupMenu.inflate(R.menu.action_status);
final ParcelableStatus status = adapter.getStatus(position);
setMenuForStatus(adapter.getContext(), mPreferences, popupMenu.getMenu(), status);
Utils.setMenuForStatus(adapter.getContext(), mPreferences, popupMenu.getMenu(), status, mTwitterWrapper);
popupMenu.show();
mPopupMenu = popupMenu;
mSelectedStatus = status;

View File

@ -22,6 +22,8 @@ package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.adapter.iface.IActivitiesAdapter;
@ -102,5 +104,4 @@ public abstract class ParcelableActivitiesFragment extends AbsActivitiesFragment
protected abstract String[] getSavedActivitiesFileArgs();
}

View File

@ -72,6 +72,8 @@ import android.widget.ImageView;
import android.widget.Space;
import android.widget.TextView;
import com.squareup.otto.Subscribe;
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
@ -102,6 +104,7 @@ import org.mariotaku.twidere.util.MathUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.MenuUtils;
import org.mariotaku.twidere.util.Nullables;
import org.mariotaku.twidere.util.RecyclerViewNavigationHelper;
import org.mariotaku.twidere.util.RecyclerViewUtils;
import org.mariotaku.twidere.util.StatusActionModeCallback;
@ -113,6 +116,9 @@ import org.mariotaku.twidere.util.TwitterAPIFactory;
import org.mariotaku.twidere.util.TwitterCardUtils;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.message.FavoriteCreatedEvent;
import org.mariotaku.twidere.util.message.FavoriteDestroyedEvent;
import org.mariotaku.twidere.util.message.StatusListChangedEvent;
import org.mariotaku.twidere.view.CardMediaContainer;
import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener;
import org.mariotaku.twidere.view.ColorLabelRelativeLayout;
@ -387,7 +393,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
popupMenu.setOnMenuItemClickListener(mOnStatusMenuItemClickListener);
popupMenu.inflate(R.menu.action_status);
final ParcelableStatus status = mStatusAdapter.getStatus(position);
Utils.setMenuForStatus(mStatusAdapter.getContext(), mPreferences, popupMenu.getMenu(), status);
Utils.setMenuForStatus(mStatusAdapter.getContext(), mPreferences, popupMenu.getMenu(), status,
mTwitterWrapper);
popupMenu.show();
mPopupMenu = popupMenu;
mSelectedStatus = status;
@ -640,6 +647,42 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
@Override
public void onStart() {
super.onStart();
mBus.register(this);
}
@Override
public void onStop() {
mBus.unregister(this);
super.onStop();
}
@Subscribe
public void notifyStatusListChanged(StatusListChangedEvent event) {
final StatusAdapter adapter = getAdapter();
adapter.notifyDataSetChanged();
}
@Subscribe
public void notifyFavoriteCreated(FavoriteCreatedEvent event) {
final StatusAdapter adapter = getAdapter();
final ParcelableStatus status = adapter.findStatusById(event.status.account_id, event.status.id);
if (status != null) {
status.is_favorite = true;
}
}
@Subscribe
public void notifyFavoriteDestroyed(FavoriteDestroyedEvent event) {
final StatusAdapter adapter = getAdapter();
final ParcelableStatus status = adapter.findStatusById(event.status.account_id, event.status.id);
if (status != null) {
status.is_favorite = false;
}
}
public static final class LoadSensitiveImageConfirmDialogFragment extends BaseSupportDialogFragment implements
DialogInterface.OnClickListener {
@ -756,7 +799,6 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private static class DetailStatusViewHolder extends ViewHolder implements OnClickListener,
ActionMenuView.OnMenuItemClickListener {
private final StatusFragment fragment;
private final StatusAdapter adapter;
private final ActionMenuView menuBar;
@ -786,9 +828,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private final TwidereLinkify linkify;
private final TextView favoritesLabel;
public DetailStatusViewHolder(StatusFragment fragment, StatusAdapter adapter, View itemView) {
public DetailStatusViewHolder(StatusAdapter adapter, View itemView) {
super(itemView);
this.fragment = fragment;
this.linkClickHandler = new StatusLinkClickHandler(adapter.getContext(), null);
this.linkify = new TwidereLinkify(linkClickHandler);
this.adapter = adapter;
@ -825,7 +866,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
initViews();
}
public void displayStatus(ParcelableStatus status) {
public void displayStatus(ParcelableStatus status, AsyncTwitterWrapper twitter) {
if (status == null) return;
final StatusFragment fragment = adapter.getFragment();
final Context context = adapter.getContext();
@ -979,8 +1020,9 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
twitterCard.setVisibility(View.GONE);
}
Utils.setMenuForStatus(context, fragment.mPreferences, menuBar.getMenu(), status,
adapter.getStatusAccount());
adapter.getStatusAccount(), twitter);
textView.setTextIsSelectable(true);
quotedTextView.setTextIsSelectable(true);
@ -1276,7 +1318,26 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Override
public long getStatusId(int position) {
final ParcelableStatus status = getStatus(position);
return status != null ? status.hashCode() : position;
return status != null ? status.id : position;
}
@Override
public long getAccountId(int position) {
final ParcelableStatus status = getStatus(position);
return status != null ? status.account_id : position;
}
@Override
public ParcelableStatus findStatusById(long accountId, long statusId) {
if (mStatus != null && accountId == mStatus.account_id && statusId == mStatus.id)
return mStatus;
for (ParcelableStatus status : Nullables.list(mConversation)) {
if (accountId == status.account_id && status.id == statusId) return status;
}
for (ParcelableStatus status : Nullables.list(mReplies)) {
if (accountId == status.account_id && status.id == statusId) return status;
}
return null;
}
@Override
@ -1412,7 +1473,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final CardView cardView = (CardView) view.findViewById(R.id.card);
cardView.setCardBackgroundColor(mCardBackgroundColor);
}
return new DetailStatusViewHolder(mFragment, this, view);
return new DetailStatusViewHolder(this, view);
}
case VIEW_TYPE_LIST_STATUS: {
final View view = mInflater.inflate(mCardLayoutResource, parent, false);
@ -1451,7 +1512,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
case VIEW_TYPE_DETAIL_STATUS: {
final ParcelableStatus status = getStatus(position);
final DetailStatusViewHolder detailHolder = (DetailStatusViewHolder) holder;
detailHolder.displayStatus(status);
detailHolder.displayStatus(status, mTwitterWrapper);
break;
}
case VIEW_TYPE_LIST_STATUS: {

View File

@ -83,6 +83,7 @@ import android.widget.TextView;
import com.meizu.flyme.reflect.StatusBarProxy;
import com.squareup.otto.Subscribe;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
@ -1297,7 +1298,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
break;
}
case TwidereLinkify.LINK_TYPE_STATUS: {
Utils.openStatus(getActivity(), accountId, ParseUtils.parseLong(link));
Utils.openStatus(getActivity(), accountId, NumberUtils.toLong(link, -1));
break;
}
}

View File

@ -40,9 +40,9 @@ import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.util.ParseUtils;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.ParseUtils.parseString;
import static org.mariotaku.twidere.util.Utils.getNonEmptyString;
import static org.mariotaku.twidere.util.Utils.trim;
@ -96,6 +96,7 @@ public class DefaultAPIPreference extends DialogPreference implements Constants,
@Override
protected void onBindDialogView(@NonNull final View view) {
super.onBindDialogView(view);
final SharedPreferences pref = getSharedPreferences();
final String apiUrlFormat = getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_TWITTER_API_URL_FORMAT);
final int authType = pref.getInt(KEY_AUTH_TYPE, ParcelableCredentials.AUTH_TYPE_OAUTH);
@ -131,12 +132,12 @@ public class DefaultAPIPreference extends DialogPreference implements Constants,
@Override
protected void onDialogClosed(final boolean positiveResult) {
if (!positiveResult) return;
final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText());
final String apiUrlFormat = ParseUtils.parseString(mEditAPIUrlFormat.getText());
final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId());
final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked();
final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked();
final String consumerKey = parseString(mEditConsumerKey.getText());
final String consumerSecret = parseString(mEditConsumerSecret.getText());
final String consumerKey = ParseUtils.parseString(mEditConsumerKey.getText());
final String consumerSecret = ParseUtils.parseString(mEditConsumerSecret.getText());
final SharedPreferences.Editor editor = getSharedPreferences().edit();
if (!isEmpty(consumerKey) && !isEmpty(consumerSecret)) {
editor.putString(KEY_CONSUMER_KEY, consumerKey);
@ -179,11 +180,11 @@ public class DefaultAPIPreference extends DialogPreference implements Constants,
protected Parcelable onSaveInstanceState() {
final Bundle outState = new Bundle();
outState.putParcelable(EXTRA_DATA, super.onSaveInstanceState());
outState.putString(Accounts.API_URL_FORMAT, parseString(mEditAPIUrlFormat.getText()));
outState.putString(Accounts.API_URL_FORMAT, ParseUtils.parseString(mEditAPIUrlFormat.getText()));
outState.putInt(Accounts.AUTH_TYPE, getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId()));
outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, mEditSameOAuthSigningUrl.isChecked());
outState.putString(Accounts.CONSUMER_KEY, parseString(mEditConsumerKey.getText()));
outState.putString(Accounts.CONSUMER_SECRET, parseString(mEditConsumerSecret.getText()));
outState.putString(Accounts.CONSUMER_KEY, ParseUtils.parseString(mEditConsumerKey.getText()));
outState.putString(Accounts.CONSUMER_SECRET, ParseUtils.parseString(mEditConsumerSecret.getText()));
return outState;
}

View File

@ -63,6 +63,7 @@ import com.squareup.okhttp.Dns;
import com.squareup.otto.Bus;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.sqliteqb.library.Columns.Column;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.OnConflict;
@ -400,11 +401,11 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
if (segments.size() == 1) {
clearNotification();
} else if (segments.size() == 2) {
final int notificationType = ParseUtils.parseInt(segments.get(1));
final int notificationType = NumberUtils.toInt(segments.get(1), -1);
clearNotification(notificationType, 0);
} else if (segments.size() == 3) {
final int notificationType = ParseUtils.parseInt(segments.get(1));
final long accountId = ParseUtils.parseLong(segments.get(2));
final int notificationType = NumberUtils.toInt(segments.get(1), -1);
final long accountId = NumberUtils.toLong(segments.get(2), -1);
clearNotification(notificationType, accountId);
}
return 1;
@ -678,15 +679,19 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
}
case VIRTUAL_TABLE_ID_NOTIFICATIONS: {
final List<String> segments = uri.getPathSegments();
if (segments.size() == 2)
return getNotificationsCursor(ParseUtils.parseInt(segments.get(1), -1));
if (segments.size() == 2) {
final int def = -1;
return getNotificationsCursor(NumberUtils.toInt(segments.get(1), def));
}
else
return getNotificationsCursor();
}
case VIRTUAL_TABLE_ID_UNREAD_COUNTS: {
final List<String> segments = uri.getPathSegments();
if (segments.size() == 2)
return getUnreadCountsCursor(ParseUtils.parseInt(segments.get(1), -1));
if (segments.size() == 2) {
final int def = -1;
return getUnreadCountsCursor(NumberUtils.toInt(segments.get(1), def));
}
else
return getUnreadCountsCursor();
}
@ -698,8 +703,8 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
case TABLE_ID_DIRECT_MESSAGES_CONVERSATION: {
final List<String> segments = uri.getPathSegments();
if (segments.size() != 4) return null;
final long accountId = ParseUtils.parseLong(segments.get(2));
final long conversationId = ParseUtils.parseLong(segments.get(3));
final long accountId = NumberUtils.toLong(segments.get(2), -1);
final long conversationId = NumberUtils.toLong(segments.get(3), -1);
final SQLSelectQuery query = ConversationQueryBuilder.buildByConversationId(projection,
accountId, conversationId, selection, sortOrder);
final Cursor c = mDatabaseWrapper.rawQuery(query.getSQL(), selectionArgs);
@ -709,7 +714,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
case TABLE_ID_DIRECT_MESSAGES_CONVERSATION_SCREEN_NAME: {
final List<String> segments = uri.getPathSegments();
if (segments.size() != 4) return null;
final long accountId = ParseUtils.parseLong(segments.get(2));
final long accountId = NumberUtils.toLong(segments.get(2), -1);
final String screenName = segments.get(3);
final SQLSelectQuery query = ConversationQueryBuilder.buildByScreenName(projection,
accountId, screenName, selection, sortOrder);
@ -718,7 +723,8 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
return c;
}
case VIRTUAL_TABLE_ID_CACHED_USERS_WITH_RELATIONSHIP: {
final long accountId = ParseUtils.parseLong(uri.getLastPathSegment(), -1);
final long def = -1;
final long accountId = NumberUtils.toLong(uri.getLastPathSegment(), def);
final SQLSelectQuery query = CachedUsersQueryBuilder.withRelationship(projection,
selection, sortOrder, accountId);
final Cursor c = mDatabaseWrapper.rawQuery(query.getSQL(), selectionArgs);
@ -726,7 +732,8 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
return c;
}
case VIRTUAL_TABLE_ID_CACHED_USERS_WITH_SCORE: {
final long accountId = ParseUtils.parseLong(uri.getLastPathSegment(), -1);
final long def = -1;
final long accountId = NumberUtils.toLong(uri.getLastPathSegment(), def);
final SQLSelectQuery query = CachedUsersQueryBuilder.withScore(projection,
selection, sortOrder, accountId, 0);
final Cursor c = mDatabaseWrapper.rawQuery(query.getSQL(), selectionArgs);
@ -768,7 +775,8 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
private Cursor getSearchSuggestionCursor(Uri uri) {
final String query = uri.getQueryParameter(QUERY_PARAM_QUERY);
final long accountId = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), -1);
final long def = -1;
final long accountId = NumberUtils.toLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), def);
if (query == null || accountId <= 0) return null;
final boolean emptyQuery = TextUtils.isEmpty(query);
final String queryEscaped = query.replace("_", "^_");

View File

@ -26,9 +26,9 @@ import android.net.Uri;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.StringLongPair;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.UriExtraUtils;
import org.mariotaku.twidere.util.Utils;
@ -50,10 +50,14 @@ public class NotificationReceiver extends BroadcastReceiver implements Constants
final Uri uri = intent.getData();
if (uri == null) return;
final String type = uri.getQueryParameter(QUERY_PARAM_NOTIFICATION_TYPE);
final long accountId = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), -1);
final long itemId = ParseUtils.parseLong(UriExtraUtils.getExtra(uri, "item_id"), -1);
final long itemUserId = ParseUtils.parseLong(UriExtraUtils.getExtra(uri, "item_user_id"), -1);
final long timestamp = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_TIMESTAMP), -1);
final long def4 = -1;
final long accountId = NumberUtils.toLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), def4);
final long def3 = -1;
final long itemId = NumberUtils.toLong(UriExtraUtils.getExtra(uri, "item_id"), def3);
final long def2 = -1;
final long itemUserId = NumberUtils.toLong(UriExtraUtils.getExtra(uri, "item_user_id"), def2);
final long def1 = -1;
final long timestamp = NumberUtils.toLong(uri.getQueryParameter(QUERY_PARAM_TIMESTAMP), def1);
final ApplicationModule module = ApplicationModule.get(context);
if (AUTHORITY_MENTIONS.equals(type) && accountId != -1 && itemId != -1 && timestamp != -1) {
final HotMobiLogger logger = module.getHotMobiLogger();
@ -64,8 +68,9 @@ public class NotificationReceiver extends BroadcastReceiver implements Constants
final String paramReadPosition, paramReadPositions;
final String tag = getPositionTag(type);
if (tag != null && !TextUtils.isEmpty(paramReadPosition = uri.getQueryParameter(QUERY_PARAM_READ_POSITION))) {
final long def = -1;
manager.setPosition(Utils.getReadPositionTagWithAccounts(tag, accountId),
ParseUtils.parseLong(paramReadPosition, -1));
NumberUtils.toLong(paramReadPosition, def));
} else if (!TextUtils.isEmpty(paramReadPositions = uri.getQueryParameter(QUERY_PARAM_READ_POSITIONS))) {
try {
final StringLongPair[] pairs = StringLongPair.valuesOf(paramReadPositions);

View File

@ -43,6 +43,7 @@ import android.widget.Toast;
import com.nostra13.universalimageloader.utils.IoUtils;
import com.twitter.Extractor;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.restfu.http.ContentType;
import org.mariotaku.restfu.http.mime.FileTypedData;
import org.mariotaku.sqliteqb.library.Expression;
@ -79,7 +80,6 @@ import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.ListUtils;
import org.mariotaku.twidere.util.MediaUploaderInterface;
import org.mariotaku.twidere.util.NotificationManagerWrapper;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.StatusCodeMessageUtils;
import org.mariotaku.twidere.util.StatusShortenerInterface;
import org.mariotaku.twidere.util.TwidereValidator;
@ -222,7 +222,8 @@ public class BackgroundOperationService extends IntentService implements Constan
final Uri uri = intent.getData();
if (uri == null) return;
mNotificationManager.cancel(uri.toString(), NOTIFICATION_ID_DRAFTS);
final long draftId = ParseUtils.parseLong(uri.getLastPathSegment(), -1);
final long def = -1;
final long draftId = NumberUtils.toLong(uri.getLastPathSegment(), def);
if (draftId == -1) return;
final Expression where = Expression.equals(Drafts._ID, draftId);
final ContentResolver cr = getContentResolver();
@ -255,7 +256,8 @@ public class BackgroundOperationService extends IntentService implements Constan
if (data == null) return;
mNotificationManager.cancel(data.toString(), NOTIFICATION_ID_DRAFTS);
final ContentResolver cr = getContentResolver();
final long id = ParseUtils.parseLong(data.getLastPathSegment(), -1);
final long def = -1;
final long id = NumberUtils.toLong(data.getLastPathSegment(), def);
final Expression where = Expression.equals(Drafts._ID, id);
cr.delete(Drafts.CONTENT_URI, where.getSQL(), null);
}
@ -325,7 +327,8 @@ public class BackgroundOperationService extends IntentService implements Constan
final ContentValues draftValues = ContentValuesCreator.createStatusDraft(item,
ParcelableAccount.getAccountIds(item.accounts));
final Uri draftUri = mResolver.insert(Drafts.CONTENT_URI, draftValues);
final long draftId = draftUri != null ? ParseUtils.parseLong(draftUri.getLastPathSegment(), -1) : -1;
final long def = -1;
final long draftId = draftUri != null ? NumberUtils.toLong(draftUri.getLastPathSegment(), def) : -1;
mTwitter.addSendingDraftId(draftId);
final List<SingleResponse<ParcelableStatus>> result = updateStatus(builder, item);
boolean failed = false;

View File

@ -30,6 +30,7 @@ import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.AccountPreferences;
@ -49,7 +50,6 @@ import javax.inject.Inject;
import edu.tsinghua.hotmobi.HotMobiLogger;
import edu.tsinghua.hotmobi.model.ScreenEvent;
import static org.mariotaku.twidere.util.ParseUtils.parseInt;
import static org.mariotaku.twidere.util.Utils.getAccountIds;
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
import static org.mariotaku.twidere.util.Utils.getNewestMessageIdsFromDatabase;
@ -268,7 +268,7 @@ public class RefreshService extends Service implements Constants {
private long getRefreshInterval() {
if (mPreferences == null) return 0;
final int prefValue = parseInt(mPreferences.getString(KEY_REFRESH_INTERVAL, DEFAULT_REFRESH_INTERVAL));
final int prefValue = NumberUtils.toInt(mPreferences.getString(KEY_REFRESH_INTERVAL, DEFAULT_REFRESH_INTERVAL), -1);
return Math.max(prefValue, 3) * 60 * 1000;
}

View File

@ -27,6 +27,7 @@ import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener;
@ -92,11 +93,11 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants {
break;
}
case TwidereLinkify.LINK_TYPE_USER_ID: {
openUserProfile(context, accountId, ParseUtils.parseLong(link), null, null);
openUserProfile(context, accountId, NumberUtils.toLong(link, -1), null, null);
break;
}
case TwidereLinkify.LINK_TYPE_STATUS: {
openStatus(context, accountId, ParseUtils.parseLong(link));
openStatus(context, accountId, NumberUtils.toLong(link, -1));
break;
}
}

View File

@ -24,6 +24,7 @@ import android.text.TextUtils;
import com.twitter.Validator;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.Constants;
public class TwidereValidator implements Constants {
@ -37,7 +38,7 @@ public class TwidereValidator implements Constants {
mValidator = new Validator();
if (prefs != null) {
final String textLimit = prefs.getString(KEY_STATUS_TEXT_LIMIT, null);
mMaxTweetLength = ParseUtils.parseInt(textLimit, Validator.MAX_TWEET_LENGTH);
mMaxTweetLength = NumberUtils.toInt(textLimit, Validator.MAX_TWEET_LENGTH);
} else {
mMaxTweetLength = Validator.MAX_TWEET_LENGTH;
}

View File

@ -14,6 +14,7 @@ import android.webkit.URLUtil;
import com.squareup.okhttp.Dns;
import com.squareup.okhttp.OkHttpClient;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.restfu.ExceptionFactory;
import org.mariotaku.restfu.HttpRequestFactory;
import org.mariotaku.restfu.Pair;
@ -148,7 +149,7 @@ public class TwitterAPIFactory implements TwidereConstants {
public static Proxy getProxy(final SharedPreferences prefs) {
final String proxyHost = prefs.getString(KEY_PROXY_HOST, null);
final int proxyPort = ParseUtils.parseInt(prefs.getString(KEY_PROXY_PORT, "-1"));
final int proxyPort = NumberUtils.toInt(prefs.getString(KEY_PROXY_PORT, "-1"), -1);
if (!isEmpty(proxyHost) && proxyPort >= 0 && proxyPort < 65535) {
final SocketAddress addr = InetSocketAddress.createUnresolved(proxyHost, proxyPort);
return new Proxy(Proxy.Type.HTTP, addr);

View File

@ -23,6 +23,7 @@ import android.graphics.Point;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.model.ParcelableStatus.ParcelableCardEntity;
import org.mariotaku.twidere.model.ParcelableStatus.ParcelableCardEntity.ParcelableBindingValue;
@ -60,8 +61,8 @@ public class TwitterCardUtils {
final ParcelableBindingValue player_width = ParcelableCardEntity.getValue(card, "player_width");
final ParcelableBindingValue player_height = ParcelableCardEntity.getValue(card, "player_height");
if (player_width != null && player_height != null) {
final int width = ParseUtils.parseInt(String.valueOf(player_width.value));
final int height = ParseUtils.parseInt(String.valueOf(player_height.value));
final int width = NumberUtils.toInt(String.valueOf(player_width.value), -1);
final int height = NumberUtils.toInt(String.valueOf(player_height.value), -1);
if (width > 0 && height > 0) {
return new Point(width, height);
}

View File

@ -25,6 +25,7 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.graphics.Color;
import android.support.v4.util.LongSparseArray;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.api.twitter.model.User;
import org.mariotaku.twidere.model.ParcelableStatus;
@ -175,7 +176,8 @@ public class UserColorNameManager implements TwidereConstants {
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
final long userId = ParseUtils.parseLong(key, -1);
final long def = -1;
final long userId = NumberUtils.toLong(key, def);
if (mListener != null) {
mListener.onUserColorChanged(userId, sharedPreferences.getInt(key, 0));
}
@ -193,7 +195,8 @@ public class UserColorNameManager implements TwidereConstants {
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
final long userId = ParseUtils.parseLong(key, -1);
final long def = -1;
final long userId = NumberUtils.toLong(key, def);
if (mListener != null) {
mListener.onUserNicknameChanged(userId, sharedPreferences.getString(key, null));
}

View File

@ -115,6 +115,7 @@ import android.widget.Toast;
import com.bluelinelabs.logansquare.LoganSquare;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.json.JSONException;
import org.mariotaku.restfu.RestAPIFactory;
import org.mariotaku.restfu.RestClient;
@ -846,8 +847,8 @@ public final class Utils implements Constants {
}
case LINK_ID_MAP: {
if (!args.containsKey(EXTRA_LATITUDE) && !args.containsKey(EXTRA_LONGITUDE)) {
final double lat = ParseUtils.parseDouble(uri.getQueryParameter(QUERY_PARAM_LAT), Double.NaN);
final double lng = ParseUtils.parseDouble(uri.getQueryParameter(QUERY_PARAM_LNG), Double.NaN);
final double lat = NumberUtils.toDouble(uri.getQueryParameter(QUERY_PARAM_LAT), Double.NaN);
final double lng = NumberUtils.toDouble(uri.getQueryParameter(QUERY_PARAM_LNG), Double.NaN);
if (Double.isNaN(lat) || Double.isNaN(lng)) return null;
args.putDouble(EXTRA_LATITUDE, lat);
args.putDouble(EXTRA_LONGITUDE, lng);
@ -859,7 +860,7 @@ public final class Utils implements Constants {
fragment = new StatusFragment();
if (!args.containsKey(EXTRA_STATUS_ID)) {
final String param_status_id = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(param_status_id));
args.putLong(EXTRA_STATUS_ID, NumberUtils.toLong(param_status_id, -1));
}
break;
}
@ -871,7 +872,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(param_user_id));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(param_user_id, -1));
}
break;
}
@ -883,7 +884,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
}
break;
}
@ -895,7 +896,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
}
if (isEmpty(paramScreenName) && isEmpty(paramUserId)) return null;
break;
@ -908,7 +909,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
}
if (isEmpty(paramScreenName) && isEmpty(paramUserId)) return null;
break;
@ -921,7 +922,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
}
if (!args.containsKey(EXTRA_SCREEN_NAME) && !args.containsKey(EXTRA_USER_ID))
return null;
@ -935,7 +936,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(param_user_id));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(param_user_id, -1));
}
if (isEmpty(paramScreenName) && isEmpty(param_user_id)) return null;
break;
@ -948,7 +949,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(param_user_id));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(param_user_id, -1));
}
if (isEmpty(paramScreenName) && isEmpty(param_user_id)) return null;
break;
@ -969,7 +970,7 @@ public final class Utils implements Constants {
fragment = new MessagesConversationFragment();
final String paramRecipientId = uri.getQueryParameter(QUERY_PARAM_RECIPIENT_ID);
final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME);
final long conversationId = ParseUtils.parseLong(paramRecipientId);
final long conversationId = NumberUtils.toLong(paramRecipientId, -1);
if (conversationId > 0) {
args.putLong(EXTRA_RECIPIENT_ID, conversationId);
} else if (paramScreenName != null) {
@ -986,8 +987,8 @@ public final class Utils implements Constants {
if (isEmpty(paramListId)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(paramUserId)))
return null;
args.putLong(EXTRA_LIST_ID, ParseUtils.parseLong(paramListId));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_LIST_ID, NumberUtils.toLong(paramListId, -1));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
args.putString(EXTRA_LIST_NAME, paramListName);
break;
@ -1000,7 +1001,7 @@ public final class Utils implements Constants {
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
}
if (!args.containsKey(EXTRA_USER_ID)) {
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
}
if (isEmpty(paramScreenName) && isEmpty(paramUserId)) return null;
break;
@ -1014,8 +1015,8 @@ public final class Utils implements Constants {
if (isEmpty(paramListId)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(paramUserId)))
return null;
args.putLong(EXTRA_LIST_ID, ParseUtils.parseLong(paramListId));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_LIST_ID, NumberUtils.toLong(paramListId, -1));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
args.putString(EXTRA_LIST_NAME, paramListName);
break;
@ -1029,8 +1030,8 @@ public final class Utils implements Constants {
if (isEmpty(paramListId)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(paramUserId)))
return null;
args.putLong(EXTRA_LIST_ID, ParseUtils.parseLong(paramListId));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_LIST_ID, NumberUtils.toLong(paramListId, -1));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
args.putString(EXTRA_LIST_NAME, paramListName);
break;
@ -1044,8 +1045,8 @@ public final class Utils implements Constants {
if (isEmpty(paramListId)
&& (isEmpty(paramListName) || isEmpty(paramScreenName) && isEmpty(paramUserId)))
return null;
args.putLong(EXTRA_LIST_ID, ParseUtils.parseLong(paramListId));
args.putLong(EXTRA_USER_ID, ParseUtils.parseLong(paramUserId));
args.putLong(EXTRA_LIST_ID, NumberUtils.toLong(paramListId, -1));
args.putLong(EXTRA_USER_ID, NumberUtils.toLong(paramUserId, -1));
args.putString(EXTRA_SCREEN_NAME, paramScreenName);
args.putString(EXTRA_LIST_NAME, paramListName);
break;
@ -1079,7 +1080,7 @@ public final class Utils implements Constants {
fragment = new StatusRetweetersListFragment();
if (!args.containsKey(EXTRA_STATUS_ID)) {
final String paramStatusId = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(paramStatusId));
args.putLong(EXTRA_STATUS_ID, NumberUtils.toLong(paramStatusId, -1));
}
break;
}
@ -1087,7 +1088,7 @@ public final class Utils implements Constants {
fragment = new StatusFavoritersListFragment();
if (!args.containsKey(EXTRA_STATUS_ID)) {
final String paramStatusId = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(paramStatusId));
args.putLong(EXTRA_STATUS_ID, NumberUtils.toLong(paramStatusId, -1));
}
break;
}
@ -1095,7 +1096,7 @@ public final class Utils implements Constants {
fragment = new StatusRepliesListFragment();
if (!args.containsKey(EXTRA_STATUS_ID)) {
final String paramStatusId = uri.getQueryParameter(QUERY_PARAM_STATUS_ID);
args.putLong(EXTRA_STATUS_ID, ParseUtils.parseLong(paramStatusId));
args.putLong(EXTRA_STATUS_ID, NumberUtils.toLong(paramStatusId, -1));
}
if (!args.containsKey(EXTRA_SCREEN_NAME)) {
final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME);
@ -1120,7 +1121,7 @@ public final class Utils implements Constants {
}
final String paramAccountId = uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID);
if (paramAccountId != null) {
args.putLong(EXTRA_ACCOUNT_ID, ParseUtils.parseLong(paramAccountId));
args.putLong(EXTRA_ACCOUNT_ID, NumberUtils.toLong(paramAccountId, -1));
} else {
final String paramAccountName = uri.getQueryParameter(QUERY_PARAM_ACCOUNT_NAME);
if (paramAccountName != null) {
@ -1954,7 +1955,8 @@ public final class Utils implements Constants {
final List<Long> list = new ArrayList<>();
for (final Entry<String, ?> entry : manager.getNameEntries()) {
final String value = ParseUtils.parseString(entry.getValue());
final long key = ParseUtils.parseLong(entry.getKey(), -1);
final long def = -1;
final long key = NumberUtils.toLong(entry.getKey(), def);
if (key == -1 || isEmpty(value)) {
continue;
}
@ -3326,20 +3328,29 @@ public final class Utils implements Constants {
}
public static void setMenuForStatus(final Context context, final SharedPreferencesWrapper preferences,
final Menu menu, final ParcelableStatus status) {
final Menu menu, final ParcelableStatus status,
final AsyncTwitterWrapper twitter) {
if (status == null) return;
final ParcelableCredentials account = ParcelableAccount.getCredentials(context, status.account_id);
setMenuForStatus(context, preferences, menu, status, account);
setMenuForStatus(context, preferences, menu, status, account, twitter);
}
public static void setMenuForStatus(final Context context, final SharedPreferencesWrapper preferences,
final Menu menu, final ParcelableStatus status, final ParcelableCredentials account) {
final Menu menu, final ParcelableStatus status,
final ParcelableCredentials account, final AsyncTwitterWrapper twitter) {
if (context == null || menu == null || status == null || account == null) return;
final Resources resources = context.getResources();
final int retweetHighlight = ContextCompat.getColor(context, R.color.highlight_retweet);
final int favoriteHighlight = ContextCompat.getColor(context, R.color.highlight_favorite);
final int likeHighlight = ContextCompat.getColor(context, R.color.highlight_like);
final boolean isMyRetweet = isMyRetweet(status);
final boolean isMyRetweet;
if (twitter.isCreatingRetweet(status.account_id, status.id)) {
isMyRetweet = true;
} else if (twitter.isDestroyingStatus(status.account_id, status.id)) {
isMyRetweet = false;
} else {
isMyRetweet = isMyRetweet(status);
}
final MenuItem delete = menu.findItem(R.id.delete);
if (delete != null) {
delete.setVisible(isMyStatus(status));
@ -3351,6 +3362,14 @@ public final class Utils implements Constants {
}
final MenuItem favorite = menu.findItem(R.id.favorite);
if (favorite != null) {
final boolean is_favorite;
if (twitter.isCreatingFavorite(status.account_id, status.id)) {
is_favorite = true;
} else if (twitter.isDestroyingFavorite(status.account_id, status.id)) {
is_favorite = false;
} else {
is_favorite = status.is_favorite;
}
if (preferences.getBoolean(KEY_I_WANT_MY_STARS_BACK)) {
final Drawable oldIcon = favorite.getIcon();
if (oldIcon instanceof ActionIconDrawable) {
@ -3359,11 +3378,11 @@ public final class Utils implements Constants {
} else {
favorite.setIcon(R.drawable.ic_action_star);
}
ActionIconDrawable.setMenuHighlight(favorite, new TwidereMenuInfo(status.is_favorite, favoriteHighlight));
favorite.setTitle(status.is_favorite ? R.string.unfavorite : R.string.favorite);
ActionIconDrawable.setMenuHighlight(favorite, new TwidereMenuInfo(is_favorite, favoriteHighlight));
favorite.setTitle(is_favorite ? R.string.unfavorite : R.string.favorite);
} else {
ActionIconDrawable.setMenuHighlight(favorite, new TwidereMenuInfo(status.is_favorite, likeHighlight));
favorite.setTitle(status.is_favorite ? R.string.undo_like : R.string.like);
ActionIconDrawable.setMenuHighlight(favorite, new TwidereMenuInfo(is_favorite, likeHighlight));
favorite.setTitle(is_favorite ? R.string.undo_like : R.string.like);
}
}
final MenuItem translate = menu.findItem(R.id.translate);
@ -3981,11 +4000,15 @@ public final class Utils implements Constants {
public static void logOpenNotificationFromUri(Context context, Uri uri) {
if (!uri.getBooleanQueryParameter(QUERY_PARAM_FROM_NOTIFICATION, false)) return;
final String type = uri.getQueryParameter(QUERY_PARAM_NOTIFICATION_TYPE);
final long accountId = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), -1);
final long def3 = -1;
final long accountId = NumberUtils.toLong(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_ID), def3);
final long itemId = ParseUtils.parseLong(UriExtraUtils.getExtra(uri, "item_id"), -1);
final long itemUserId = ParseUtils.parseLong(UriExtraUtils.getExtra(uri, "item_user_id"), -1);
final long timestamp = ParseUtils.parseLong(uri.getQueryParameter(QUERY_PARAM_TIMESTAMP), -1);
final long def2 = -1;
final long itemId = NumberUtils.toLong(UriExtraUtils.getExtra(uri, "item_id"), def2);
final long def1 = -1;
final long itemUserId = NumberUtils.toLong(UriExtraUtils.getExtra(uri, "item_user_id"), def1);
final long def = -1;
final long timestamp = NumberUtils.toLong(uri.getQueryParameter(QUERY_PARAM_TIMESTAMP), def);
if (!NotificationEvent.isSupported(type) || accountId < 0 || itemId < 0 || timestamp < 0)
return;
final ApplicationModule module = ApplicationModule.get(context);

View File

@ -0,0 +1,34 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util.message;
import org.mariotaku.twidere.model.ParcelableStatus;
/**
* Created by mariotaku on 14/12/12.
*/
public class StatusItemChangedEvent {
public final ParcelableStatus status;
public StatusItemChangedEvent(ParcelableStatus status) {
this.status = status;
}
}

View File

@ -23,4 +23,5 @@ package org.mariotaku.twidere.util.message;
* Created by mariotaku on 14/12/12.
*/
public class StatusListChangedEvent {
}

View File

@ -572,6 +572,17 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi
return 0;
}
@Override
public long getAccountId(int position) {
return 0;
}
@Nullable
@Override
public ParcelableStatus findStatusById(long accountId, long statusId) {
return null;
}
@Override
public TwidereLinkify getTwidereLinkify() {
return linkify;