From 6752f2d1d8905dcd8ed820c52f1d4448fa470517 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Wed, 25 Nov 2015 10:30:37 +0800 Subject: [PATCH] improved status fav/retweet state - close #250 --- .../mariotaku/twidere/model/ObjectCursor.java | 10 ++ .../twidere/model/ParcelableLocation.java | 5 +- .../twidere/model/ParcelableMedia.java | 6 +- .../org/mariotaku/twidere/util/Nullables.java | 39 ++++++++ .../mariotaku/twidere/util/ParseUtils.java | 61 +----------- .../twidere/util/TwitterContentUtils.java | 4 +- .../activity/TwitterLinkHandlerActivity.java | 5 +- .../activity/support/APIEditorActivity.java | 14 +-- .../activity/support/HomeActivity.java | 4 +- .../support/UserListSelectorActivity.java | 4 +- .../twidere/adapter/AbsActivitiesAdapter.java | 12 ++- .../adapter/AbsParcelableStatusesAdapter.java | 18 ++++ .../twidere/adapter/AbsStatusesAdapter.java | 11 +++ .../adapter/iface/IStatusesAdapter.java | 7 ++ .../support/AbsActivitiesFragment.java | 11 +++ .../fragment/support/AbsStatusesFragment.java | 4 +- .../support/ParcelableActivitiesFragment.java | 3 +- .../fragment/support/StatusFragment.java | 79 +++++++++++++-- .../fragment/support/UserFragment.java | 3 +- .../preference/DefaultAPIPreference.java | 15 +-- .../twidere/provider/TwidereDataProvider.java | 34 ++++--- .../receiver/NotificationReceiver.java | 17 ++-- .../service/BackgroundOperationService.java | 11 ++- .../twidere/service/RefreshService.java | 4 +- .../twidere/util/OnLinkClickHandler.java | 5 +- .../twidere/util/TwidereValidator.java | 3 +- .../twidere/util/TwitterAPIFactory.java | 3 +- .../twidere/util/TwitterCardUtils.java | 5 +- .../twidere/util/UserColorNameManager.java | 7 +- .../org/mariotaku/twidere/util/Utils.java | 97 ++++++++++++------- .../util/message/StatusItemChangedEvent.java | 34 +++++++ .../util/message/StatusListChangedEvent.java | 1 + .../twidere/view/holder/StatusViewHolder.java | 11 +++ 33 files changed, 375 insertions(+), 172 deletions(-) create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/util/Nullables.java create mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/message/StatusItemChangedEvent.java diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java index 9da18ed4a..ece48cc84 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java @@ -74,6 +74,16 @@ public class ObjectCursor extends AbstractList { mCursor.close(); } + public CursorIndices getIndices() { + return mIndices; + } + + public Cursor getCursor(int position) { + ensureCursor(); + mCursor.moveToPosition(position); + return mCursor; + } + public static abstract class CursorIndices { public CursorIndices(@NonNull Cursor cursor) { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableLocation.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableLocation.java index 69d70a99d..7ef709a6c 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableLocation.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableLocation.java @@ -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); } } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java index 3f0337909..5c5764878 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMedia.java @@ -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) { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/Nullables.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/Nullables.java new file mode 100644 index 000000000..34e556a3f --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/Nullables.java @@ -0,0 +1,39 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * 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 . + */ + +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 List list(@Nullable List list) { + if (list == null) return Collections.emptyList(); + return list; + } + +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ParseUtils.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ParseUtils.java index ed20b4f2c..5f2a41096 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ParseUtils.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/ParseUtils.java @@ -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; } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java index 8c4efe428..022b396e3 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java @@ -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); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java index 58810764c..2b96dfe51 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java @@ -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); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java index 4a01d25dd..407bd2dcc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java @@ -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); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java index 083786f21..24b5612b5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java @@ -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)) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java index d88efcbd6..6d47a7a35 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java @@ -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; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java index 80d77dafa..f430b2033 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java @@ -331,12 +331,16 @@ public abstract class AbsActivitiesAdapter 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 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 { diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsParcelableStatusesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsParcelableStatusesAdapter.java index 6e3a879e3..5b76414c0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsParcelableStatusesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsParcelableStatusesAdapter.java @@ -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
  • data) { mData = data; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java index 8fbcc871b..9fba76971 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java @@ -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 extends LoadMoreSupportAdapter extends IContentCardAdapter, IStatusView long getStatusId(int position); + long getAccountId(int position); + + @Nullable + ParcelableStatus findStatusById(long accountId, long statusId); + int getStatusesCount(); TwidereLinkify getTwidereLinkify(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsActivitiesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsActivitiesFragment.java index 958df275a..604f5988d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsActivitiesFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsActivitiesFragment.java @@ -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 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() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java index e759fa460..38ac26e50 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java @@ -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 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; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableActivitiesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableActivitiesFragment.java index 97eb59298..3e8d3477d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableActivitiesFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableActivitiesFragment.java @@ -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(); - } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index c5a2ec294..ef8c6f851 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -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: { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java index 0ecd7626f..eb5bcc075 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java @@ -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; } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java index ed5168111..7539a28e0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java @@ -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; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java index bc973814c..e6734b0e5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java @@ -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 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 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 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 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("_", "^_"); diff --git a/twidere/src/main/java/org/mariotaku/twidere/receiver/NotificationReceiver.java b/twidere/src/main/java/org/mariotaku/twidere/receiver/NotificationReceiver.java index 27a73f124..ed03c0c53 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/receiver/NotificationReceiver.java +++ b/twidere/src/main/java/org/mariotaku/twidere/receiver/NotificationReceiver.java @@ -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); diff --git a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java index 13dc00cd2..2812d7bda 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java +++ b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java @@ -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> result = updateStatus(builder, item); boolean failed = false; diff --git a/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java b/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java index 5a03c1077..165ceea0e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java +++ b/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java @@ -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; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java index a45010c7a..a0c621ffb 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/OnLinkClickHandler.java @@ -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; } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwidereValidator.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereValidator.java index eaadb5116..e0da113f3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwidereValidator.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereValidator.java @@ -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; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java index 9fb231dee..b17671805 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java @@ -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); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterCardUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterCardUtils.java index 3108fc5a8..d999bc801 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterCardUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterCardUtils.java @@ -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); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/UserColorNameManager.java b/twidere/src/main/java/org/mariotaku/twidere/util/UserColorNameManager.java index bbb773747..517e44d86 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/UserColorNameManager.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/UserColorNameManager.java @@ -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)); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index ff8d1831e..24a8f872d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -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 list = new ArrayList<>(); for (final Entry 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); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/message/StatusItemChangedEvent.java b/twidere/src/main/java/org/mariotaku/twidere/util/message/StatusItemChangedEvent.java new file mode 100644 index 000000000..abdda0f4c --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/util/message/StatusItemChangedEvent.java @@ -0,0 +1,34 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * 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 . + */ + +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; + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/message/StatusListChangedEvent.java b/twidere/src/main/java/org/mariotaku/twidere/util/message/StatusListChangedEvent.java index 162cd8f59..136f8c452 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/message/StatusListChangedEvent.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/message/StatusListChangedEvent.java @@ -23,4 +23,5 @@ package org.mariotaku.twidere.util.message; * Created by mariotaku on 14/12/12. */ public class StatusListChangedEvent { + } diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java index 2f1a32cb3..07bda2162 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java @@ -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;