From d247f1921ed1081c3d7cb91974c1160866d12d6e Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Mon, 11 May 2015 18:54:41 +0800 Subject: [PATCH] added automatic bug report --- .../simplerestapi/RestMethodInfo.java | 4 +- twidere/build.gradle | 1 + .../activity/support/HomeActivity.java | 18 +++--- .../twidere/app/TwidereApplication.java | 13 +++++ .../fragment/support/AbsStatusesFragment.java | 15 +++-- .../fragment/support/StatusFragment.java | 15 ++--- .../support/ActivitiesAboutMeLoader.java | 2 +- .../support/ActivitiesByFriendsLoader.java | 2 +- .../support/BaseCursorSupportUsersLoader.java | 2 +- .../support/ParcelableStatusesLoader.java | 2 + ...r.java => TwitterAPIActivitiesLoader.java} | 19 +++---- .../support/TwitterAPIStatusesLoader.java | 26 ++++----- ...Loader.java => TwitterAPIUsersLoader.java} | 4 +- .../loader/support/UserSearchLoader.java | 2 +- .../preference/ThemePreviewPreference.java | 1 - .../twidere/util/DataImportExportUtils.java | 3 +- .../util/LoganSquareWrapper.java} | 20 +++++-- .../twidere/util/TwitterAPIUtils.java | 1 - .../twidere/view/TabPagerIndicator.java | 3 - .../layout/card_item_user_list_compact.xml | 57 +++++++++---------- .../src/main/res/layout/layout_tab_item.xml | 2 +- twidere/src/main/res/values/strings.xml | 2 + .../src/main/res/xml/preferences_cards.xml | 2 + 23 files changed, 119 insertions(+), 97 deletions(-) rename twidere/src/main/java/org/mariotaku/twidere/loader/support/{Twitter4JActivitiesLoader.java => TwitterAPIActivitiesLoader.java} (90%) rename twidere/src/main/java/org/mariotaku/twidere/loader/support/{Twitter4JUsersLoader.java => TwitterAPIUsersLoader.java} (91%) rename twidere/src/main/java/org/mariotaku/{jsonserializer/JSONFileIO.java => twidere/util/LoganSquareWrapper.java} (75%) diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java index 5aa7e1a58..3f95f5654 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java +++ b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java @@ -3,6 +3,7 @@ package org.mariotaku.simplerestapi; import android.support.annotation.NonNull; import android.util.Pair; +import org.apache.commons.lang3.NotImplementedException; import org.mariotaku.simplerestapi.http.ValueMap; import org.mariotaku.simplerestapi.http.mime.BaseTypedData; import org.mariotaku.simplerestapi.http.mime.FormTypedBody; @@ -280,7 +281,7 @@ public final class RestMethodInfo { private static void checkMethod(RestMethod restMethod, Body body, HashMap forms, HashMap parts, FileValue file) { if (restMethod == null) - throw new NullPointerException("Method must has annotation annotated with @RestMethod"); + throw new NotImplementedException("Method must has annotation annotated with @RestMethod"); if (!restMethod.hasBody() && body != null) { throw new IllegalArgumentException(restMethod.value() + " does not allow body"); } @@ -363,7 +364,6 @@ public final class RestMethodInfo { } - public List> getQueries() { return queries; } diff --git a/twidere/build.gradle b/twidere/build.gradle index 66eb70bd6..6543bbdaf 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -94,6 +94,7 @@ dependencies { compile 'com.squareup:pollexor:2.0.2' compile 'org.apache.commons:commons-lang3:3.4' compile 'com.bluelinelabs:logansquare:1.0.6' + compile 'ch.acra:acra:4.6.2' googleCompile 'com.google.android.gms:play-services-maps:7.0.0' googleCompile 'com.google.maps.android:android-maps-utils:0.3.4' fdroidCompile 'org.osmdroid:osmdroid-android:4.3' 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 8927a61b7..042cb075d 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 @@ -164,7 +164,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen private UpdateUnreadCountTask mUpdateUnreadCountTask; - private int mTabDisplayOption; private Toolbar mActionBar; private OnSharedPreferenceChangeListener mReadStateChangeListener = new OnSharedPreferenceChangeListener() { @@ -360,7 +359,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen setSupportActionBar(mActionBar); sendBroadcast(new Intent(BROADCAST_HOME_ACTIVITY_ONCREATE)); final boolean refreshOnStart = mPreferences.getBoolean(KEY_REFRESH_ON_START, false); - mTabDisplayOption = getTabDisplayOptionInt(this); + int tabDisplayOptionInt = getTabDisplayOptionInt(this); mTabColumns = getResources().getInteger(R.integer.default_tab_columns); @@ -371,12 +370,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen mTabIndicator.setViewPager(mViewPager); mTabIndicator.setOnPageChangeListener(this); mTabIndicator.setColumns(mTabColumns); - if (mTabDisplayOption != 0) { - mTabIndicator.setTabDisplayOption(mTabDisplayOption); - } else { - mTabIndicator.setTabDisplayOption(TabPagerIndicator.ICON); + if (tabDisplayOptionInt == 0) { + tabDisplayOptionInt = TabPagerIndicator.ICON; } + mTabIndicator.setTabDisplayOption(tabDisplayOptionInt); + mTabIndicator.setTabExpandEnabled((tabDisplayOptionInt & TabPagerIndicator.LABEL) == 0); mTabIndicator.setDisplayBadge(mPreferences.getBoolean(KEY_UNREAD_COUNT, true)); + mTabIndicator.updateAppearance(); + mActionsButton.setOnClickListener(this); mActionsButton.setOnLongClickListener(this); mEmptyTabHint.setOnClickListener(this); @@ -438,9 +439,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen resolver.registerContentObserver(Accounts.CONTENT_URI, true, mAccountChangeObserver); final Bus bus = TwidereApplication.getInstance(this).getMessageBus(); bus.register(this); - if (getTabDisplayOptionInt(this) != mTabDisplayOption) { - restart(); - } // UCD ProfilingUtil.profile(this, ProfilingUtil.FILE_NAME_APP, "App onStart"); // spice @@ -876,6 +874,8 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen ThemeUtils.applyWindowBackground(this, mSlidingMenu.getContent(), getCurrentThemeResourceId(), getThemeBackgroundOption(), getCurrentThemeBackgroundAlpha()); window.setBackgroundDrawable(new EmptyDrawable()); + + mSlidingMenu.addIgnoredView(mActionBarContainer); } private void showDataProfilingRequest() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java index f72fe6583..58f7d69ea 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -43,6 +43,9 @@ import com.nostra13.universalimageloader.utils.L; import com.squareup.okhttp.internal.Network; import com.squareup.otto.Bus; +import org.acra.ACRA; +import org.acra.annotation.ReportsCrashes; +import org.acra.sender.HttpSender; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.activity.AssistLauncherActivity; import org.mariotaku.twidere.activity.MainActivity; @@ -75,6 +78,11 @@ import static org.mariotaku.twidere.util.Utils.initAccountColor; import static org.mariotaku.twidere.util.Utils.startRefreshServiceIfNeeded; import static org.mariotaku.twidere.util.Utils.startUsageStatisticsServiceIfNeeded; +@ReportsCrashes(formUri = "https://mariotaku.cloudant.com/acra-twidere/_design/acra-storage/_update/report", + reportType = HttpSender.Type.JSON, + httpMethod = HttpSender.Method.PUT, + formUriBasicAuthLogin = "membeentlyposedistderryb", + formUriBasicAuthPassword = "oYETEB0KXUThmyXketa8V4XY") public class TwidereApplication extends MultiDexApplication implements Constants, OnSharedPreferenceChangeListener { @@ -223,6 +231,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants StrictModeUtils.detectAllVmPolicy(); } super.onCreate(); + initBugReport(); mDefaultUserAgent = UserAgentUtils.getDefaultUserAgentString(this); mHandler = new Handler(); mMessageBus = new Bus(); @@ -255,6 +264,10 @@ public class TwidereApplication extends MultiDexApplication implements Constants reloadConnectivitySettings(); } + private void initBugReport() { + ACRA.init(this); + } + private void migrateUsageStatisticsPreferences() { final SharedPreferences preferences = getSharedPreferences(); final boolean hasUsageStatistics = preferences.contains(KEY_USAGE_STATISTICS); 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 15f461a6f..64be3e128 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 @@ -164,15 +164,15 @@ public abstract class AbsStatusesFragment extends AbsContentRecyclerViewFr final long lastReadId; final int lastVisiblePos, lastVisibleTop; final String tag = getCurrentReadPositionTag(); - final LinearLayoutManager mLayoutManager = getLayoutManager(); + final LinearLayoutManager layoutManager = getLayoutManager(); if (readFromBottom) { - lastVisiblePos = mLayoutManager.findLastVisibleItemPosition(); + lastVisiblePos = layoutManager.findLastVisibleItemPosition(); } else { - lastVisiblePos = mLayoutManager.findFirstVisibleItemPosition(); + lastVisiblePos = layoutManager.findFirstVisibleItemPosition(); } if (lastVisiblePos != RecyclerView.NO_POSITION) { lastReadId = adapter.getStatusId(lastVisiblePos); - final View positionView = mLayoutManager.findViewByPosition(lastVisiblePos); + final View positionView = layoutManager.findViewByPosition(lastVisiblePos); lastVisibleTop = positionView != null ? positionView.getTop() : 0; } else if (rememberPosition && tag != null) { lastReadId = mReadStateManager.getPosition(tag); @@ -193,7 +193,12 @@ public abstract class AbsStatusesFragment extends AbsContentRecyclerViewFr } } if (pos != -1 && adapter.isStatus(pos) && (readFromBottom || lastVisiblePos != 0)) { - mLayoutManager.scrollToPositionWithOffset(pos, lastVisibleTop); + if (layoutManager.getHeight() == 0) { + // RecyclerView has not currently laid out, ignore padding. + layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop); + } else { + layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop - layoutManager.getPaddingTop()); + } } } if (loader instanceof IExtendedLoader) { 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 a9a953ef8..ff1580cd9 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 @@ -73,6 +73,9 @@ import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.adapter.AbsStatusesAdapter.StatusAdapterListener; import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration; import org.mariotaku.twidere.adapter.iface.IStatusesAdapter; +import org.mariotaku.twidere.api.twitter.Twitter; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.constant.IntentConstants; import org.mariotaku.twidere.loader.support.ParcelableStatusLoader; @@ -121,9 +124,6 @@ import java.util.Locale; import edu.tsinghua.spice.Utilies.SpiceProfilingUtil; import edu.tsinghua.spice.Utilies.TypeMappingUtil; -import org.mariotaku.twidere.api.twitter.model.Paging; -import org.mariotaku.twidere.api.twitter.Twitter; -import org.mariotaku.twidere.api.twitter.TwitterException; /** * Created by mariotaku on 14/12/5. @@ -161,6 +161,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac private LoaderCallbacks> mRepliesLoaderCallback = new LoaderCallbacks>() { @Override public Loader> onCreateLoader(int id, Bundle args) { + mStatusAdapter.updateItemDecoration(); final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1); final String screenName = args.getString(EXTRA_SCREEN_NAME); final long statusId = args.getLong(EXTRA_STATUS_ID, -1); @@ -170,12 +171,12 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac final StatusRepliesLoader loader = new StatusRepliesLoader(getActivity(), accountId, screenName, statusId, maxId, sinceId, null, null, 0, true); loader.setComparator(ParcelableStatus.REVERSE_ID_COMPARATOR); - return loader; } @Override public void onLoadFinished(Loader> loader, List data) { + mStatusAdapter.updateItemDecoration(); final Pair readPosition = saveReadPosition(); setReplies(data); restoreReadPosition(readPosition); @@ -1525,10 +1526,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac if (mRecyclerView == null) return; final DividerItemDecoration decoration = mFragment.getItemDecoration(); decoration.setDecorationStart(0); - if (isLoadMoreIndicatorVisible()) { - decoration.setDecorationEndOffset(3); + if (mReplies == null) { + decoration.setDecorationEndOffset(2); } else { - decoration.setDecorationEndOffset(mReplies != null && mReplies.size() > 0 ? 1 : 2); + decoration.setDecorationEndOffset(1); } mRecyclerView.invalidateItemDecorations(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesAboutMeLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesAboutMeLoader.java index fc2130c97..b1c1d9762 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesAboutMeLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesAboutMeLoader.java @@ -31,7 +31,7 @@ import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; -public class ActivitiesAboutMeLoader extends Twitter4JActivitiesLoader { +public class ActivitiesAboutMeLoader extends TwitterAPIActivitiesLoader { public ActivitiesAboutMeLoader(final Context context, final long accountId, long sinceId, long maxId, final List data, diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesByFriendsLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesByFriendsLoader.java index d0082dc4b..74c5482c3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesByFriendsLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ActivitiesByFriendsLoader.java @@ -31,7 +31,7 @@ import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; -public class ActivitiesByFriendsLoader extends Twitter4JActivitiesLoader { +public class ActivitiesByFriendsLoader extends TwitterAPIActivitiesLoader { public ActivitiesByFriendsLoader(final Context context, final long accountId, long sinceId, diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseCursorSupportUsersLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseCursorSupportUsersLoader.java index 8f802f9e7..44c1ad2b1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseCursorSupportUsersLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseCursorSupportUsersLoader.java @@ -29,7 +29,7 @@ import java.util.List; import org.mariotaku.twidere.api.twitter.model.CursorSupport; -public abstract class BaseCursorSupportUsersLoader extends Twitter4JUsersLoader +public abstract class BaseCursorSupportUsersLoader extends TwitterAPIUsersLoader implements ICursorSupportLoader { private final long mCursor; diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusesLoader.java index abbecde73..f7123e877 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusesLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusesLoader.java @@ -20,6 +20,7 @@ package org.mariotaku.twidere.loader.support; import android.content.Context; +import android.support.annotation.Nullable; import android.support.v4.content.AsyncTaskLoader; import org.mariotaku.twidere.Constants; @@ -77,6 +78,7 @@ public abstract class ParcelableStatusesLoader extends AsyncTaskLoader getData() { return mData; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JActivitiesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIActivitiesLoader.java similarity index 90% rename from twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JActivitiesLoader.java rename to twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIActivitiesLoader.java index 7c4cb49b5..9e8def605 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JActivitiesLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIActivitiesLoader.java @@ -27,17 +27,16 @@ import android.util.Pair; import com.bluelinelabs.logansquare.LoganSquare; -import org.mariotaku.jsonserializer.JSONFileIO; import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Activity; import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.model.ParcelableActivity; +import org.mariotaku.twidere.util.LoganSquareWrapper; import org.mariotaku.twidere.util.TwitterAPIUtils; import org.mariotaku.twidere.util.Utils; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -48,7 +47,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import static org.mariotaku.twidere.util.Utils.truncateActivities; -public abstract class Twitter4JActivitiesLoader extends ParcelableActivitiesLoader { +public abstract class TwitterAPIActivitiesLoader extends ParcelableActivitiesLoader { private final Context mContext; private final long mAccountIds; @@ -56,9 +55,9 @@ public abstract class Twitter4JActivitiesLoader extends ParcelableActivitiesLoad private final Object[] mSavedStatusesFileArgs; private Comparator mComparator; - public Twitter4JActivitiesLoader(final Context context, final long accountId, final long sinceId, - final long maxId, final List data, final String[] savedStatusesArgs, - final int tabPosition) { + public TwitterAPIActivitiesLoader(final Context context, final long accountId, final long sinceId, + final long maxId, final List data, final String[] savedStatusesArgs, + final int tabPosition) { super(context, data, tabPosition); mContext = context; mAccountIds = accountId; @@ -151,10 +150,8 @@ public abstract class Twitter4JActivitiesLoader extends ParcelableActivitiesLoad private List getCachedData(final File file) { if (file == null) return null; - FileInputStream is = null; try { - is = new FileInputStream(file); - return LoganSquare.parseList(is, ParcelableActivity.class); + return LoganSquareWrapper.parseList(file, ParcelableActivity.class); } catch (final IOException e) { if (Utils.isDebugBuild()) { Log.w(LOGTAG, e); @@ -164,8 +161,6 @@ public abstract class Twitter4JActivitiesLoader extends ParcelableActivitiesLoad throw e; } Log.e(LOGTAG, "Error unserializing data", e); - } finally { - Utils.closeSilently(is); } return null; } @@ -173,7 +168,7 @@ public abstract class Twitter4JActivitiesLoader extends ParcelableActivitiesLoad private File getSerializationFile() { if (mSavedStatusesFileArgs == null) return null; try { - return JSONFileIO.getSerializationFile(mContext, mSavedStatusesFileArgs); + return LoganSquareWrapper.getSerializationFile(mContext, mSavedStatusesFileArgs); } catch (final IOException e) { e.printStackTrace(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java index 9188cbad4..efc38fd0a 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java @@ -29,13 +29,16 @@ import android.util.Log; import com.bluelinelabs.logansquare.LoganSquare; import org.apache.commons.lang3.ArrayUtils; -import org.mariotaku.jsonserializer.JSONFileIO; +import org.mariotaku.twidere.api.twitter.Twitter; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.model.Paging; +import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableStatus; +import org.mariotaku.twidere.util.LoganSquareWrapper; import org.mariotaku.twidere.util.TwitterAPIUtils; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -44,12 +47,6 @@ import java.util.Comparator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import org.mariotaku.twidere.api.twitter.model.Paging; -import org.mariotaku.twidere.api.twitter.model.Status; -import org.mariotaku.twidere.api.twitter.Twitter; -import org.mariotaku.twidere.api.twitter.TwitterException; - -import static org.mariotaku.twidere.util.TwitterAPIUtils.getTwitterInstance; import static org.mariotaku.twidere.util.Utils.truncateStatuses; public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader { @@ -75,7 +72,10 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader @Override public final List loadInBackground() { final File serializationFile = getSerializationFile(); - final List data = getData(); + List data = getData(); + if (data == null) { + data = new CopyOnWriteArrayList<>(); + } if (isFirstLoad() && getTabPosition() >= 0 && serializationFile != null) { final List cached = getCachedData(serializationFile); if (cached != null) { @@ -96,7 +96,7 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader final Context context = getContext(); final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); final int loadItemLimit = prefs.getInt(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT); - final boolean noItemsBefore = data == null || data.isEmpty(); + final boolean noItemsBefore = data.isEmpty(); try { final Paging paging = new Paging(); paging.setCount(loadItemLimit); @@ -181,9 +181,9 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader private List getCachedData(final File file) { if (file == null) return null; try { - return LoganSquare.parseList(new FileInputStream(file), ParcelableStatus.class); + return LoganSquareWrapper.parseList(file, ParcelableStatus.class); } catch (final IOException e) { - e.printStackTrace(); + Log.w(LOGTAG, e); } return null; } @@ -191,7 +191,7 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader private File getSerializationFile() { if (mSavedStatusesFileArgs == null) return null; try { - return JSONFileIO.getSerializationFile(mContext, mSavedStatusesFileArgs); + return LoganSquareWrapper.getSerializationFile(mContext, mSavedStatusesFileArgs); } catch (final IOException e) { e.printStackTrace(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JUsersLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIUsersLoader.java similarity index 91% rename from twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JUsersLoader.java rename to twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIUsersLoader.java index efcb87013..027589ecd 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JUsersLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIUsersLoader.java @@ -33,13 +33,13 @@ import org.mariotaku.twidere.api.twitter.model.User; import static org.mariotaku.twidere.util.TwitterAPIUtils.getTwitterInstance; -public abstract class Twitter4JUsersLoader extends ParcelableUsersLoader { +public abstract class TwitterAPIUsersLoader extends ParcelableUsersLoader { private final long mAccountId; private final Context mContext; - public Twitter4JUsersLoader(final Context context, final long accountId, final List data, boolean fromUser) { + public TwitterAPIUsersLoader(final Context context, final long accountId, final List data, boolean fromUser) { super(context, data, fromUser); mContext = context; mAccountId = accountId; diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/UserSearchLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/UserSearchLoader.java index 8972709ac..1f4783a55 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/UserSearchLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/UserSearchLoader.java @@ -30,7 +30,7 @@ import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.User; -public class UserSearchLoader extends Twitter4JUsersLoader { +public class UserSearchLoader extends TwitterAPIUsersLoader { private final String mQuery; private final int mPage; diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/ThemePreviewPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/ThemePreviewPreference.java index 2a5c91539..9d15ea2d7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/ThemePreviewPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/ThemePreviewPreference.java @@ -120,7 +120,6 @@ public class ThemePreviewPreference extends Preference implements Constants, OnS cardView.setCardBackgroundColor(cardBackgroundColor); actionBarView.setTitle(R.string.app_name); -// actionBarView.setTitleTextColor(ThemeUtils.getContrastActionBarTitleColor(context, themeId, accentColor)); menuBar.setEnabled(false); final MenuInflater inflater = new SupportMenuInflater(context); inflater.inflate(R.menu.menu_status, menuBar.getMenu()); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/DataImportExportUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/DataImportExportUtils.java index 7dad3eba8..6f1037c6e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/DataImportExportUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/DataImportExportUtils.java @@ -26,7 +26,6 @@ import android.util.Log; import org.json.JSONException; import org.json.JSONObject; -import org.mariotaku.jsonserializer.JSONFileIO; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.annotation.Preference; import org.mariotaku.twidere.constant.SharedPreferenceConstants; @@ -159,7 +158,7 @@ public class DataImportExportUtils implements Constants { @NonNull final ProcessStrategy strategy) throws IOException { final ZipEntry entry = zipFile.getEntry(entryName); if (entry == null) return; - final JSONObject json = JSONFileIO.convertJSONObject(zipFile.getInputStream(entry)); + final JSONObject json = LoganSquareWrapper.convertJSONObject(zipFile.getInputStream(entry)); final Iterator keys = json.keys(); final SharedPreferences preferences = context.getSharedPreferences(preferencesName, Context.MODE_PRIVATE); final SharedPreferences.Editor editor = preferences.edit(); diff --git a/twidere/src/main/java/org/mariotaku/jsonserializer/JSONFileIO.java b/twidere/src/main/java/org/mariotaku/twidere/util/LoganSquareWrapper.java similarity index 75% rename from twidere/src/main/java/org/mariotaku/jsonserializer/JSONFileIO.java rename to twidere/src/main/java/org/mariotaku/twidere/util/LoganSquareWrapper.java index b23a2a8b4..57897e470 100644 --- a/twidere/src/main/java/org/mariotaku/jsonserializer/JSONFileIO.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/LoganSquareWrapper.java @@ -1,21 +1,23 @@ -package org.mariotaku.jsonserializer; +package org.mariotaku.twidere.util; import android.content.Context; +import com.bluelinelabs.logansquare.LoganSquare; + import org.json.JSONException; import org.json.JSONObject; -import org.mariotaku.twidere.util.TwidereArrayUtils; -import org.mariotaku.twidere.util.Utils; import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; +import java.util.List; -public class JSONFileIO { +public class LoganSquareWrapper extends LoganSquare { public static final String JSON_CACHE_DIR = "json_cache"; @@ -28,6 +30,16 @@ public class JSONFileIO { } } + public static List parseList(File file, Class jsonObjectClass) throws IOException { + final FileInputStream is = new FileInputStream(file); + //noinspection TryFinallyCanBeTryWithResources + try { + return LoganSquare.parseList(is, jsonObjectClass); + } finally { + is.close(); + } + } + public static String convertString(final InputStream stream) throws IOException { if (stream == null) throw new FileNotFoundException(); final BufferedReader reader = new BufferedReader(new InputStreamReader(stream, Charset.defaultCharset())); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java index 44a9fb92c..f01681464 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java @@ -11,7 +11,6 @@ import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.internal.Internal; import org.mariotaku.simplerestapi.RestAPIFactory; -import org.mariotaku.simplerestapi.RestMethod; import org.mariotaku.simplerestapi.RestMethodInfo; import org.mariotaku.simplerestapi.http.Authorization; import org.mariotaku.simplerestapi.http.Endpoint; diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/TabPagerIndicator.java b/twidere/src/main/java/org/mariotaku/twidere/view/TabPagerIndicator.java index a4214d2a5..a80b5013e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/TabPagerIndicator.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/TabPagerIndicator.java @@ -170,7 +170,6 @@ public class TabPagerIndicator extends RecyclerView implements PagerIndicator, C @DisplayOption public void setTabDisplayOption(int flags) { mOption = flags; - notifyDataSetChanged(); } private void dispatchTabClick(int position) { @@ -249,7 +248,6 @@ public class TabPagerIndicator extends RecyclerView implements PagerIndicator, C private void setHorizontalPadding(int padding) { mHorizontalPadding = padding; - notifyDataSetChanged(); } private void setTabShowDivider(boolean showDivider) { @@ -262,7 +260,6 @@ public class TabPagerIndicator extends RecyclerView implements PagerIndicator, C private void setVerticalPadding(int padding) { mVerticalPadding = padding; - notifyDataSetChanged(); } @IntDef({ICON, LABEL, BOTH}) diff --git a/twidere/src/main/res/layout/card_item_user_list_compact.xml b/twidere/src/main/res/layout/card_item_user_list_compact.xml index 3ec36d023..5d94b349e 100644 --- a/twidere/src/main/res/layout/card_item_user_list_compact.xml +++ b/twidere/src/main/res/layout/card_item_user_list_compact.xml @@ -52,53 +52,48 @@ android:contentDescription="@string/profile_image" android:scaleType="fitCenter" /> - + android:layout_toRightOf="@id/profile_image" + android:gravity="center_vertical" + android:orientation="vertical"> - + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorPrimary" + android:textStyle="bold" + tools:text="List" /> - - - - - + + diff --git a/twidere/src/main/res/layout/layout_tab_item.xml b/twidere/src/main/res/layout/layout_tab_item.xml index f0e40594d..0a28c0d52 100644 --- a/twidere/src/main/res/layout/layout_tab_item.xml +++ b/twidere/src/main/res/layout/layout_tab_item.xml @@ -21,7 +21,7 @@ diff --git a/twidere/src/main/res/values/strings.xml b/twidere/src/main/res/values/strings.xml index 16be258aa..e24e692d3 100644 --- a/twidere/src/main/res/values/strings.xml +++ b/twidere/src/main/res/values/strings.xml @@ -744,4 +744,6 @@ Must start with a letter and can consist only letters, numbers, \"-\", or \"_\". Delete conversation Delete all messages of this conversation? + Display name first + Display @screenname first \ No newline at end of file diff --git a/twidere/src/main/res/xml/preferences_cards.xml b/twidere/src/main/res/xml/preferences_cards.xml index 081f0bd63..9d772fd49 100644 --- a/twidere/src/main/res/xml/preferences_cards.xml +++ b/twidere/src/main/res/xml/preferences_cards.xml @@ -13,6 +13,8 @@ android:defaultValue="true" android:key="name_first" android:order="22" + android:summaryOff="@string/name_first_summary_off" + android:summaryOn="@string/name_first_summary_on" android:title="@string/name_first">