From 40a2e9a5b7c70e61aaf99c966a5d0a0bb812a2d9 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Thu, 12 Mar 2015 17:43:28 +0800 Subject: [PATCH] improved refresh indicator --- .../activity/support/BaseSupportActivity.java | 1 + .../activity/support/HomeActivity.java | 15 -- .../activity/support/MediaViewerActivity.java | 3 + .../fragment/support/AbsStatusesFragment.java | 208 ++++++++++-------- .../DirectMessagesConversationFragment.java | 3 +- .../fragment/support/StatusFragment.java | 1 + .../main/res/layout/activity_media_viewer.xml | 20 +- 7 files changed, 142 insertions(+), 109 deletions(-) diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportActivity.java index 701540c73..03bd14336 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportActivity.java @@ -23,6 +23,7 @@ import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.Rect; import android.os.Bundle; +import android.util.Log; import android.view.MenuItem; import org.mariotaku.twidere.Constants; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java index a8d6759c5..cb5865c50 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java @@ -955,21 +955,6 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener } - public void moveControlBarBy(float delta) { - final int min = -getControlBarHeight(), max = 0; - mTabsContainer.setTranslationY(MathUtils.clamp(mTabsContainer.getTranslationY() + delta, max, min)); - final ViewGroup.LayoutParams ablp = mActionsButton.getLayoutParams(); - final int totalHeight; - if (ablp instanceof MarginLayoutParams) { - final MarginLayoutParams mlp = (MarginLayoutParams) ablp; - totalHeight = mActionsButton.getHeight() + mlp.topMargin + mlp.bottomMargin; - } else { - totalHeight = mActionsButton.getHeight(); - } - mActionsButton.setTranslationY(MathUtils.clamp(mActionsButton.getTranslationY() - delta, totalHeight, 0)); - notifyControlBarOffsetChanged(); - } - private static class ControlBarOffsetProperty extends Property { public static final ControlBarOffsetProperty SINGLETON = new ControlBarOffsetProperty(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java index d1130c490..7a3e4cf33 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java @@ -29,6 +29,7 @@ import android.support.v4.view.MenuItemCompat; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBar.OnMenuVisibilityListener; import android.support.v7.widget.ShareActionProvider; import android.view.LayoutInflater; import android.view.Menu; @@ -146,6 +147,8 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement } else { mActionBar.hide(); } + + findViewById(R.id.media_status).setVisibility(visible ? View.VISIBLE : View.GONE); } private void toggleBar() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java index d58798ca3..e0ff2c8e9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java @@ -1,5 +1,6 @@ package org.mariotaku.twidere.fragment.support; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -25,6 +26,8 @@ import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.activity.iface.IControlBarActivity; +import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffsetListener; import org.mariotaku.twidere.activity.support.BaseSupportActivity; import org.mariotaku.twidere.adapter.AbsStatusesAdapter; import org.mariotaku.twidere.adapter.AbsStatusesAdapter.StatusAdapterListener; @@ -51,8 +54,8 @@ import static org.mariotaku.twidere.util.Utils.setMenuForStatus; * Created by mariotaku on 14/11/5. */ public abstract class AbsStatusesFragment extends BaseSupportFragment implements LoaderCallbacks, - OnRefreshListener, DrawerCallback, RefreshScrollTopInterface, StatusAdapterListener { - + OnRefreshListener, DrawerCallback, RefreshScrollTopInterface, StatusAdapterListener, + ControlBarOffsetListener { private final Object mStatusesBusCallback; private AbsStatusesAdapter mAdapter; @@ -63,7 +66,7 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl private SwipeRefreshLayout mSwipeRefreshLayout; private RecyclerView mRecyclerView; private SimpleDrawerCallback mDrawerCallback; - + private int mTouchSlop; private OnScrollListener mOnScrollListener = new OnScrollListener() { private int mScrollState; @@ -93,15 +96,8 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl } } }; - private int mTouchSlop; - - private void setControlVisible(boolean visible) { - final FragmentActivity activity = getActivity(); - if (activity instanceof BaseSupportActivity) { - ((BaseSupportActivity) activity).setControlBarVisibleAnimate(visible); - } - } - + private Rect mSystemWindowsInsets = new Rect(); + private int mControlBarOffsetPixels; private PopupMenu mPopupMenu; protected AbsStatusesFragment() { @@ -160,66 +156,18 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl public void setRefreshing(boolean refreshing) { if (refreshing == mSwipeRefreshLayout.isRefreshing()) return; + updateRefreshProgressOffset(); mSwipeRefreshLayout.setRefreshing(refreshing); } @Override - public final Loader onCreateLoader(int id, Bundle args) { - final boolean fromUser = args.getBoolean(EXTRA_FROM_USER); - args.remove(EXTRA_FROM_USER); - return onCreateStatusesLoader(getActivity(), args, fromUser); + public void onAttach(Activity activity) { + super.onAttach(activity); + if (activity instanceof IControlBarActivity) { + ((IControlBarActivity) activity).registerControlBarOffsetListener(this); + } } - @Override - public final void onLoadFinished(Loader loader, Data data) { - setRefreshing(false); - final SharedPreferences preferences = getSharedPreferences(); - final boolean readFromBottom = preferences.getBoolean(KEY_READ_FROM_BOTTOM, false); - final long lastReadId; - final int lastVisiblePos, lastVisibleTop; - if (readFromBottom) { - lastVisiblePos = mLayoutManager.findLastVisibleItemPosition(); - } else { - lastVisiblePos = mLayoutManager.findFirstVisibleItemPosition(); - } - if (lastVisiblePos != -1) { - lastReadId = mAdapter.getItemId(lastVisiblePos); - if (readFromBottom) { - lastVisibleTop = mLayoutManager.getChildAt(mLayoutManager.getChildCount() - 1).getTop(); - } else { - lastVisibleTop = mLayoutManager.getChildAt(0).getTop(); - } - } else { - lastReadId = -1; - lastVisibleTop = 0; - } - mAdapter.setData(data); - if (!(data instanceof IExtendedLoader) || ((IExtendedLoader) data).isFromUser()) { - mAdapter.setLoadMoreIndicatorEnabled(hasMoreData(data)); - int pos = -1; - for (int i = 0; i < mAdapter.getItemCount(); i++) { - if (lastReadId == mAdapter.getItemId(i)) { - pos = i; - break; - } - } - if (pos != -1 && mAdapter.isStatus(pos) && (readFromBottom || lastVisiblePos != 0)) { - mLayoutManager.scrollToPositionWithOffset(pos, lastVisibleTop - mLayoutManager.getPaddingTop()); - } - } - if (data instanceof IExtendedLoader) { - ((IExtendedLoader) data).setFromUser(false); - } - setListShown(true); - } - - @Override - public void onLoaderReset(Loader loader) { - } - - public abstract Loader onCreateStatusesLoader(final Context context, final Bundle args, - final boolean fromUser); - @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_recycler_view, container, false); @@ -278,6 +226,96 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl super.onDestroyView(); } + @Override + public void onBaseViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onBaseViewCreated(view, savedInstanceState); + mContentView = view.findViewById(R.id.fragment_content); + mProgressContainer = view.findViewById(R.id.progress_container); + mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_layout); + mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); + } + + @Override + public void onDetach() { + final FragmentActivity activity = getActivity(); + if (activity instanceof IControlBarActivity) { + ((IControlBarActivity) activity).unregisterControlBarOffsetListener(this); + } + super.onDetach(); + } + + @Override + protected void fitSystemWindows(Rect insets) { + super.fitSystemWindows(insets); + mRecyclerView.setPadding(insets.left, insets.top, insets.right, insets.bottom); + mSystemWindowsInsets.set(insets); + + updateRefreshProgressOffset(); + } + + @Override + public void onControlBarOffsetChanged(IControlBarActivity activity, float offset) { + mControlBarOffsetPixels = Math.round(activity.getControlBarHeight() * (1 - offset)); + updateRefreshProgressOffset(); + } + + @Override + public final Loader onCreateLoader(int id, Bundle args) { + final boolean fromUser = args.getBoolean(EXTRA_FROM_USER); + args.remove(EXTRA_FROM_USER); + return onCreateStatusesLoader(getActivity(), args, fromUser); + } + + @Override + public final void onLoadFinished(Loader loader, Data data) { + setRefreshing(false); + final SharedPreferences preferences = getSharedPreferences(); + final boolean readFromBottom = preferences.getBoolean(KEY_READ_FROM_BOTTOM, false); + final long lastReadId; + final int lastVisiblePos, lastVisibleTop; + if (readFromBottom) { + lastVisiblePos = mLayoutManager.findLastVisibleItemPosition(); + } else { + lastVisiblePos = mLayoutManager.findFirstVisibleItemPosition(); + } + if (lastVisiblePos != -1) { + lastReadId = mAdapter.getItemId(lastVisiblePos); + if (readFromBottom) { + lastVisibleTop = mLayoutManager.getChildAt(mLayoutManager.getChildCount() - 1).getTop(); + } else { + lastVisibleTop = mLayoutManager.getChildAt(0).getTop(); + } + } else { + lastReadId = -1; + lastVisibleTop = 0; + } + mAdapter.setData(data); + if (!(data instanceof IExtendedLoader) || ((IExtendedLoader) data).isFromUser()) { + mAdapter.setLoadMoreIndicatorEnabled(hasMoreData(data)); + int pos = -1; + for (int i = 0; i < mAdapter.getItemCount(); i++) { + if (lastReadId == mAdapter.getItemId(i)) { + pos = i; + break; + } + } + if (pos != -1 && mAdapter.isStatus(pos) && (readFromBottom || lastVisiblePos != 0)) { + mLayoutManager.scrollToPositionWithOffset(pos, lastVisibleTop - mLayoutManager.getPaddingTop()); + } + } + if (data instanceof IExtendedLoader) { + ((IExtendedLoader) data).setFromUser(false); + } + setListShown(true); + } + + @Override + public void onLoaderReset(Loader loader) { + } + + public abstract Loader onCreateStatusesLoader(final Context context, final Bundle args, + final boolean fromUser); + @Override public void onGapClick(GapViewHolder holder, int position) { final ParcelableStatus status = mAdapter.getStatus(position); @@ -349,27 +387,6 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl triggerRefresh(); } - @Override - public void onBaseViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onBaseViewCreated(view, savedInstanceState); - mContentView = view.findViewById(R.id.fragment_content); - mProgressContainer = view.findViewById(R.id.progress_container); - mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_layout); - mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); - } - - @Override - protected void fitSystemWindows(Rect insets) { - super.fitSystemWindows(insets); - mRecyclerView.setPadding(insets.left, insets.top, insets.right, insets.bottom); - float density = getResources().getDisplayMetrics().density; - // 40: SwipeRefreshLayout.CIRCLE_DIAMETER - final int swipeStart = insets.top - Math.round(40 * density); - // 64: SwipeRefreshLayout.DEFAULT_CIRCLE_TARGET - final int swipeDistance = Math.round(64 * density); - mSwipeRefreshLayout.setProgressViewOffset(false, swipeStart, swipeStart + swipeDistance); - } - @Override public boolean scrollToStart() { final AsyncTwitterWrapper twitter = getTwitterWrapper(); @@ -378,6 +395,7 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl twitter.clearUnreadCountAsync(tabPosition); } mRecyclerView.smoothScrollToPosition(0); +// mRecyclerView.scrollToPosition(0); return true; } @@ -401,11 +419,27 @@ public abstract class AbsStatusesFragment extends BaseSupportFragment impl protected abstract void onLoadMoreStatuses(); + private void setControlVisible(boolean visible) { + final FragmentActivity activity = getActivity(); + if (activity instanceof BaseSupportActivity) { + ((BaseSupportActivity) activity).setControlBarVisibleAnimate(visible); + } + } + private void setListShown(boolean shown) { mProgressContainer.setVisibility(shown ? View.GONE : View.VISIBLE); mSwipeRefreshLayout.setVisibility(shown ? View.VISIBLE : View.GONE); } + private void updateRefreshProgressOffset() { + if (mSystemWindowsInsets.top == 0 || mSwipeRefreshLayout == null || isRefreshing()) return; + // 40: SwipeRefreshLayout.CIRCLE_DIAMETER + final float density = getResources().getDisplayMetrics().density; + final int swipeStart = (mSystemWindowsInsets.top - mControlBarOffsetPixels) - Math.round(40 * density); + // 64: SwipeRefreshLayout.DEFAULT_CIRCLE_TARGET + final int swipeDistance = Math.round(64 * density); + mSwipeRefreshLayout.setProgressViewOffset(true, swipeStart, swipeStart + swipeDistance); + } protected final class StatusesBusCallback { 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 18ec71be2..06b1481ba 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 @@ -207,7 +207,8 @@ public class DirectMessagesConversationFragment extends BaseSupportFragment impl mUserQuery = (EditText) actionBarView.findViewById(R.id.user_query); mQueryButton = actionBarView.findViewById(R.id.query_button); final List accounts = ParcelableAccount.getAccountsList(activity, false); - final AccountsSpinnerAdapter accountsSpinnerAdapter = new AccountsSpinnerAdapter(mAccountSpinner.getContext(), R.layout.spinner_item_account_icon); + final AccountsSpinnerAdapter accountsSpinnerAdapter = new AccountsSpinnerAdapter( + actionBar.getThemedContext(), R.layout.spinner_item_account_icon); accountsSpinnerAdapter.setDropDownViewResource(R.layout.list_item_user); accountsSpinnerAdapter.addAll(accounts); mAccountSpinner.setAdapter(accountsSpinnerAdapter); 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 aca0958f8..02645a52a 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 @@ -656,6 +656,7 @@ public class StatusFragment extends BaseSupportFragment cardView.setCardBackgroundColor(mCardBackgroundColor); } final StatusViewHolder holder = new StatusViewHolder(this, view); + holder.setupViewOptions(); holder.setOnClickListeners(); return holder; } diff --git a/twidere/src/main/res/layout/activity_media_viewer.xml b/twidere/src/main/res/layout/activity_media_viewer.xml index ca5e3a3ce..99d3d7081 100644 --- a/twidere/src/main/res/layout/activity_media_viewer.xml +++ b/twidere/src/main/res/layout/activity_media_viewer.xml @@ -18,15 +18,23 @@ ~ along with this program. If not, see . --> - + - \ No newline at end of file + + + \ No newline at end of file