- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import org.mariotaku.refreshnow.widget.OnRefreshListener;
-import org.mariotaku.refreshnow.widget.RefreshMode;
-import org.mariotaku.refreshnow.widget.RefreshNowConfig;
-import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator;
-import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator.IndicatorConfig;
-import org.mariotaku.twidere.R;
-import org.mariotaku.twidere.fragment.iface.IBasePullToRefreshFragment;
-import org.mariotaku.twidere.util.ThemeUtils;
-import org.mariotaku.twidere.view.RefreshNowStaggeredGridView;
-
-public abstract class BasePullToRefreshStaggeredGridFragment extends BaseSupportStaggeredGridFragment implements
- IBasePullToRefreshFragment, OnTouchListener {
-
- @Override
- public RefreshNowStaggeredGridView getListView() {
- return (RefreshNowStaggeredGridView) super.getListView();
- }
-
- @Override
- public RefreshMode getRefreshMode() {
- if (getView() == null) return RefreshMode.NONE;
- return getListView().getRefreshMode();
- }
-
- @Override
- public boolean isRefreshing() {
- if (getView() == null) return false;
- return getListView().isRefreshing();
- }
-
- /**
- * Provide default implementation to return a simple list view. Subclasses
- * can override to replace with their own layout. If doing so, the returned
- * view hierarchy must have a ListView whose id is
- * {@link android.R.id#list android.R.id.list} and can optionally have a
- * sibling view id {@link android.R.id#empty android.R.id.empty} that is to
- * be shown when the list is empty.
- *
- * If you are overriding this method with your own custom content, consider
- * including the standard layout {@link android.R.layout#list_content} in
- * your layout file, so that you continue to retain all of the standard
- * behavior of ListFragment. In particular, this is currently the only way
- * to have the built-in indeterminant progress state be shown.
- */
- @Override
- public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
- final Context context = getActivity();
-
- final FrameLayout root = new FrameLayout(context);
-
- // ------------------------------------------------------------------
-
- final LinearLayout pframe = new LinearLayout(context);
- pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID);
- pframe.setOrientation(LinearLayout.VERTICAL);
- pframe.setVisibility(View.GONE);
- pframe.setGravity(Gravity.CENTER);
-
- final ProgressBar progress = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge);
- pframe.addView(progress, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
-
- root.addView(pframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- // ------------------------------------------------------------------
-
- final FrameLayout lframe = new FrameLayout(context);
- lframe.setId(INTERNAL_LIST_CONTAINER_ID);
-
- final TextView tv = new TextView(getActivity());
- tv.setId(INTERNAL_EMPTY_ID);
- tv.setGravity(Gravity.CENTER);
- lframe.addView(tv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- final RefreshNowStaggeredGridView lv = (RefreshNowStaggeredGridView) inflater.inflate(
- R.layout.refreshnow_staggered_gridview, lframe, false);
- lv.setId(android.R.id.list);
- lv.setDrawSelectorOnTop(false);
- lv.setOnRefreshListener(this);
- lv.setOnTouchListener(this);
- lframe.addView(lv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- final RefreshNowProgressIndicator indicator = new RefreshNowProgressIndicator(context);
- final IndicatorConfig config = ThemeUtils.buildRefreshIndicatorConfig(context);
- indicator.setConfig(config);
- final int indicatorHeight = Math.round(3 * getResources().getDisplayMetrics().density);
- lframe.addView(indicator, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, indicatorHeight,
- Gravity.TOP));
-
- lv.setRefreshIndicatorView(indicator);
-
- root.addView(lframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- // ------------------------------------------------------------------
-
- root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- return root;
- }
-
- @Override
- public void onRefreshComplete() {
-
- }
-
- @Override
- public final void onRefreshStart(final RefreshMode mode) {
- if (mode.hasStart()) {
- onRefreshFromStart();
- } else if (mode.hasEnd()) {
- onRefreshFromEnd();
- }
- }
-
- @Override
- public final boolean onTouch(final View v, final MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- onListTouched();
- break;
- }
- }
- return false;
- }
-
- @Override
- public void setConfig(final RefreshNowConfig config) {
- if (getView() == null) return;
- getListView().setConfig(config);
- }
-
- @Override
- public void setOnRefreshListener(final OnRefreshListener listener) {
-
- }
-
- @Override
- public void setRefreshComplete() {
- if (getView() == null) return;
- getListView().setRefreshComplete();
- }
-
- @Override
- public void setRefreshIndicatorView(final View view) {
- if (getView() == null) return;
- getListView().setRefreshIndicatorView(view);
- }
-
- @Override
- public void setRefreshing(final boolean refresh) {
- if (getView() == null) return;
- getListView().setRefreshing(refresh);
- }
-
- @Override
- public void setRefreshMode(final RefreshMode mode) {
- if (getView() == null) return;
- getListView().setRefreshMode(mode);
- }
-
- @Override
- public boolean triggerRefresh() {
- onRefreshFromStart();
- setRefreshing(true);
- return true;
- }
-
- protected void onListTouched() {
-
- }
-
-}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseStatusesListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseStatusesListFragment.java
index 24f846995..a893cbe41 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseStatusesListFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseStatusesListFragment.java
@@ -40,8 +40,8 @@ import android.widget.ListView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
-import org.mariotaku.twidere.model.Account;
-import org.mariotaku.twidere.model.Account.AccountWithCredentials;
+import org.mariotaku.twidere.model.ParcelableAccount;
+import org.mariotaku.twidere.model.ParcelableAccount.ParcelableAccountWithCredentials;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.task.AsyncTask;
import org.mariotaku.twidere.util.AsyncTaskManager;
@@ -345,9 +345,9 @@ abstract class BaseStatusesListFragment extends BasePullToRefreshListFragm
break;
}
case MENU_TRANSLATE: {
- final AccountWithCredentials account = Account.getAccountWithCredentials(getActivity(),
+ final ParcelableAccountWithCredentials account = ParcelableAccount.getAccountWithCredentials(getActivity(),
status.account_id);
- if (AccountWithCredentials.isOfficialCredentials(getActivity(), account)) {
+ if (ParcelableAccountWithCredentials.isOfficialCredentials(getActivity(), account)) {
StatusTranslateDialogFragment.show(getFragmentManager(), status);
} else {
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseStatusesStaggeredGridFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseStatusesStaggeredGridFragment.java
deleted file mode 100644
index 5e9fba080..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseStatusesStaggeredGridFragment.java
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * Twidere - Twitter client for Android
- *
- * Copyright (C) 2012-2014 Mariotaku Lee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.support.v4.app.LoaderManager.LoaderCallbacks;
-import android.support.v4.content.Loader;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MenuItem.OnMenuItemClickListener;
-import android.view.View;
-import android.widget.AbsListView;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ListView;
-
-import com.etsy.android.grid.StaggeredGridView;
-
-import org.mariotaku.menucomponent.widget.PopupMenu;
-import org.mariotaku.twidere.R;
-import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
-import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
-import org.mariotaku.twidere.model.ParcelableStatus;
-import org.mariotaku.twidere.task.AsyncTask;
-import org.mariotaku.twidere.util.AsyncTaskManager;
-import org.mariotaku.twidere.util.AsyncTwitterWrapper;
-import org.mariotaku.twidere.util.ClipboardUtils;
-import org.mariotaku.twidere.util.MultiSelectManager;
-import org.mariotaku.twidere.util.PositionManager;
-import org.mariotaku.twidere.util.TwitterWrapper;
-import org.mariotaku.twidere.util.Utils;
-import org.mariotaku.twidere.util.collection.NoDuplicatesCopyOnWriteArrayList;
-import org.mariotaku.twidere.view.holder.StatusListViewHolder;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.mariotaku.twidere.util.Utils.cancelRetweet;
-import static org.mariotaku.twidere.util.Utils.clearListViewChoices;
-import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
-import static org.mariotaku.twidere.util.Utils.isMyRetweet;
-import static org.mariotaku.twidere.util.Utils.openStatus;
-import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
-import static org.mariotaku.twidere.util.Utils.showOkMessage;
-import static org.mariotaku.twidere.util.Utils.startStatusShareChooser;
-
-abstract class BaseStatusesStaggeredGridFragment extends BasePullToRefreshStaggeredGridFragment implements
- LoaderCallbacks, OnItemLongClickListener, OnMenuItemClickListener,
- MultiSelectManager.Callback, MenuButtonClickListener {
-
- private AsyncTaskManager mAsyncTaskManager;
- private SharedPreferences mPreferences;
-
- private StaggeredGridView mListView;
- private IStatusesListAdapter mAdapter;
- private PopupMenu mPopupMenu;
-
- private Data mData;
- private ParcelableStatus mSelectedStatus;
-
- private boolean mLoadMoreAutomatically;
- private int mListScrollOffset;
-
- private MultiSelectManager mMultiSelectManager;
- private PositionManager mPositionManager;
-
- private int mFirstVisibleItem;
- private int mSelectedPosition;
-
- private final Map> mUnreadCountsToRemove = Collections
- .synchronizedMap(new HashMap>());
- private final List mReadPositions = new NoDuplicatesCopyOnWriteArrayList();
-
- private RemoveUnreadCountsTask mRemoveUnreadCountsTask;
-
- public AsyncTaskManager getAsyncTaskManager() {
- return mAsyncTaskManager;
- }
-
- public final Data getData() {
- return mData;
- }
-
- @Override
- public IStatusesListAdapter getListAdapter() {
- return mAdapter;
- }
-
- public ParcelableStatus getSelectedStatus() {
- return mSelectedStatus;
- }
-
- public SharedPreferences getSharedPreferences() {
- return mPreferences;
- }
-
- public abstract int getStatuses(long[] account_ids, long[] max_ids, long[] since_ids);
-
- public final Map> getUnreadCountsToRemove() {
- return mUnreadCountsToRemove;
- }
-
- @Override
- public void onActivityCreated(final Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- mAsyncTaskManager = getAsyncTaskManager();
- mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
- mPositionManager = new PositionManager(getActivity());
- mMultiSelectManager = getMultiSelectManager();
- mListView = getListView();
- mAdapter = newAdapterInstance();
- mAdapter.setMenuButtonClickListener(this);
- setListAdapter(null);
- setListHeaderFooters(mListView);
- setListAdapter(mAdapter);
- mListView.setSelector(android.R.color.transparent);
- mListView.setOnItemLongClickListener(this);
- setListShown(false);
- getLoaderManager().initLoader(0, getArguments(), this);
- }
-
- @Override
- public abstract Loader onCreateLoader(int id, Bundle args);
-
- @Override
- public boolean onItemLongClick(final AdapterView> parent, final View view, final int position, final long id) {
- final Object tag = view.getTag();
- if (tag instanceof StatusListViewHolder) {
- final StatusListViewHolder holder = (StatusListViewHolder) tag;
- final ParcelableStatus status = mAdapter.getStatus(position - mListView.getHeaderViewsCount());
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter != null) {
- TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
- }
- if (holder.show_as_gap) return false;
- if (mPreferences.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false)) {
- openMenu(holder.content.getFakeOverflowButton(), status, position);
- } else {
- setItemSelected(status, position, !mMultiSelectManager.isSelected(status));
- }
- return true;
- }
- return false;
- }
-
- @Override
- public void onItemsCleared() {
- clearListViewChoices(mListView);
- }
-
- @Override
- public void onItemSelected(final Object item) {
- mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- }
-
- @Override
- public void onItemUnselected(final Object item) {
- }
-
- @Override
- public void onListItemClick(final StaggeredGridView l, final View v, final int position, final long id) {
- final Object tag = v.getTag();
- if (tag instanceof StatusListViewHolder) {
- final int pos = position - l.getHeaderViewsCount();
- final ParcelableStatus status = mAdapter.getStatus(pos);
- if (status == null) return;
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter != null) {
- TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
- }
- if (((StatusListViewHolder) tag).show_as_gap) {
- final long since_id = position + 1 < mAdapter.getStatusCount() ? mAdapter.getStatus(pos + 1).id : -1;
- getStatuses(new long[]{status.account_id}, new long[]{status.id}, new long[]{since_id});
- mListView.setItemChecked(position, false);
- } else {
- if (mMultiSelectManager.isActive()) {
- setItemSelected(status, position, !mMultiSelectManager.isSelected(status));
- return;
- }
- openStatus(getActivity(), status, null);
- }
- }
- }
-
- @Override
- public final void onLoaderReset(final Loader loader) {
- mAdapter.setData(mData = null);
- }
-
- @Override
- public final void onLoadFinished(final Loader loader, final Data data) {
- if (getActivity() == null || getView() == null) return;
- setListShown(true);
- setRefreshComplete();
- setProgressBarIndeterminateVisibility(false);
- setData(data);
- mFirstVisibleItem = -1;
- mReadPositions.clear();
- final int listVisiblePosition, savedChildIndex;
- final boolean rememberPosition = mPreferences.getBoolean(KEY_REMEMBER_POSITION, true);
- if (rememberPosition) {
- listVisiblePosition = mListView.getLastVisiblePosition();
- final int childCount = mListView.getChildCount();
- savedChildIndex = childCount - 1;
- if (childCount > 0) {
- final View lastChild = mListView.getChildAt(savedChildIndex);
- mListScrollOffset = lastChild != null ? lastChild.getTop() : 0;
- }
- } else {
- listVisiblePosition = mListView.getFirstVisiblePosition();
- savedChildIndex = 0;
- if (mListView.getChildCount() > 0) {
- final View firstChild = mListView.getChildAt(savedChildIndex);
- mListScrollOffset = firstChild != null ? firstChild.getTop() : 0;
- }
- }
- final long lastViewedId = mAdapter.getStatusId(listVisiblePosition);
- mAdapter.setData(data);
- mAdapter.setShowAccountColor(shouldShowAccountColor());
- final int currFirstVisiblePosition = mListView.getFirstVisiblePosition();
- final long currViewedId = mAdapter.getStatusId(currFirstVisiblePosition);
- final long statusId;
- if (lastViewedId <= 0) {
- if (!rememberPosition) return;
- statusId = mPositionManager.getPosition(getPositionKey());
- } else if ((listVisiblePosition > 0 || rememberPosition) && currViewedId > 0 && lastViewedId != currViewedId) {
- statusId = lastViewedId;
- } else {
- if (listVisiblePosition == 0 && mAdapter.getStatusId(0) != lastViewedId) {
- mAdapter.setMaxAnimationPosition(mListView.getLastVisiblePosition());
- }
- return;
- }
- final int position = mAdapter.findPositionByStatusId(statusId);
- if (position > -1 && position < mListView.getCount()) {
- mAdapter.setMaxAnimationPosition(mListView.getLastVisiblePosition());
- // mListView.setSelectionFromTop(position, mListScrollOffset);
- mListView.setSelection(position);
- mListScrollOffset = 0;
- }
- }
-
- @Override
- public void onMenuButtonClick(final View button, final int position, final long id) {
- if (mMultiSelectManager.isActive()) return;
- final ParcelableStatus status = mAdapter.getStatus(position);
- if (status == null) return;
- openMenu(button, status, position);
- }
-
- @Override
- public final boolean onMenuItemClick(final MenuItem item) {
- final ParcelableStatus status = mSelectedStatus;
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (status == null || twitter == null) return false;
- switch (item.getItemId()) {
- case MENU_VIEW: {
- openStatus(getActivity(), status, null);
- break;
- }
- case MENU_SHARE: {
- startStatusShareChooser(getActivity(), status);
- break;
- }
- case MENU_COPY: {
- if (ClipboardUtils.setText(getActivity(), status.text_plain)) {
- showOkMessage(getActivity(), R.string.text_copied, false);
- }
- break;
- }
- case MENU_RETWEET: {
- if (isMyRetweet(status)) {
- cancelRetweet(twitter, status);
- } else {
- final long id_to_retweet = status.retweet_id > 0 ? status.retweet_id : status.id;
- twitter.retweetStatus(status.account_id, id_to_retweet);
- }
- break;
- }
- case MENU_QUOTE: {
- final Intent intent = new Intent(INTENT_ACTION_QUOTE);
- final Bundle bundle = new Bundle();
- bundle.putParcelable(EXTRA_STATUS, status);
- intent.putExtras(bundle);
- startActivity(intent);
- break;
- }
- case MENU_REPLY: {
- final Intent intent = new Intent(INTENT_ACTION_REPLY);
- final Bundle bundle = new Bundle();
- bundle.putParcelable(EXTRA_STATUS, status);
- intent.putExtras(bundle);
- startActivity(intent);
- break;
- }
- case MENU_FAVORITE: {
- if (status.is_favorite) {
- twitter.destroyFavoriteAsync(status.account_id, status.id);
- } else {
- twitter.createFavoriteAsync(status.account_id, status.id);
- }
- break;
- }
- case MENU_DELETE: {
- twitter.destroyStatusAsync(status.account_id, status.id);
- break;
- }
- case MENU_ADD_TO_FILTER: {
- AddStatusFilterDialogFragment.show(getFragmentManager(), status);
- break;
- }
- case MENU_MULTI_SELECT: {
- final boolean isSelected = !mMultiSelectManager.isSelected(status);
- setItemSelected(status, mSelectedPosition, isSelected);
- break;
- }
- default: {
- if (item.getIntent() != null) {
- try {
- startActivity(item.getIntent());
- } catch (final ActivityNotFoundException e) {
- Log.w(LOGTAG, e);
- return false;
- }
- }
- break;
- }
- }
- return true;
- }
-
- @Override
- public void onRefreshFromEnd() {
- if (mLoadMoreAutomatically) return;
- loadMoreStatuses();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mListView.setFastScrollEnabled(mPreferences.getBoolean(KEY_FAST_SCROLL_THUMB, false));
- configBaseCardAdapter(getActivity(), mAdapter);
- final boolean display_image_preview = mPreferences.getBoolean(KEY_DISPLAY_IMAGE_PREVIEW, false);
- final boolean display_sensitive_contents = mPreferences.getBoolean(KEY_DISPLAY_SENSITIVE_CONTENTS, false);
- final boolean indicate_my_status = mPreferences.getBoolean(KEY_INDICATE_MY_STATUS, true);
- mAdapter.setDisplayImagePreview(display_image_preview);
- mAdapter.setDisplaySensitiveContents(display_sensitive_contents);
- mAdapter.setIndicateMyStatusDisabled(isMyTimeline() || !indicate_my_status);
- mLoadMoreAutomatically = mPreferences.getBoolean(KEY_LOAD_MORE_AUTOMATICALLY, false);
- }
-
- @Override
- public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
- final int totalItemCount) {
- super.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
- addReadPosition(firstVisibleItem);
- }
-
- @Override
- public void onScrollStateChanged(final AbsListView view, final int scrollState) {
- super.onScrollStateChanged(view, scrollState);
- switch (scrollState) {
- case SCROLL_STATE_IDLE:
- for (int i = mListView.getFirstVisiblePosition(), j = mListView.getLastVisiblePosition(); i < j; i++) {
- mReadPositions.add(i);
- }
- removeUnreadCounts();
- break;
- default:
- break;
- }
- }
-
- @Override
- public void onStart() {
- super.onStart();
- mMultiSelectManager.registerCallback(this);
- final int choiceMode = mListView.getChoiceMode();
- if (mMultiSelectManager.isActive()) {
- if (choiceMode != ListView.CHOICE_MODE_MULTIPLE) {
- mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
- }
- } else {
- if (choiceMode != ListView.CHOICE_MODE_NONE) {
- Utils.clearListViewChoices(mListView);
- }
- }
- }
-
- @Override
- public void onStop() {
- savePosition();
- mMultiSelectManager.unregisterCallback(this);
- if (mPopupMenu != null) {
- mPopupMenu.dismiss();
- }
- super.onStop();
- }
-
- @Override
- public boolean scrollToStart() {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- final int tab_position = getTabPosition();
- if (twitter != null && tab_position >= 0) {
- twitter.clearUnreadCountAsync(tab_position);
- }
- return super.scrollToStart();
- }
-
- @Override
- public void setUserVisibleHint(final boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
- updateRefreshState();
- }
-
- protected final int getListScrollOffset() {
- return mListScrollOffset;
- }
-
- protected abstract long[] getNewestStatusIds();
-
- protected abstract long[] getOldestStatusIds();
-
- protected abstract String getPositionKey();
-
- protected boolean isMyTimeline() {
- return false;
- }
-
- protected abstract void loadMoreStatuses();
-
- protected abstract IStatusesListAdapter newAdapterInstance();
-
- @Override
- protected void onReachedBottom() {
- if (!mLoadMoreAutomatically) return;
- loadMoreStatuses();
- }
-
- protected void savePosition() {
- final int first_visible_position = mListView.getFirstVisiblePosition();
- if (mListView.getChildCount() > 0) {
- final View first_child = mListView.getChildAt(0);
- mListScrollOffset = first_child != null ? first_child.getTop() : 0;
- }
- final long status_id = mAdapter.getStatusId(first_visible_position);
- mPositionManager.setPosition(getPositionKey(), status_id);
- }
-
- protected final void setData(final Data data) {
- mData = data;
- }
-
- protected void setItemSelected(final ParcelableStatus status, final int position, final boolean selected) {
- if (selected) {
- mMultiSelectManager.selectItem(status);
- } else {
- mMultiSelectManager.unselectItem(status);
- }
- if (position >= 0) {
- mListView.setItemChecked(position, selected);
- }
- }
-
- protected void setListHeaderFooters(final StaggeredGridView list) {
-
- }
-
- protected boolean shouldEnablePullToRefresh() {
- return true;
- }
-
- protected abstract boolean shouldShowAccountColor();
-
- protected abstract void updateRefreshState();
-
- private void addReadPosition(final int firstVisibleItem) {
- if (mFirstVisibleItem != firstVisibleItem) {
- mReadPositions.add(firstVisibleItem);
- }
- mFirstVisibleItem = firstVisibleItem;
- }
-
- private void addUnreadCountsToRemove(final long account_id, final long id) {
- if (mUnreadCountsToRemove.containsKey(account_id)) {
- final Set counts = mUnreadCountsToRemove.get(account_id);
- counts.add(id);
- } else {
- final Set counts = new HashSet();
- counts.add(id);
- mUnreadCountsToRemove.put(account_id, counts);
- }
- }
-
- private void openMenu(final View view, final ParcelableStatus status, final int position) {
- mSelectedStatus = status;
- mSelectedPosition = position;
- if (view == null || status == null) return;
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter != null) {
- TwitterWrapper.removeUnreadCounts(getActivity(), getTabPosition(), status.account_id, status.id);
- }
- if (mPopupMenu != null && mPopupMenu.isShowing()) {
- mPopupMenu.dismiss();
- }
- mPopupMenu = PopupMenu.getInstance(getActivity(), view);
- mPopupMenu.inflate(R.menu.action_status);
- final boolean longclickToOpenMenu = mPreferences.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
- final Menu menu = mPopupMenu.getMenu();
- setMenuForStatus(getActivity(), menu, status);
- Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
- mPopupMenu.setOnMenuItemClickListener(this);
- mPopupMenu.show();
- }
-
- private void removeUnreadCounts() {
- if (mRemoveUnreadCountsTask != null && mRemoveUnreadCountsTask.getStatus() == AsyncTask.Status.RUNNING)
- return;
- mRemoveUnreadCountsTask = new RemoveUnreadCountsTask(mReadPositions, this);
- mRemoveUnreadCountsTask.execute();
- }
-
- static class RemoveUnreadCountsTask extends AsyncTask {
- private final List read_positions;
- private final IStatusesListAdapter adapter;
- private final BaseStatusesStaggeredGridFragment fragment;
-
- RemoveUnreadCountsTask(final List read_positions, final BaseStatusesStaggeredGridFragment fragment) {
- this.read_positions = read_positions;
- this.fragment = fragment;
- this.adapter = fragment.getListAdapter();
- }
-
- @Override
- protected Void doInBackground(final Void... params) {
- for (final int pos : read_positions) {
- final long id = adapter.getStatusId(pos), account_id = adapter.getAccountId(pos);
- fragment.addUnreadCountsToRemove(account_id, id);
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(final Void result) {
- final AsyncTwitterWrapper twitter = fragment.getTwitterWrapper();
- if (twitter != null) {
- twitter.removeUnreadCountsAsync(fragment.getTabPosition(), fragment.getUnreadCountsToRemove());
- }
- }
-
- }
-}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java
index 7d39013fd..e5f05fb2b 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java
@@ -114,7 +114,8 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons
@Override
public int getTabPosition() {
- return 0;
+ final Bundle args = getArguments();
+ return args != null ? args.getInt(EXTRA_TAB_POSITION, -1) : -1;
}
@Override
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportStaggeredGridFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportStaggeredGridFragment.java
deleted file mode 100644
index 31bdaebeb..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportStaggeredGridFragment.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Twidere - Twitter client for Android
- *
- * Copyright (C) 2012-2014 Mariotaku Lee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.AbsListView.OnScrollListener;
-
-import com.etsy.android.grid.StaggeredGridView;
-
-import org.mariotaku.twidere.Constants;
-import org.mariotaku.twidere.activity.support.HomeActivity;
-import org.mariotaku.twidere.app.TwidereApplication;
-import org.mariotaku.twidere.fragment.iface.IBaseFragment;
-import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
-import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
-import org.mariotaku.twidere.util.AsyncTwitterWrapper;
-import org.mariotaku.twidere.util.MultiSelectManager;
-import org.mariotaku.twidere.util.Utils;
-
-public class BaseSupportStaggeredGridFragment extends StaggeredGridFragment implements IBaseFragment, Constants,
- OnScrollListener, RefreshScrollTopInterface {
-
- private boolean mActivityFirstCreated;
- private boolean mIsInstanceStateSaved;
- private boolean mReachedBottom, mNotReachedBottomBefore = true;
-
- @Override
- public void requestFitSystemWindows() {
- final Activity activity = getActivity();
- final Fragment parentFragment = getParentFragment();
- final SystemWindowsInsetsCallback callback;
- if (parentFragment instanceof SystemWindowsInsetsCallback) {
- callback = (SystemWindowsInsetsCallback) parentFragment;
- } else if (activity instanceof SystemWindowsInsetsCallback) {
- callback = (SystemWindowsInsetsCallback) activity;
- } else {
- return;
- }
- final Rect insets = new Rect();
- if (callback.getSystemWindowsInsets(insets)) {
- fitSystemWindows(insets);
- }
- }
-
- protected void fitSystemWindows(Rect insets) {
-
- }
-
- public final TwidereApplication getApplication() {
- return TwidereApplication.getInstance(getActivity());
- }
-
- public final ContentResolver getContentResolver() {
- final Activity activity = getActivity();
- if (activity != null) return activity.getContentResolver();
- return null;
- }
-
- @Override
- public Bundle getExtraConfiguration() {
- final Bundle args = getArguments();
- final Bundle extras = new Bundle();
- if (args != null && args.containsKey(EXTRA_EXTRAS)) {
- extras.putAll(args.getBundle(EXTRA_EXTRAS));
- }
- return extras;
- }
-
- public final MultiSelectManager getMultiSelectManager() {
- return getApplication() != null ? getApplication().getMultiSelectManager() : null;
- }
-
- public final SharedPreferences getSharedPreferences(final String name, final int mode) {
- final Activity activity = getActivity();
- if (activity != null) return activity.getSharedPreferences(name, mode);
- return null;
- }
-
- public final Object getSystemService(final String name) {
- final Activity activity = getActivity();
- if (activity != null) return activity.getSystemService(name);
- return null;
- }
-
- @Override
- public final int getTabPosition() {
- final Bundle args = getArguments();
- return args != null ? args.getInt(EXTRA_TAB_POSITION, -1) : -1;
- }
-
- public AsyncTwitterWrapper getTwitterWrapper() {
- return getApplication() != null ? getApplication().getTwitterWrapper() : null;
- }
-
- public void invalidateOptionsMenu() {
- final Activity activity = getActivity();
- if (activity == null) return;
- activity.invalidateOptionsMenu();
- }
-
- public boolean isActivityFirstCreated() {
- return mActivityFirstCreated;
- }
-
- public boolean isInstanceStateSaved() {
- return mIsInstanceStateSaved;
- }
-
- public boolean isReachedBottom() {
- return mReachedBottom;
- }
-
- @Override
- public void onActivityCreated(final Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- mIsInstanceStateSaved = savedInstanceState != null;
- final StaggeredGridView lv = getListView();
- lv.setOnScrollListener(this);
- }
-
- @Override
- public void onAttach(final Activity activity) {
- super.onAttach(activity);
- }
-
- @Override
- public void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mActivityFirstCreated = true;
- }
-
- @Override
- public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
- return super.onCreateView(inflater, container, savedInstanceState);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mActivityFirstCreated = true;
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
- final Fragment fragment = getParentFragment();
- if (fragment instanceof SupportFragmentCallback) {
- ((SupportFragmentCallback) fragment).onDetachFragment(this);
- }
- final Activity activity = getActivity();
- if (activity instanceof SupportFragmentCallback) {
- ((SupportFragmentCallback) activity).onDetachFragment(this);
- }
- }
-
- public void onPostStart() {
- }
-
- @Override
- public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
- final int totalItemCount) {
- final boolean reached = firstVisibleItem + visibleItemCount >= totalItemCount
- && totalItemCount >= visibleItemCount;
-
- if (mReachedBottom != reached) {
- mReachedBottom = reached;
- if (mReachedBottom && mNotReachedBottomBefore) {
- mNotReachedBottomBefore = false;
- return;
- }
- if (mReachedBottom && getListAdapter().getCount() > visibleItemCount) {
- onReachedBottom();
- }
- }
-
- }
-
- @Override
- public void onScrollStateChanged(final AbsListView view, final int scrollState) {
-
- }
-
- @Override
- public void onStart() {
- super.onStart();
- onPostStart();
- }
-
- @Override
- public void onStop() {
- mActivityFirstCreated = false;
- super.onStop();
- }
-
- public void registerReceiver(final BroadcastReceiver receiver, final IntentFilter filter) {
- final Activity activity = getActivity();
- if (activity == null) return;
- activity.registerReceiver(receiver, filter);
- }
-
- @Override
- public boolean scrollToStart() {
- if (!isAdded() || getActivity() == null) return false;
- Utils.scrollListToTop(getListView());
- return true;
- }
-
- public void setProgressBarIndeterminateVisibility(final boolean visible) {
- final Activity activity = getActivity();
- if (activity == null) return;
- activity.setProgressBarIndeterminateVisibility(visible);
- if (activity instanceof HomeActivity) {
- ((HomeActivity) activity).setHomeProgressBarIndeterminateVisibility(visible);
- }
- }
-
- @Override
- public void setSelection(final int position) {
- Utils.scrollListToPosition(getListView(), position);
- }
-
- @Override
- public void setUserVisibleHint(final boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
- final Activity activity = getActivity();
- final Fragment fragment = getParentFragment();
- if (fragment instanceof SupportFragmentCallback) {
- ((SupportFragmentCallback) fragment).onSetUserVisibleHint(this, isVisibleToUser);
- }
- if (activity instanceof SupportFragmentCallback) {
- ((SupportFragmentCallback) activity).onSetUserVisibleHint(this, isVisibleToUser);
- }
- }
-
- @Override
- public boolean triggerRefresh() {
- return false;
- }
-
- public void unregisterReceiver(final BroadcastReceiver receiver) {
- final Activity activity = getActivity();
- if (activity == null) return;
- activity.unregisterReceiver(receiver);
- }
-
- protected void onReachedBottom() {
-
- }
-}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesFragment.java
index bbfb7fad6..36bd80190 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesFragment.java
@@ -20,18 +20,134 @@
package org.mariotaku.twidere.fragment.support;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import org.mariotaku.querybuilder.Columns.Column;
+import org.mariotaku.querybuilder.Expression;
+import org.mariotaku.querybuilder.RawItemArray;
import org.mariotaku.twidere.adapter.CursorStatusesAdapter;
+import org.mariotaku.twidere.provider.TweetStore.Statuses;
+import org.mariotaku.twidere.task.AsyncTask;
+import org.mariotaku.twidere.util.Utils;
+
+import static org.mariotaku.twidere.util.Utils.buildStatusFilterWhereClause;
+import static org.mariotaku.twidere.util.Utils.getNewestStatusIdsFromDatabase;
+import static org.mariotaku.twidere.util.Utils.getOldestStatusIdsFromDatabase;
+import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
+import static org.mariotaku.twidere.util.Utils.shouldEnableFiltersForRTs;
/**
* Created by mariotaku on 14/12/3.
*/
public abstract class CursorStatusesFragment extends AbsStatusesFragment {
+
+ public abstract Uri getContentUri();
+
+ @Override
+ public Loader onCreateLoader(int id, Bundle args) {
+ final Context context = getActivity();
+ final Uri uri = getContentUri();
+ final String table = getTableNameByUri(uri);
+ final String sortOrder = getSortOrder();
+ final long[] accountIds = getAccountIds();
+ final Expression accountWhere = Expression.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(accountIds));
+ final Expression filterWhere = getFiltersWhere(table), where;
+ if (filterWhere != null) {
+ where = Expression.and(accountWhere, filterWhere);
+ } else {
+ where = accountWhere;
+ }
+ final String selection = processWhere(where).getSQL();
+ return new CursorLoader(context, uri, Statuses.COLUMNS, selection, null, sortOrder);
+ }
+
+ @Override
+ public boolean triggerRefresh() {
+ new AsyncTask() {
+
+ @Override
+ protected long[][] doInBackground(final Void... params) {
+ final long[][] result = new long[3][];
+ result[0] = getAccountIds();
+ result[2] = getNewestStatusIds(result[0]);
+ return result;
+ }
+
+ @Override
+ protected void onPostExecute(final long[][] result) {
+ getStatuses(result[0], result[1], result[2]);
+ }
+
+ }.execute();
+ return true;
+ }
+
+ @Override
+ protected long[] getAccountIds() {
+ final Bundle args = getArguments();
+ if (args != null && args.getLong(EXTRA_ACCOUNT_ID) > 0) {
+ return new long[]{args.getLong(EXTRA_ACCOUNT_ID)};
+ }
+ return Utils.getActivatedAccountIds(getActivity());
+ }
+
+ protected abstract int getNotificationType();
+
@Override
protected CursorStatusesAdapter onCreateAdapter(final Context context, final boolean compact) {
return new CursorStatusesAdapter(context, compact);
}
+ @Override
+ protected void onLoadMoreStatuses() {
+ new AsyncTask() {
+
+ @Override
+ protected long[][] doInBackground(final Void... params) {
+ final long[][] result = new long[3][];
+ result[0] = getAccountIds();
+ result[1] = getOldestStatusIds(result[0]);
+ return result;
+ }
+
+ @Override
+ protected void onPostExecute(final long[][] result) {
+ getStatuses(result[0], result[1], result[2]);
+ }
+
+ }.execute();
+ }
+
+ protected Expression getFiltersWhere(String table) {
+ if (!isFilterEnabled()) return null;
+ return buildStatusFilterWhereClause(table, null, shouldEnableFiltersForRTs(getActivity()));
+ }
+
+ protected abstract boolean isFilterEnabled();
+
+ protected long[] getNewestStatusIds(long[] accountIds) {
+ return getNewestStatusIdsFromDatabase(getActivity(), getContentUri(), accountIds);
+ }
+
+ protected long[] getOldestStatusIds(long[] accountIds) {
+ return getOldestStatusIdsFromDatabase(getActivity(), getContentUri(), accountIds);
+ }
+
+ protected Expression processWhere(final Expression where) {
+ return where;
+ }
+
+ private String getSortOrder() {
+ final SharedPreferences preferences = getSharedPreferences();
+ final boolean sortById = preferences.getBoolean(KEY_SORT_TIMELINE_BY_ID, false);
+ return sortById ? Statuses.SORT_ORDER_STATUS_ID_DESC : Statuses.SORT_ORDER_TIMESTAMP_DESC;
+ }
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesListFragment.java
deleted file mode 100644
index 3a033d600..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesListFragment.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Twidere - Twitter client for Android
- *
- * Copyright (C) 2012-2014 Mariotaku Lee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import android.widget.AbsListView;
-
-import org.mariotaku.querybuilder.Columns.Column;
-import org.mariotaku.querybuilder.RawItemArray;
-import org.mariotaku.querybuilder.Where;
-import org.mariotaku.twidere.R;
-import org.mariotaku.twidere.activity.support.HomeActivity;
-import org.mariotaku.twidere.adapter.CursorStatusesListAdapter;
-import org.mariotaku.twidere.provider.TweetStore.Accounts;
-import org.mariotaku.twidere.provider.TweetStore.Filters;
-import org.mariotaku.twidere.provider.TweetStore.Statuses;
-import org.mariotaku.twidere.task.AsyncTask;
-import org.mariotaku.twidere.util.AsyncTwitterWrapper;
-import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver;
-
-import static org.mariotaku.twidere.util.Utils.buildStatusFilterWhereClause;
-import static org.mariotaku.twidere.util.Utils.getActivatedAccountIds;
-import static org.mariotaku.twidere.util.Utils.getNewestStatusIdsFromDatabase;
-import static org.mariotaku.twidere.util.Utils.getOldestStatusIdsFromDatabase;
-import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
-import static org.mariotaku.twidere.util.Utils.shouldEnableFiltersForRTs;
-
-public abstract class CursorStatusesListFragment extends BaseStatusesListFragment {
-
- private final SupportFragmentReloadCursorObserver mReloadContentObserver = new SupportFragmentReloadCursorObserver(
- this, 0, this);
-
- public HomeActivity getHomeActivity() {
- final Activity activity = getActivity();
- if (activity instanceof HomeActivity) return (HomeActivity) activity;
- return null;
- }
-
- @Override
- public void onActivityCreated(final Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- getListAdapter().setFiltersEnabled(isFiltersEnabled());
- }
-
- @Override
- public Loader onCreateLoader(final int id, final Bundle args) {
- final Context context = getActivity();
- final SharedPreferences preferences = getSharedPreferences();
- final boolean sortById = preferences.getBoolean(KEY_SORT_TIMELINE_BY_ID, false);
- final Uri uri = getContentUri();
- final String table = getTableNameByUri(uri);
- final String sortOrder = sortById ? Statuses.SORT_ORDER_STATUS_ID_DESC : Statuses.SORT_ORDER_TIMESTAMP_DESC;
- final long accountId = getAccountId();
- final long[] accountIds = accountId > 0 ? new long[]{accountId} : getActivatedAccountIds(context);
- final boolean noAccountSelected = accountIds.length == 0;
- setEmptyText(noAccountSelected ? getString(R.string.no_account_selected) : null);
- if (!noAccountSelected) {
- getListView().setEmptyView(null);
- }
- final Where accountWhere = Where.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(accountIds));
- final Where where;
- if (isFiltersEnabled()) {
- final Where filterWhere = new Where(buildStatusFilterWhereClause(table, null,
- shouldEnableFiltersForRTs(context)));
- where = Where.and(accountWhere, filterWhere);
- } else {
- where = accountWhere;
- }
- final String selection = processWhere(where).getSQL();
- return new CursorLoader(context, uri, CursorStatusesListAdapter.CURSOR_COLS, selection, null, sortOrder);
- }
-
- @Override
- public void onRefreshFromStart() {
- if (isRefreshing()) return;
- savePosition();
- new AsyncTask() {
-
- @Override
- protected long[][] doInBackground(final Void... params) {
- final long[][] result = new long[3][];
- final long account_id = getAccountId();
- result[0] = account_id > 0 ? new long[]{account_id} : getActivatedAccountIds(getActivity());
- result[2] = getNewestStatusIds();
- return result;
- }
-
- @Override
- protected void onPostExecute(final long[][] result) {
- getStatuses(result[0], result[1], result[2]);
- }
-
- }.execute();
- }
-
- @Override
- public void onRestart() {
- super.onRestart();
- getLoaderManager().restartLoader(0, getArguments(), this);
- }
-
- @Override
- public void onScrollStateChanged(final AbsListView view, final int scrollState) {
- super.onScrollStateChanged(view, scrollState);
- switch (scrollState) {
- case SCROLL_STATE_FLING:
- case SCROLL_STATE_TOUCH_SCROLL: {
- break;
- }
- case SCROLL_STATE_IDLE: {
- savePosition();
- break;
- }
- }
- }
-
- @Override
- public void onStart() {
- super.onStart();
- final ContentResolver resolver = getContentResolver();
- resolver.registerContentObserver(Filters.CONTENT_URI, true, mReloadContentObserver);
- if (getAccountId() <= 0) {
- resolver.registerContentObserver(Accounts.CONTENT_URI, true, mReloadContentObserver);
- }
- }
-
- @Override
- public void onStop() {
- savePosition();
- final ContentResolver resolver = getContentResolver();
- resolver.unregisterContentObserver(mReloadContentObserver);
- super.onStop();
- }
-
- protected long getAccountId() {
- final Bundle args = getArguments();
- return args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
- }
-
- protected abstract Uri getContentUri();
-
- @Override
- protected long[] getNewestStatusIds() {
- final long account_id = getAccountId();
- final long[] account_ids = account_id > 0 ? new long[]{account_id} : getActivatedAccountIds(getActivity());
- return getNewestStatusIdsFromDatabase(getActivity(), getContentUri(), account_ids);
- }
-
- protected abstract int getNotificationType();
-
- @Override
- protected long[] getOldestStatusIds() {
- final long account_id = getAccountId();
- final long[] account_ids = account_id > 0 ? new long[]{account_id} : getActivatedAccountIds(getActivity());
- return getOldestStatusIdsFromDatabase(getActivity(), getContentUri(), account_ids);
- }
-
- protected abstract boolean isFiltersEnabled();
-
- @Override
- protected void loadMoreStatuses() {
- if (isRefreshing()) return;
- savePosition();
- new AsyncTask() {
-
- @Override
- protected long[][] doInBackground(final Void... params) {
- final long[][] result = new long[3][];
- final long account_id = getAccountId();
- result[0] = account_id > 0 ? new long[]{account_id} : getActivatedAccountIds(getActivity());
- result[1] = getOldestStatusIds();
- return result;
- }
-
- @Override
- protected void onPostExecute(final long[][] result) {
- getStatuses(result[0], result[1], result[2]);
- }
-
- }.execute();
- }
-
- @Override
- protected CursorStatusesListAdapter newAdapterInstance(final boolean compact) {
- return new CursorStatusesListAdapter(getActivity(), compact);
- }
-
- @Override
- protected void onListTouched() {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter != null) {
- twitter.clearNotificationAsync(getNotificationType(), getAccountId());
- }
- }
-
- protected Where processWhere(final Where where) {
- return where;
- }
-
- @Override
- protected boolean shouldShowAccountColor() {
- return getAccountId() <= 0 && getActivatedAccountIds(getActivity()).length > 1;
- }
-}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesStaggeredGridFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesStaggeredGridFragment.java
deleted file mode 100644
index 990c887f3..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/CursorStatusesStaggeredGridFragment.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Twidere - Twitter client for Android
- *
- * Copyright (C) 2012-2014 Mariotaku Lee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import static org.mariotaku.twidere.util.Utils.buildStatusFilterWhereClause;
-import static org.mariotaku.twidere.util.Utils.getActivatedAccountIds;
-import static org.mariotaku.twidere.util.Utils.getNewestStatusIdsFromDatabase;
-import static org.mariotaku.twidere.util.Utils.getOldestStatusIdsFromDatabase;
-import static org.mariotaku.twidere.util.Utils.getTableNameByUri;
-import static org.mariotaku.twidere.util.Utils.shouldEnableFiltersForRTs;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import android.widget.AbsListView;
-
-import org.mariotaku.querybuilder.Columns.Column;
-import org.mariotaku.querybuilder.RawItemArray;
-import org.mariotaku.querybuilder.Where;
-import org.mariotaku.twidere.R;
-import org.mariotaku.twidere.activity.support.HomeActivity;
-import org.mariotaku.twidere.adapter.CursorStatusesListAdapter;
-import org.mariotaku.twidere.provider.TweetStore.Accounts;
-import org.mariotaku.twidere.provider.TweetStore.Filters;
-import org.mariotaku.twidere.provider.TweetStore.Statuses;
-import org.mariotaku.twidere.task.AsyncTask;
-import org.mariotaku.twidere.util.AsyncTwitterWrapper;
-import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver;
-
-public abstract class CursorStatusesStaggeredGridFragment extends BaseStatusesStaggeredGridFragment {
-
- private final SupportFragmentReloadCursorObserver mReloadContentObserver = new SupportFragmentReloadCursorObserver(
- this, 0, this);
-
- public HomeActivity getHomeActivity() {
- final Activity activity = getActivity();
- if (activity instanceof HomeActivity) return (HomeActivity) activity;
- return null;
- }
-
- @Override
- public void onActivityCreated(final Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- getListAdapter().setFiltersEnabled(isFiltersEnabled());
- }
-
- @Override
- public Loader onCreateLoader(final int id, final Bundle args) {
- final Uri uri = getContentUri();
- final String table = getTableNameByUri(uri);
- final String sort_by = Statuses.DEFAULT_SORT_ORDER;
- final long account_id = getAccountId();
- final long[] account_ids = account_id > 0 ? new long[] { account_id } : getActivatedAccountIds(getActivity());
- final boolean no_account_selected = account_ids.length == 0;
- setEmptyText(no_account_selected ? getString(R.string.no_account_selected) : null);
- if (!no_account_selected) {
- getListView().setEmptyView(null);
- }
- final Where accountWhere = Where.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(account_ids));
- final Where where;
- if (isFiltersEnabled()) {
- final Where filterWhere = new Where(buildStatusFilterWhereClause(table, null,
- shouldEnableFiltersForRTs(getActivity())));
- where = Where.and(accountWhere, filterWhere);
- } else {
- where = accountWhere;
- }
- return new CursorLoader(getActivity(), uri, CursorStatusesListAdapter.CURSOR_COLS, where.getSQL(), null, sort_by);
- }
-
- @Override
- public void onRefreshFromStart() {
- if (isRefreshing()) return;
- savePosition();
- new AsyncTask() {
-
- @Override
- protected long[][] doInBackground(final Void... params) {
- final long[][] result = new long[3][];
- final long account_id = getAccountId();
- result[0] = account_id > 0 ? new long[] { account_id } : getActivatedAccountIds(getActivity());
- result[2] = getNewestStatusIds();
- return result;
- }
-
- @Override
- protected void onPostExecute(final long[][] result) {
- getStatuses(result[0], result[1], result[2]);
- }
-
- }.execute();
- }
-
- @Override
- public void onScrollStateChanged(final AbsListView view, final int scrollState) {
- super.onScrollStateChanged(view, scrollState);
- switch (scrollState) {
- case SCROLL_STATE_FLING:
- case SCROLL_STATE_TOUCH_SCROLL: {
- break;
- }
- case SCROLL_STATE_IDLE: {
- savePosition();
- break;
- }
- }
- }
-
- @Override
- public void onStart() {
- super.onStart();
- final ContentResolver resolver = getContentResolver();
- resolver.registerContentObserver(Filters.CONTENT_URI, true, mReloadContentObserver);
- if (getAccountId() <= 0) {
- resolver.registerContentObserver(Accounts.CONTENT_URI, true, mReloadContentObserver);
- }
- }
-
- @Override
- public void onStop() {
- savePosition();
- final ContentResolver resolver = getContentResolver();
- resolver.unregisterContentObserver(mReloadContentObserver);
- super.onStop();
- }
-
- protected long getAccountId() {
- final Bundle args = getArguments();
- return args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
- }
-
- protected abstract Uri getContentUri();
-
- @Override
- protected long[] getNewestStatusIds() {
- final long account_id = getAccountId();
- final long[] account_ids = account_id > 0 ? new long[] { account_id } : getActivatedAccountIds(getActivity());
- return getNewestStatusIdsFromDatabase(getActivity(), getContentUri(), account_ids);
- }
-
- protected abstract int getNotificationType();
-
- @Override
- protected long[] getOldestStatusIds() {
- final long account_id = getAccountId();
- final long[] account_ids = account_id > 0 ? new long[] { account_id } : getActivatedAccountIds(getActivity());
- return getOldestStatusIdsFromDatabase(getActivity(), getContentUri(), account_ids);
- }
-
- protected abstract boolean isFiltersEnabled();
-
- @Override
- protected void loadMoreStatuses() {
- if (isRefreshing()) return;
- savePosition();
- new AsyncTask() {
-
- @Override
- protected long[][] doInBackground(final Void... params) {
- final long[][] result = new long[3][];
- final long account_id = getAccountId();
- result[0] = account_id > 0 ? new long[] { account_id } : getActivatedAccountIds(getActivity());
- result[1] = getOldestStatusIds();
- return result;
- }
-
- @Override
- protected void onPostExecute(final long[][] result) {
- getStatuses(result[0], result[1], result[2]);
- }
-
- }.execute();
- }
-
- @Override
- protected CursorStatusesListAdapter newAdapterInstance() {
- return new CursorStatusesListAdapter(getActivity());
- }
-
- @Override
- protected void onListTouched() {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter != null) {
- twitter.clearNotificationAsync(getNotificationType(), getAccountId());
- }
- }
-
- @Override
- protected boolean shouldShowAccountColor() {
- return getAccountId() <= 0 && getActivatedAccountIds(getActivity()).length > 1;
- }
-}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java
index c58a68713..0ed3fa44e 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesConversationFragment.java
@@ -64,7 +64,7 @@ import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter;
import org.mariotaku.twidere.adapter.DirectMessagesConversationAdapter;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
import org.mariotaku.twidere.app.TwidereApplication;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.provider.TweetStore;
@@ -134,7 +134,7 @@ public class DirectMessagesConversationFragment extends BasePullToRefreshListFra
}
};
- private Account mSender;
+ private ParcelableAccount mSender;
private ParcelableUser mRecipient;
private ImageLoaderWrapper mImageLoader;
private IColorLabelView mProfileImageContainer;
@@ -174,7 +174,7 @@ public class DirectMessagesConversationFragment extends BasePullToRefreshListFra
}
mEditText.addTextChangedListener(this);
- final List accounts = Account.getAccountsList(getActivity(), false);
+ final List accounts = ParcelableAccount.getAccountsList(getActivity(), false);
mAccountSpinner.setAdapter(new AccountsSpinnerAdapter(getActivity(), accounts));
mAccountSpinner.setOnItemSelectedListener(this);
@@ -331,7 +331,7 @@ public class DirectMessagesConversationFragment extends BasePullToRefreshListFra
@Override
public void onItemSelected(final AdapterView> parent, final View view, final int pos, final long id) {
- final Account account = (Account) mAccountSpinner.getSelectedItem();
+ final ParcelableAccount account = (ParcelableAccount) mAccountSpinner.getSelectedItem();
if (account != null) {
mAccountId = account.account_id;
mSender = account;
@@ -487,7 +487,7 @@ public class DirectMessagesConversationFragment extends BasePullToRefreshListFra
mAccountId = accountId;
mRecipientId = recipientId;
final Context context = getActivity();
- mSender = Account.getAccount(context, accountId);
+ mSender = ParcelableAccount.getAccount(context, accountId);
mRecipient = Utils.getUserForConversation(context, accountId, recipientId);
final LoaderManager lm = getLoaderManager();
final Bundle args = new Bundle();
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java
index 9c5e829cc..a9b099fca 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java
@@ -37,8 +37,8 @@ import android.widget.AbsListView;
import android.widget.ListView;
import org.mariotaku.querybuilder.Columns.Column;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.RawItemArray;
-import org.mariotaku.querybuilder.Where;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.DirectMessageConversationEntriesAdapter;
import org.mariotaku.twidere.provider.TweetStore.Accounts;
@@ -112,10 +112,7 @@ public class DirectMessagesFragment extends BasePullToRefreshListFragment implem
mAdapter = new DirectMessageConversationEntriesAdapter(getActivity());
setListAdapter(mAdapter);
mListView = getListView();
- if (!mPreferences.getBoolean(KEY_COMPACT_CARDS, false)) {
- mListView.setDivider(null);
- }
- mListView.setSelector(android.R.color.transparent);
+ mListView.setDivider(null);
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@@ -130,7 +127,7 @@ public class DirectMessagesFragment extends BasePullToRefreshListFragment implem
if (!no_account_selected) {
getListView().setEmptyView(null);
}
- final Where account_where = Where.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(account_ids));
+ final Expression account_where = Expression.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(account_ids));
return new CursorLoader(getActivity(), uri, null, account_where.getSQL(), null, null);
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/HomeTimelineFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/HomeTimelineFragment.java
index 7049822fd..5c05b7122 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/HomeTimelineFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/HomeTimelineFragment.java
@@ -19,33 +19,61 @@
package org.mariotaku.twidere.fragment.support;
-import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.SharedPreferences;
-import android.database.Cursor;
import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import org.mariotaku.twidere.adapter.CursorStatusesListAdapter;
import org.mariotaku.twidere.provider.TweetStore.Statuses;
+import org.mariotaku.twidere.util.AsyncTwitterWrapper;
/**
* Created by mariotaku on 14/12/3.
*/
public class HomeTimelineFragment extends CursorStatusesFragment {
+
@Override
- public int getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) {
- return 0;
+ public Uri getContentUri() {
+ return Statuses.CONTENT_URI;
}
@Override
- public Loader onCreateLoader(int id, Bundle args) {
- final Context context = getActivity();
- final Uri uri = Statuses.CONTENT_URI;
- final SharedPreferences preferences = getSharedPreferences();
- final boolean sortById = preferences.getBoolean(KEY_SORT_TIMELINE_BY_ID, false);
- final String sortOrder = sortById ? Statuses.SORT_ORDER_STATUS_ID_DESC : Statuses.SORT_ORDER_TIMESTAMP_DESC;
- return new CursorLoader(context, uri, CursorStatusesListAdapter.CURSOR_COLS, null, null, sortOrder);
+ protected int getNotificationType() {
+ return NOTIFICATION_ID_HOME_TIMELINE;
}
+
+ @Override
+ protected boolean isFilterEnabled() {
+ final SharedPreferences pref = getSharedPreferences();
+ return pref != null && pref.getBoolean(KEY_FILTERS_IN_HOME_TIMELINE, true);
+ }
+
+ @Override
+ public int getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) {
+ final AsyncTwitterWrapper twitter = getTwitterWrapper();
+ if (twitter == null) return -1;
+ return twitter.getHomeTimelineAsync(accountIds, maxIds, sinceIds);
+ }
+
+ @Override
+ protected void onReceivedBroadcast(Intent intent, String action) {
+ switch (action) {
+ case BROADCAST_TASK_STATE_CHANGED: {
+ updateRefreshState();
+ break;
+ }
+ }
+ }
+
+ @Override
+ protected void onSetIntentFilter(IntentFilter filter) {
+ filter.addAction(BROADCAST_TASK_STATE_CHANGED);
+ }
+
+ private void updateRefreshState() {
+ final AsyncTwitterWrapper twitter = getTwitterWrapper();
+ if (twitter == null) return;
+ setRefreshing(twitter.isHomeTimelineRefreshing());
+ }
+
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/HomeTimelineListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/HomeTimelineListFragment.java
deleted file mode 100644
index 363c586c7..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/HomeTimelineListFragment.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Twidere - Twitter client for Android
- *
- * Copyright (C) 2012-2014 Mariotaku Lee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.net.Uri;
-
-import org.mariotaku.twidere.provider.TweetStore.Statuses;
-import org.mariotaku.twidere.util.AsyncTwitterWrapper;
-
-public class HomeTimelineListFragment extends CursorStatusesListFragment {
-
- private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() {
-
- @Override
- public void onReceive(final Context context, final Intent intent) {
- if (getActivity() == null || !isAdded() || isDetached()) return;
- final String action = intent.getAction();
- if (BROADCAST_HOME_TIMELINE_REFRESHED.equals(action)) {
- setRefreshComplete();
- } else if (BROADCAST_TASK_STATE_CHANGED.equals(action)) {
- updateRefreshState();
- }
- }
- };
-
- @Override
- public int getStatuses(final long[] accountIds, final long[] maxIds, final long[] sinceIds) {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter == null) return 0;
- if (maxIds == null) return twitter.refreshAll(accountIds);
- return twitter.getHomeTimelineAsync(accountIds, maxIds, sinceIds);
- }
-
- @Override
- public void onStart() {
- super.onStart();
- final IntentFilter filter = new IntentFilter(BROADCAST_HOME_TIMELINE_REFRESHED);
- filter.addAction(BROADCAST_TASK_STATE_CHANGED);
- registerReceiver(mStatusReceiver, filter);
- }
-
- @Override
- public void onStop() {
- unregisterReceiver(mStatusReceiver);
- super.onStop();
- }
-
- @Override
- protected Uri getContentUri() {
- return Statuses.CONTENT_URI;
- }
-
- @Override
- protected int getNotificationType() {
- return NOTIFICATION_ID_HOME_TIMELINE;
- }
-
- @Override
- protected String getPositionKey() {
- return "home_timeline" + getTabPosition();
- }
-
- @Override
- protected boolean isFiltersEnabled() {
- final SharedPreferences pref = getSharedPreferences();
- return pref != null && pref.getBoolean(KEY_FILTERS_IN_HOME_TIMELINE, true);
- }
-
- @Override
- protected void updateRefreshState() {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter == null || !getUserVisibleHint() || getActivity() == null) return;
- setRefreshing(twitter.isHomeTimelineRefreshing());
- }
-
-}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/IncomingFriendshipsMenuDialogFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/IncomingFriendshipsMenuDialogFragment.java
index a37ab1180..a0895d954 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/IncomingFriendshipsMenuDialogFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/IncomingFriendshipsMenuDialogFragment.java
@@ -5,8 +5,8 @@ import android.view.Menu;
import android.view.MenuInflater;
import org.mariotaku.twidere.R;
-import org.mariotaku.twidere.model.Account;
-import org.mariotaku.twidere.model.Account.AccountWithCredentials;
+import org.mariotaku.twidere.model.ParcelableAccount;
+import org.mariotaku.twidere.model.ParcelableAccount.ParcelableAccountWithCredentials;
import org.mariotaku.twidere.model.ParcelableUser;
public class IncomingFriendshipsMenuDialogFragment extends UserMenuDialogFragment {
@@ -14,8 +14,8 @@ public class IncomingFriendshipsMenuDialogFragment extends UserMenuDialogFragmen
@Override
protected void onPrepareItemMenu(final Menu menu, final ParcelableUser user) {
final Context context = getThemedContext();
- final AccountWithCredentials account = Account.getAccountWithCredentials(context, user.account_id);
- if (AccountWithCredentials.isOfficialCredentials(context, account)) {
+ final ParcelableAccountWithCredentials account = ParcelableAccount.getAccountWithCredentials(context, user.account_id);
+ if (ParcelableAccountWithCredentials.isOfficialCredentials(context, account)) {
final MenuInflater inflater = new MenuInflater(context);
inflater.inflate(R.menu.action_incoming_friendship, menu);
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MentionsTimelineFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MentionsTimelineFragment.java
index cdff2cf92..18b037f8b 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MentionsTimelineFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MentionsTimelineFragment.java
@@ -1,18 +1,18 @@
/*
- * Twidere - Twitter client for Android
- *
+ * Twidere - Twitter client for Android
+ *
* Copyright (C) 2012-2014 Mariotaku Lee
- *
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
@@ -25,89 +25,57 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.Uri;
-import android.os.Bundle;
-import org.mariotaku.querybuilder.Where;
import org.mariotaku.twidere.provider.TweetStore.Mentions;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
-public class MentionsTimelineFragment extends CursorStatusesListFragment {
+/**
+ * Created by mariotaku on 14/12/3.
+ */
+public class MentionsTimelineFragment extends CursorStatusesFragment {
- private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() {
+ @Override
+ public Uri getContentUri() {
+ return Mentions.CONTENT_URI;
+ }
- @Override
- public void onReceive(final Context context, final Intent intent) {
- if (getActivity() == null || !isAdded() || isDetached()) return;
- final String action = intent.getAction();
- if (BROADCAST_MENTIONS_REFRESHED.equals(action)) {
- setRefreshComplete();
- } else if (BROADCAST_TASK_STATE_CHANGED.equals(action)) {
- updateRefreshState();
- }
- }
- };
+ @Override
+ protected int getNotificationType() {
+ return NOTIFICATION_ID_MENTIONS_TIMELINE;
+ }
- @Override
- public int getStatuses(final long[] account_ids, final long[] max_ids, final long[] since_ids) {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter == null) return -1;
- return twitter.getMentionsAsync(account_ids, max_ids, since_ids);
- }
+ @Override
+ protected boolean isFilterEnabled() {
+ final SharedPreferences pref = getSharedPreferences();
+ return pref != null && pref.getBoolean(KEY_FILTERS_IN_MENTIONS_TIMELINE, true);
+ }
- @Override
- public void onActivityCreated(final Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- getListAdapter().setMentionsHightlightDisabled(true);
- }
+ @Override
+ public int getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) {
+ final AsyncTwitterWrapper twitter = getTwitterWrapper();
+ if (twitter == null) return -1;
+ return twitter.getMentionsTimelineAsync(accountIds, maxIds, sinceIds);
+ }
- @Override
- public void onStart() {
- super.onStart();
- final IntentFilter filter = new IntentFilter(BROADCAST_MENTIONS_REFRESHED);
- filter.addAction(BROADCAST_TASK_STATE_CHANGED);
- registerReceiver(mStatusReceiver, filter);
- }
+ @Override
+ protected void onReceivedBroadcast(Intent intent, String action) {
+ switch (action) {
+ case BROADCAST_TASK_STATE_CHANGED: {
+ updateRefreshState();
+ break;
+ }
+ }
+ }
- @Override
- public void onStop() {
- unregisterReceiver(mStatusReceiver);
- super.onStop();
- }
+ @Override
+ protected void onSetIntentFilter(IntentFilter filter) {
+ filter.addAction(BROADCAST_TASK_STATE_CHANGED);
+ }
- @Override
- protected Uri getContentUri() {
- return Mentions.CONTENT_URI;
- }
-
- @Override
- protected int getNotificationType() {
- return NOTIFICATION_ID_MENTIONS;
- }
-
- @Override
- protected String getPositionKey() {
- return "mentions_timeline" + getTabPosition();
- }
-
- @Override
- protected boolean isFiltersEnabled() {
- final SharedPreferences pref = getSharedPreferences();
- return pref != null && pref.getBoolean(KEY_FILTERS_IN_MENTIONS, true);
- }
-
- @Override
- protected Where processWhere(final Where where) {
- final Bundle extras = getExtraConfiguration();
- if (extras.getBoolean(EXTRA_MY_FOLLOWING_ONLY))
- return Where.and(where, Where.equals(Mentions.IS_FOLLOWING, 1));
- return where;
- }
-
- @Override
- protected void updateRefreshState() {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter == null || !getUserVisibleHint()) return;
- setRefreshing(twitter.isMentionsRefreshing());
- }
+ private void updateRefreshState() {
+ final AsyncTwitterWrapper twitter = getTwitterWrapper();
+ if (twitter == null) return;
+ setRefreshing(twitter.isMentionsTimelineRefreshing());
+ }
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesFragment.java
index 912b89864..64f97a0cb 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesFragment.java
@@ -20,11 +20,15 @@
package org.mariotaku.twidere.fragment.support;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.os.Bundle;
import org.mariotaku.twidere.adapter.ParcelableStatusesAdapter;
+import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.model.ParcelableStatus;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -33,8 +37,31 @@ import java.util.List;
public abstract class ParcelableStatusesFragment extends AbsStatusesFragment> {
@Override
- protected ParcelableStatusesAdapter onCreateAdapter(final Context context, final boolean compact) {
- return new ParcelableStatusesAdapter(context, compact);
+ protected void onSetIntentFilter(IntentFilter filter) {
+ filter.addAction(BROADCAST_STATUS_DESTROYED);
+ }
+
+ @Override
+ protected void onReceivedBroadcast(Intent intent, String action) {
+ switch (action) {
+ case BROADCAST_STATUS_DESTROYED: {
+ deleteStatus(intent.getLongExtra(EXTRA_STATUS_ID, -1));
+ break;
+ }
+ }
+ }
+
+ public final void deleteStatus(final long statusId) {
+ final List data = getAdapterData();
+ if (statusId <= 0 || data == null) return;
+ final ArrayList dataToRemove = new ArrayList<>();
+ for (final ParcelableStatus status : data) {
+ if (status.id == statusId || status.retweet_id > 0 && status.retweet_id == statusId) {
+ dataToRemove.add(status);
+ }
+ }
+ data.removeAll(dataToRemove);
+ setAdapterData(data);
}
@Override
@@ -50,4 +77,39 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment> adapter = getAdapter();
+ final long[] maxIds = new long[]{adapter.getStatus(adapter.getStatusCount() - 1).id};
+ getStatuses(null, maxIds, null);
+ }
+
+ @Override
+ public boolean triggerRefresh() {
+ final IStatusesAdapter> adapter = getAdapter();
+ final long[] accountIds = getAccountIds();
+ if (adapter.getStatusCount() > 0) {
+ final long[] sinceIds = new long[]{adapter.getStatus(0).id};
+ getStatuses(accountIds, null, sinceIds);
+ } else {
+ getStatuses(accountIds, null, null);
+ }
+ return true;
+ }
+
+ protected long getAccountId() {
+ final Bundle args = getArguments();
+ return args != null ? args.getLong(EXTRA_ACCOUNT_ID, -1) : -1;
+ }
+
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesListFragment.java
index be00e9690..954fbfd29 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesListFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ParcelableStatusesListFragment.java
@@ -58,7 +58,7 @@ public abstract class ParcelableStatusesListFragment extends BaseStatusesListFra
if (statusId > 0) {
deleteStatus(statusId);
}
- } else if (BROADCAST_RETWEET_CHANGED.equals(action)) {
+ } else if (BROADCAST_STATUS_RETWEETED.equals(action)) {
final long status_id = intent.getLongExtra(EXTRA_STATUS_ID, -1);
final boolean retweeted = intent.getBooleanExtra(EXTRA_RETWEETED, false);
if (status_id > 0 && !retweeted) {
@@ -158,7 +158,7 @@ public abstract class ParcelableStatusesListFragment extends BaseStatusesListFra
public void onStart() {
super.onStart();
final IntentFilter filter = new IntentFilter(BROADCAST_STATUS_DESTROYED);
- filter.addAction(BROADCAST_RETWEET_CHANGED);
+ filter.addAction(BROADCAST_STATUS_RETWEETED);
registerReceiver(mStateReceiver, filter);
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java
index 2e213df77..ae9a56c5d 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java
@@ -54,6 +54,15 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
private Fragment mCurrentVisibleFragment;
+ @Override
+ protected void fitSystemWindows(Rect insets) {
+ super.fitSystemWindows(insets);
+ final View view = getView();
+ if (view != null) {
+ view.setPadding(insets.left, insets.top, insets.right, insets.bottom);
+ }
+ }
+
@Override
public Fragment getCurrentVisibleFragment() {
return mCurrentVisibleFragment;
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StaggeredGridFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StaggeredGridFragment.java
deleted file mode 100644
index 26095fae7..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StaggeredGridFragment.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.v4.app.Fragment;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
-import android.widget.AdapterView;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.ListAdapter;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.etsy.android.grid.StaggeredGridView;
-
-import org.mariotaku.twidere.R;
-
-/**
- * Static library support version of the framework's
- * {@link android.app.ListFragment}. Used to write apps that run on platforms
- * prior to Android 3.0. When running on Android 3.0 or above, this
- * implementation is still used; it does not try to switch to the framework's
- * implementation. See the framework SDK documentation for a class overview.
- */
-public class StaggeredGridFragment extends Fragment {
- static final int INTERNAL_EMPTY_ID = 0x00ff0001;
- static final int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002;
- static final int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003;
-
- final private Handler mHandler = new Handler();
-
- final private Runnable mRequestFocus = new Runnable() {
- @Override
- public void run() {
- mList.focusableViewAvailable(mList);
- }
- };
-
- final private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(final AdapterView> parent, final View v, final int position, final long id) {
- onListItemClick((StaggeredGridView) parent, v, position, id);
- }
- };
-
- ListAdapter mAdapter;
- StaggeredGridView mList;
- View mEmptyView;
- TextView mStandardEmptyView;
- View mProgressContainer;
- View mListContainer;
- CharSequence mEmptyText;
- boolean mListShown;
-
- public StaggeredGridFragment() {
- }
-
- /**
- * Get the ListAdapter associated with this activity's ListView.
- */
- public ListAdapter getListAdapter() {
- return mAdapter;
- }
-
- /**
- * Get the activity's list view widget.
- */
- public StaggeredGridView getListView() {
- ensureList();
- return mList;
- }
-
- /**
- * Get the cursor row ID of the currently selected list item.
- */
- public long getSelectedItemId() {
- ensureList();
- return mList.getSelectedItemId();
- }
-
- /**
- * Get the position of the currently selected list item.
- */
- public int getSelectedItemPosition() {
- ensureList();
- return mList.getSelectedItemPosition();
- }
-
- /**
- * Provide default implementation to return a simple list view. Subclasses
- * can override to replace with their own layout. If doing so, the returned
- * view hierarchy must have a ListView whose id is
- * {@link android.R.id#list android.R.id.list} and can optionally have a
- * sibling view id {@link android.R.id#empty android.R.id.empty} that is to
- * be shown when the list is empty.
- *
- *
- * If you are overriding this method with your own custom content, consider
- * including the standard layout {@link android.R.layout#list_content} in
- * your layout file, so that you continue to retain all of the standard
- * behavior of ListFragment. In particular, this is currently the only way
- * to have the built-in indeterminant progress state be shown.
- */
- @Override
- public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
- final Context context = getActivity();
-
- final FrameLayout root = new FrameLayout(context);
-
- // ------------------------------------------------------------------
-
- final LinearLayout pframe = new LinearLayout(context);
- pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID);
- pframe.setOrientation(LinearLayout.VERTICAL);
- pframe.setVisibility(View.GONE);
- pframe.setGravity(Gravity.CENTER);
-
- final ProgressBar progress = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge);
- pframe.addView(progress, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT));
-
- root.addView(pframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- // ------------------------------------------------------------------
-
- final FrameLayout lframe = new FrameLayout(context);
- lframe.setId(INTERNAL_LIST_CONTAINER_ID);
-
- final TextView tv = new TextView(getActivity());
- tv.setId(INTERNAL_EMPTY_ID);
- tv.setGravity(Gravity.CENTER);
- lframe.addView(tv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- final StaggeredGridView lv = (StaggeredGridView) inflater.inflate(R.layout.staggered_gridview, lframe, false);
- lv.setId(android.R.id.list);
- lv.setDrawSelectorOnTop(false);
- lframe.addView(lv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- root.addView(lframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- // ------------------------------------------------------------------
-
- root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
-
- return root;
- }
-
- /**
- * Detach from list view.
- */
- @Override
- public void onDestroyView() {
- mHandler.removeCallbacks(mRequestFocus);
- mList = null;
- mListShown = false;
- mEmptyView = mProgressContainer = mListContainer = null;
- mStandardEmptyView = null;
- super.onDestroyView();
- }
-
- /**
- * This method will be called when an item in the list is selected.
- * Subclasses should override. Subclasses can call
- * getListView().getItemAtPosition(position) if they need to access the data
- * associated with the selected item.
- *
- * @param l The ListView where the click happened
- * @param v The view that was clicked within the ListView
- * @param position The position of the view in the list
- * @param id The row id of the item that was clicked
- */
- public void onListItemClick(final StaggeredGridView l, final View v, final int position, final long id) {
- }
-
- /**
- * Attach to list view once the view hierarchy has been created.
- */
- @Override
- public void onViewCreated(final View view, final Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- ensureList();
- }
-
- /**
- * The default content for a ListFragment has a TextView that can be shown
- * when the list is empty. If you would like to have it shown, call this
- * method to supply the text it should use.
- */
- public void setEmptyText(final CharSequence text) {
- ensureList();
- if (mStandardEmptyView == null) throw new IllegalStateException("Can't be used with a custom content view");
- mStandardEmptyView.setText(text);
- if (mEmptyText == null) {
- mList.setEmptyView(mStandardEmptyView);
- }
- mEmptyText = text;
- }
-
- /**
- * Provide the cursor for the list view.
- */
- public void setListAdapter(final ListAdapter adapter) {
- final boolean hadAdapter = mAdapter != null;
- mAdapter = adapter;
- if (mList != null) {
- mList.setAdapter(adapter);
- if (!mListShown && !hadAdapter) {
- // The list was hidden, and previously didn't have an
- // adapter. It is now time to show it.
- setListShown(true, getView().getWindowToken() != null);
- }
- }
- }
-
- /**
- * Control whether the list is being displayed. You can make it not
- * displayed if you are waiting for the initial data to show in it. During
- * this time an indeterminant progress indicator will be shown instead.
- *
- *
- * Applications do not normally need to use this themselves. The default
- * behavior of ListFragment is to start with the list not being shown, only
- * showing it once an adapter is given with
- * {@link #setListAdapter(ListAdapter)}. If the list at that point had not
- * been shown, when it does get shown it will be do without the user ever
- * seeing the hidden state.
- *
- * @param shown If true, the list view is shown; if false, the progress
- * indicator. The initial value is true.
- */
- public void setListShown(final boolean shown) {
- setListShown(shown, true);
- }
-
- /**
- * Like {@link #setListShown(boolean)}, but no animation is used when
- * transitioning from the previous state.
- */
- public void setListShownNoAnimation(final boolean shown) {
- setListShown(shown, false);
- }
-
- /**
- * Set the currently selected list item to the specified position with the
- * adapter's data
- *
- * @param position
- */
- public void setSelection(final int position) {
- ensureList();
- mList.setSelection(position);
- }
-
- private void ensureList() {
- if (mList != null) return;
- final View root = getView();
- if (root == null) throw new IllegalStateException("Content view not yet created");
- if (root instanceof StaggeredGridView) {
- mList = (StaggeredGridView) root;
- } else {
- mStandardEmptyView = (TextView) root.findViewById(INTERNAL_EMPTY_ID);
- if (mStandardEmptyView == null) {
- mEmptyView = root.findViewById(android.R.id.empty);
- } else {
- mStandardEmptyView.setVisibility(View.GONE);
- }
- mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID);
- mListContainer = root.findViewById(INTERNAL_LIST_CONTAINER_ID);
- final View rawListView = root.findViewById(android.R.id.list);
- if (!(rawListView instanceof StaggeredGridView)) {
- if (rawListView == null)
- throw new RuntimeException("Your content must have a StaggeredGridView whose id attribute is "
- + "'android.R.id.list'");
- throw new RuntimeException("Content has view with id attribute 'android.R.id.list' "
- + "that is not a StaggeredGridView class");
- }
- mList = (StaggeredGridView) rawListView;
- if (mEmptyView != null) {
- mList.setEmptyView(mEmptyView);
- } else if (mEmptyText != null) {
- mStandardEmptyView.setText(mEmptyText);
- mList.setEmptyView(mStandardEmptyView);
- }
- }
- mListShown = true;
- mList.setOnItemClickListener(mOnClickListener);
- if (mAdapter != null) {
- final ListAdapter adapter = mAdapter;
- mAdapter = null;
- setListAdapter(adapter);
- } else {
- // We are starting without an adapter, so assume we won't
- // have our data right away and start with the progress indicator.
- if (mProgressContainer != null) {
- setListShown(false, false);
- }
- }
- mHandler.post(mRequestFocus);
- }
-
- /**
- * Control whether the list is being displayed. You can make it not
- * displayed if you are waiting for the initial data to show in it. During
- * this time an indeterminant progress indicator will be shown instead.
- *
- * @param shown If true, the list view is shown; if false, the progress
- * indicator. The initial value is true.
- * @param animate If true, an animation will be used to transition to the
- * new state.
- */
- private void setListShown(final boolean shown, final boolean animate) {
- ensureList();
- if (mProgressContainer == null) throw new IllegalStateException("Can't be used with a custom content view");
- if (mListShown == shown) return;
- mListShown = shown;
- if (shown) {
- if (animate) {
- mProgressContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out));
- mListContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in));
- } else {
- mProgressContainer.clearAnimation();
- mListContainer.clearAnimation();
- }
- mProgressContainer.setVisibility(View.GONE);
- mListContainer.setVisibility(View.VISIBLE);
- } else {
- if (animate) {
- mProgressContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in));
- mListContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out));
- } else {
- mProgressContainer.clearAnimation();
- mListContainer.clearAnimation();
- }
- mProgressContainer.setVisibility(View.VISIBLE);
- mListContainer.setVisibility(View.GONE);
- }
- }
-}
\ No newline at end of file
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StaggeredHomeTimelineFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StaggeredHomeTimelineFragment.java
deleted file mode 100644
index 1ddbbea74..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StaggeredHomeTimelineFragment.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Twidere - Twitter client for Android
- *
- * Copyright (C) 2012-2014 Mariotaku Lee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.fragment.support;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.view.View;
-
-import org.mariotaku.twidere.provider.TweetStore.Statuses;
-import org.mariotaku.twidere.util.AsyncTwitterWrapper;
-
-public class StaggeredHomeTimelineFragment extends CursorStatusesStaggeredGridFragment {
-
- private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() {
-
- @Override
- public void onReceive(final Context context, final Intent intent) {
- if (getActivity() == null || !isAdded() || isDetached()) return;
- final String action = intent.getAction();
- if (BROADCAST_HOME_TIMELINE_REFRESHED.equals(action)) {
- setRefreshComplete();
- } else if (BROADCAST_TASK_STATE_CHANGED.equals(action)) {
- updateRefreshState();
- }
- }
- };
-
- @Override
- public int getStatuses(final long[] accountIds, final long[] maxIds, final long[] sinceIds) {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter == null) return 0;
- if (maxIds == null) return twitter.refreshAll(accountIds);
- return twitter.getHomeTimelineAsync(accountIds, maxIds, sinceIds);
- }
-
- @Override
- public void onStart() {
- super.onStart();
- final IntentFilter filter = new IntentFilter(BROADCAST_HOME_TIMELINE_REFRESHED);
- filter.addAction(BROADCAST_TASK_STATE_CHANGED);
- registerReceiver(mStatusReceiver, filter);
- }
-
- @Override
- public void onStop() {
- unregisterReceiver(mStatusReceiver);
- super.onStop();
- }
-
- @Override
- protected Uri getContentUri() {
- return Statuses.CONTENT_URI;
- }
-
- @Override
- protected int getNotificationType() {
- return NOTIFICATION_ID_HOME_TIMELINE;
- }
-
- @Override
- protected String getPositionKey() {
- return "home_timeline" + getTabPosition();
- }
-
- @Override
- protected boolean isFiltersEnabled() {
- final SharedPreferences pref = getSharedPreferences();
- return pref != null && pref.getBoolean(KEY_FILTERS_IN_HOME_TIMELINE, true);
- }
-
- @Override
- protected void updateRefreshState() {
- final AsyncTwitterWrapper twitter = getTwitterWrapper();
- if (twitter == null || !getUserVisibleHint() || getActivity() == null) return;
- setRefreshing(twitter.isHomeTimelineRefreshing());
- }
-
- @Override
- public View getRefreshIndicatorView() {
- return getListView().getRefreshIndicatorView();
- }
-}
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 dbab3f284..7eaf31e99 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
@@ -74,8 +74,8 @@ import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.adapter.ParcelableStatusesListAdapter;
import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
import org.mariotaku.twidere.app.TwidereApplication;
-import org.mariotaku.twidere.model.Account;
-import org.mariotaku.twidere.model.Account.AccountWithCredentials;
+import org.mariotaku.twidere.model.ParcelableAccount;
+import org.mariotaku.twidere.model.ParcelableAccount.ParcelableAccountWithCredentials;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
@@ -203,7 +203,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
}
break;
}
- case BROADCAST_RETWEET_CHANGED: {
+ case BROADCAST_STATUS_RETWEETED: {
final long status_id = intent.getLongExtra(EXTRA_STATUS_ID, -1);
if (status_id > 0 && status_id == getStatusId()) {
getStatus(true);
@@ -561,9 +561,9 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
}
case R.id.favorites_container: {
// TODO
- final AccountWithCredentials account = Account.getAccountWithCredentials(getActivity(),
+ final ParcelableAccountWithCredentials account = ParcelableAccount.getAccountWithCredentials(getActivity(),
status.account_id);
- if (AccountWithCredentials.isOfficialCredentials(getActivity(), account)) {
+ if (ParcelableAccountWithCredentials.isOfficialCredentials(getActivity(), account)) {
openStatusFavoriters(getActivity(), status.account_id, status.retweet_id > 0 ? status.retweet_id
: status.id);
}
@@ -689,7 +689,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
final IntentFilter filter = new IntentFilter();
filter.addAction(BROADCAST_FRIENDSHIP_CHANGED);
filter.addAction(BROADCAST_FAVORITE_CHANGED);
- filter.addAction(BROADCAST_RETWEET_CHANGED);
+ filter.addAction(BROADCAST_STATUS_RETWEETED);
registerReceiver(mStatusReceiver, filter);
updateUserColor();
final int text_size = mPreferences.getInt(KEY_TEXT_SIZE, getDefaultTextSize(getActivity()));
@@ -814,9 +814,9 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
break;
}
case MENU_TRANSLATE: {
- final AccountWithCredentials account = Account.getAccountWithCredentials(getActivity(),
+ final ParcelableAccountWithCredentials account = ParcelableAccount.getAccountWithCredentials(getActivity(),
status.account_id);
- if (AccountWithCredentials.isOfficialCredentials(getActivity(), account)) {
+ if (ParcelableAccountWithCredentials.isOfficialCredentials(getActivity(), account)) {
StatusTranslateDialogFragment.show(getFragmentManager(), status);
} else {
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFavoritesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFavoritesFragment.java
index 73d660eba..356ba2b5b 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFavoritesFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFavoritesFragment.java
@@ -36,7 +36,6 @@ public class UserFavoritesFragment extends ParcelableStatusesFragment {
@Override
public Loader> onCreateLoader(int id, Bundle args) {
setRefreshing(true);
- final List data = getAdapterData();
final Context context = getActivity();
final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1);
final long maxId = args.getLong(EXTRA_MAX_ID, -1);
@@ -44,8 +43,8 @@ public class UserFavoritesFragment extends ParcelableStatusesFragment {
final long userId = args.getLong(EXTRA_USER_ID, -1);
final String screenName = args.getString(EXTRA_SCREEN_NAME);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);
- return new UserFavoritesLoader(context, accountId, userId, screenName, maxId, sinceId, data,
- null, tabPosition);
+ return new UserFavoritesLoader(context, accountId, userId, screenName, maxId, sinceId,
+ getAdapterData(), null, tabPosition);
}
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java
index 5bf013ea8..6f9d3237b 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java
@@ -80,7 +80,7 @@ import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import org.mariotaku.menucomponent.internal.menu.MenuUtils;
-import org.mariotaku.querybuilder.Where;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
@@ -332,7 +332,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
mFollowButton.setText(R.string.follow);
}
final ContentResolver resolver = getContentResolver();
- final String where = Where.equals(CachedUsers.USER_ID, user.id).getSQL();
+ final String where = Expression.equals(CachedUsers.USER_ID, user.id).getSQL();
resolver.delete(CachedUsers.CONTENT_URI, where, null);
// I bet you don't want to see blocked user in your auto
// complete list.
@@ -926,7 +926,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
final boolean filtering = Utils.isFilteringUser(getActivity(), user.id);
final ContentResolver cr = getContentResolver();
if (filtering) {
- final Where where = Where.equals(Filters.Users.USER_ID, user.id);
+ final Expression where = Expression.equals(Filters.Users.USER_ID, user.id);
cr.delete(Filters.Users.CONTENT_URI, where.getSQL(), null);
showInfoMessage(getActivity(), R.string.message_user_unmuted, false);
} else {
@@ -1115,7 +1115,8 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
final Drawable shadow = activity.getResources().getDrawable(R.drawable.shadow_user_banner_action_bar);
final Drawable background = ThemeUtils.getActionBarBackground(activity, themeResId);
mActionBarBackground = new ActionBarDrawable(getResources(), shadow, background, ThemeUtils.isDarkTheme(themeResId));
- mActionBarBackground.setAlpha(ThemeUtils.getThemeAlpha(activity));
+ mActionBarBackground.setAlpha(linkHandler.getCurrentThemeBackgroundAlpha());
+ mProfileBannerView.setAlpha(linkHandler.getCurrentThemeBackgroundAlpha() / 255f);
actionBar.setBackgroundDrawable(mActionBarBackground);
}
@@ -1161,8 +1162,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
final View profileBannerContainer = mProfileBannerContainer;
final int spaceHeight = space.getHeight();
final float factor = MathUtils.clamp(offset / (float) spaceHeight, 0, 1);
- profileBannerView.setAlpha(1.0f - factor / 8f);
- profileBannerContainer.setTranslationY(-offset);
+ profileBannerContainer.setTranslationY(Math.max(-offset, -spaceHeight));
profileBannerView.setTranslationY(Math.min(offset, spaceHeight) / 2);
if (mActionBarBackground != null && mTintedStatusContent != null) {
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java
index a8f7838af..29b69ed4e 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java
@@ -32,12 +32,14 @@ import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
+import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager;
+import android.support.v7.widget.CardView;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.LayoutInflater;
@@ -59,6 +61,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
+import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.SingleResponse;
@@ -86,7 +89,7 @@ import static org.mariotaku.twidere.util.Utils.setMenuItemAvailability;
public class UserListFragment extends BaseSupportFragment implements OnClickListener,
LoaderCallbacks>, DrawerCallback,
- SystemWindowsInsetsCallback {
+ SystemWindowsInsetsCallback, SupportFragmentCallback {
private ImageLoaderWrapper mProfileImageLoader;
private AsyncTwitterWrapper mTwitterWrapper;
@@ -100,6 +103,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
private HeaderDrawerLayout mHeaderDrawerLayout;
private ViewPager mViewPager;
private PagerSlidingTabStrip mPagerIndicator;
+ private CardView mCardView;
private SupportTabsAdapter mPagerAdapter;
@@ -125,6 +129,59 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
}
};
private boolean mUserListLoaderInitialized;
+ private Fragment mCurrentVisibleFragment;
+
+ @Override
+ public boolean canScroll(float dy) {
+ final Fragment fragment = mCurrentVisibleFragment;
+ return fragment instanceof DrawerCallback && ((DrawerCallback) fragment).canScroll(dy);
+ }
+
+ @Override
+ public void cancelTouch() {
+ final Fragment fragment = mCurrentVisibleFragment;
+ if (fragment instanceof DrawerCallback) {
+ ((DrawerCallback) fragment).cancelTouch();
+ }
+ }
+
+ @Override
+ public void fling(float velocity) {
+ final Fragment fragment = mCurrentVisibleFragment;
+ if (fragment instanceof DrawerCallback) {
+ ((DrawerCallback) fragment).fling(velocity);
+ }
+ }
+
+ @Override
+ public boolean isScrollContent(float x, float y) {
+ final ViewPager v = mViewPager;
+ final int[] location = new int[2];
+ v.getLocationOnScreen(location);
+ return x >= location[0] && x <= location[0] + v.getWidth()
+ && y >= location[1] && y <= location[1] + v.getHeight();
+ }
+
+ @Override
+ public void scrollBy(float dy) {
+ final Fragment fragment = mCurrentVisibleFragment;
+ if (fragment instanceof DrawerCallback) {
+ ((DrawerCallback) fragment).scrollBy(dy);
+ }
+ }
+
+ @Override
+ public boolean shouldLayoutHeaderBottom() {
+ final HeaderDrawerLayout drawer = mHeaderDrawerLayout;
+ final CardView card = mCardView;
+ if (drawer == null || card == null) return false;
+ return card.getTop() + drawer.getHeaderTop() - drawer.getPaddingTop() <= 0;
+ }
+
+ @Override
+ public void topChanged(int offset) {
+
+ }
public void displayUserList(final ParcelableUserList userList) {
if (userList == null || getActivity() == null) return;
@@ -149,6 +206,31 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
invalidateOptionsMenu();
}
+ @Override
+ public Fragment getCurrentVisibleFragment() {
+ return mCurrentVisibleFragment;
+ }
+
+ @Override
+ public void onDetachFragment(Fragment fragment) {
+
+ }
+
+ @Override
+ public void onSetUserVisibleHint(Fragment fragment, boolean isVisibleToUser) {
+ mCurrentVisibleFragment = isVisibleToUser ? fragment : null;
+ }
+
+ @Override
+ public boolean triggerRefresh(int position) {
+ return false;
+ }
+
+ @Override
+ public boolean getSystemWindowsInsets(Rect insets) {
+ return false;
+ }
+
public void getUserListInfo(final boolean omit_intent_extra) {
final LoaderManager lm = getLoaderManager();
lm.destroyLoader(0);
@@ -320,29 +402,6 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
return true;
}
- private void setupUserPages() {
- final Context context = getActivity();
- final Bundle args = getArguments(), tabArgs = new Bundle();
- if (args.containsKey(EXTRA_USER)) {
- final ParcelableUserList userList = args.getParcelable(EXTRA_USER_LIST);
- tabArgs.putLong(EXTRA_ACCOUNT_ID, userList.account_id);
- tabArgs.putLong(EXTRA_USER_ID, userList.user_id);
- tabArgs.putString(EXTRA_SCREEN_NAME, userList.user_screen_name);
- tabArgs.putInt(EXTRA_LIST_ID, (int) userList.id);
- tabArgs.putString(EXTRA_LIST_NAME, userList.name);
- } else {
- tabArgs.putLong(EXTRA_ACCOUNT_ID, args.getLong(EXTRA_ACCOUNT_ID, -1));
- tabArgs.putLong(EXTRA_USER_ID, args.getLong(EXTRA_USER_ID, -1));
- tabArgs.putString(EXTRA_SCREEN_NAME, args.getString(EXTRA_SCREEN_NAME));
- tabArgs.putInt(EXTRA_LIST_ID, args.getInt(EXTRA_LIST_ID, -1));
- tabArgs.putString(EXTRA_LIST_NAME, args.getString(EXTRA_LIST_NAME));
- }
- mPagerAdapter.addTab(UserListTimelineFragment.class, tabArgs, getString(R.string.statuses), null, 0);
- mPagerAdapter.addTab(UserListMembersFragment.class, tabArgs, getString(R.string.list_members), null, 1);
- mPagerAdapter.addTab(UserListSubscribersFragment.class, tabArgs, getString(R.string.list_subscribers), null, 2);
- mPagerIndicator.notifyDataSetChanged();
- }
-
@Override
public void onClick(final View view) {
switch (view.getId()) {
@@ -415,6 +474,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
final View headerView = mHeaderDrawerLayout.getHeader();
final View contentView = mHeaderDrawerLayout.getContent();
+ mCardView = (CardView) headerView.findViewById(R.id.card);
mProfileContainer = (ColorLabelRelativeLayout) headerView.findViewById(R.id.profile);
mListNameView = (TextView) headerView.findViewById(R.id.list_name);
mCreatedByView = (TextView) headerView.findViewById(R.id.created_by);
@@ -441,44 +501,27 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
content.setClipToPadding(false);
}
- @Override
- public void fling(float velocity) {
-
- }
-
- @Override
- public void scrollBy(float dy) {
-
- }
-
- @Override
- public boolean shouldLayoutHeaderBottom() {
- return false;
- }
-
- @Override
- public boolean canScroll(float dy) {
- return false;
- }
-
- @Override
- public boolean isScrollContent(float x, float y) {
- return false;
- }
-
- @Override
- public void cancelTouch() {
-
- }
-
- @Override
- public void topChanged(int offset) {
-
- }
-
- @Override
- public boolean getSystemWindowsInsets(Rect insets) {
- return false;
+ private void setupUserPages() {
+ final Context context = getActivity();
+ final Bundle args = getArguments(), tabArgs = new Bundle();
+ if (args.containsKey(EXTRA_USER)) {
+ final ParcelableUserList userList = args.getParcelable(EXTRA_USER_LIST);
+ tabArgs.putLong(EXTRA_ACCOUNT_ID, userList.account_id);
+ tabArgs.putLong(EXTRA_USER_ID, userList.user_id);
+ tabArgs.putString(EXTRA_SCREEN_NAME, userList.user_screen_name);
+ tabArgs.putInt(EXTRA_LIST_ID, (int) userList.id);
+ tabArgs.putString(EXTRA_LIST_NAME, userList.name);
+ } else {
+ tabArgs.putLong(EXTRA_ACCOUNT_ID, args.getLong(EXTRA_ACCOUNT_ID, -1));
+ tabArgs.putLong(EXTRA_USER_ID, args.getLong(EXTRA_USER_ID, -1));
+ tabArgs.putString(EXTRA_SCREEN_NAME, args.getString(EXTRA_SCREEN_NAME));
+ tabArgs.putInt(EXTRA_LIST_ID, args.getInt(EXTRA_LIST_ID, -1));
+ tabArgs.putString(EXTRA_LIST_NAME, args.getString(EXTRA_LIST_NAME));
+ }
+ mPagerAdapter.addTab(UserListTimelineFragment.class, tabArgs, getString(R.string.statuses), null, 0);
+ mPagerAdapter.addTab(UserListMembersFragment.class, tabArgs, getString(R.string.list_members), null, 1);
+ mPagerAdapter.addTab(UserListSubscribersFragment.class, tabArgs, getString(R.string.list_subscribers), null, 2);
+ mPagerIndicator.notifyDataSetChanged();
}
public static class EditUserListDialogFragment extends BaseSupportDialogFragment implements
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListTimelineFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListTimelineFragment.java
index 0d35dcd54..0c9a82860 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListTimelineFragment.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListTimelineFragment.java
@@ -1,75 +1,51 @@
/*
- * Twidere - Twitter client for Android
- *
+ * Twidere - Twitter client for Android
+ *
* Copyright (C) 2012-2014 Mariotaku Lee
- *
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.mariotaku.twidere.fragment.support;
-import android.content.Context;
import android.os.Bundle;
import android.support.v4.content.Loader;
-import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
import org.mariotaku.twidere.loader.support.UserListTimelineLoader;
import org.mariotaku.twidere.model.ParcelableStatus;
import java.util.List;
-public class UserListTimelineFragment extends ParcelableStatusesListFragment {
+/**
+ * Created by mariotaku on 14/12/2.
+ */
+public class UserListTimelineFragment extends ParcelableStatusesFragment {
- @Override
- public Loader> newLoaderInstance(final Context context, final Bundle args) {
- if (args == null) return null;
- final int list_id = args.getInt(EXTRA_LIST_ID, -1);
- final long account_id = args.getLong(EXTRA_ACCOUNT_ID, -1);
- final long max_id = args.getLong(EXTRA_MAX_ID, -1);
- final long since_id = args.getLong(EXTRA_SINCE_ID, -1);
- final long user_id = args.getLong(EXTRA_USER_ID, -1);
- final String screen_name = args.getString(EXTRA_SCREEN_NAME);
- final String list_name = args.getString(EXTRA_LIST_NAME);
- final int tab_position = args.getInt(EXTRA_TAB_POSITION, -1);
- return new UserListTimelineLoader(getActivity(), account_id, list_id, user_id, screen_name, list_name, max_id,
- since_id, getData(), getSavedStatusesFileArgs(), tab_position);
- }
-
- @Override
- public void onActivityCreated(final Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- final IStatusesListAdapter> adapter = getListAdapter();
- adapter.setFiltersEnabled(true);
- adapter.setIgnoredFilterFields(false, false, false, false, false);
- }
-
- @Override
- protected String[] getSavedStatusesFileArgs() {
- final Bundle args = getArguments();
- if (args == null) return null;
- final int list_id = args.getInt(EXTRA_LIST_ID, -1);
- final long account_id = args.getLong(EXTRA_ACCOUNT_ID, -1);
- final long user_id = args.getLong(EXTRA_USER_ID, -1);
- final String screen_name = args.getString(EXTRA_SCREEN_NAME);
- final String list_name = args.getString(EXTRA_LIST_NAME);
- return new String[] { AUTHORITY_USER_LIST_TIMELINE, "account" + account_id, "list_id" + list_id,
- "list_name" + list_name, "user" + user_id, "screen_name" + screen_name };
- }
-
- @Override
- protected boolean shouldShowAccountColor() {
- return false;
- }
+ @Override
+ public Loader> onCreateLoader(int id, Bundle args) {
+ setRefreshing(true);
+ if (args == null) return null;
+ final int listId = args.getInt(EXTRA_LIST_ID, -1);
+ final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1);
+ final long maxId = args.getLong(EXTRA_MAX_ID, -1);
+ final long sinceId = args.getLong(EXTRA_SINCE_ID, -1);
+ final long userId = args.getLong(EXTRA_USER_ID, -1);
+ final String screenName = args.getString(EXTRA_SCREEN_NAME);
+ final String listName = args.getString(EXTRA_LIST_NAME);
+ final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);
+ return new UserListTimelineLoader(getActivity(), accountId, listId, userId, screenName,
+ listName, maxId, sinceId, getAdapterData(), null, tabPosition);
+ }
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListTimelineListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListTimelineListFragment.java
new file mode 100644
index 000000000..1ffde1236
--- /dev/null
+++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListTimelineListFragment.java
@@ -0,0 +1,75 @@
+/*
+ * Twidere - Twitter client for Android
+ *
+ * Copyright (C) 2012-2014 Mariotaku Lee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.mariotaku.twidere.fragment.support;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.content.Loader;
+
+import org.mariotaku.twidere.adapter.iface.IStatusesListAdapter;
+import org.mariotaku.twidere.loader.support.UserListTimelineLoader;
+import org.mariotaku.twidere.model.ParcelableStatus;
+
+import java.util.List;
+
+public class UserListTimelineListFragment extends ParcelableStatusesListFragment {
+
+ @Override
+ public Loader> newLoaderInstance(final Context context, final Bundle args) {
+ if (args == null) return null;
+ final int list_id = args.getInt(EXTRA_LIST_ID, -1);
+ final long account_id = args.getLong(EXTRA_ACCOUNT_ID, -1);
+ final long max_id = args.getLong(EXTRA_MAX_ID, -1);
+ final long since_id = args.getLong(EXTRA_SINCE_ID, -1);
+ final long user_id = args.getLong(EXTRA_USER_ID, -1);
+ final String screen_name = args.getString(EXTRA_SCREEN_NAME);
+ final String list_name = args.getString(EXTRA_LIST_NAME);
+ final int tab_position = args.getInt(EXTRA_TAB_POSITION, -1);
+ return new UserListTimelineLoader(getActivity(), account_id, list_id, user_id, screen_name, list_name, max_id,
+ since_id, getData(), getSavedStatusesFileArgs(), tab_position);
+ }
+
+ @Override
+ public void onActivityCreated(final Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ final IStatusesListAdapter> adapter = getListAdapter();
+ adapter.setFiltersEnabled(true);
+ adapter.setIgnoredFilterFields(false, false, false, false, false);
+ }
+
+ @Override
+ protected String[] getSavedStatusesFileArgs() {
+ final Bundle args = getArguments();
+ if (args == null) return null;
+ final int list_id = args.getInt(EXTRA_LIST_ID, -1);
+ final long account_id = args.getLong(EXTRA_ACCOUNT_ID, -1);
+ final long user_id = args.getLong(EXTRA_USER_ID, -1);
+ final String screen_name = args.getString(EXTRA_SCREEN_NAME);
+ final String list_name = args.getString(EXTRA_LIST_NAME);
+ return new String[] { AUTHORITY_USER_LIST_TIMELINE, "account" + account_id, "list_id" + list_id,
+ "list_name" + list_name, "user" + user_id, "screen_name" + screen_name };
+ }
+
+ @Override
+ protected boolean shouldShowAccountColor() {
+ return false;
+ }
+
+}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/menu/AccountActionProvider.java b/twidere/src/main/java/org/mariotaku/twidere/menu/AccountActionProvider.java
index fe818267e..daef766da 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/menu/AccountActionProvider.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/menu/AccountActionProvider.java
@@ -9,19 +9,19 @@ import android.view.SubMenu;
import android.view.View;
import org.mariotaku.twidere.TwidereConstants;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
public class AccountActionProvider extends ActionProvider implements TwidereConstants {
public static final int MENU_GROUP = 201;
- private final Account[] mAccounts;
+ private final ParcelableAccount[] mAccounts;
private long mAccountId;
public AccountActionProvider(final Context context) {
super(context);
- mAccounts = Account.getAccounts(context, false, false);
+ mAccounts = ParcelableAccount.getAccounts(context, false, false);
}
@Override
@@ -37,7 +37,7 @@ public class AccountActionProvider extends ActionProvider implements TwidereCons
@Override
public void onPrepareSubMenu(final SubMenu subMenu) {
subMenu.removeGroup(MENU_GROUP);
- for (final Account account : mAccounts) {
+ for (final ParcelableAccount account : mAccounts) {
final MenuItem item = subMenu.add(MENU_GROUP, Menu.NONE, 0, account.name);
final Intent intent = new Intent();
intent.putExtra(EXTRA_ACCOUNT, account);
@@ -47,7 +47,7 @@ public class AccountActionProvider extends ActionProvider implements TwidereCons
for (int i = 0, j = subMenu.size(); i < j; i++) {
final MenuItem item = subMenu.getItem(i);
final Intent intent = item.getIntent();
- final Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
+ final ParcelableAccount account = intent.getParcelableExtra(EXTRA_ACCOUNT);
if (account.account_id == mAccountId) {
item.setChecked(true);
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/AccountPreferences.java b/twidere/src/main/java/org/mariotaku/twidere/model/AccountPreferences.java
index 3f815da55..9d8dbbb8a 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/model/AccountPreferences.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/model/AccountPreferences.java
@@ -46,7 +46,7 @@ public class AccountPreferences implements Constants {
}
public int getDefaultNotificationLightColor() {
- final Account a = Account.getAccount(mContext, mAccountId);
+ final ParcelableAccount a = ParcelableAccount.getAccount(mContext, mAccountId);
return a != null ? a.color : mContext.getResources().getColor(R.color.material_light_blue);
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/CustomTabConfiguration2.java b/twidere/src/main/java/org/mariotaku/twidere/model/CustomTabConfiguration2.java
deleted file mode 100644
index 11be8cc1d..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/model/CustomTabConfiguration2.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Twidere - Twitter client for Android
- *
- * Copyright (C) 2012-2014 Mariotaku Lee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package org.mariotaku.twidere.model;
-
-import android.support.v4.app.Fragment;
-
-import org.mariotaku.twidere.Constants;
-import org.mariotaku.twidere.R;
-import org.mariotaku.twidere.fragment.support.ActivitiesAboutMeFragment;
-import org.mariotaku.twidere.fragment.support.ActivitiesByFriendsFragment;
-import org.mariotaku.twidere.fragment.support.DirectMessagesFragment;
-import org.mariotaku.twidere.fragment.support.HomeTimelineFragment;
-import org.mariotaku.twidere.fragment.support.HomeTimelineListFragment;
-import org.mariotaku.twidere.fragment.support.MentionsTimelineFragment;
-import org.mariotaku.twidere.fragment.support.SearchStatusesFragment;
-import org.mariotaku.twidere.fragment.support.TrendsSuggectionsFragment;
-import org.mariotaku.twidere.fragment.support.UserFavoritesFragment;
-import org.mariotaku.twidere.fragment.support.UserListTimelineFragment;
-import org.mariotaku.twidere.fragment.support.UserTimelineFragment;
-
-import java.util.Comparator;
-import java.util.Map.Entry;
-
-public enum CustomTabConfiguration2 implements Constants {
-
- HOME_TIMELINE(HomeTimelineFragment.class, R.string.home, R.drawable.ic_action_home,
- CustomTabConfiguration.ACCOUNT_OPTIONAL, CustomTabConfiguration.FIELD_TYPE_NONE, 0, false),
-
- MENTIONS_TIMELINE(MentionsTimelineFragment.class, R.string.mentions, R.drawable.ic_action_at,
- CustomTabConfiguration.ACCOUNT_OPTIONAL, CustomTabConfiguration.FIELD_TYPE_NONE, 1, false),
-
- DIRECT_MESSAGES(DirectMessagesFragment.class, R.string.direct_messages, R.drawable.ic_action_message,
- CustomTabConfiguration.ACCOUNT_OPTIONAL, CustomTabConfiguration.FIELD_TYPE_NONE, 2, false),
-
- TRENDS_SUGGESTIONS(TrendsSuggectionsFragment.class, R.string.trends, R.drawable.ic_action_hashtag,
- CustomTabConfiguration.ACCOUNT_NONE, CustomTabConfiguration.FIELD_TYPE_NONE, 3, true),
-
- FAVORITES(UserFavoritesFragment.class, R.string.favorites, R.drawable.ic_action_star,
- CustomTabConfiguration.ACCOUNT_REQUIRED, CustomTabConfiguration.FIELD_TYPE_USER, 4),
-
- USER_TIMELINE(UserTimelineFragment.class, R.string.users_statuses, R.drawable.ic_action_quote,
- CustomTabConfiguration.ACCOUNT_REQUIRED, CustomTabConfiguration.FIELD_TYPE_USER, 5),
-
- SEARCH_STATUSES(SearchStatusesFragment.class, R.string.search_statuses, R.drawable.ic_action_search,
- CustomTabConfiguration.ACCOUNT_REQUIRED, CustomTabConfiguration.FIELD_TYPE_TEXT, R.string.query,
- EXTRA_QUERY, 6),
-
- LIST_TIMELINE(UserListTimelineFragment.class, R.string.list_timeline, R.drawable.ic_action_list,
- CustomTabConfiguration.ACCOUNT_REQUIRED, CustomTabConfiguration.FIELD_TYPE_USER_LIST, 7),
-
- ACTIVITIES_ABOUT_ME(ActivitiesAboutMeFragment.class, R.string.activities_about_me,
- R.drawable.ic_action_user, CustomTabConfiguration.ACCOUNT_OPTIONAL,
- CustomTabConfiguration.FIELD_TYPE_NONE, 8),
-
- ACTIVITIES_BY_FRIENDS(ActivitiesByFriendsFragment.class, R.string.activities_by_friends,
- R.drawable.ic_action_accounts, CustomTabConfiguration.ACCOUNT_REQUIRED,
- CustomTabConfiguration.FIELD_TYPE_NONE, 9);
-
- public static final int FIELD_TYPE_NONE = 0;
- public static final int FIELD_TYPE_USER = 1;
- public static final int FIELD_TYPE_USER_LIST = 2;
- public static final int FIELD_TYPE_TEXT = 3;
-
- public static final int ACCOUNT_NONE = 0;
- public static final int ACCOUNT_REQUIRED = 1;
- public static final int ACCOUNT_OPTIONAL = 2;
-
- private final int title, icon, secondaryFieldType, secondaryFieldTitle, sortPosition, accountRequirement;
- private final Class extends Fragment> cls;
- private final String secondaryFieldTextKey;
- private final boolean singleTab;
-
- CustomTabConfiguration2(final Class extends Fragment> cls, final int title, final int icon,
- final int accountRequirement, final int secondaryFieldType, final int sortPosition) {
- this(cls, title, icon, accountRequirement, secondaryFieldType, 0, EXTRA_TEXT, sortPosition, false);
- }
-
- CustomTabConfiguration2(final Class extends Fragment> cls, final int title, final int icon,
- final int accountRequirement, final int secondaryFieldType, final int sortPosition, final boolean singleTab) {
- this(cls, title, icon, accountRequirement, secondaryFieldType, 0, EXTRA_TEXT, sortPosition, singleTab);
- }
-
- CustomTabConfiguration2(final Class extends Fragment> cls, final int title, final int icon,
- final int accountRequirement, final int secondaryFieldType, final int secondaryFieldTitle,
- final String secondaryFieldTextKey, final int sortPosition) {
- this(cls, title, icon, accountRequirement, secondaryFieldType, 0, secondaryFieldTextKey, sortPosition, false);
- }
-
- CustomTabConfiguration2(final Class extends Fragment> cls, final int title, final int icon,
- final int accountRequirement, final int secondaryFieldType, final int secondaryFieldTitle,
- final String secondaryFieldTextKey, final int sortPosition, final boolean singleTab) {
- this.cls = cls;
- this.title = title;
- this.icon = icon;
- this.sortPosition = sortPosition;
- this.accountRequirement = accountRequirement;
- this.secondaryFieldType = secondaryFieldType;
- this.secondaryFieldTitle = secondaryFieldTitle;
- this.secondaryFieldTextKey = secondaryFieldTextKey;
- this.singleTab = singleTab;
- }
-
- public int getAccountRequirement() {
- return accountRequirement;
- }
-
- public int getDefaultIcon() {
- return icon;
- }
-
- public int getDefaultTitle() {
- return title;
- }
-
- public Class extends Fragment> getFragmentClass() {
- return cls;
- }
-
- public String getSecondaryFieldTextKey() {
- return secondaryFieldTextKey;
- }
-
- public int getSecondaryFieldTitle() {
- return secondaryFieldTitle;
- }
-
- public int getSecondaryFieldType() {
- return secondaryFieldType;
- }
-
- public int getSortPosition() {
- return sortPosition;
- }
-
- public boolean isSingleTab() {
- return singleTab;
- }
-
- @Override
- public String toString() {
- return "CustomTabConfiguration{title=" + title + ", icon=" + icon + ", secondaryFieldType="
- + secondaryFieldType + ", secondaryFieldTitle=" + secondaryFieldTitle + ", sortPosition="
- + sortPosition + ", accountRequirement=" + accountRequirement + ", cls=" + cls
- + ", secondaryFieldTextKey=" + secondaryFieldTextKey + ", singleTab=" + singleTab + "}";
- }
-
- public static class CustomTabConfigurationComparator implements Comparator> {
-
- public static final CustomTabConfigurationComparator SINGLETON = new CustomTabConfigurationComparator();
-
- @Override
- public int compare(final Entry lhs,
- final Entry rhs) {
- return lhs.getValue().getSortPosition() - rhs.getValue().getSortPosition();
- }
-
- }
-
-}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/DraftItem.java b/twidere/src/main/java/org/mariotaku/twidere/model/DraftItem.java
index 14349b616..3a0f86e29 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/model/DraftItem.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/model/DraftItem.java
@@ -80,7 +80,7 @@ public class DraftItem implements Parcelable {
public DraftItem(final ParcelableStatusUpdate status) {
_id = 0;
- account_ids = Account.getAccountIds(status.accounts);
+ account_ids = ParcelableAccount.getAccountIds(status.accounts);
in_reply_to_status_id = status.in_reply_to_status_id;
text = status.text;
media = status.media;
diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/Account.java b/twidere/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java
similarity index 81%
rename from twidere/src/main/java/org/mariotaku/twidere/model/Account.java
rename to twidere/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java
index c85a4baee..14e4edb50 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/model/Account.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java
@@ -27,8 +27,8 @@ import android.os.Parcelable;
import android.support.annotation.NonNull;
import org.mariotaku.querybuilder.Columns.Column;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.RawItemArray;
-import org.mariotaku.querybuilder.Where;
import org.mariotaku.twidere.provider.TweetStore.Accounts;
import org.mariotaku.twidere.util.content.ContentResolverUtils;
@@ -39,18 +39,18 @@ import java.util.List;
import static org.mariotaku.twidere.util.Utils.isOfficialConsumerKeySecret;
import static org.mariotaku.twidere.util.Utils.shouldForceUsingPrivateAPIs;
-public class Account implements Parcelable {
+public class ParcelableAccount implements Parcelable {
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
- public Account createFromParcel(final Parcel in) {
- return new Account(in);
+ public ParcelableAccount createFromParcel(final Parcel in) {
+ return new ParcelableAccount(in);
}
@Override
- public Account[] newArray(final int size) {
- return new Account[size];
+ public ParcelableAccount[] newArray(final int size) {
+ return new ParcelableAccount[size];
}
};
@@ -60,7 +60,7 @@ public class Account implements Parcelable {
public final boolean is_activated;
public final boolean is_dummy;
- public Account(final Cursor cursor, final Indices indices) {
+ public ParcelableAccount(final Cursor cursor, final Indices indices) {
is_dummy = false;
screen_name = indices.screen_name != -1 ? cursor.getString(indices.screen_name) : null;
name = indices.name != -1 ? cursor.getString(indices.name) : null;
@@ -71,7 +71,7 @@ public class Account implements Parcelable {
is_activated = indices.is_activated != -1 && cursor.getInt(indices.is_activated) == 1;
}
- public Account(final Parcel source) {
+ public ParcelableAccount(final Parcel source) {
is_dummy = source.readInt() == 1;
is_activated = source.readInt() == 1;
account_id = source.readLong();
@@ -82,7 +82,7 @@ public class Account implements Parcelable {
color = source.readInt();
}
- private Account() {
+ private ParcelableAccount() {
is_dummy = true;
screen_name = null;
name = null;
@@ -117,11 +117,11 @@ public class Account implements Parcelable {
out.writeInt(color);
}
- public static Account dummyInstance() {
- return new Account();
+ public static ParcelableAccount dummyInstance() {
+ return new ParcelableAccount();
}
- public static Account getAccount(final Context context, final long account_id) {
+ public static ParcelableAccount getAccount(final Context context, final long account_id) {
if (context == null) return null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null);
@@ -130,7 +130,7 @@ public class Account implements Parcelable {
if (cur.getCount() > 0 && cur.moveToFirst()) {
final Indices indices = new Indices(cur);
cur.moveToFirst();
- return new Account(cur, indices);
+ return new ParcelableAccount(cur, indices);
}
} finally {
cur.close();
@@ -139,7 +139,7 @@ public class Account implements Parcelable {
return null;
}
- public static long[] getAccountIds(final Account[] accounts) {
+ public static long[] getAccountIds(final ParcelableAccount[] accounts) {
final long[] ids = new long[accounts.length];
for (int i = 0, j = accounts.length; i < j; i++) {
ids[i] = accounts[i].account_id;
@@ -147,25 +147,25 @@ public class Account implements Parcelable {
return ids;
}
- public static Account[] getAccounts(final Context context, final boolean activatedOnly,
+ public static ParcelableAccount[] getAccounts(final Context context, final boolean activatedOnly,
final boolean officialKeyOnly) {
- final List list = getAccountsList(context, activatedOnly, officialKeyOnly);
- return list.toArray(new Account[list.size()]);
+ final List list = getAccountsList(context, activatedOnly, officialKeyOnly);
+ return list.toArray(new ParcelableAccount[list.size()]);
}
- public static Account[] getAccounts(final Context context, final long[] accountIds) {
- if (context == null) return new Account[0];
- final String where = accountIds != null ? Where.in(new Column(Accounts.ACCOUNT_ID),
+ public static ParcelableAccount[] getAccounts(final Context context, final long[] accountIds) {
+ if (context == null) return new ParcelableAccount[0];
+ final String where = accountIds != null ? Expression.in(new Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS_NO_CREDENTIALS, where, null, null);
- if (cur == null) return new Account[0];
+ if (cur == null) return new ParcelableAccount[0];
try {
final Indices idx = new Indices(cur);
cur.moveToFirst();
- final Account[] names = new Account[cur.getCount()];
+ final ParcelableAccount[] names = new ParcelableAccount[cur.getCount()];
while (!cur.isAfterLast()) {
- names[cur.getPosition()] = new Account(cur, idx);
+ names[cur.getPosition()] = new ParcelableAccount(cur, idx);
cur.moveToNext();
}
return names;
@@ -174,14 +174,14 @@ public class Account implements Parcelable {
}
}
- public static List getAccountsList(final Context context, final boolean activatedOnly) {
+ public static List getAccountsList(final Context context, final boolean activatedOnly) {
return getAccountsList(context, activatedOnly, false);
}
- public static List getAccountsList(final Context context, final boolean activatedOnly,
+ public static List getAccountsList(final Context context, final boolean activatedOnly,
final boolean officialKeyOnly) {
if (context == null) return Collections.emptyList();
- final ArrayList accounts = new ArrayList<>();
+ final ArrayList accounts = new ArrayList<>();
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(),
Accounts.CONTENT_URI, Accounts.COLUMNS_NO_CREDENTIALS,
activatedOnly ? Accounts.IS_ACTIVATED + " = 1" : null, null, Accounts.SORT_POSITION);
@@ -190,13 +190,13 @@ public class Account implements Parcelable {
cur.moveToFirst();
while (!cur.isAfterLast()) {
if (!officialKeyOnly) {
- accounts.add(new Account(cur, indices));
+ accounts.add(new ParcelableAccount(cur, indices));
} else {
final String consumerKey = cur.getString(indices.consumer_key);
final String consumerSecret = cur.getString(indices.consumer_secret);
if (shouldForceUsingPrivateAPIs(context)
|| isOfficialConsumerKeySecret(context, consumerKey, consumerSecret)) {
- accounts.add(new Account(cur, indices));
+ accounts.add(new ParcelableAccount(cur, indices));
}
}
cur.moveToNext();
@@ -205,7 +205,7 @@ public class Account implements Parcelable {
return accounts;
}
- public static AccountWithCredentials getAccountWithCredentials(final Context context, final long account_id) {
+ public static ParcelableAccountWithCredentials getAccountWithCredentials(final Context context, final long account_id) {
if (context == null) return null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null);
@@ -214,7 +214,7 @@ public class Account implements Parcelable {
if (cur.getCount() > 0 && cur.moveToFirst()) {
final Indices indices = new Indices(cur);
cur.moveToFirst();
- return new AccountWithCredentials(cur, indices);
+ return new ParcelableAccountWithCredentials(cur, indices);
}
} finally {
cur.close();
@@ -223,7 +223,7 @@ public class Account implements Parcelable {
return null;
}
- public static class AccountWithCredentials extends Account {
+ public static class ParcelableAccountWithCredentials extends ParcelableAccount {
public final int auth_type;
public final String consumer_key, consumer_secret;
@@ -232,7 +232,7 @@ public class Account implements Parcelable {
public final String api_url_format;
public final boolean same_oauth_signing_url, no_version_suffix;
- public AccountWithCredentials(final Cursor cursor, final Indices indices) {
+ public ParcelableAccountWithCredentials(final Cursor cursor, final Indices indices) {
super(cursor, indices);
auth_type = cursor.getInt(indices.auth_type);
consumer_key = cursor.getString(indices.consumer_key);
@@ -254,7 +254,7 @@ public class Account implements Parcelable {
+ ", api_url_format=" + api_url_format + ", same_oauth_signing_url=" + same_oauth_signing_url + "}";
}
- public static boolean isOfficialCredentials(final Context context, final AccountWithCredentials account) {
+ public static boolean isOfficialCredentials(final Context context, final ParcelableAccountWithCredentials account) {
if (account == null) return false;
final boolean isOAuth = account.auth_type == Accounts.AUTH_TYPE_OAUTH
|| account.auth_type == Accounts.AUTH_TYPE_XAUTH;
diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java b/twidere/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java
index 353036c35..2deac7c2e 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/model/ParcelableStatusUpdate.java
@@ -39,7 +39,7 @@ public class ParcelableStatusUpdate implements Parcelable {
}
};
- public final Account[] accounts;
+ public final ParcelableAccount[] accounts;
public final ParcelableMediaUpdate[] media;
public final String text;
public final ParcelableLocation location;
@@ -51,7 +51,7 @@ public class ParcelableStatusUpdate implements Parcelable {
* ParcelableStatusUpdate.Builder instead.
*/
@Deprecated
- public ParcelableStatusUpdate(final Account[] accounts, final String text, final ParcelableLocation location,
+ public ParcelableStatusUpdate(final ParcelableAccount[] accounts, final String text, final ParcelableLocation location,
final ParcelableMediaUpdate[] media, final long in_reply_to_status_id, final boolean is_possibly_sensitive) {
this.accounts = accounts;
this.text = text;
@@ -62,7 +62,7 @@ public class ParcelableStatusUpdate implements Parcelable {
}
public ParcelableStatusUpdate(final Context context, final DraftItem draft) {
- accounts = Account.getAccounts(context, draft.account_ids);
+ accounts = ParcelableAccount.getAccounts(context, draft.account_ids);
text = draft.text;
location = draft.location;
media = draft.media;
@@ -71,7 +71,7 @@ public class ParcelableStatusUpdate implements Parcelable {
}
public ParcelableStatusUpdate(final Parcel in) {
- accounts = in.createTypedArray(Account.CREATOR);
+ accounts = in.createTypedArray(ParcelableAccount.CREATOR);
text = in.readString();
location = in.readParcelable(ParcelableLocation.class.getClassLoader());
media = in.createTypedArray(ParcelableMediaUpdate.CREATOR);
@@ -103,7 +103,7 @@ public class ParcelableStatusUpdate implements Parcelable {
public static final class Builder {
- private Account[] accounts;
+ private ParcelableAccount[] accounts;
private String text;
private ParcelableLocation location;
private ParcelableMediaUpdate[] media;
@@ -123,7 +123,7 @@ public class ParcelableStatusUpdate implements Parcelable {
isPossiblySensitive(base.is_possibly_sensitive);
}
- public Builder accounts(final Account[] accounts) {
+ public Builder accounts(final ParcelableAccount[] accounts) {
this.accounts = accounts;
return this;
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java
index 55d8371df..e26b98195 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/preference/AccountsListPreference.java
@@ -36,8 +36,6 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
import android.widget.Switch;
import android.widget.TextView;
@@ -47,7 +45,7 @@ import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.app.TwidereApplication;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.task.AsyncTask;
import org.mariotaku.twidere.util.ImageLoaderWrapper;
import org.mariotaku.twidere.util.Utils;
@@ -76,9 +74,9 @@ public abstract class AccountsListPreference extends PreferenceCategory implemen
a.recycle();
}
- public void setAccountsData(final List accounts) {
+ public void setAccountsData(final List accounts) {
removeAll();
- for (final Account account : accounts) {
+ for (final ParcelableAccount account : accounts) {
final AccountItemPreference preference = new AccountItemPreference(getContext(), account, mSwitchKey,
mSwitchDefault);
setupPreference(preference, account);
@@ -95,12 +93,12 @@ public abstract class AccountsListPreference extends PreferenceCategory implemen
new LoadAccountsTask(this).execute();
}
- protected abstract void setupPreference(AccountItemPreference preference, Account account);
+ protected abstract void setupPreference(AccountItemPreference preference, ParcelableAccount account);
public static final class AccountItemPreference extends Preference implements ImageLoadingListener,
OnCheckedChangeListener, OnSharedPreferenceChangeListener, OnPreferenceClickListener, OnClickListener {
- private final Account mAccount;
+ private final ParcelableAccount mAccount;
private final SharedPreferences mSwitchPreference;
private final ImageLoaderWrapper mImageLoader;
@@ -108,7 +106,7 @@ public abstract class AccountsListPreference extends PreferenceCategory implemen
private final boolean mSwitchDefault;
private Switch mToggle;
- public AccountItemPreference(final Context context, final Account account, final String switchKey,
+ public AccountItemPreference(final Context context, final ParcelableAccount account, final String switchKey,
final boolean switchDefault) {
super(context);
setWidgetLayoutResource(R.layout.preference_widget_account_preference_item);
@@ -215,7 +213,7 @@ public abstract class AccountsListPreference extends PreferenceCategory implemen
}
}
- private static class LoadAccountsTask extends AsyncTask> {
+ private static class LoadAccountsTask extends AsyncTask> {
private final AccountsListPreference mPreference;
@@ -224,12 +222,12 @@ public abstract class AccountsListPreference extends PreferenceCategory implemen
}
@Override
- protected List doInBackground(final Void... params) {
- return Account.getAccountsList(mPreference.getContext(), false);
+ protected List doInBackground(final Void... params) {
+ return ParcelableAccount.getAccountsList(mPreference.getContext(), false);
}
@Override
- protected void onPostExecute(final List result) {
+ protected void onPostExecute(final List result) {
mPreference.setAccountsData(result);
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/AutoRefreshAccountsListPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/AutoRefreshAccountsListPreference.java
index a6759f223..c060f14eb 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/preference/AutoRefreshAccountsListPreference.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/preference/AutoRefreshAccountsListPreference.java
@@ -25,7 +25,7 @@ import android.util.AttributeSet;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.fragment.AccountRefreshSettingsFragment;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
public class AutoRefreshAccountsListPreference extends AccountsListPreference implements TwidereConstants {
@@ -42,7 +42,7 @@ public class AutoRefreshAccountsListPreference extends AccountsListPreference im
}
@Override
- protected void setupPreference(final AccountItemPreference preference, final Account account) {
+ protected void setupPreference(final AccountItemPreference preference, final ParcelableAccount account) {
preference.setFragment(AccountRefreshSettingsFragment.class.getName());
final Bundle args = preference.getExtras();
args.putParcelable(EXTRA_ACCOUNT, account);
diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/NotificationAccountsListPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/NotificationAccountsListPreference.java
index ba0153019..3529b6846 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/preference/NotificationAccountsListPreference.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/preference/NotificationAccountsListPreference.java
@@ -25,7 +25,7 @@ import android.util.AttributeSet;
import org.mariotaku.twidere.TwidereConstants;
import org.mariotaku.twidere.fragment.AccountNotificationSettingsFragment;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
public class NotificationAccountsListPreference extends AccountsListPreference implements TwidereConstants {
@@ -42,7 +42,7 @@ public class NotificationAccountsListPreference extends AccountsListPreference i
}
@Override
- protected void setupPreference(final AccountItemPreference preference, final Account account) {
+ protected void setupPreference(final AccountItemPreference preference, final ParcelableAccount account) {
preference.setFragment(AccountNotificationSettingsFragment.class.getName());
final Bundle args = preference.getExtras();
args.putParcelable(EXTRA_ACCOUNT, account);
diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereCommandProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereCommandProvider.java
index b9f30ea61..bf5c1c2c3 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereCommandProvider.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereCommandProvider.java
@@ -146,7 +146,7 @@ public class TwidereCommandProvider extends ContentProvider implements Constants
case CODE_REFRESH_HOME_TIMELINE:
if (mTwitterWrapper.isHomeTimelineRefreshing()) return getEmptyCursor();
case CODE_REFRESH_MENTIONS:
- if (mTwitterWrapper.isMentionsRefreshing()) return getEmptyCursor();
+ if (mTwitterWrapper.isMentionsTimelineRefreshing()) return getEmptyCursor();
case CODE_REFRESH_INBOX:
if (mTwitterWrapper.isReceivedDirectMessagesRefreshing()) return getEmptyCursor();
case CODE_REFRESH_OUTBOX:
diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java
index 8bbd0fb05..5415e4f31 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java
@@ -591,7 +591,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
isAccountSpecific = true;
break;
}
- case NOTIFICATION_ID_MENTIONS: {
+ case NOTIFICATION_ID_MENTIONS_TIMELINE: {
mNewMentions.clear();
isAccountSpecific = true;
break;
@@ -889,7 +889,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
private Cursor getNotificationsCursor() {
final MatrixCursor c = new MatrixCursor(TweetStore.Notifications.MATRIX_COLUMNS);
c.addRow(new Integer[]{NOTIFICATION_ID_HOME_TIMELINE, mUnreadStatuses.size()});
- c.addRow(new Integer[]{NOTIFICATION_ID_MENTIONS, mNewMentions.size()});
+ c.addRow(new Integer[]{NOTIFICATION_ID_MENTIONS_TIMELINE, mNewMentions.size()});
c.addRow(new Integer[]{NOTIFICATION_ID_DIRECT_MESSAGES, mNewMessages.size()});
return c;
}
@@ -898,7 +898,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
final MatrixCursor c = new MatrixCursor(TweetStore.Notifications.MATRIX_COLUMNS);
if (id == NOTIFICATION_ID_HOME_TIMELINE) {
c.addRow(new Integer[]{id, mNewStatuses.size()});
- } else if (id == NOTIFICATION_ID_MENTIONS) {
+ } else if (id == NOTIFICATION_ID_MENTIONS_TIMELINE) {
c.addRow(new Integer[]{id, mNewMentions.size()});
} else if (id == NOTIFICATION_ID_DIRECT_MESSAGES) {
c.addRow(new Integer[]{id, mNewMessages.size()});
@@ -1018,7 +1018,7 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
if (values == null || values.length == 0) return 0;
// Add statuses that not filtered to list for future use.
int result = 0;
- final boolean enabled = mPreferences.getBoolean(KEY_FILTERS_IN_MENTIONS, true);
+ final boolean enabled = mPreferences.getBoolean(KEY_FILTERS_IN_MENTIONS_TIMELINE, true);
final boolean filtersForRts = mPreferences.getBoolean(KEY_FILTERS_FOR_RTS, true);
for (final ContentValues value : values) {
final ParcelableStatus status = new ParcelableStatus(value);
@@ -1112,12 +1112,12 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
if (pref.isMentionsNotificationEnabled()) {
final long accountId = pref.getAccountId();
displayStatusesNotification(notifiedCount, pref, pref.getMentionsNotificationType(),
- NOTIFICATION_ID_MENTIONS, getStatusesForAccounts(items, accountId),
+ NOTIFICATION_ID_MENTIONS_TIMELINE, getStatusesForAccounts(items, accountId),
R.string.notification_mention, R.string.notification_mention_multiple,
R.drawable.ic_stat_mention);
}
}
- notifyUnreadCountChanged(NOTIFICATION_ID_MENTIONS);
+ notifyUnreadCountChanged(NOTIFICATION_ID_MENTIONS_TIMELINE);
break;
}
case TABLE_ID_DIRECT_MESSAGES_INBOX: {
diff --git a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java
index 2512da855..b44141bab 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java
@@ -45,7 +45,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.MainActivity;
import org.mariotaku.twidere.activity.MainHondaJOJOActivity;
import org.mariotaku.twidere.app.TwidereApplication;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.MediaUploadResult;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableLocation;
@@ -278,7 +278,7 @@ public class BackgroundOperationService extends IntentService implements Constan
final List> result = updateStatus(builder, item);
boolean failed = false;
Exception exception = null;
- final List failed_account_ids = ListUtils.fromArray(Account.getAccountIds(item.accounts));
+ final List failed_account_ids = ListUtils.fromArray(ParcelableAccount.getAccountIds(item.accounts));
for (final SingleResponse response : result) {
if (response.getData() == null) {
@@ -446,7 +446,7 @@ public class BackgroundOperationService extends IntentService implements Constan
}
}
}
- for (final Account account : statusUpdate.accounts) {
+ for (final ParcelableAccount account : statusUpdate.accounts) {
final Twitter twitter = getTwitterInstance(this, account.account_id, true, true);
final StatusUpdate status = new StatusUpdate(shortenedText);
status.setInReplyToStatusId(statusUpdate.in_reply_to_status_id);
diff --git a/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java b/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java
index 998db280b..fea937f99 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/service/RefreshService.java
@@ -184,7 +184,7 @@ public class RefreshService extends Service implements Constants {
}
private int getMentions(final long[] accountIds, final long[] maxIds, final long[] sinceIds) {
- return mTwitterWrapper.getMentionsAsync(accountIds, maxIds, sinceIds);
+ return mTwitterWrapper.getMentionsTimelineAsync(accountIds, maxIds, sinceIds);
}
private int getReceivedDirectMessages(final long[] accountIds, final long[] maxIds, final long[] sinceIds) {
@@ -220,7 +220,7 @@ public class RefreshService extends Service implements Constants {
}
private boolean isMentionsRefreshing() {
- return mTwitterWrapper.isMentionsRefreshing();
+ return mTwitterWrapper.isMentionsTimelineRefreshing();
}
private boolean isReceivedDirectMessagesRefreshing() {
diff --git a/twidere/src/main/java/org/mariotaku/twidere/task/CacheUsersStatusesTask.java b/twidere/src/main/java/org/mariotaku/twidere/task/CacheUsersStatusesTask.java
index 43e10596b..1c5b6cffa 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/task/CacheUsersStatusesTask.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/task/CacheUsersStatusesTask.java
@@ -30,7 +30,7 @@ import android.content.Context;
import com.twitter.Extractor;
-import org.mariotaku.querybuilder.Where;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.provider.TweetStore.CachedHashtags;
import org.mariotaku.twidere.provider.TweetStore.CachedStatuses;
@@ -84,7 +84,7 @@ public class CacheUsersStatusesTask extends AsyncTask implemen
final ContentValues filtered_users_values = new ContentValues();
filtered_users_values.put(Filters.Users.NAME, user.getName());
filtered_users_values.put(Filters.Users.SCREEN_NAME, user.getScreenName());
- final String filtered_users_where = Where.equals(Filters.Users.USER_ID, user.getId()).getSQL();
+ final String filtered_users_where = Expression.equals(Filters.Users.USER_ID, user.getId()).getSQL();
resolver.update(Filters.Users.CONTENT_URI, filtered_users_values, filtered_users_where, null);
}
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java
index a0f02ae9f..1e57616d3 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java
@@ -29,11 +29,11 @@ import android.net.Uri;
import android.os.Bundle;
import org.mariotaku.querybuilder.Columns.Column;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.RawItemArray;
-import org.mariotaku.querybuilder.Where;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.app.TwidereApplication;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ListResponse;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMediaUpdate;
@@ -246,7 +246,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
return mGetLocalTrendsTaskId = mAsyncTaskManager.add(task, true);
}
- public int getMentionsAsync(final long[] accountIds, final long[] max_ids, final long[] since_ids) {
+ public int getMentionsTimelineAsync(final long[] accountIds, final long[] max_ids, final long[] since_ids) {
mAsyncTaskManager.cancel(mGetMentionsTaskId);
final GetMentionsTask task = new GetMentionsTask(accountIds, max_ids, since_ids);
return mGetMentionsTaskId = mAsyncTaskManager.add(task, true);
@@ -302,7 +302,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
|| mAsyncTaskManager.hasRunningTasksForTag(TASK_TAG_STORE_TRENDS);
}
- public boolean isMentionsRefreshing() {
+ public boolean isMentionsTimelineRefreshing() {
return mAsyncTaskManager.hasRunningTasksForTag(TASK_TAG_GET_MENTIONS)
|| mAsyncTaskManager.hasRunningTasksForTag(TASK_TAG_STORE_MENTIONS);
}
@@ -325,7 +325,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
public int refreshAll(final long[] accountIds) {
if (mPreferences.getBoolean(KEY_HOME_REFRESH_MENTIONS, HomeRefreshContentPreference.DEFAULT_ENABLE_MENTIONS)) {
final long[] sinceIds = getNewestStatusIdsFromDatabase(mContext, Mentions.CONTENT_URI, accountIds);
- getMentionsAsync(accountIds, null, sinceIds);
+ getMentionsTimelineAsync(accountIds, null, sinceIds);
}
if (mPreferences.getBoolean(KEY_HOME_REFRESH_DIRECT_MESSAGES,
HomeRefreshContentPreference.DEFAULT_ENABLE_DIRECT_MESSAGES)) {
@@ -398,7 +398,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
final ParcelableMediaUpdate[] media, final long inReplyToStatusId,
final boolean isPossiblySensitive) {
final ParcelableStatusUpdate.Builder builder = new ParcelableStatusUpdate.Builder();
- builder.accounts(Account.getAccounts(mContext, accountIds));
+ builder.accounts(ParcelableAccount.getAccounts(mContext, accountIds));
builder.text(text);
builder.location(location);
builder.media(media);
@@ -693,15 +693,15 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
try {
final User user = twitter.createBlock(user_id);
for (final Uri uri : STATUSES_URIS) {
- final Where where = Where.and(Where.equals(Statuses.ACCOUNT_ID, account_id),
- Where.equals(Statuses.USER_ID, user_id));
+ final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, account_id),
+ Expression.equals(Statuses.USER_ID, user_id));
mResolver.delete(uri, where.getSQL(), null);
}
// I bet you don't want to see this user in your auto
// complete
// list.
- final Where where = Where.equals(CachedUsers.USER_ID, user_id);
+ final Expression where = Expression.equals(CachedUsers.USER_ID, user_id);
mResolver.delete(CachedUsers.CONTENT_URI, where.getSQL(), null);
return SingleResponse.getInstance(user, null);
} catch (final TwitterException e) {
@@ -742,8 +742,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (twitter == null) return SingleResponse.getInstance();
try {
final User user = twitter.createMute(mUserId);
- final Where where = Where.and(Where.equals(Statuses.ACCOUNT_ID, mAccountId),
- Where.equals(Statuses.USER_ID, mUserId));
+ final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, mAccountId),
+ Expression.equals(Statuses.USER_ID, mUserId));
mResolver.delete(Statuses.CONTENT_URI, where.getSQL(), null);
return SingleResponse.getInstance(user, null);
@@ -788,9 +788,9 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
final twitter4j.Status status = twitter.createFavorite(status_id);
final ContentValues values = new ContentValues();
values.put(Statuses.IS_FAVORITE, true);
- final Where where = Where.and(Where.equals(Statuses.ACCOUNT_ID, account_id),
- Where.or(Where.equals(Statuses.STATUS_ID, status_id),
- Where.equals(Statuses.RETWEET_ID, status_id)));
+ final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, account_id),
+ Expression.or(Expression.equals(Statuses.STATUS_ID, status_id),
+ Expression.equals(Statuses.RETWEET_ID, status_id)));
for (final Uri uri : TweetStore.STATUSES_URIS) {
mResolver.update(uri, values, where.getSQL(), null);
}
@@ -1310,8 +1310,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
final twitter4j.Status status = twitter.destroyFavorite(status_id);
final ContentValues values = new ContentValues();
values.put(Statuses.IS_FAVORITE, 0);
- final Where where = Where.and(Where.equals(Statuses.ACCOUNT_ID, account_id),
- Where.or(Where.equals(Statuses.STATUS_ID, status_id), Where.equals(Statuses.RETWEET_ID, status_id)));
+ final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, account_id),
+ Expression.or(Expression.equals(Statuses.STATUS_ID, status_id), Expression.equals(Statuses.RETWEET_ID, status_id)));
for (final Uri uri : TweetStore.STATUSES_URIS) {
mResolver.update(uri, values, where.getSQL(), null);
}
@@ -1366,9 +1366,9 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
try {
final User user = twitter.destroyFriendship(user_id);
// remove user tweets and retweets
- final Where where = Where.and(Where.equals(Statuses.ACCOUNT_ID, account_id),
- Where.or(Where.equals(Statuses.USER_ID, user_id),
- Where.equals(Statuses.RETWEETED_BY_USER_ID, user_id)));
+ final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, account_id),
+ Expression.or(Expression.equals(Statuses.USER_ID, user_id),
+ Expression.equals(Statuses.RETWEETED_BY_USER_ID, user_id)));
mResolver.delete(Statuses.CONTENT_URI, where.getSQL(), null);
return SingleResponse.getInstance(user, null);
} catch (final TwitterException e) {
@@ -1943,8 +1943,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (result != null) {
final String user_id_where = ListUtils.toString(result.list, ',', false);
for (final Uri uri : STATUSES_URIS) {
- final Where where = Where.and(Where.equals(Statuses.ACCOUNT_ID, account_id),
- new Where(String.format(Locale.ROOT, "%s IN (%s)", Statuses.USER_ID, user_id_where)));
+ final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, account_id),
+ new Expression(String.format(Locale.ROOT, "%s IN (%s)", Statuses.USER_ID, user_id_where)));
mResolver.delete(uri, where.getSQL(), null);
}
mMessagesManager.showInfoMessage(R.string.reported_users_for_spam, false);
@@ -2043,9 +2043,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
for (final Uri uri : STATUSES_URIS) {
mResolver.update(uri, values, where, null);
}
- final Intent intent = new Intent(BROADCAST_RETWEET_CHANGED);
+ final Intent intent = new Intent(BROADCAST_STATUS_RETWEETED);
intent.putExtra(EXTRA_STATUS_ID, status_id);
- intent.putExtra(EXTRA_RETWEETED, true);
mContext.sendBroadcast(intent);
mMessagesManager.showOkMessage(R.string.status_retweeted, false);
} else {
@@ -2090,8 +2089,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
// Delete all rows conflicting before new data inserted.
{
- final Where deleteWhere = Where.and(Where.equals(DirectMessages.ACCOUNT_ID, accountId),
- Where.in(new Column(DirectMessages.MESSAGE_ID), new RawItemArray(messageIds)));
+ final Expression deleteWhere = Expression.and(Expression.equals(DirectMessages.ACCOUNT_ID, accountId),
+ Expression.in(new Column(DirectMessages.MESSAGE_ID), new RawItemArray(messageIds)));
final Uri deleteUri = appendQueryParameters(uri, new NameValuePairImpl(QUERY_PARAM_NOTIFY,
false));
mResolver.delete(deleteUri, deleteWhere.getSQL(), null);
@@ -2211,9 +2210,9 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
statusIds[i] = status.getId();
}
// Delete all rows conflicting before new data inserted.
- final Where accountWhere = Where.equals(Statuses.ACCOUNT_ID, accountId);
- final Where statusWhere = Where.in(new Column(Statuses.STATUS_ID), new RawItemArray(statusIds));
- final String deleteWhere = Where.and(accountWhere, statusWhere).getSQL();
+ final Expression accountWhere = Expression.equals(Statuses.ACCOUNT_ID, accountId);
+ final Expression statusWhere = Expression.in(new Column(Statuses.STATUS_ID), new RawItemArray(statusIds));
+ final String deleteWhere = Expression.and(accountWhere, statusWhere).getSQL();
final Uri deleteUri = appendQueryParameters(uri, new NameValuePairImpl(QUERY_PARAM_NOTIFY, false));
final int rowsDeleted = mResolver.delete(deleteUri, deleteWhere, null);
// UCD
@@ -2233,8 +2232,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (insertGap) {
final ContentValues gapValue = new ContentValues();
gapValue.put(Statuses.IS_GAP, 1);
- final Where where = Where.and(Where.equals(Statuses.ACCOUNT_ID, accountId),
- Where.equals(Statuses.STATUS_ID, minId));
+ final Expression where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, accountId),
+ Expression.equals(Statuses.STATUS_ID, minId));
final Uri updateUri = appendQueryParameters(uri, new NameValuePairImpl(QUERY_PARAM_NOTIFY, true));
mResolver.update(updateUri, gapValue, where.getSQL(), null);
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java b/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java
index 9b7283b37..9aba1fdf3 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/ContentValuesCreator.java
@@ -25,7 +25,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.mariotaku.jsonserializer.JSONSerializer;
import org.mariotaku.twidere.TwidereConstants;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMedia;
@@ -326,7 +326,7 @@ public final class ContentValuesCreator implements TwidereConstants {
}
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status) {
- return makeStatusDraftContentValues(status, Account.getAccountIds(status.accounts));
+ return makeStatusDraftContentValues(status, ParcelableAccount.getAccountIds(status.accounts));
}
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status,
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/CustomTabUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/CustomTabUtils.java
index fbd0e2f55..5b6d1bef7 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/CustomTabUtils.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/CustomTabUtils.java
@@ -36,12 +36,10 @@ import org.mariotaku.twidere.fragment.support.ActivitiesAboutMeFragment;
import org.mariotaku.twidere.fragment.support.ActivitiesByFriendsFragment;
import org.mariotaku.twidere.fragment.support.DirectMessagesFragment;
import org.mariotaku.twidere.fragment.support.HomeTimelineFragment;
-import org.mariotaku.twidere.fragment.support.HomeTimelineListFragment;
import org.mariotaku.twidere.fragment.support.InvalidTabFragment;
import org.mariotaku.twidere.fragment.support.MentionsTimelineFragment;
import org.mariotaku.twidere.fragment.support.RetweetsOfMeFragment;
import org.mariotaku.twidere.fragment.support.SearchStatusesFragment;
-import org.mariotaku.twidere.fragment.support.StaggeredHomeTimelineFragment;
import org.mariotaku.twidere.fragment.support.TrendsSuggectionsFragment;
import org.mariotaku.twidere.fragment.support.UserFavoritesFragment;
import org.mariotaku.twidere.fragment.support.UserListTimelineFragment;
@@ -102,10 +100,6 @@ public class CustomTabUtils implements Constants {
RetweetsOfMeFragment.class, R.string.retweets_of_me, R.drawable.ic_action_retweet,
CustomTabConfiguration.ACCOUNT_REQUIRED, CustomTabConfiguration.FIELD_TYPE_NONE, 10));
if (Utils.hasStaggeredTimeline()) {
- CUSTOM_TABS_CONFIGURATION_MAP.put(TAB_TYPE_STAGGERED_HOME_TIMELINE, new CustomTabConfiguration(
- StaggeredHomeTimelineFragment.class, R.string.staggered_home_timeline,
- R.drawable.ic_action_view_quilt, CustomTabConfiguration.ACCOUNT_OPTIONAL,
- CustomTabConfiguration.FIELD_TYPE_NONE, 11, false));
}
CUSTOM_TABS_ICON_NAME_MAP.put("accounts", R.drawable.ic_action_accounts);
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoaderWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoaderWrapper.java
index e7670ccde..5b03ba7aa 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoaderWrapper.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/ImageLoaderWrapper.java
@@ -20,7 +20,6 @@
package org.mariotaku.twidere.util;
import android.graphics.Bitmap;
-import android.text.TextUtils;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
@@ -33,7 +32,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.imageloader.AccountExtra;
import org.mariotaku.twidere.util.imageloader.OvalBitmapDisplayer;
-import static org.mariotaku.twidere.util.Utils.getBestBannerType;
+import static org.mariotaku.twidere.util.Utils.getBestBannerUrl;
public class ImageLoaderWrapper implements Constants {
@@ -104,10 +103,17 @@ public class ImageLoaderWrapper implements Constants {
mImageLoader.displayImage(url, view, b.build(), loadingHandler, loadingHandler);
}
- public void displayProfileBanner(final ImageView view, final String base_url, final int width) {
- final String type = getBestBannerType(width);
- final String url = TextUtils.isEmpty(base_url) ? null : base_url + "/" + type;
- mImageLoader.displayImage(url, view, mBannerDisplayOptions);
+ public void displayProfileBanner(final ImageView view, final String url,
+ final ImageLoadingListener listener) {
+ mImageLoader.displayImage(url, view, mBannerDisplayOptions, listener);
+ }
+
+ public void displayProfileBanner(final ImageView view, final String url) {
+ displayProfileBanner(view, url, null);
+ }
+
+ public void displayProfileBanner(final ImageView view, final String baseUrl, final int width) {
+ displayProfileBanner(view, getBestBannerUrl(baseUrl, width));
}
public void displayProfileImage(final ImageView view, final String url) {
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java
index 5e2d2e86f..7cec10f2e 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java
@@ -36,7 +36,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseSupportActivity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.menu.AccountActionProvider;
-import org.mariotaku.twidere.model.Account;
+import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.provider.TweetStore.Filters;
@@ -179,7 +179,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
if (item.getGroupId() == AccountActionProvider.MENU_GROUP) {
final Intent intent = item.getIntent();
if (intent == null || !intent.hasExtra(EXTRA_ACCOUNT)) return false;
- final Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
+ final ParcelableAccount account = intent.getParcelableExtra(EXTRA_ACCOUNT);
mMultiSelectManager.setAccountId(account.account_id);
if (mAccountActionProvider != null) {
mAccountActionProvider.setAccountId(account.account_id);
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwidereQueryBuilder.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereQueryBuilder.java
index 184c11e2a..393142f23 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/TwidereQueryBuilder.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereQueryBuilder.java
@@ -21,11 +21,11 @@ package org.mariotaku.twidere.util;
import org.mariotaku.querybuilder.Columns;
import org.mariotaku.querybuilder.Columns.Column;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.OrderBy;
import org.mariotaku.querybuilder.SQLQueryBuilder;
import org.mariotaku.querybuilder.Selectable;
import org.mariotaku.querybuilder.Tables;
-import org.mariotaku.querybuilder.Where;
import org.mariotaku.querybuilder.query.SQLSelectQuery;
import org.mariotaku.twidere.provider.TweetStore.DirectMessages;
import org.mariotaku.twidere.provider.TweetStore.DirectMessages.Conversation;
@@ -42,16 +42,16 @@ public class TwidereQueryBuilder {
final Selectable select = Utils.getColumnsFromProjection(projection);
final SQLSelectQuery.Builder qb = SQLQueryBuilder.select(select);
qb.from(new Tables(DirectMessages.TABLE_NAME));
- final Where accountIdWhere = Where.equals(DirectMessages.ACCOUNT_ID, account_id);
- final Where incomingWhere = Where.and(Where.notEquals(DirectMessages.IS_OUTGOING, 1),
- Where.equals(DirectMessages.SENDER_ID, conversationId));
- final Where outgoingWhere = Where.and(Where.equals(DirectMessages.IS_OUTGOING, 1),
- Where.equals(DirectMessages.RECIPIENT_ID, conversationId));
- final Where conversationWhere = Where.or(incomingWhere, outgoingWhere);
+ final Expression accountIdWhere = Expression.equals(DirectMessages.ACCOUNT_ID, account_id);
+ final Expression incomingWhere = Expression.and(Expression.notEquals(DirectMessages.IS_OUTGOING, 1),
+ Expression.equals(DirectMessages.SENDER_ID, conversationId));
+ final Expression outgoingWhere = Expression.and(Expression.equals(DirectMessages.IS_OUTGOING, 1),
+ Expression.equals(DirectMessages.RECIPIENT_ID, conversationId));
+ final Expression conversationWhere = Expression.or(incomingWhere, outgoingWhere);
if (selection != null) {
- qb.where(Where.and(accountIdWhere, conversationWhere, new Where(selection)));
+ qb.where(Expression.and(accountIdWhere, conversationWhere, new Expression(selection)));
} else {
- qb.where(Where.and(accountIdWhere, conversationWhere));
+ qb.where(Expression.and(accountIdWhere, conversationWhere));
}
qb.orderBy(new OrderBy(sortOrder != null ? sortOrder : Conversation.DEFAULT_SORT_ORDER));
return qb.build().getSQL();
@@ -63,15 +63,15 @@ public class TwidereQueryBuilder {
final SQLSelectQuery.Builder qb = SQLQueryBuilder.select(select);
qb.select(select);
qb.from(new Tables(DirectMessages.TABLE_NAME));
- final Where accountIdWhere = Where.equals(DirectMessages.ACCOUNT_ID, account_id);
- final Where incomingWhere = Where.and(Where.notEquals(DirectMessages.IS_OUTGOING, 1),
- Where.equals(new Column(DirectMessages.SENDER_SCREEN_NAME), screen_name));
- final Where outgoingWhere = Where.and(Where.equals(DirectMessages.IS_OUTGOING, 1),
- Where.equals(new Column(DirectMessages.RECIPIENT_SCREEN_NAME), screen_name));
+ final Expression accountIdWhere = Expression.equals(DirectMessages.ACCOUNT_ID, account_id);
+ final Expression incomingWhere = Expression.and(Expression.notEquals(DirectMessages.IS_OUTGOING, 1),
+ Expression.equals(new Column(DirectMessages.SENDER_SCREEN_NAME), screen_name));
+ final Expression outgoingWhere = Expression.and(Expression.equals(DirectMessages.IS_OUTGOING, 1),
+ Expression.equals(new Column(DirectMessages.RECIPIENT_SCREEN_NAME), screen_name));
if (selection != null) {
- qb.where(Where.and(accountIdWhere, incomingWhere, outgoingWhere, new Where(selection)));
+ qb.where(Expression.and(accountIdWhere, incomingWhere, outgoingWhere, new Expression(selection)));
} else {
- qb.where(Where.and(accountIdWhere, incomingWhere, outgoingWhere));
+ qb.where(Expression.and(accountIdWhere, incomingWhere, outgoingWhere));
}
qb.orderBy(new OrderBy(sortOrder != null ? sortOrder : Conversation.DEFAULT_SORT_ORDER));
return qb.build().getSQL();
@@ -127,20 +127,20 @@ public class TwidereQueryBuilder {
conversationIds.select(new Columns(new Column(DirectMessages.MESSAGE_ID), new Column(
DirectMessages.SENDER_ID, ConversationEntries.CONVERSATION_ID)));
conversationIds.from(new Tables(Inbox.TABLE_NAME));
- conversationIds.where(Where.in(new Column(DirectMessages.MESSAGE_ID), recent_inbox_msg_ids.build()));
+ conversationIds.where(Expression.in(new Column(DirectMessages.MESSAGE_ID), recent_inbox_msg_ids.build()));
conversationIds.union();
conversationIds.select(new Columns(new Column(DirectMessages.MESSAGE_ID), new Column(
DirectMessages.RECIPIENT_ID, ConversationEntries.CONVERSATION_ID)));
conversationIds.from(new Tables(Outbox.TABLE_NAME));
- conversationIds.where(Where.in(new Column(DirectMessages.MESSAGE_ID), recent_outbox_msg_ids.build()));
+ conversationIds.where(Expression.in(new Column(DirectMessages.MESSAGE_ID), recent_outbox_msg_ids.build()));
final SQLSelectQuery.Builder groupedConversationIds = new SQLSelectQuery.Builder();
groupedConversationIds.select(new Column(DirectMessages.MESSAGE_ID));
groupedConversationIds.from(conversationIds.build());
groupedConversationIds.groupBy(new Column(ConversationEntries.CONVERSATION_ID));
- final Where groupedWhere = Where.in(new Column(DirectMessages.MESSAGE_ID), groupedConversationIds.build());
- final Where where;
+ final Expression groupedWhere = Expression.in(new Column(DirectMessages.MESSAGE_ID), groupedConversationIds.build());
+ final Expression where;
if (selection != null) {
- where = Where.and(groupedWhere, new Where(selection));
+ where = Expression.and(groupedWhere, new Expression(selection));
} else {
where = groupedWhere;
}
@@ -164,12 +164,12 @@ public class TwidereQueryBuilder {
final Selectable select = Utils.getColumnsFromProjection(projection);
qb.select(select).from(new Tables(DirectMessages.Inbox.TABLE_NAME));
if (selection != null) {
- qb.where(new Where(selection));
+ qb.where(new Expression(selection));
}
qb.union();
qb.select(select).from(new Tables(DirectMessages.Outbox.TABLE_NAME));
if (selection != null) {
- qb.where(new Where(selection));
+ qb.where(new Expression(selection));
}
qb.orderBy(new OrderBy(sortOrder != null ? sortOrder : DirectMessages.DEFAULT_SORT_ORDER));
return qb.build();
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java
index 81cb98357..78a56586d 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java
@@ -102,8 +102,6 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
-import com.etsy.android.grid.StaggeredGridView;
-
import org.apache.http.NameValuePair;
import org.json.JSONException;
import org.mariotaku.gallery3d.ImageViewerGLActivity;
@@ -112,11 +110,13 @@ import org.mariotaku.menucomponent.internal.menu.MenuUtils;
import org.mariotaku.querybuilder.AllColumns;
import org.mariotaku.querybuilder.Columns;
import org.mariotaku.querybuilder.Columns.Column;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.OrderBy;
import org.mariotaku.querybuilder.RawItemArray;
+import org.mariotaku.querybuilder.SQLQueryBuilder;
import org.mariotaku.querybuilder.Selectable;
+import org.mariotaku.querybuilder.Table;
import org.mariotaku.querybuilder.Tables;
-import org.mariotaku.querybuilder.Where;
import org.mariotaku.querybuilder.query.SQLSelectQuery;
import org.mariotaku.refreshnow.widget.RefreshNowListView;
import org.mariotaku.twidere.BuildConfig;
@@ -154,9 +154,9 @@ import org.mariotaku.twidere.fragment.support.UserMentionsFragment;
import org.mariotaku.twidere.fragment.support.UserTimelineFragment;
import org.mariotaku.twidere.fragment.support.UsersListFragment;
import org.mariotaku.twidere.graphic.PaddingDrawable;
-import org.mariotaku.twidere.model.Account;
-import org.mariotaku.twidere.model.Account.AccountWithCredentials;
import org.mariotaku.twidere.model.AccountPreferences;
+import org.mariotaku.twidere.model.ParcelableAccount;
+import org.mariotaku.twidere.model.ParcelableAccount.ParcelableAccountWithCredentials;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableStatus;
@@ -469,10 +469,10 @@ public final class Utils implements Constants, TwitterConstants {
public static String buildActivatedStatsWhereClause(final Context context, final String selection) {
if (context == null) return null;
final long[] account_ids = getActivatedAccountIds(context);
- final Where accountWhere = Where.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(account_ids));
- final Where where;
+ final Expression accountWhere = Expression.in(new Column(Statuses.ACCOUNT_ID), new RawItemArray(account_ids));
+ final Expression where;
if (selection != null) {
- where = Where.and(accountWhere, new Where(selection));
+ where = Expression.and(accountWhere, new Expression(selection));
} else {
where = accountWhere;
}
@@ -489,50 +489,48 @@ public final class Utils implements Constants, TwitterConstants {
return builder.build();
}
- public static String buildStatusFilterWhereClause(final String table, final String selection,
- final boolean enableInRts) {
+ public static Expression buildStatusFilterWhereClause(final String table, final Expression extraSelection,
+ final boolean enableInRts) {
if (table == null) return null;
- final StringBuilder builder = new StringBuilder();
- if (selection != null) {
- builder.append(selection);
- builder.append(" AND ");
- }
- builder.append(Statuses._ID + " NOT IN ( ");
- builder.append("SELECT DISTINCT " + table + "." + Statuses._ID + " FROM " + table);
- builder.append(" WHERE " + table + "." + Statuses.USER_ID + " IN ( SELECT " + Filters.Users.TABLE_NAME + "."
- + Filters.Users.USER_ID + " FROM " + Filters.Users.TABLE_NAME + " )");
+ final SQLSelectQuery filteredUsersQuery = SQLQueryBuilder
+ .select(new Column(new Table(Filters.Users.TABLE_NAME), Filters.Users.USER_ID))
+ .from(new Tables(Filters.Users.TABLE_NAME))
+ .build();
+ final Expression filteredUsersWhere;
if (enableInRts) {
- builder.append(" OR " + table + "." + Statuses.RETWEETED_BY_USER_ID + " IN ( SELECT "
- + Filters.Users.TABLE_NAME + "." + Filters.Users.USER_ID + " FROM " + Filters.Users.TABLE_NAME
- + " )");
+ filteredUsersWhere = Expression.or(
+ Expression.in(new Column(new Table(table), Statuses.USER_ID), filteredUsersQuery),
+ Expression.in(new Column(new Table(table), Statuses.RETWEETED_BY_USER_ID), filteredUsersQuery));
+ } else {
+ filteredUsersWhere = Expression.in(new Column(new Table(table), Statuses.USER_ID), filteredUsersQuery);
}
- builder.append(" AND " + table + "." + Statuses.IS_GAP + " IS NULL");
- builder.append(" OR " + table + "." + Statuses.IS_GAP + " == 0");
- builder.append(" UNION ");
- builder.append("SELECT DISTINCT " + table + "." + Statuses._ID + " FROM " + table + ", "
- + Filters.Sources.TABLE_NAME);
- builder.append(" WHERE " + table + "." + Statuses.SOURCE + " LIKE '%>'||" + Filters.Sources.TABLE_NAME + "."
- + Filters.Sources.VALUE + "||'%'");
- builder.append(" AND " + table + "." + Statuses.IS_GAP + " IS NULL");
- builder.append(" OR " + table + "." + Statuses.IS_GAP + " == 0");
- builder.append(" UNION ");
- builder.append("SELECT DISTINCT " + table + "." + Statuses._ID + " FROM " + table + ", "
- + Filters.Keywords.TABLE_NAME);
- builder.append(" WHERE " + table + "." + Statuses.TEXT_PLAIN + " LIKE '%'||" + Filters.Keywords.TABLE_NAME
- + "." + Filters.Keywords.VALUE + "||'%'");
- builder.append(" AND " + table + "." + Statuses.IS_GAP + " IS NULL");
- builder.append(" OR " + table + "." + Statuses.IS_GAP + " == 0");
- builder.append(" UNION ");
- builder.append("SELECT DISTINCT " + table + "." + Statuses._ID + " FROM " + table + ", "
- + Filters.Links.TABLE_NAME);
- builder.append(" WHERE " + table + "." + Statuses.TEXT_HTML + " LIKE '%%'");
- builder.append(" OR " + table + "." + Statuses.TEXT_HTML + " LIKE '%>%'||" + Filters.Links.TABLE_NAME + "."
- + Filters.Links.VALUE + "||'%%'");
- builder.append(" AND " + table + "." + Statuses.IS_GAP + " IS NULL");
- builder.append(" OR " + table + "." + Statuses.IS_GAP + " == 0");
- builder.append(" )");
- return builder.toString();
+ final SQLSelectQuery.Builder filteredIdsQueryBuilder = SQLQueryBuilder
+ .select(true, new Column(new Table(table), Statuses._ID))
+ .from(new Tables(table))
+ .where(filteredUsersWhere)
+ .union()
+ .select(true, new Columns(new Column(new Table(table), Statuses._ID)))
+ .from(new Tables(table, Filters.Sources.TABLE_NAME))
+ .where(Expression.like(new Column(new Table(table), Statuses.SOURCE),
+ "%>'||" + Filters.Sources.TABLE_NAME + "." + Filters.Sources.VALUE + "||'%"))
+ .union()
+ .select(true, new Columns(new Column(new Table(table), Statuses._ID)))
+ .from(new Tables(table, Filters.Keywords.TABLE_NAME))
+ .where(Expression.like(new Column(new Table(table), Statuses.TEXT_PLAIN),
+ "%'||" + Filters.Keywords.TABLE_NAME + "." + Filters.Keywords.VALUE + "||'%"))
+ .union()
+ .select(true, new Columns(new Column(new Table(table), Statuses._ID)))
+ .from(new Tables(table, Filters.Links.TABLE_NAME))
+ .where(Expression.like(new Column(new Table(table), Statuses.SOURCE),
+ "%>%'||" + Filters.Links.TABLE_NAME + "." + Filters.Links.VALUE + "||'%%"));
+ final Expression filterExpression = Expression.or(
+ Expression.notIn(new Column(new Table(table), Statuses._ID), filteredIdsQueryBuilder.build()),
+ Expression.equals(new Column(new Table(table), Statuses.IS_GAP), 1)
+ );
+ if (extraSelection != null) {
+ return Expression.and(filterExpression, extraSelection);
+ }
+ return filterExpression;
}
public static int calculateInSampleSize(final int width, final int height, final int preferredWidth,
@@ -569,24 +567,24 @@ public final class Utils implements Constants, TwitterConstants {
continue;
}
final String table = getTableNameByUri(uri);
- final Where account_where = new Where(Statuses.ACCOUNT_ID + " = " + account_id);
+ final Expression account_where = new Expression(Statuses.ACCOUNT_ID + " = " + account_id);
final SQLSelectQuery.Builder qb = new SQLSelectQuery.Builder();
qb.select(new Column(Statuses._ID)).from(new Tables(table));
- qb.where(new Where(Statuses.ACCOUNT_ID + " = " + account_id));
+ qb.where(new Expression(Statuses.ACCOUNT_ID + " = " + account_id));
qb.orderBy(new OrderBy(Statuses.STATUS_ID + " DESC"));
qb.limit(itemLimit);
- final Where where = Where.and(Where.notIn(new Column(Statuses._ID), qb.build()), account_where);
+ final Expression where = Expression.and(Expression.notIn(new Column(Statuses._ID), qb.build()), account_where);
resolver.delete(uri, where.getSQL(), null);
}
for (final Uri uri : DIRECT_MESSAGES_URIS) {
final String table = getTableNameByUri(uri);
- final Where account_where = new Where(DirectMessages.ACCOUNT_ID + " = " + account_id);
+ final Expression account_where = new Expression(DirectMessages.ACCOUNT_ID + " = " + account_id);
final SQLSelectQuery.Builder qb = new SQLSelectQuery.Builder();
qb.select(new Column(DirectMessages._ID)).from(new Tables(table));
- qb.where(new Where(DirectMessages.ACCOUNT_ID + " = " + account_id));
+ qb.where(new Expression(DirectMessages.ACCOUNT_ID + " = " + account_id));
qb.orderBy(new OrderBy(DirectMessages.MESSAGE_ID + " DESC"));
qb.limit(itemLimit);
- final Where where = Where.and(Where.notIn(new Column(DirectMessages._ID), qb.build()), account_where);
+ final Expression where = Expression.and(Expression.notIn(new Column(DirectMessages._ID), qb.build()), account_where);
resolver.delete(uri, where.getSQL(), null);
}
}
@@ -598,7 +596,7 @@ public final class Utils implements Constants, TwitterConstants {
qb.from(new Tables(table));
qb.orderBy(new OrderBy(BaseColumns._ID + " DESC"));
qb.limit(itemLimit * 20);
- final Where where = Where.notIn(new Column(BaseColumns._ID), qb.build());
+ final Expression where = Expression.notIn(new Column(BaseColumns._ID), qb.build());
resolver.delete(uri, where.getSQL(), null);
}
}
@@ -632,20 +630,6 @@ public final class Utils implements Constants, TwitterConstants {
// Utils.scrollListToPosition(view, position, offset);
}
- public static void clearListViewChoices(final StaggeredGridView view) {
- if (view == null) return;
- final ListAdapter adapter = view.getAdapter();
- if (adapter == null) return;
- view.clearChoices();
- view.setChoiceMode(AbsListView.CHOICE_MODE_NONE);
- view.invalidateViews();
- // Workaround for Android bug
- // http://stackoverflow.com/questions/9754170/listview-selection-remains-persistent-after-exiting-choice-mode
- // final int position = view.getFirstVisiblePosition();
- // view.setAdapter(adapter);
- // Utils.scrollListToPosition(view, position);
- }
-
public static boolean closeSilently(final Closeable c) {
if (c == null) return false;
try {
@@ -1313,7 +1297,7 @@ public final class Utils implements Constants, TwitterConstants {
public static int[] getAccountColors(final Context context, final long[] accountIds) {
if (context == null || accountIds == null) return new int[0];
final String[] cols = new String[]{Accounts.ACCOUNT_ID, Accounts.COLOR};
- final String where = Where.in(new Column(Accounts.ACCOUNT_ID), new RawItemArray(accountIds)).getSQL();
+ final String where = Expression.in(new Column(Accounts.ACCOUNT_ID), new RawItemArray(accountIds)).getSQL();
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, cols, where,
null, null);
if (cur == null) return new int[0];
@@ -1398,7 +1382,7 @@ public final class Utils implements Constants, TwitterConstants {
public static String[] getAccountNames(final Context context, final long[] accountIds) {
if (context == null) return new String[0];
final String[] cols = new String[]{Accounts.NAME};
- final String where = accountIds != null ? Where.in(new Column(Accounts.ACCOUNT_ID),
+ final String where = accountIds != null ? Expression.in(new Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, cols, where,
null, null);
@@ -1456,7 +1440,7 @@ public final class Utils implements Constants, TwitterConstants {
final boolean includeAtChar) {
if (context == null) return new String[0];
final String[] cols = new String[]{Accounts.SCREEN_NAME};
- final String where = accountIds != null ? Where.in(new Column(Accounts.ACCOUNT_ID),
+ final String where = accountIds != null ? Expression.in(new Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, cols, where,
null, null);
@@ -1498,8 +1482,8 @@ public final class Utils implements Constants, TwitterConstants {
if (context == null) return 0;
final ContentResolver resolver = context.getContentResolver();
final Cursor cur = ContentResolverUtils.query(resolver, uri, new String[]{Statuses.STATUS_ID},
- buildStatusFilterWhereClause(getTableNameByUri(uri), null, shouldEnableFiltersForRTs(context)), null,
- null);
+ buildStatusFilterWhereClause(getTableNameByUri(uri), null, shouldEnableFiltersForRTs(context)).getSQL(),
+ null, null);
if (cur == null) return 0;
try {
return cur.getCount();
@@ -1512,8 +1496,8 @@ public final class Utils implements Constants, TwitterConstants {
if (context == null) return new long[0];
final ContentResolver resolver = context.getContentResolver();
final Cursor cur = ContentResolverUtils.query(resolver, uri, new String[]{Statuses.STATUS_ID},
- buildStatusFilterWhereClause(getTableNameByUri(uri), null, shouldEnableFiltersForRTs(context)), null,
- null);
+ buildStatusFilterWhereClause(getTableNameByUri(uri), null, shouldEnableFiltersForRTs(context)).getSQL(),
+ null, null);
if (cur == null) return new long[0];
final long[] ids = new long[cur.getCount()];
cur.moveToFirst();
@@ -1552,6 +1536,11 @@ public final class Utils implements Constants, TwitterConstants {
return sb.toString();
}
+ public static String getBestBannerUrl(final String baseUrl, final int width) {
+ final String type = getBestBannerType(width);
+ return TextUtils.isEmpty(baseUrl) ? null : baseUrl + "/" + type;
+ }
+
public static String getBestBannerType(final int width) {
if (width <= 320)
return "mobile";
@@ -2288,7 +2277,7 @@ public final class Utils implements Constants, TwitterConstants {
return date.getTime();
}
- public static Authorization getTwitterAuthorization(final Context context, final AccountWithCredentials account) {
+ public static Authorization getTwitterAuthorization(final Context context, final ParcelableAccountWithCredentials account) {
if (context == null || account == null) return null;
switch (account.auth_type) {
case Accounts.AUTH_TYPE_OAUTH:
@@ -2342,7 +2331,7 @@ public final class Utils implements Constants, TwitterConstants {
public static Authorization getTwitterAuthorization(final Context context, final long accountId) {
- final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL();
+ final String where = Expression.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL();
final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, where, null, null);
if (c == null) return null;
@@ -2468,7 +2457,7 @@ public final class Utils implements Constants, TwitterConstants {
final boolean enableProxy = prefs.getBoolean(KEY_ENABLE_PROXY, false);
// Here I use old consumer key/secret because it's default key for older
// versions
- final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL();
+ final String where = Expression.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL();
final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, where, null, null);
if (c == null) return null;
@@ -2596,7 +2585,7 @@ public final class Utils implements Constants, TwitterConstants {
Accounts.COLUMNS, null, null, null);
if (cur == null) return false;
final String[] keySecrets = context.getResources().getStringArray(R.array.values_official_consumer_key_secret);
- final Account.Indices indices = new Account.Indices(cur);
+ final ParcelableAccount.Indices indices = new ParcelableAccount.Indices(cur);
cur.moveToFirst();
try {
while (!cur.isAfterLast()) {
@@ -2827,7 +2816,7 @@ public final class Utils implements Constants, TwitterConstants {
public static boolean isOfficialKeyAccount(final Context context, final long accountId) {
if (context == null) return false;
final String[] projection = {Accounts.CONSUMER_KEY, Accounts.CONSUMER_SECRET};
- final String selection = Where.equals(Accounts.ACCOUNT_ID, accountId).getSQL();
+ final String selection = Expression.equals(Accounts.ACCOUNT_ID, accountId).getSQL();
final Cursor c = context.getContentResolver().query(Accounts.CONTENT_URI, projection, selection, null, null);
try {
if (c.moveToPosition(0))
@@ -3544,8 +3533,8 @@ public final class Utils implements Constants, TwitterConstants {
}
final MenuItem translate = menu.findItem(MENU_TRANSLATE);
if (translate != null) {
- final AccountWithCredentials account = Account.getAccountWithCredentials(context, status.account_id);
- final boolean isOfficialKey = AccountWithCredentials.isOfficialCredentials(context, account);
+ final ParcelableAccountWithCredentials account = ParcelableAccount.getAccountWithCredentials(context, status.account_id);
+ final boolean isOfficialKey = ParcelableAccountWithCredentials.isOfficialCredentials(context, account);
setMenuItemAvailability(menu, MENU_TRANSLATE, isOfficialKey);
}
menu.removeGroup(MENU_GROUP_STATUS_EXTENSION);
@@ -3975,7 +3964,7 @@ public final class Utils implements Constants, TwitterConstants {
public static boolean isFilteringUser(Context context, long userId) {
final ContentResolver cr = context.getContentResolver();
- final Where where = Where.equals(Users.USER_ID, userId);
+ final Expression where = Expression.equals(Users.USER_ID, userId);
final Cursor c = cr.query(Users.CONTENT_URI, new String[0], where.getSQL(), null, null);
try {
return c.getCount() > 0;
@@ -3987,8 +3976,8 @@ public final class Utils implements Constants, TwitterConstants {
public static ParcelableUser getUserForConversation(Context context, long accountId,
long conversationId) {
final ContentResolver cr = context.getContentResolver();
- final Where where = Where.and(Where.equals(ConversationEntries.ACCOUNT_ID, accountId),
- Where.equals(ConversationEntries.CONVERSATION_ID, conversationId));
+ final Expression where = Expression.and(Expression.equals(ConversationEntries.ACCOUNT_ID, accountId),
+ Expression.equals(ConversationEntries.CONVERSATION_ID, conversationId));
final Cursor c = cr.query(ConversationEntries.CONTENT_URI, null, where.getSQL(), null, null);
try {
if (c.moveToFirst()) return ParcelableUser.fromDirectMessageConversationEntry(c);
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/content/DatabaseUpgradeHelper.java b/twidere/src/main/java/org/mariotaku/twidere/util/content/DatabaseUpgradeHelper.java
index 3f0e505f7..3e768779e 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/content/DatabaseUpgradeHelper.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/content/DatabaseUpgradeHelper.java
@@ -19,23 +19,17 @@
package org.mariotaku.twidere.util.content;
-import static org.mariotaku.querybuilder.SQLQueryBuilder.alterTable;
-import static org.mariotaku.querybuilder.SQLQueryBuilder.createTable;
-import static org.mariotaku.querybuilder.SQLQueryBuilder.dropTable;
-import static org.mariotaku.querybuilder.SQLQueryBuilder.insertInto;
-import static org.mariotaku.querybuilder.SQLQueryBuilder.select;
-
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import org.mariotaku.querybuilder.Columns;
import org.mariotaku.querybuilder.Columns.Column;
+import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.NewColumn;
+import org.mariotaku.querybuilder.OnConflict;
import org.mariotaku.querybuilder.Tables;
-import org.mariotaku.querybuilder.Where;
-import org.mariotaku.querybuilder.query.SQLInsertIntoQuery;
-import org.mariotaku.querybuilder.query.SQLInsertIntoQuery.OnConflict;
+import org.mariotaku.querybuilder.query.SQLInsertQuery;
import org.mariotaku.querybuilder.query.SQLSelectQuery;
import org.mariotaku.twidere.util.ArrayUtils;
@@ -46,145 +40,151 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
+import static org.mariotaku.querybuilder.SQLQueryBuilder.alterTable;
+import static org.mariotaku.querybuilder.SQLQueryBuilder.createTable;
+import static org.mariotaku.querybuilder.SQLQueryBuilder.dropTable;
+import static org.mariotaku.querybuilder.SQLQueryBuilder.insertInto;
+import static org.mariotaku.querybuilder.SQLQueryBuilder.select;
+
public final class DatabaseUpgradeHelper {
- public static void safeUpgrade(final SQLiteDatabase db, final String table, final String[] newColNames,
- final String[] newColTypes, final boolean dropDirectly, final boolean strictMode,
- final Map colAliases) {
- safeUpgrade(db, table, newColNames, newColTypes, dropDirectly, strictMode, colAliases, OnConflict.REPLACE);
- }
+ public static void safeUpgrade(final SQLiteDatabase db, final String table, final String[] newColNames,
+ final String[] newColTypes, final boolean dropDirectly, final boolean strictMode,
+ final Map colAliases) {
+ safeUpgrade(db, table, newColNames, newColTypes, dropDirectly, strictMode, colAliases, OnConflict.REPLACE);
+ }
- public static void safeUpgrade(final SQLiteDatabase db, final String table, final String[] newColNames,
- final String[] newColTypes, final boolean dropDirectly, final boolean strictMode,
- final Map colAliases, final OnConflict onConflict) {
+ public static void safeUpgrade(final SQLiteDatabase db, final String table, final String[] newColNames,
+ final String[] newColTypes, final boolean dropDirectly, final boolean strictMode,
+ final Map colAliases, final OnConflict onConflict) {
- if (newColNames == null || newColTypes == null || newColNames.length != newColTypes.length)
- throw new IllegalArgumentException("Invalid parameters for upgrading table " + table
- + ", length of columns and types not match.");
+ if (newColNames == null || newColTypes == null || newColNames.length != newColTypes.length)
+ throw new IllegalArgumentException("Invalid parameters for upgrading table " + table
+ + ", length of columns and types not match.");
- // First, create the table if not exists.
- final NewColumn[] newCols = NewColumn.createNewColumns(newColNames, newColTypes);
- final String createQuery = createTable(true, table).columns(newCols).buildSQL();
- db.execSQL(createQuery);
+ // First, create the table if not exists.
+ final NewColumn[] newCols = NewColumn.createNewColumns(newColNames, newColTypes);
+ final String createQuery = createTable(true, table).columns(newCols).buildSQL();
+ db.execSQL(createQuery);
- // We need to get all data from old table.
- final String[] oldCols = getColumnNames(db, table);
- if (strictMode) {
- final String oldCreate = getCreateSQL(db, table);
- final Map map = getTypeMapByCreateQuery(oldCreate);
- boolean differenct = false;
- for (final NewColumn newCol : newCols) {
- if (!newCol.getType().equalsIgnoreCase(map.get(newCol.getName()))) {
- differenct = true;
- }
- }
- if (!differenct) return;
- } else if (oldCols == null || ArrayUtils.contentMatch(newColNames, oldCols)) return;
- if (dropDirectly) {
- db.beginTransaction();
- db.execSQL(dropTable(true, table).getSQL());
- db.execSQL(createQuery);
- db.setTransactionSuccessful();
- db.endTransaction();
- return;
- }
- final String tempTable = String.format(Locale.US, "temp_%s_%d", table, System.currentTimeMillis());
- db.beginTransaction();
- db.execSQL(alterTable(table).renameTo(tempTable).buildSQL());
- db.execSQL(createQuery);
- final String[] notNullCols = getNotNullColumns(newCols);
- final String insertQuery = createInsertDataQuery(table, tempTable, newColNames, oldCols, colAliases,
- notNullCols, onConflict);
- if (insertQuery != null) {
- db.execSQL(insertQuery);
- }
- db.execSQL(dropTable(true, tempTable).getSQL());
- db.setTransactionSuccessful();
- db.endTransaction();
- }
+ // We need to get all data from old table.
+ final String[] oldCols = getColumnNames(db, table);
+ if (strictMode) {
+ final String oldCreate = getCreateSQL(db, table);
+ final Map map = getTypeMapByCreateQuery(oldCreate);
+ boolean differenct = false;
+ for (final NewColumn newCol : newCols) {
+ if (!newCol.getType().equalsIgnoreCase(map.get(newCol.getName()))) {
+ differenct = true;
+ }
+ }
+ if (!differenct) return;
+ } else if (oldCols == null || ArrayUtils.contentMatch(newColNames, oldCols)) return;
+ if (dropDirectly) {
+ db.beginTransaction();
+ db.execSQL(dropTable(true, table).getSQL());
+ db.execSQL(createQuery);
+ db.setTransactionSuccessful();
+ db.endTransaction();
+ return;
+ }
+ final String tempTable = String.format(Locale.US, "temp_%s_%d", table, System.currentTimeMillis());
+ db.beginTransaction();
+ db.execSQL(alterTable(table).renameTo(tempTable).buildSQL());
+ db.execSQL(createQuery);
+ final String[] notNullCols = getNotNullColumns(newCols);
+ final String insertQuery = createInsertDataQuery(table, tempTable, newColNames, oldCols, colAliases,
+ notNullCols, onConflict);
+ if (insertQuery != null) {
+ db.execSQL(insertQuery);
+ }
+ db.execSQL(dropTable(true, tempTable).getSQL());
+ db.setTransactionSuccessful();
+ db.endTransaction();
+ }
- public static void safeUpgrade(final SQLiteDatabase db, final String table, final String[] newColNames,
- final String[] newColTypes, final boolean dropDirectly, final Map colAliases) {
- safeUpgrade(db, table, newColNames, newColTypes, dropDirectly, true, colAliases, OnConflict.REPLACE);
- }
+ public static void safeUpgrade(final SQLiteDatabase db, final String table, final String[] newColNames,
+ final String[] newColTypes, final boolean dropDirectly, final Map colAliases) {
+ safeUpgrade(db, table, newColNames, newColTypes, dropDirectly, true, colAliases, OnConflict.REPLACE);
+ }
- private static String createInsertDataQuery(final String table, final String tempTable, final String[] newCols,
- final String[] oldCols, final Map colAliases, final String[] notNullCols,
- final OnConflict onConflict) {
- final SQLInsertIntoQuery.Builder qb = insertInto(onConflict, table);
- final List newInsertColsList = new ArrayList();
- for (final String newCol : newCols) {
- final String oldAliasedCol = colAliases != null ? colAliases.get(newCol) : null;
- if (ArrayUtils.contains(oldCols, newCol) || oldAliasedCol != null
- && ArrayUtils.contains(oldCols, oldAliasedCol)) {
- newInsertColsList.add(newCol);
- }
- }
- final String[] newInsertCols = newInsertColsList.toArray(new String[newInsertColsList.size()]);
- if (!ArrayUtils.contains(newInsertCols, notNullCols)) return null;
- qb.columns(newInsertCols);
- final Columns.Column[] oldDataCols = new Columns.Column[newInsertCols.length];
- for (int i = 0, j = oldDataCols.length; i < j; i++) {
- final String newCol = newInsertCols[i];
- final String oldAliasedCol = colAliases != null ? colAliases.get(newCol) : null;
- if (oldAliasedCol != null && ArrayUtils.contains(oldCols, oldAliasedCol)) {
- oldDataCols[i] = new Columns.Column(oldAliasedCol, newCol);
- } else {
- oldDataCols[i] = new Columns.Column(newCol);
- }
- }
- final SQLSelectQuery.Builder selectOldBuilder = select(new Columns(oldDataCols));
- selectOldBuilder.from(new Tables(tempTable));
- qb.select(selectOldBuilder.build());
- return qb.buildSQL();
- }
+ private static String createInsertDataQuery(final String table, final String tempTable, final String[] newCols,
+ final String[] oldCols, final Map colAliases, final String[] notNullCols,
+ final OnConflict onConflict) {
+ final SQLInsertQuery.Builder qb = insertInto(onConflict, table);
+ final List newInsertColsList = new ArrayList();
+ for (final String newCol : newCols) {
+ final String oldAliasedCol = colAliases != null ? colAliases.get(newCol) : null;
+ if (ArrayUtils.contains(oldCols, newCol) || oldAliasedCol != null
+ && ArrayUtils.contains(oldCols, oldAliasedCol)) {
+ newInsertColsList.add(newCol);
+ }
+ }
+ final String[] newInsertCols = newInsertColsList.toArray(new String[newInsertColsList.size()]);
+ if (!ArrayUtils.contains(newInsertCols, notNullCols)) return null;
+ qb.columns(newInsertCols);
+ final Columns.Column[] oldDataCols = new Columns.Column[newInsertCols.length];
+ for (int i = 0, j = oldDataCols.length; i < j; i++) {
+ final String newCol = newInsertCols[i];
+ final String oldAliasedCol = colAliases != null ? colAliases.get(newCol) : null;
+ if (oldAliasedCol != null && ArrayUtils.contains(oldCols, oldAliasedCol)) {
+ oldDataCols[i] = new Columns.Column(oldAliasedCol, newCol);
+ } else {
+ oldDataCols[i] = new Columns.Column(newCol);
+ }
+ }
+ final SQLSelectQuery.Builder selectOldBuilder = select(new Columns(oldDataCols));
+ selectOldBuilder.from(new Tables(tempTable));
+ qb.select(selectOldBuilder.build());
+ return qb.buildSQL();
+ }
- private static String[] getColumnNames(final SQLiteDatabase db, final String table) {
- final Cursor cur = db.query(table, null, null, null, null, null, null, "1");
- if (cur == null) return null;
- try {
- return cur.getColumnNames();
- } finally {
- cur.close();
- }
- }
+ private static String[] getColumnNames(final SQLiteDatabase db, final String table) {
+ final Cursor cur = db.query(table, null, null, null, null, null, null, "1");
+ if (cur == null) return null;
+ try {
+ return cur.getColumnNames();
+ } finally {
+ cur.close();
+ }
+ }
- private static String getCreateSQL(final SQLiteDatabase db, final String table) {
- final SQLSelectQuery.Builder qb = select(new Column("sql"));
- qb.from(new Tables("sqlite_master"));
- qb.where(new Where("type = ? AND name = ?"));
- final Cursor c = db.rawQuery(qb.buildSQL(), new String[] { "table", table });
- if (c == null) return null;
- try {
- if (c.moveToFirst()) return c.getString(0);
- return null;
- } finally {
- c.close();
- }
- }
+ private static String getCreateSQL(final SQLiteDatabase db, final String table) {
+ final SQLSelectQuery.Builder qb = select(new Column("sql"));
+ qb.from(new Tables("sqlite_master"));
+ qb.where(new Expression("type = ? AND name = ?"));
+ final Cursor c = db.rawQuery(qb.buildSQL(), new String[]{"table", table});
+ if (c == null) return null;
+ try {
+ if (c.moveToFirst()) return c.getString(0);
+ return null;
+ } finally {
+ c.close();
+ }
+ }
- private static String[] getNotNullColumns(final NewColumn[] newCols) {
- if (newCols == null) return null;
- final String[] notNullCols = new String[newCols.length];
- int count = 0;
- for (final NewColumn column : newCols) {
- if (column.getType().endsWith(" NOT NULL")) {
- notNullCols[count++] = column.getName();
- }
- }
- return ArrayUtils.subArray(notNullCols, 0, count);
- }
+ private static String[] getNotNullColumns(final NewColumn[] newCols) {
+ if (newCols == null) return null;
+ final String[] notNullCols = new String[newCols.length];
+ int count = 0;
+ for (final NewColumn column : newCols) {
+ if (column.getType().endsWith(" NOT NULL")) {
+ notNullCols[count++] = column.getName();
+ }
+ }
+ return ArrayUtils.subArray(notNullCols, 0, count);
+ }
- private static Map getTypeMapByCreateQuery(final String query) {
- if (TextUtils.isEmpty(query)) return Collections.emptyMap();
- final int start = query.indexOf("("), end = query.lastIndexOf(")");
- if (start < 0 || end < 0) return Collections.emptyMap();
- final HashMap map = new HashMap();
- for (final String segment : query.substring(start + 1, end).split(",")) {
- final String trimmed = segment.trim().replaceAll(" +", " ");
- final int idx = trimmed.indexOf(" ");
- map.put(trimmed.substring(0, idx), trimmed.substring(idx + 1, trimmed.length()));
- }
- return map;
- }
+ private static Map getTypeMapByCreateQuery(final String query) {
+ if (TextUtils.isEmpty(query)) return Collections.emptyMap();
+ final int start = query.indexOf("("), end = query.lastIndexOf(")");
+ if (start < 0 || end < 0) return Collections.emptyMap();
+ final HashMap map = new HashMap();
+ for (final String segment : query.substring(start + 1, end).split(",")) {
+ final String trimmed = segment.trim().replaceAll(" +", " ");
+ final int idx = trimmed.indexOf(" ");
+ map.put(trimmed.substring(0, idx), trimmed.substring(idx + 1, trimmed.length()));
+ }
+ return map;
+ }
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java b/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java
index 9f2b817e5..7979711ab 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java
@@ -35,8 +35,8 @@ import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
-import org.mariotaku.twidere.model.Account;
-import org.mariotaku.twidere.model.Account.AccountWithCredentials;
+import org.mariotaku.twidere.model.ParcelableAccount;
+import org.mariotaku.twidere.model.ParcelableAccount.ParcelableAccountWithCredentials;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.util.MediaPreviewUtils;
import org.mariotaku.twidere.util.Utils;
@@ -125,10 +125,10 @@ public class TwidereImageDownloader extends BaseImageDownloader implements Const
throws IOException, TwitterException {
final Uri uri = Uri.parse(uriString);
final Authorization auth;
- final AccountWithCredentials account;
+ final ParcelableAccountWithCredentials account;
if (isTwitterAuthRequired(uri) && extras instanceof AccountExtra) {
final AccountExtra accountExtra = (AccountExtra) extras;
- account = Account.getAccountWithCredentials(mContext, accountExtra.account_id);
+ account = ParcelableAccount.getAccountWithCredentials(mContext, accountExtra.account_id);
auth = getTwitterAuthorization(mContext, accountExtra.account_id);
} else {
account = null;
diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/BottomDividerFrameLayout.java b/twidere/src/main/java/org/mariotaku/twidere/view/BottomDividerFrameLayout.java
new file mode 100644
index 000000000..b518eed5f
--- /dev/null
+++ b/twidere/src/main/java/org/mariotaku/twidere/view/BottomDividerFrameLayout.java
@@ -0,0 +1,71 @@
+/*
+ * Twidere - Twitter client for Android
+ *
+ * Copyright (C) 2012-2014 Mariotaku Lee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.mariotaku.twidere.view;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.FrameLayout;
+
+/**
+ * Created by mariotaku on 14/12/4.
+ */
+public class BottomDividerFrameLayout extends FrameLayout {
+
+ private final Drawable mDividerDrawable;
+
+ public BottomDividerFrameLayout(Context context) {
+ this(context, null);
+ }
+
+ public BottomDividerFrameLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public BottomDividerFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ setWillNotDraw(false);
+ TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.divider});
+ mDividerDrawable = a.getDrawable(0);
+ a.recycle();
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ final Drawable divider = mDividerDrawable;
+ if (divider != null) {
+ final int drawableLeft = 0, drawableRight = drawableLeft + getMeasuredWidth();
+ final int drawableBottom = getMeasuredHeight(), drawableTop = drawableBottom - divider.getIntrinsicHeight();
+ divider.setBounds(drawableLeft, drawableTop, drawableRight, drawableBottom);
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ final Drawable divider = mDividerDrawable;
+ if (divider != null) {
+ divider.draw(canvas);
+ }
+ }
+}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/RefreshNowStaggeredGridView.java b/twidere/src/main/java/org/mariotaku/twidere/view/RefreshNowStaggeredGridView.java
deleted file mode 100644
index decbc51b5..000000000
--- a/twidere/src/main/java/org/mariotaku/twidere/view/RefreshNowStaggeredGridView.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.mariotaku.twidere.view;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-import com.etsy.android.grid.StaggeredGridView;
-
-import org.mariotaku.refreshnow.widget.OnRefreshListener;
-import org.mariotaku.refreshnow.widget.RefreshMode;
-import org.mariotaku.refreshnow.widget.RefreshNowConfig;
-import org.mariotaku.refreshnow.widget.iface.IRefreshNowView;
-
-public class RefreshNowStaggeredGridView extends StaggeredGridView implements IRefreshNowView {
-
- private final Helper mHelper;
-
- public RefreshNowStaggeredGridView(final Context context) {
- this(context, null);
- }
-
- public RefreshNowStaggeredGridView(final Context context, final AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public RefreshNowStaggeredGridView(final Context context, final AttributeSet attrs, final int defStyle) {
- super(context, attrs, defStyle);
- mHelper = new Helper(this, context, attrs, defStyle);
- }
-
- @Override
- public RefreshMode getRefreshMode() {
- return mHelper.getRefreshMode();
- }
-
- @Override
- public boolean isRefreshing() {
- return mHelper.isRefreshing();
- }
-
- @Override
- public boolean onTouchEvent(final MotionEvent ev) {
- return super.onTouchEvent(mHelper.processOnTouchEvent(ev));
- }
-
- @Override
- public void setConfig(final RefreshNowConfig config) {
- mHelper.setConfig(config);
- }
-
- @Override
- public void setFriction(final float friction) {
- super.setFriction(friction);
- mHelper.setFriction(friction);
- }
-
- @Override
- public void setOnRefreshListener(final OnRefreshListener listener) {
- mHelper.setOnRefreshListener(listener);
- }
-
- @Override
- public void setRefreshComplete() {
- mHelper.setRefreshComplete();
- }
-
- @Override
- public void setRefreshIndicatorView(final View view) {
- mHelper.setRefreshIndicatorView(view);
- }
-
- @Override
- public View getRefreshIndicatorView() {
- return mHelper.getRefreshIndicatorView();
- }
-
- @Override
- public void setRefreshing(final boolean refreshing) {
- mHelper.setRefreshing(refreshing);
- }
-
- @Override
- public void setRefreshMode(final RefreshMode mode) {
- mHelper.setRefreshMode(mode);
- }
-
- @Override
- protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) {
- super.onScrollChanged(l, t, oldl, oldt);
- mHelper.dispatchOnScrollChanged(l, t, oldl, oldt);
- }
-
- @Override
- protected boolean overScrollBy(final int deltaX, final int deltaY, final int scrollX, final int scrollY,
- final int scrollRangeX, final int scrollRangeY, final int maxOverScrollX, final int maxOverScrollY,
- final boolean isTouchEvent) {
- return true;
- }
-
-}
\ No newline at end of file
diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/DirectMessageEntryViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/DirectMessageEntryViewHolder.java
index d4aea9ffe..1b2bd2f96 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/DirectMessageEntryViewHolder.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/DirectMessageEntryViewHolder.java
@@ -28,60 +28,52 @@ import android.widget.TextView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ShortTimeView;
-import org.mariotaku.twidere.view.iface.ICardItemView;
-public class DirectMessageEntryViewHolder extends CardViewHolder {
+public class DirectMessageEntryViewHolder extends ViewHolder {
- public final ImageView profile_image;
- public final TextView name, screen_name, text;
- public final ShortTimeView time;
- public final ICardItemView content;
- private float text_size;
- private boolean account_color_enabled;
- private final boolean is_rtl;
+ public final ImageView profile_image;
+ public final TextView name, text;
+ public final ShortTimeView time;
+ private float text_size;
+ private boolean account_color_enabled;
+ private final boolean is_rtl;
- public DirectMessageEntryViewHolder(final View view) {
- super(view);
- final Context context = view.getContext();
- content = (ICardItemView) findViewById(R.id.content);
- profile_image = (ImageView) findViewById(R.id.profile_image);
- name = (TextView) findViewById(R.id.name);
- screen_name = (TextView) findViewById(R.id.screen_name);
- text = (TextView) findViewById(R.id.text);
- time = (ShortTimeView) findViewById(R.id.time);
- is_rtl = Utils.isRTL(context);
- }
+ public DirectMessageEntryViewHolder(final View view) {
+ super(view);
+ final Context context = view.getContext();
+ profile_image = (ImageView) findViewById(R.id.profile_image);
+ name = (TextView) findViewById(R.id.name);
+ text = (TextView) findViewById(R.id.text);
+ time = (ShortTimeView) findViewById(R.id.time);
+ is_rtl = Utils.isRTL(context);
+ }
- public void setAccountColor(final int color) {
- content.drawEnd(account_color_enabled ? color : Color.TRANSPARENT);
- }
+ public void setAccountColor(final int color) {
+// content.drawEnd(account_color_enabled ? color : Color.TRANSPARENT);
+ }
- public void setAccountColorEnabled(final boolean enabled) {
- if (account_color_enabled == enabled) return;
- account_color_enabled = enabled;
- if (!account_color_enabled) {
- content.drawEnd(Color.TRANSPARENT);
- }
- }
+ public void setAccountColorEnabled(final boolean enabled) {
+ if (account_color_enabled == enabled) return;
+ account_color_enabled = enabled;
+ if (!account_color_enabled) {
+// content.drawEnd(Color.TRANSPARENT);
+ }
+ }
- public void setIsOutgoing(final boolean is_outgoing) {
- if (is_rtl) {
- time.setCompoundDrawablesWithIntrinsicBounds(is_outgoing ? R.drawable.ic_indicator_sent : 0, 0, 0, 0);
- } else {
- time.setCompoundDrawablesWithIntrinsicBounds(0, 0, is_outgoing ? R.drawable.ic_indicator_sent : 0, 0);
- }
- }
+ public void setIsOutgoing(final boolean is_outgoing) {
+ if (is_rtl) {
+ time.setCompoundDrawablesWithIntrinsicBounds(is_outgoing ? R.drawable.ic_indicator_sent : 0, 0, 0, 0);
+ } else {
+ time.setCompoundDrawablesWithIntrinsicBounds(0, 0, is_outgoing ? R.drawable.ic_indicator_sent : 0, 0);
+ }
+ }
- public void setTextSize(final float text_size) {
- if (this.text_size == text_size) return;
- this.text_size = text_size;
- text.setTextSize(text_size);
- name.setTextSize(text_size);
- screen_name.setTextSize(text_size * 0.75f);
- time.setTextSize(text_size * 0.65f);
- }
+ public void setTextSize(final float text_size) {
+ if (this.text_size == text_size) return;
+ this.text_size = text_size;
+ }
- public void setUserColor(final int color) {
- content.drawStart(color);
- }
+ public void setUserColor(final int color) {
+// content.drawStart(color);
+ }
}
diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java
index 8653b9151..54d89c1a9 100644
--- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java
+++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java
@@ -1,7 +1,6 @@
package org.mariotaku.twidere.view.holder;
import android.content.Context;
-import android.content.Intent;
import android.database.Cursor;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
@@ -12,7 +11,6 @@ import android.widget.TextView;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
-import org.mariotaku.twidere.constant.IntentConstants;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableStatus.CursorIndices;
@@ -29,9 +27,9 @@ import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
/**
* Created by mariotaku on 14/11/19.
*/
-public class StatusViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
+public class StatusViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
- private final IStatusesAdapter adapter;
+ private final IStatusesAdapter> adapter;
private final ImageView retweetProfileImageView;
private final CircularImageView profileImageView;
@@ -44,7 +42,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements O
private final View mediaPreviewContainer;
private final TextView replyCountView, retweetCountView, favoriteCountView;
- public StatusViewHolder(IStatusesAdapter adapter, View itemView) {
+ public StatusViewHolder(IStatusesAdapter> adapter, View itemView) {
super(itemView);
this.adapter = adapter;
itemView.findViewById(R.id.item_content).setOnClickListener(this);
@@ -70,7 +68,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements O
itemView.setOnClickListener(this);
profileImageView.setOnClickListener(this);
mediaPreviewContainer.setOnClickListener(this);
- retweetCountView.setOnClickListener(this);
+ replyCountView.setOnClickListener(this);
retweetCountView.setOnClickListener(this);
favoriteCountView.setOnClickListener(this);
}
@@ -280,9 +278,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements O
@Override
public void onClick(View v) {
- final Context context = itemView.getContext();
final int position = getPosition();
- final ParcelableStatus status = adapter.getStatus(position);
switch (v.getId()) {
case R.id.item_content: {
adapter.onStatusClick(this, position);
@@ -297,10 +293,7 @@ public class StatusViewHolder extends RecyclerView.ViewHolder implements O
break;
}
case R.id.reply_count: {
- final Intent intent = new Intent(IntentConstants.INTENT_ACTION_REPLY);
- intent.setPackage(context.getPackageName());
- intent.putExtra(IntentConstants.EXTRA_STATUS, status);
- context.startActivity(intent);
+ adapter.onItemActionClick(this, v.getId(), position);
break;
}
}
diff --git a/twidere/src/main/res/drawable-hdpi/ic_user_type_protected.png b/twidere/src/main/res/drawable-hdpi/ic_user_type_protected.png
index afe19e747..e83a82f2a 100755
Binary files a/twidere/src/main/res/drawable-hdpi/ic_user_type_protected.png and b/twidere/src/main/res/drawable-hdpi/ic_user_type_protected.png differ
diff --git a/twidere/src/main/res/drawable-hdpi/ic_user_type_verified.png b/twidere/src/main/res/drawable-hdpi/ic_user_type_verified.png
index 2ec613d1e..2537b04b3 100755
Binary files a/twidere/src/main/res/drawable-hdpi/ic_user_type_verified.png and b/twidere/src/main/res/drawable-hdpi/ic_user_type_verified.png differ
diff --git a/twidere/src/main/res/drawable-mdpi/ic_user_type_protected.png b/twidere/src/main/res/drawable-mdpi/ic_user_type_protected.png
index 5a956191d..d3854790a 100755
Binary files a/twidere/src/main/res/drawable-mdpi/ic_user_type_protected.png and b/twidere/src/main/res/drawable-mdpi/ic_user_type_protected.png differ
diff --git a/twidere/src/main/res/drawable-mdpi/ic_user_type_verified.png b/twidere/src/main/res/drawable-mdpi/ic_user_type_verified.png
index ed5042113..c9f12f463 100755
Binary files a/twidere/src/main/res/drawable-mdpi/ic_user_type_verified.png and b/twidere/src/main/res/drawable-mdpi/ic_user_type_verified.png differ
diff --git a/twidere/src/main/res/drawable-xhdpi/ic_user_type_protected.png b/twidere/src/main/res/drawable-xhdpi/ic_user_type_protected.png
index 1da5ef88c..1b0d6fe52 100755
Binary files a/twidere/src/main/res/drawable-xhdpi/ic_user_type_protected.png and b/twidere/src/main/res/drawable-xhdpi/ic_user_type_protected.png differ
diff --git a/twidere/src/main/res/drawable-xhdpi/ic_user_type_verified.png b/twidere/src/main/res/drawable-xhdpi/ic_user_type_verified.png
index 6533cdd3d..3933b5479 100755
Binary files a/twidere/src/main/res/drawable-xhdpi/ic_user_type_verified.png and b/twidere/src/main/res/drawable-xhdpi/ic_user_type_verified.png differ
diff --git a/twidere/src/main/res/drawable-xxhdpi/ic_user_type_protected.png b/twidere/src/main/res/drawable-xxhdpi/ic_user_type_protected.png
index 362c91de6..e6f3eb2ef 100755
Binary files a/twidere/src/main/res/drawable-xxhdpi/ic_user_type_protected.png and b/twidere/src/main/res/drawable-xxhdpi/ic_user_type_protected.png differ
diff --git a/twidere/src/main/res/drawable-xxhdpi/ic_user_type_verified.png b/twidere/src/main/res/drawable-xxhdpi/ic_user_type_verified.png
index cf245878d..31f10aaff 100755
Binary files a/twidere/src/main/res/drawable-xxhdpi/ic_user_type_verified.png and b/twidere/src/main/res/drawable-xxhdpi/ic_user_type_verified.png differ
diff --git a/twidere/src/main/res/layout-v21/list_item_preference_header_category.xml b/twidere/src/main/res/layout-v21/list_item_preference_header_category.xml
new file mode 100644
index 000000000..6162f21b4
--- /dev/null
+++ b/twidere/src/main/res/layout-v21/list_item_preference_header_category.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/twidere/src/main/res/layout-v21/list_item_preference_header_item.xml b/twidere/src/main/res/layout-v21/list_item_preference_header_item.xml
new file mode 100644
index 000000000..004a74f9f
--- /dev/null
+++ b/twidere/src/main/res/layout-v21/list_item_preference_header_item.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/twidere/src/main/res/layout-v21/list_item_preference_header_space.xml b/twidere/src/main/res/layout-v21/list_item_preference_header_space.xml
new file mode 100644
index 000000000..ae8159d8d
--- /dev/null
+++ b/twidere/src/main/res/layout-v21/list_item_preference_header_space.xml
@@ -0,0 +1,23 @@
+
+
+
+
diff --git a/twidere/src/main/res/layout/activity_filters.xml b/twidere/src/main/res/layout/activity_filters.xml
index 14c3fd6a1..7e14b0f7b 100644
--- a/twidere/src/main/res/layout/activity_filters.xml
+++ b/twidere/src/main/res/layout/activity_filters.xml
@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:fitsSystemWindows="true"
tools:context=".activity.FiltersActivity">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/twidere/src/main/res/layout/card_item_message_entry_compact.xml b/twidere/src/main/res/layout/card_item_message_entry_compact.xml
deleted file mode 100644
index 3edba8c8c..000000000
--- a/twidere/src/main/res/layout/card_item_message_entry_compact.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/twidere/src/main/res/layout/fragment_content_pages.xml b/twidere/src/main/res/layout/fragment_content_pages.xml
index 96b870b8c..c45fa89bc 100644
--- a/twidere/src/main/res/layout/fragment_content_pages.xml
+++ b/twidere/src/main/res/layout/fragment_content_pages.xml
@@ -30,7 +30,9 @@
android:layout_width="match_parent"
android:layout_height="@dimen/element_size_normal"
android:textColor="?android:textColorSecondary"
- app:pstsTabBackground="?android:selectableItemBackground"/>
+ app:pstsTabBackground="?android:selectableItemBackground"
+ app:pstsShouldExpand="true"
+ app:pstsTabPaddingLeftRight="@dimen/element_spacing_large"/>
+ android:layout_height="wrap_content"
+ android:foreground="?android:selectableItemBackground">