fixed filter
fixed search query
This commit is contained in:
Mariotaku Lee 2016-03-18 00:28:29 +08:00
parent 933232e3f4
commit 28f68e2ff3
26 changed files with 216 additions and 155 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -37,6 +37,8 @@ public interface IStatusesAdapter<Data> extends IContentCardAdapter, IGapSupport
int getStatusCount();
int getRawStatusCount();
TwidereLinkify getTwidereLinkify();
boolean isCardActionsShown(int position);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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"/>

View File

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

View File

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