diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java index e5717c99..32b43eb3 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java @@ -78,7 +78,7 @@ public class MainActivity extends BaseActivity { @BindView(R.id.tab_layout) TabLayout tabLayout; @BindView(R.id.pager) ViewPager viewPager; - static FloatingActionButton composeBtn; + FloatingActionButton composeButton; @Override protected void onCreate(Bundle savedInstanceState) { @@ -112,13 +112,6 @@ public class MainActivity extends BaseActivity { // Setup the tabs and timeline pager. TimelinePagerAdapter adapter = new TimelinePagerAdapter(getSupportFragmentManager()); - String[] pageTitles = { - getString(R.string.title_home), - getString(R.string.title_notifications), - getString(R.string.title_public_local), - getString(R.string.title_public_federated), - }; - adapter.setPageTitles(pageTitles); int pageMargin = getResources().getDimensionPixelSize(R.dimen.tab_page_margin); viewPager.setPageMargin(pageMargin); @@ -129,10 +122,23 @@ public class MainActivity extends BaseActivity { tabLayout.setupWithViewPager(viewPager); - tabLayout.getTabAt(0).setIcon(R.drawable.ic_home_24dp); - tabLayout.getTabAt(1).setIcon(R.drawable.ic_notifications_24dp); - tabLayout.getTabAt(2).setIcon(R.drawable.ic_local_24dp); - tabLayout.getTabAt(3).setIcon(R.drawable.ic_public_24dp); + int[] tabIcons = { + R.drawable.ic_home_24dp, + R.drawable.ic_notifications_24dp, + R.drawable.ic_local_24dp, + R.drawable.ic_public_24dp, + }; + String[] pageTitles = { + getString(R.string.title_home), + getString(R.string.title_notifications), + getString(R.string.title_public_local), + getString(R.string.title_public_federated), + }; + for (int i = 0; i < 4; i++) { + TabLayout.Tab tab = tabLayout.getTabAt(i); + tab.setIcon(tabIcons[i]); + tab.setContentDescription(pageTitles[i]); + } tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override @@ -180,7 +186,7 @@ public class MainActivity extends BaseActivity { // Setup push notifications if (arePushNotificationsEnabled()) enablePushNotifications(); - composeBtn = floatingBtn; + composeButton = floatingBtn; } @Override diff --git a/app/src/main/java/com/keylesspalace/tusky/StatusViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/StatusViewHolder.java index 5dd1449d..930ec021 100644 --- a/app/src/main/java/com/keylesspalace/tusky/StatusViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/StatusViewHolder.java @@ -16,7 +16,6 @@ package com.keylesspalace.tusky; import android.content.Context; -import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; diff --git a/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java b/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java index 1e9085f4..76f8fa46 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/TimelineFragment.java @@ -57,6 +57,7 @@ public class TimelineFragment extends SFragment implements private TimelineAdapter adapter; private Kind kind; private String hashtagOrId; + private RecyclerView recyclerView; private LinearLayoutManager layoutManager; private EndlessOnScrollListener scrollListener; private TabLayout.OnTabSelectedListener onTabSelectedListener; @@ -95,7 +96,7 @@ public class TimelineFragment extends SFragment implements swipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout); swipeRefreshLayout.setOnRefreshListener(this); // Setup the RecyclerView. - RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view); + recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(context); recyclerView.setLayoutManager(layoutManager); @@ -105,33 +106,6 @@ public class TimelineFragment extends SFragment implements R.drawable.status_divider_dark); divider.setDrawable(drawable); recyclerView.addItemDecoration(divider); - scrollListener = new EndlessOnScrollListener(layoutManager) { - @Override - public void onScrolled(RecyclerView view, int dx, int dy) { - super.onScrolled(view, dx, dy); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); - - if (dy > 0 && prefs.getBoolean("fabHide", false) && MainActivity.composeBtn.isShown()) { - MainActivity.composeBtn.hide(); // hides the button if we're scrolling down - } else if (dy < 0 && prefs.getBoolean("fabHide", false) && !MainActivity.composeBtn.isShown()) { - MainActivity.composeBtn.show(); // shows it if we are scrolling up - } - - } - - @Override - public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { - TimelineAdapter adapter = (TimelineAdapter) view.getAdapter(); - Status status = adapter.getItem(adapter.getItemCount() - 2); - if (status != null) { - sendFetchTimelineRequest(status.id, null); - } else { - sendFetchTimelineRequest(); - } - } - }; - recyclerView.addOnScrollListener(scrollListener); adapter = new TimelineAdapter(this); recyclerView.setAdapter(adapter); @@ -155,6 +129,60 @@ public class TimelineFragment extends SFragment implements return rootView; } + private void onLoadMore(RecyclerView view) { + TimelineAdapter adapter = (TimelineAdapter) view.getAdapter(); + Status status = adapter.getItem(adapter.getItemCount() - 2); + if (status != null) { + sendFetchTimelineRequest(status.id, null); + } else { + sendFetchTimelineRequest(); + } + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + /* This is delayed until onActivityCreated solely because MainActivity.composeButton isn't + * guaranteed to be set until then. */ + if (followButtonPresent()) { + /* Use a modified scroll listener that both loads more statuses as it goes, and hides + * the follow button on down-scroll. */ + MainActivity activity = (MainActivity) getActivity(); + final FloatingActionButton composeButton = activity.composeButton; + final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences( + activity); + scrollListener = new EndlessOnScrollListener(layoutManager) { + @Override + public void onScrolled(RecyclerView view, int dx, int dy) { + super.onScrolled(view, dx, dy); + + if (preferences.getBoolean("fabHide", false)) { + if (dy > 0 && composeButton.isShown()) { + composeButton.hide(); // hides the button if we're scrolling down + } else if (dy < 0 && !composeButton.isShown()) { + composeButton.show(); // shows it if we are scrolling up + } + } + } + + @Override + public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { + TimelineFragment.this.onLoadMore(view); + } + }; + } else { + // Just use the basic scroll listener to load more statuses. + scrollListener = new EndlessOnScrollListener(layoutManager) { + @Override + public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { + TimelineFragment.this.onLoadMore(view); + } + }; + } + recyclerView.addOnScrollListener(scrollListener); + } + @Override public void onDestroy() { super.onDestroy(); @@ -174,6 +202,10 @@ public class TimelineFragment extends SFragment implements return kind != Kind.TAG && kind != Kind.FAVOURITES; } + private boolean followButtonPresent() { + return kind != Kind.TAG && kind != Kind.FAVOURITES; + } + private void jumpToTop() { layoutManager.scrollToPosition(0); scrollListener.reset(); diff --git a/app/src/main/java/com/keylesspalace/tusky/TimelinePagerAdapter.java b/app/src/main/java/com/keylesspalace/tusky/TimelinePagerAdapter.java index 73318600..af9bc639 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TimelinePagerAdapter.java +++ b/app/src/main/java/com/keylesspalace/tusky/TimelinePagerAdapter.java @@ -20,16 +20,10 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; class TimelinePagerAdapter extends FragmentPagerAdapter { - private String[] pageTitles; - TimelinePagerAdapter(FragmentManager manager) { super(manager); } - void setPageTitles(String[] titles) { - pageTitles = titles; - } - @Override public Fragment getItem(int i) { switch (i) { diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml index c60b9920..eebdbab8 100644 --- a/app/src/main/res/layout/item_status.xml +++ b/app/src/main/res/layout/item_status.xml @@ -5,7 +5,8 @@ android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingRight="16dp" - android:id="@+id/status_container"> + android:id="@+id/status_container" + android:contentDescription="@string/action_view_thread"> + android:contentDescription="@string/action_view_profile" /> Preferences Favourites Blocked users + View thread Open in browser Submit Add media diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index e149cc1b..b65497de 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -18,7 +18,7 @@