added automatic bug report

This commit is contained in:
Mariotaku Lee 2015-05-11 18:54:41 +08:00
parent d672aa89e5
commit d247f1921e
23 changed files with 119 additions and 97 deletions

View File

@ -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<Form, Object> forms, HashMap<Part, Object> 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<Pair<String, String>> getQueries() {
return queries;
}

View File

@ -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'

View File

@ -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() {

View File

@ -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);

View File

@ -164,15 +164,15 @@ public abstract class AbsStatusesFragment<Data> 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<Data> 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) {

View File

@ -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<List<ParcelableStatus>> mRepliesLoaderCallback = new LoaderCallbacks<List<ParcelableStatus>>() {
@Override
public Loader<List<ParcelableStatus>> 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<List<ParcelableStatus>> loader, List<ParcelableStatus> data) {
mStatusAdapter.updateItemDecoration();
final Pair<Long, Integer> 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();
}

View File

@ -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<ParcelableActivity> data,

View File

@ -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,

View File

@ -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;

View File

@ -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<List<Parc
return result;
}
@Nullable
protected List<ParcelableStatus> getData() {
return mData;
}

View File

@ -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<ParcelableActivity> mComparator;
public Twitter4JActivitiesLoader(final Context context, final long accountId, final long sinceId,
final long maxId, final List<ParcelableActivity> data, final String[] savedStatusesArgs,
final int tabPosition) {
public TwitterAPIActivitiesLoader(final Context context, final long accountId, final long sinceId,
final long maxId, final List<ParcelableActivity> 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<ParcelableActivity> 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();
}

View File

@ -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<ParcelableStatus> loadInBackground() {
final File serializationFile = getSerializationFile();
final List<ParcelableStatus> data = getData();
List<ParcelableStatus> data = getData();
if (data == null) {
data = new CopyOnWriteArrayList<>();
}
if (isFirstLoad() && getTabPosition() >= 0 && serializationFile != null) {
final List<ParcelableStatus> 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<ParcelableStatus> 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();
}

View File

@ -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<ParcelableUser> data, boolean fromUser) {
public TwitterAPIUsersLoader(final Context context, final long accountId, final List<ParcelableUser> data, boolean fromUser) {
super(context, data, fromUser);
mContext = context;
mAccountId = accountId;

View File

@ -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;

View File

@ -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());

View File

@ -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<String> keys = json.keys();
final SharedPreferences preferences = context.getSharedPreferences(preferencesName, Context.MODE_PRIVATE);
final SharedPreferences.Editor editor = preferences.edit();

View File

@ -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 <E> List<E> parseList(File file, Class<E> 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()));

View File

@ -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;

View File

@ -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})

View File

@ -52,53 +52,48 @@
android:contentDescription="@string/profile_image"
android:scaleType="fitCenter" />
<FrameLayout
android:id="@+id/name_frame"
<LinearLayout
android:id="@+id/name_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true"
android:layout_gravity="start|center_vertical"
android:layout_toEndOf="@id/profile_image"
android:layout_toRightOf="@id/profile_image">
android:layout_toRightOf="@id/profile_image"
android:gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:gravity="center_vertical"
android:orientation="horizontal">
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"
tools:text="List" />
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold" />
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/created_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />
</LinearLayout>
</FrameLayout>
<org.mariotaku.twidere.view.HandleSpanClickTextView
android:id="@+id/created_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
tools:text="Created by user" />
</LinearLayout>
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/name_frame"
android:layout_alignStart="@id/name_frame"
android:layout_below="@id/name_frame"
android:layout_alignLeft="@id/name_container"
android:layout_alignStart="@id/name_container"
android:layout_below="@id/name_container"
android:paddingTop="@dimen/element_spacing_small"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />

View File

@ -21,7 +21,7 @@
<view xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
class="org.mariotaku.twidere.view.TabPagerIndicator$ItemLayout"
android:layout_width="0dp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?selectableItemBackground"
tools:layout_height="?actionBarSize">

View File

@ -744,4 +744,6 @@
<string name="invalid_list_name">Must start with a letter and can consist only letters, numbers, \"-\", or \"_\".</string>
<string name="delete_conversation">Delete conversation</string>
<string name="delete_conversation_confirm_message">Delete all messages of this conversation?</string>
<string name="name_first_summary_on">Display name first</string>
<string name="name_first_summary_off">Display @screenname first</string>
</resources>

View File

@ -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">
<extra
android:name="notify_change"