parent
933232e3f4
commit
28f68e2ff3
|
@ -290,6 +290,7 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
|
|||
@JsonField(name = "extras")
|
||||
@CursorField(value = Statuses.EXTRAS, converter = LoganSquareCursorFieldConverter.class)
|
||||
public Extras extras;
|
||||
public transient boolean is_filtered;
|
||||
|
||||
@CursorField(value = Statuses._ID, excludeWrite = true)
|
||||
long _id;
|
||||
|
|
|
@ -87,8 +87,8 @@ dependencies {
|
|||
compile 'com.android.support:recyclerview-v7:23.2.1'
|
||||
compile 'com.android.support:preference-v7:23.2.1'
|
||||
compile 'com.android.support:preference-v14:23.2.1'
|
||||
compile('com.github.afollestad:app-theme-engine:1.0.1@aar') { transitive = true }
|
||||
compile('com.github.afollestad.material-dialogs:commons:0.8.5.7@aar') { transitive = true }
|
||||
compile('com.github.afollestad.app-theme-engine:library:1.0.2-SNAPSHOT@aar') { transitive = true }
|
||||
compile('com.github.afollestad.material-dialogs:commons:0.8.5.8-SNAPSHOT@aar') { transitive = true }
|
||||
compile 'com.twitter:twitter-text:1.13.0'
|
||||
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
|
||||
compile 'com.squareup:otto:1.3.8'
|
||||
|
|
|
@ -334,7 +334,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
|||
|
||||
setSupportActionBar(mActionBar);
|
||||
|
||||
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
|
||||
ThemeUtils.setCompatContentViewOverlay(getWindow(), new EmptyDrawable());
|
||||
|
||||
final boolean refreshOnStart = mPreferences.getBoolean(KEY_REFRESH_ON_START, false);
|
||||
int tabDisplayOptionInt = Utils.getTabDisplayOptionInt(this);
|
||||
|
|
|
@ -190,7 +190,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
|
|||
mFinishOnly = Boolean.parseBoolean(uri.getQueryParameter(QUERY_PARAM_FINISH_ONLY));
|
||||
|
||||
if (fragment instanceof IToolBarSupportFragment) {
|
||||
ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable());
|
||||
ThemeUtils.setCompatContentViewOverlay(getWindow(), new EmptyDrawable());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,12 +19,15 @@
|
|||
|
||||
package org.mariotaku.twidere.activity;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.app.AppCompatDelegate;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
|
||||
|
@ -39,6 +42,9 @@ import org.mariotaku.twidere.util.ThemeUtils;
|
|||
import org.mariotaku.twidere.util.Utils;
|
||||
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public abstract class ThemedAppCompatActivity extends ATEActivity implements Constants,
|
||||
IThemedActivity, IAppCompatActivity {
|
||||
|
||||
|
@ -117,4 +123,51 @@ public abstract class ThemedAppCompatActivity extends ATEActivity implements Con
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
private static final String[] sClassPrefixList = {
|
||||
"android.widget.",
|
||||
"android.view.",
|
||||
"android.webkit."
|
||||
};
|
||||
|
||||
@Override
|
||||
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
|
||||
// Fix for https://github.com/afollestad/app-theme-engine/issues/109
|
||||
if (context != this) {
|
||||
final AppCompatDelegate delegate = getDelegate();
|
||||
View view = delegate.createView(parent, name, context, attrs);
|
||||
if (view == null) {
|
||||
view = newInstance(name, context, attrs);
|
||||
}
|
||||
if (view == null) {
|
||||
for (String prefix : sClassPrefixList) {
|
||||
view = newInstance(prefix + name, context, attrs);
|
||||
if (view != null) break;
|
||||
}
|
||||
}
|
||||
if (view != null) {
|
||||
return view;
|
||||
}
|
||||
}
|
||||
return super.onCreateView(parent, name, context, attrs);
|
||||
}
|
||||
|
||||
private View newInstance(String name, Context context, AttributeSet attrs) {
|
||||
try {
|
||||
final Class<?> cls = Class.forName(name);
|
||||
final Constructor<?> constructor = cls.getConstructor(Context.class, AttributeSet.class);
|
||||
return (View) constructor.newInstance(context, attrs);
|
||||
} catch (InstantiationException e) {
|
||||
return null;
|
||||
} catch (IllegalAccessException e) {
|
||||
return null;
|
||||
} catch (InvocationTargetException e) {
|
||||
return null;
|
||||
} catch (NoSuchMethodException e) {
|
||||
return null;
|
||||
} catch (ClassNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -176,6 +176,11 @@ public final class DummyStatusHolderAdapter implements IStatusesAdapter<Object>,
|
|||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRawStatusCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getStatusId(int position) {
|
||||
|
|
|
@ -50,6 +50,7 @@ import org.mariotaku.twidere.util.OnLinkClickHandler;
|
|||
import org.mariotaku.twidere.util.ThemeUtils;
|
||||
import org.mariotaku.twidere.util.TwidereLinkify;
|
||||
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.EmptyViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.GapViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.StatusViewHolder;
|
||||
|
@ -447,19 +448,13 @@ public class ParcelableActivitiesAdapter extends LoadMoreSupportAdapter<Recycler
|
|||
}
|
||||
}
|
||||
|
||||
static class EmptyViewHolder extends RecyclerView.ViewHolder {
|
||||
public EmptyViewHolder(View view) {
|
||||
super(view);
|
||||
}
|
||||
}
|
||||
|
||||
static class EventListener implements IStatusViewHolder.StatusClickListener, GapClickListener,
|
||||
ActivityEventListener {
|
||||
|
||||
final WeakReference<ParcelableActivitiesAdapter> adapterRef;
|
||||
|
||||
EventListener(ParcelableActivitiesAdapter adapter) {
|
||||
adapterRef = new WeakReference<ParcelableActivitiesAdapter>(adapter);
|
||||
adapterRef = new WeakReference<>(adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -23,6 +23,7 @@ import android.content.Context;
|
|||
import android.database.Cursor;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.widget.Space;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -43,6 +44,7 @@ import org.mariotaku.twidere.util.TwidereLinkify;
|
|||
import org.mariotaku.twidere.util.Utils;
|
||||
import org.mariotaku.twidere.view.CardMediaContainer;
|
||||
import org.mariotaku.twidere.view.ShapedImageView;
|
||||
import org.mariotaku.twidere.view.holder.EmptyViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.GapViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder;
|
||||
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
|
||||
|
@ -56,6 +58,7 @@ import java.util.List;
|
|||
public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<RecyclerView.ViewHolder>
|
||||
implements Constants, IStatusesAdapter<List<ParcelableStatus>> {
|
||||
public static final int ITEM_VIEW_TYPE_STATUS = 2;
|
||||
public static final int ITEM_VIEW_TYPE_EMPTY = 3;
|
||||
private final LayoutInflater mInflater;
|
||||
private final MediaLoadingHandler mLoadingHandler;
|
||||
private final TwidereLinkify mLinkify;
|
||||
|
@ -82,6 +85,7 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
|
|||
private boolean mShowAccountsColor;
|
||||
private List<ParcelableStatus> mData;
|
||||
private int mShowingActionCardPosition = RecyclerView.NO_POSITION;
|
||||
private boolean mLastItemFiltered;
|
||||
|
||||
public ParcelableStatusesAdapter(Context context, boolean compact) {
|
||||
super(context);
|
||||
|
@ -115,12 +119,19 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
|
|||
@Override
|
||||
public ParcelableStatus getStatus(int adapterPosition) {
|
||||
int dataPosition = adapterPosition - getStatusStartIndex();
|
||||
if (dataPosition < 0 || dataPosition >= getStatusCount()) return null;
|
||||
if (dataPosition < 0 || dataPosition >= getRawStatusCount()) return null;
|
||||
return mData.get(dataPosition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getStatusCount() {
|
||||
if (mData == null) return 0;
|
||||
if (mLastItemFiltered) return mData.size() - 1;
|
||||
return mData.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRawStatusCount() {
|
||||
if (mData == null) return 0;
|
||||
return mData.size();
|
||||
}
|
||||
|
@ -179,6 +190,11 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
|
|||
|
||||
public void setData(List<ParcelableStatus> data) {
|
||||
mData = data;
|
||||
if (!(data instanceof ObjectCursor) && !data.isEmpty()) {
|
||||
mLastItemFiltered = data.get(data.size() - 1).is_filtered;
|
||||
} else {
|
||||
mLastItemFiltered = false;
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
|
@ -306,6 +322,9 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
|
|||
final View view = mInflater.inflate(R.layout.card_item_load_indicator, parent, false);
|
||||
return new LoadIndicatorViewHolder(view);
|
||||
}
|
||||
case ITEM_VIEW_TYPE_EMPTY: {
|
||||
return new EmptyViewHolder(new Space(getContext()));
|
||||
}
|
||||
}
|
||||
throw new IllegalStateException("Unknown view type " + viewType);
|
||||
}
|
||||
|
@ -341,6 +360,7 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
|
|||
} else if (isGapItem(position)) {
|
||||
return ITEM_VIEW_TYPE_GAP;
|
||||
}
|
||||
if (isFiltered(position)) return ITEM_VIEW_TYPE_EMPTY;
|
||||
return ITEM_VIEW_TYPE_STATUS;
|
||||
}
|
||||
|
||||
|
@ -403,6 +423,11 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
|
|||
return start;
|
||||
}
|
||||
|
||||
private boolean isFiltered(int position) {
|
||||
if (mData instanceof ObjectCursor) return false;
|
||||
return getStatus(position).is_filtered;
|
||||
}
|
||||
|
||||
public static class EventListener implements GapClickListener, IStatusViewHolder.StatusClickListener {
|
||||
|
||||
private final WeakReference<IStatusesAdapter<?>> adapterRef;
|
||||
|
|
|
@ -37,6 +37,8 @@ public interface IStatusesAdapter<Data> extends IContentCardAdapter, IGapSupport
|
|||
|
||||
int getStatusCount();
|
||||
|
||||
int getRawStatusCount();
|
||||
|
||||
TwidereLinkify getTwidereLinkify();
|
||||
|
||||
boolean isCardActionsShown(int position);
|
||||
|
|
|
@ -22,14 +22,11 @@ package org.mariotaku.twidere.fragment.support;
|
|||
import android.app.Dialog;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.DialogInterface.OnClickListener;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
|
||||
import com.afollestad.materialdialogs.AlertDialogWrapper;
|
||||
import com.afollestad.materialdialogs.DialogAction;
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import com.twitter.Extractor;
|
||||
|
||||
|
@ -41,7 +38,6 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
|
|||
import org.mariotaku.twidere.util.ContentValuesCreator;
|
||||
import org.mariotaku.twidere.util.HtmlEscapeHelper;
|
||||
import org.mariotaku.twidere.util.ParseUtils;
|
||||
import org.mariotaku.twidere.util.ThemeUtils;
|
||||
import org.mariotaku.twidere.util.UserColorNameManager;
|
||||
import org.mariotaku.twidere.util.content.ContentResolverUtils;
|
||||
|
||||
|
@ -49,68 +45,17 @@ import java.util.ArrayList;
|
|||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class AddStatusFilterDialogFragment extends BaseSupportDialogFragment implements OnClickListener {
|
||||
public class AddStatusFilterDialogFragment extends BaseSupportDialogFragment {
|
||||
|
||||
public static final String FRAGMENT_TAG = "add_status_filter";
|
||||
|
||||
private final Extractor mExtractor = new Extractor();
|
||||
private FilterItemInfo[] mFilterItems;
|
||||
|
||||
@Override
|
||||
public void onClick(final DialogInterface dialog, final int which) {
|
||||
final MaterialDialog materialDialog = (MaterialDialog) dialog;
|
||||
final Integer[] selectedIndices = materialDialog.getSelectedIndices();
|
||||
assert selectedIndices != null;
|
||||
|
||||
final Set<UserKey> userKeys = new HashSet<>();
|
||||
final Set<String> keywords = new HashSet<>();
|
||||
final Set<String> sources = new HashSet<>();
|
||||
final ArrayList<ContentValues> userValues = new ArrayList<>();
|
||||
final ArrayList<ContentValues> keywordValues = new ArrayList<>();
|
||||
final ArrayList<ContentValues> sourceValues = new ArrayList<>();
|
||||
for (final int idx : selectedIndices) {
|
||||
final FilterItemInfo info = mFilterItems[idx];
|
||||
final Object value = info.value;
|
||||
if (value instanceof ParcelableUserMention) {
|
||||
final ParcelableUserMention mention = (ParcelableUserMention) value;
|
||||
userKeys.add(mention.key);
|
||||
userValues.add(ContentValuesCreator.createFilteredUser(mention));
|
||||
} else if (value instanceof UserItem) {
|
||||
final UserItem item = (UserItem) value;
|
||||
userKeys.add(item.key);
|
||||
userValues.add(createFilteredUser(item));
|
||||
} else if (info.type == FilterItemInfo.FILTER_TYPE_KEYWORD) {
|
||||
if (value != null) {
|
||||
final String keyword = ParseUtils.parseString(value);
|
||||
keywords.add(keyword);
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(Filters.Keywords.VALUE, "#" + keyword);
|
||||
keywordValues.add(values);
|
||||
}
|
||||
} else if (info.type == FilterItemInfo.FILTER_TYPE_SOURCE) {
|
||||
if (value != null) {
|
||||
final String source = ParseUtils.parseString(value);
|
||||
sources.add(source);
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(Filters.Sources.VALUE, source);
|
||||
sourceValues.add(values);
|
||||
}
|
||||
}
|
||||
}
|
||||
final ContentResolver resolver = getContentResolver();
|
||||
ContentResolverUtils.bulkDelete(resolver, Filters.Users.CONTENT_URI, Filters.Users.USER_ID, userKeys, null);
|
||||
ContentResolverUtils.bulkDelete(resolver, Filters.Keywords.CONTENT_URI, Filters.Keywords.VALUE, keywords, null);
|
||||
ContentResolverUtils.bulkDelete(resolver, Filters.Sources.CONTENT_URI, Filters.Sources.VALUE, sources, null);
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Users.CONTENT_URI, userValues);
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Keywords.CONTENT_URI, keywordValues);
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Sources.CONTENT_URI, sourceValues);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(final Bundle savedInstanceState) {
|
||||
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());
|
||||
final AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(wrapped);
|
||||
final MaterialDialog.Builder builder = new MaterialDialog.Builder(getContext());
|
||||
mFilterItems = getFilterItemsInfo();
|
||||
final String[] entries = new String[mFilterItems.length];
|
||||
final boolean nameFirst = mPreferences.getBoolean(KEY_NAME_FIRST);
|
||||
|
@ -118,22 +63,80 @@ public class AddStatusFilterDialogFragment extends BaseSupportDialogFragment imp
|
|||
final FilterItemInfo info = mFilterItems[i];
|
||||
switch (info.type) {
|
||||
case FilterItemInfo.FILTER_TYPE_USER:
|
||||
entries[i] = getString(R.string.user_filter_name, getName(mUserColorNameManager, info.value, nameFirst));
|
||||
entries[i] = getString(R.string.user_filter_name, getName(mUserColorNameManager,
|
||||
info.value, nameFirst));
|
||||
break;
|
||||
case FilterItemInfo.FILTER_TYPE_KEYWORD:
|
||||
entries[i] = getString(R.string.keyword_filter_name, getName(mUserColorNameManager, info.value, nameFirst));
|
||||
entries[i] = getString(R.string.keyword_filter_name, getName(mUserColorNameManager,
|
||||
info.value, nameFirst));
|
||||
break;
|
||||
case FilterItemInfo.FILTER_TYPE_SOURCE:
|
||||
entries[i] = getString(R.string.source_filter_name, getName(mUserColorNameManager, info.value, nameFirst));
|
||||
entries[i] = getString(R.string.source_filter_name, getName(mUserColorNameManager,
|
||||
info.value, nameFirst));
|
||||
break;
|
||||
}
|
||||
}
|
||||
builder.setTitle(R.string.add_to_filter);
|
||||
builder.setMultiChoiceItems(entries, null, null);
|
||||
builder.setPositiveButton(android.R.string.ok, this);
|
||||
builder.setNegativeButton(android.R.string.cancel, null);
|
||||
builder.alwaysCallMultiChoiceCallback();
|
||||
return builder.create();
|
||||
builder.title(R.string.add_to_filter);
|
||||
builder.items(entries);
|
||||
builder.positiveText(android.R.string.ok);
|
||||
builder.itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() {
|
||||
@Override
|
||||
public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
builder.onPositive(new MaterialDialog.SingleButtonCallback() {
|
||||
@Override
|
||||
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
|
||||
final Integer[] selectedIndices = dialog.getSelectedIndices();
|
||||
assert selectedIndices != null;
|
||||
|
||||
final Set<UserKey> userKeys = new HashSet<>();
|
||||
final Set<String> keywords = new HashSet<>();
|
||||
final Set<String> sources = new HashSet<>();
|
||||
final ArrayList<ContentValues> userValues = new ArrayList<>();
|
||||
final ArrayList<ContentValues> keywordValues = new ArrayList<>();
|
||||
final ArrayList<ContentValues> sourceValues = new ArrayList<>();
|
||||
for (final int idx : selectedIndices) {
|
||||
final FilterItemInfo info = mFilterItems[idx];
|
||||
final Object value = info.value;
|
||||
if (value instanceof ParcelableUserMention) {
|
||||
final ParcelableUserMention mention = (ParcelableUserMention) value;
|
||||
userKeys.add(mention.key);
|
||||
userValues.add(ContentValuesCreator.createFilteredUser(mention));
|
||||
} else if (value instanceof UserItem) {
|
||||
final UserItem item = (UserItem) value;
|
||||
userKeys.add(item.key);
|
||||
userValues.add(createFilteredUser(item));
|
||||
} else if (info.type == FilterItemInfo.FILTER_TYPE_KEYWORD) {
|
||||
if (value != null) {
|
||||
final String keyword = ParseUtils.parseString(value);
|
||||
keywords.add(keyword);
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(Filters.Keywords.VALUE, "#" + keyword);
|
||||
keywordValues.add(values);
|
||||
}
|
||||
} else if (info.type == FilterItemInfo.FILTER_TYPE_SOURCE) {
|
||||
if (value != null) {
|
||||
final String source = ParseUtils.parseString(value);
|
||||
sources.add(source);
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(Filters.Sources.VALUE, source);
|
||||
sourceValues.add(values);
|
||||
}
|
||||
}
|
||||
}
|
||||
final ContentResolver resolver = getContentResolver();
|
||||
ContentResolverUtils.bulkDelete(resolver, Filters.Users.CONTENT_URI, Filters.Users.USER_ID, userKeys, null);
|
||||
ContentResolverUtils.bulkDelete(resolver, Filters.Keywords.CONTENT_URI, Filters.Keywords.VALUE, keywords, null);
|
||||
ContentResolverUtils.bulkDelete(resolver, Filters.Sources.CONTENT_URI, Filters.Sources.VALUE, sources, null);
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Users.CONTENT_URI, userValues);
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Keywords.CONTENT_URI, keywordValues);
|
||||
ContentResolverUtils.bulkInsert(resolver, Filters.Sources.CONTENT_URI, sourceValues);
|
||||
}
|
||||
});
|
||||
builder.negativeText(android.R.string.cancel);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
private FilterItemInfo[] getFilterItemsInfo() {
|
||||
|
|
|
@ -151,7 +151,7 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment {
|
|||
if (position == 0) return;
|
||||
final ParcelableStatusesAdapter adapter = getAdapter();
|
||||
// Load the last item
|
||||
final int idx = adapter.getStatusStartIndex() + adapter.getStatusCount() - 1;
|
||||
final int idx = adapter.getStatusStartIndex() + adapter.getRawStatusCount() - 1;
|
||||
if (idx < 0) return;
|
||||
final ParcelableStatus status = adapter.getStatus(idx);
|
||||
UserKey[] accountKeys = {status.account_key};
|
||||
|
|
|
@ -1844,6 +1844,11 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
|
|||
|
||||
@Override
|
||||
public int getStatusCount() {
|
||||
return getRawStatusCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRawStatusCount() {
|
||||
return getTypeCount(ITEM_IDX_CONVERSATION) + getTypeCount(ITEM_IDX_STATUS)
|
||||
+ getTypeCount(ITEM_IDX_REPLY);
|
||||
}
|
||||
|
|
|
@ -1669,7 +1669,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
|
|||
|
||||
final int currentActionBarColor = (Integer) sArgbEvaluator.evaluate(factor, mActionBarShadowColor,
|
||||
stackedTabColor);
|
||||
final boolean actionItemIsDark = !ATEUtil.isColorLight(stackedTabColor);
|
||||
final boolean actionItemIsDark = ATEUtil.isColorLight(stackedTabColor);
|
||||
if (mPreviousActionBarItemIsDark == 0 || (actionItemIsDark ? 1 : -1) != mPreviousActionBarItemIsDark) {
|
||||
ThemeUtils.applyToolbarItemColor(activity, mToolbar, currentActionBarColor);
|
||||
}
|
||||
|
|
|
@ -57,9 +57,9 @@ import android.widget.CheckBox;
|
|||
import com.rengwuxian.materialedittext.MaterialEditText;
|
||||
|
||||
import org.mariotaku.twidere.R;
|
||||
import org.mariotaku.twidere.activity.iface.IThemedActivity;
|
||||
import org.mariotaku.twidere.activity.AccountSelectorActivity;
|
||||
import org.mariotaku.twidere.activity.UserListSelectorActivity;
|
||||
import org.mariotaku.twidere.activity.iface.IThemedActivity;
|
||||
import org.mariotaku.twidere.adapter.SupportTabsAdapter;
|
||||
import org.mariotaku.twidere.api.twitter.Twitter;
|
||||
import org.mariotaku.twidere.api.twitter.TwitterException;
|
||||
|
@ -422,7 +422,6 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
|
|||
final FragmentActivity activity = getActivity();
|
||||
ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator, mPagerOverlay);
|
||||
ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable());
|
||||
ThemeUtils.setCompatContentViewOverlay(activity, new EmptyDrawable());
|
||||
ThemeUtils.setWindowOverlayViewOverlay(activity, new EmptyDrawable());
|
||||
|
||||
if (activity instanceof IThemedActivity) {
|
||||
|
|
|
@ -180,8 +180,13 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
final ParcelableStatus[] array = data.toArray(new ParcelableStatus[data.size()]);
|
||||
for (int i = 0, size = array.length; i < size; i++) {
|
||||
final ParcelableStatus status = array[i];
|
||||
if (shouldFilterStatus(db, status) && !status.is_gap && i != size - 1) {
|
||||
deleteStatus(data, status.id);
|
||||
final boolean filtered = shouldFilterStatus(db, status);
|
||||
if (filtered) {
|
||||
if (!status.is_gap && i != size - 1) {
|
||||
data.remove(i);
|
||||
} else {
|
||||
status.is_filtered = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mComparator != null) {
|
||||
|
@ -211,8 +216,8 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
|
||||
@NonNull
|
||||
protected abstract List<? extends Status> getStatuses(@NonNull Twitter twitter,
|
||||
@NonNull ParcelableCredentials credentials,
|
||||
@NonNull Paging paging) throws TwitterException;
|
||||
@NonNull ParcelableCredentials credentials,
|
||||
@NonNull Paging paging) throws TwitterException;
|
||||
|
||||
@WorkerThread
|
||||
protected abstract boolean shouldFilterStatus(final SQLiteDatabase database, final ParcelableStatus status);
|
||||
|
|
|
@ -214,17 +214,8 @@ public class ThemeUtils implements Constants {
|
|||
return getColorFromAttribute(context, android.R.attr.colorForeground, 0);
|
||||
}
|
||||
|
||||
public static int getDialogThemeResource(final Context context) {
|
||||
return getDialogThemeResource(getThemeNameOption(context));
|
||||
}
|
||||
|
||||
public static int getDialogThemeResource(final String name) {
|
||||
if (VALUE_THEME_NAME_DARK.equals(name)) return R.style.Theme_Twidere_Dialog;
|
||||
return R.style.Theme_Twidere_Dialog;
|
||||
}
|
||||
|
||||
public static Context getDialogThemedContext(final Context context) {
|
||||
return new ContextThemeWrapper(context, getDialogThemeResource(context));
|
||||
return new ContextThemeWrapper(context, R.style.Theme_Twidere_Dialog);
|
||||
}
|
||||
|
||||
public static Drawable getImageHighlightDrawable(final Context context) {
|
||||
|
@ -610,12 +601,11 @@ public class ThemeUtils implements Constants {
|
|||
}
|
||||
}
|
||||
|
||||
public static void setCompatContentViewOverlay(Activity activity, Drawable overlay) {
|
||||
public static void setCompatContentViewOverlay(Window window, Drawable overlay) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) return;
|
||||
final Window window = activity.getWindow();
|
||||
View contentLayout = window.findViewById(android.support.v7.appcompat.R.id.action_bar_activity_content);
|
||||
if (contentLayout == null) {
|
||||
contentLayout = window.findViewById(R.id.content);
|
||||
contentLayout = window.findViewById(android.R.id.content);
|
||||
}
|
||||
if (contentLayout instanceof FrameLayout) {
|
||||
ViewSupport.setForeground(contentLayout, overlay);
|
||||
|
@ -780,10 +770,10 @@ public class ThemeUtils implements Constants {
|
|||
}
|
||||
|
||||
public static void applyToolbarItemColor(Context context, Toolbar toolbar, int toolbarColor) {
|
||||
if (toolbar == null || isDarkTheme(context)) {
|
||||
if (toolbar == null) {
|
||||
return;
|
||||
}
|
||||
final int contrastForegroundColor = getContrastForegroundColor(context, toolbarColor);
|
||||
final int contrastForegroundColor = getColorDependent(toolbarColor);
|
||||
toolbar.setTitleTextColor(contrastForegroundColor);
|
||||
toolbar.setSubtitleTextColor(contrastForegroundColor);
|
||||
int popupItemColor, popupTheme = toolbar.getPopupTheme();
|
||||
|
|
|
@ -218,12 +218,17 @@ public class TwitterAPIFactory implements TwidereConstants {
|
|||
return isTwitterCredentials(ParcelableAccountUtils.getAccount(context, accountId));
|
||||
}
|
||||
|
||||
public static boolean isTwitterCredentials(ParcelableAccount credentials) {
|
||||
return ParcelableAccount.Type.TWITTER.equals(credentials.account_type);
|
||||
public static boolean isTwitterCredentials(ParcelableAccount account) {
|
||||
if (account.account_type == null) {
|
||||
final String accountHost = account.account_key.getHost();
|
||||
if (accountHost == null) return true;
|
||||
return USER_TYPE_TWITTER_COM.equals(accountHost);
|
||||
}
|
||||
return ParcelableAccount.Type.TWITTER.equals(account.account_type);
|
||||
}
|
||||
|
||||
public static boolean isStatusNetCredentials(ParcelableAccount credentials) {
|
||||
return ParcelableAccount.Type.STATUSNET.equals(credentials.account_type);
|
||||
public static boolean isStatusNetCredentials(ParcelableAccount account) {
|
||||
return ParcelableAccount.Type.STATUSNET.equals(account.account_type);
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
package org.mariotaku.twidere.view.holder;
|
||||
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 16/3/18.
|
||||
*/
|
||||
public class EmptyViewHolder extends RecyclerView.ViewHolder {
|
||||
public EmptyViewHolder(View view) {
|
||||
super(view);
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 192 B |
Binary file not shown.
After Width: | Height: | Size: 168 B |
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<color xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@android:color/transparent"/>
|
Binary file not shown.
After Width: | Height: | Size: 290 B |
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:src="@drawable/ab_solid_shadow_holo"/>
|
|
@ -55,8 +55,6 @@
|
|||
|
||||
<style name="Theme.Twidere.Dialog" parent="Theme.AppCompat.Light.Dialog">
|
||||
|
||||
<!-- Custom view styles -->
|
||||
|
||||
<!-- Widget styles -->
|
||||
<item name="android:listSeparatorTextViewStyle">@style/Widget.Light.TextView.ListSeparator
|
||||
</item>
|
||||
|
@ -80,7 +78,7 @@
|
|||
</style>
|
||||
|
||||
|
||||
<style name="Theme.Twidere.Compose" parent="Theme.AppCompat.Light.Dialog">
|
||||
<style name="Theme.Twidere.Compose" parent="Theme.Twidere.Dialog">
|
||||
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowActionModeOverlay">false</item>
|
||||
|
@ -93,28 +91,6 @@
|
|||
<item name="android:windowActionBarOverlay">false</item>
|
||||
<item name="android:windowActionModeOverlay">false</item>
|
||||
|
||||
<!-- Custom view styles -->
|
||||
|
||||
<!-- Widget styles -->
|
||||
<item name="android:listSeparatorTextViewStyle">@style/Widget.Light.TextView.ListSeparator
|
||||
</item>
|
||||
|
||||
<!-- Card UI styles -->
|
||||
<item name="cardActionButtonStyle">@style/Widget.Light.CardActionButton</item>
|
||||
<item name="profileImageStyle">@style/Widget.Light.ProfileImage</item>
|
||||
<item name="profileImageStyleLarge">@style/Widget.Light.ProfileImage.Large</item>
|
||||
<item name="cardItemBackgroundColor">@color/background_color_card_item_light</item>
|
||||
|
||||
|
||||
<!-- Twidere specific styles -->
|
||||
<item name="menuIconColor">@color/action_icon_dark</item>
|
||||
<item name="messageBubbleColor">@color/message_bubble_color_light</item>
|
||||
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_light</item>
|
||||
<item name="coloredActionBar">true</item>
|
||||
|
||||
<!-- ATE attributes -->
|
||||
<item name="ateThemeKey">light</item>
|
||||
|
||||
</style>
|
||||
|
||||
<style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog">
|
||||
|
|
|
@ -62,8 +62,6 @@
|
|||
|
||||
<style name="Theme.Twidere.Dialog" parent="Theme.AppCompat.Dialog">
|
||||
|
||||
<!-- Custom view styles -->
|
||||
|
||||
<!-- Widget styles -->
|
||||
<item name="android:listSeparatorTextViewStyle">@style/Widget.Dark.TextView.ListSeparator
|
||||
</item>
|
||||
|
@ -86,7 +84,8 @@
|
|||
|
||||
</style>
|
||||
|
||||
<style name="Theme.Twidere.Compose" parent="Theme.AppCompat.Dialog">
|
||||
|
||||
<style name="Theme.Twidere.Compose" parent="Theme.Twidere.Dialog">
|
||||
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowActionModeOverlay">false</item>
|
||||
|
@ -99,27 +98,6 @@
|
|||
<item name="android:windowActionBarOverlay">false</item>
|
||||
<item name="android:windowActionModeOverlay">false</item>
|
||||
|
||||
<!-- Custom view styles -->
|
||||
|
||||
<!-- Widget styles -->
|
||||
<item name="android:listSeparatorTextViewStyle">@style/Widget.Dark.TextView.ListSeparator
|
||||
</item>
|
||||
|
||||
<!-- Card UI styles -->
|
||||
<item name="cardActionButtonStyle">@style/Widget.CardActionButton</item>
|
||||
<item name="profileImageStyle">@style/Widget.ProfileImage</item>
|
||||
<item name="profileImageStyleLarge">@style/Widget.ProfileImage.Large</item>
|
||||
<item name="cardItemBackgroundColor">@color/background_color_card_item_dark</item>
|
||||
|
||||
<!-- Twidere specific styles -->
|
||||
<item name="menuIconColor">@color/action_icon_light</item>
|
||||
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
|
||||
<item name="quoteIndicatorBackgroundColor">@color/quote_indicator_background_dark</item>
|
||||
<item name="darkTheme">true</item>
|
||||
|
||||
<!-- ATE attributes -->
|
||||
<item name="ateThemeKey">dark</item>
|
||||
|
||||
</style>
|
||||
|
||||
<style name="Theme.Twidere.QuickSearchBar" parent="Theme.Twidere.Dialog">
|
||||
|
|
Loading…
Reference in New Issue