make FAB hide on scroll in AccountActivity as well
This commit is contained in:
parent
e4c9b229d7
commit
099d76d919
|
@ -47,6 +47,7 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import com.keylesspalace.tusky.entity.Account;
|
import com.keylesspalace.tusky.entity.Account;
|
||||||
import com.keylesspalace.tusky.entity.Relationship;
|
import com.keylesspalace.tusky.entity.Relationship;
|
||||||
|
import com.keylesspalace.tusky.interfaces.ActionButtonActivity;
|
||||||
import com.keylesspalace.tusky.interfaces.LinkListener;
|
import com.keylesspalace.tusky.interfaces.LinkListener;
|
||||||
import com.keylesspalace.tusky.pager.AccountPagerAdapter;
|
import com.keylesspalace.tusky.pager.AccountPagerAdapter;
|
||||||
import com.keylesspalace.tusky.receiver.TimelineReceiver;
|
import com.keylesspalace.tusky.receiver.TimelineReceiver;
|
||||||
|
@ -64,7 +65,7 @@ import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
import retrofit2.Response;
|
import retrofit2.Response;
|
||||||
|
|
||||||
public class AccountActivity extends BaseActivity {
|
public class AccountActivity extends BaseActivity implements ActionButtonActivity {
|
||||||
private static final String TAG = "AccountActivity"; // logging tag
|
private static final String TAG = "AccountActivity"; // logging tag
|
||||||
|
|
||||||
private enum FollowState {
|
private enum FollowState {
|
||||||
|
@ -86,6 +87,8 @@ public class AccountActivity extends BaseActivity {
|
||||||
private TabLayout tabLayout;
|
private TabLayout tabLayout;
|
||||||
private ImageView accountLockedView;
|
private ImageView accountLockedView;
|
||||||
private View container;
|
private View container;
|
||||||
|
private boolean hideFab;
|
||||||
|
private int oldOffset;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
@ -127,6 +130,8 @@ public class AccountActivity extends BaseActivity {
|
||||||
actionBar.setDisplayShowHomeEnabled(true);
|
actionBar.setDisplayShowHomeEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hideFab = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("fabHide", false);
|
||||||
|
|
||||||
// Add a listener to change the toolbar icon color when it enters/exits its collapsed state.
|
// Add a listener to change the toolbar icon color when it enters/exits its collapsed state.
|
||||||
AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.account_app_bar_layout);
|
AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.account_app_bar_layout);
|
||||||
final CollapsingToolbarLayout collapsingToolbar =
|
final CollapsingToolbarLayout collapsingToolbar =
|
||||||
|
@ -158,6 +163,16 @@ public class AccountActivity extends BaseActivity {
|
||||||
ThemeUtils.setDrawableTint(context, toolbar.getNavigationIcon(), attribute);
|
ThemeUtils.setDrawableTint(context, toolbar.getNavigationIcon(), attribute);
|
||||||
ThemeUtils.setDrawableTint(context, toolbar.getOverflowIcon(), attribute);
|
ThemeUtils.setDrawableTint(context, toolbar.getOverflowIcon(), attribute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(floatingBtn != null && hideFab) {
|
||||||
|
if (verticalOffset > oldOffset) {
|
||||||
|
floatingBtn.show();
|
||||||
|
}
|
||||||
|
if (verticalOffset < oldOffset) {
|
||||||
|
floatingBtn.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oldOffset = verticalOffset;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -642,4 +657,11 @@ public class AccountActivity extends BaseActivity {
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public FloatingActionButton getActionButton() {
|
||||||
|
return floatingBtn;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.PersistableBundle;
|
import android.os.PersistableBundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.design.widget.FloatingActionButton;
|
import android.support.design.widget.FloatingActionButton;
|
||||||
import android.support.design.widget.TabLayout;
|
import android.support.design.widget.TabLayout;
|
||||||
import android.support.graphics.drawable.VectorDrawableCompat;
|
import android.support.graphics.drawable.VectorDrawableCompat;
|
||||||
|
@ -37,6 +38,7 @@ import android.widget.ImageButton;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import com.keylesspalace.tusky.entity.Account;
|
import com.keylesspalace.tusky.entity.Account;
|
||||||
|
import com.keylesspalace.tusky.interfaces.ActionButtonActivity;
|
||||||
import com.keylesspalace.tusky.pager.TimelinePagerAdapter;
|
import com.keylesspalace.tusky.pager.TimelinePagerAdapter;
|
||||||
import com.keylesspalace.tusky.receiver.TimelineReceiver;
|
import com.keylesspalace.tusky.receiver.TimelineReceiver;
|
||||||
import com.keylesspalace.tusky.util.ThemeUtils;
|
import com.keylesspalace.tusky.util.ThemeUtils;
|
||||||
|
@ -63,7 +65,7 @@ import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
import retrofit2.Response;
|
import retrofit2.Response;
|
||||||
|
|
||||||
public class MainActivity extends BaseActivity {
|
public class MainActivity extends BaseActivity implements ActionButtonActivity {
|
||||||
private static final String TAG = "MainActivity"; // logging tag
|
private static final String TAG = "MainActivity"; // logging tag
|
||||||
private static final long DRAWER_ITEM_EDIT_PROFILE = 0;
|
private static final long DRAWER_ITEM_EDIT_PROFILE = 0;
|
||||||
private static final long DRAWER_ITEM_FAVOURITES = 1;
|
private static final long DRAWER_ITEM_FAVOURITES = 1;
|
||||||
|
@ -77,7 +79,8 @@ public class MainActivity extends BaseActivity {
|
||||||
private static final long DRAWER_ITEM_SAVED_TOOT = 9;
|
private static final long DRAWER_ITEM_SAVED_TOOT = 9;
|
||||||
|
|
||||||
protected static int COMPOSE_RESULT = 1;
|
protected static int COMPOSE_RESULT = 1;
|
||||||
public FloatingActionButton composeButton;
|
|
||||||
|
private FloatingActionButton composeButton;
|
||||||
private String loggedInAccountId;
|
private String loggedInAccountId;
|
||||||
private String loggedInAccountUsername;
|
private String loggedInAccountUsername;
|
||||||
private Stack<Integer> pageHistory;
|
private Stack<Integer> pageHistory;
|
||||||
|
@ -493,4 +496,10 @@ public class MainActivity extends BaseActivity {
|
||||||
private void onFetchUserInfoFailure(Exception exception) {
|
private void onFetchUserInfoFailure(Exception exception) {
|
||||||
Log.e(TAG, "Failed to fetch user info. " + exception.getMessage());
|
Log.e(TAG, "Failed to fetch user info. " + exception.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public FloatingActionButton getActionButton() {
|
||||||
|
return composeButton;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -17,9 +17,12 @@ package com.keylesspalace.tusky.fragment;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.design.widget.FloatingActionButton;
|
||||||
import android.support.design.widget.Snackbar;
|
import android.support.design.widget.Snackbar;
|
||||||
import android.support.design.widget.TabLayout;
|
import android.support.design.widget.TabLayout;
|
||||||
import android.support.v7.widget.DividerItemDecoration;
|
import android.support.v7.widget.DividerItemDecoration;
|
||||||
|
@ -42,6 +45,7 @@ import com.keylesspalace.tusky.BaseActivity;
|
||||||
import com.keylesspalace.tusky.entity.Account;
|
import com.keylesspalace.tusky.entity.Account;
|
||||||
import com.keylesspalace.tusky.entity.Relationship;
|
import com.keylesspalace.tusky.entity.Relationship;
|
||||||
import com.keylesspalace.tusky.interfaces.AccountActionListener;
|
import com.keylesspalace.tusky.interfaces.AccountActionListener;
|
||||||
|
import com.keylesspalace.tusky.interfaces.ActionButtonActivity;
|
||||||
import com.keylesspalace.tusky.network.MastodonApi;
|
import com.keylesspalace.tusky.network.MastodonApi;
|
||||||
import com.keylesspalace.tusky.R;
|
import com.keylesspalace.tusky.R;
|
||||||
import com.keylesspalace.tusky.util.HttpHeaderLink;
|
import com.keylesspalace.tusky.util.HttpHeaderLink;
|
||||||
|
@ -77,6 +81,7 @@ public class AccountListFragment extends BaseFragment implements AccountActionLi
|
||||||
private int bottomFetches;
|
private int bottomFetches;
|
||||||
private boolean topLoading;
|
private boolean topLoading;
|
||||||
private int topFetches;
|
private int topFetches;
|
||||||
|
private boolean hideFab;
|
||||||
|
|
||||||
public static AccountListFragment newInstance(Type type) {
|
public static AccountListFragment newInstance(Type type) {
|
||||||
Bundle arguments = new Bundle();
|
Bundle arguments = new Bundle();
|
||||||
|
@ -168,15 +173,55 @@ public class AccountListFragment extends BaseFragment implements AccountActionLi
|
||||||
* activity is created, so everything needing to access the api object has to be delayed
|
* activity is created, so everything needing to access the api object has to be delayed
|
||||||
* until here. */
|
* until here. */
|
||||||
api = activity.mastodonApi;
|
api = activity.mastodonApi;
|
||||||
scrollListener = new EndlessOnScrollListener(layoutManager) {
|
|
||||||
@Override
|
|
||||||
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
|
if (actionButtonPresent()) {
|
||||||
AccountListFragment.this.onLoadMore(view);
|
/* Use a modified scroll listener that both loads more statuses as it goes, and hides
|
||||||
}
|
* the follow button on down-scroll. */
|
||||||
};
|
ActionButtonActivity actionButtonActivity = (ActionButtonActivity) getActivity();
|
||||||
|
final FloatingActionButton composeButton = actionButtonActivity.getActionButton();
|
||||||
|
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||||
|
hideFab = preferences.getBoolean("fabHide", false);
|
||||||
|
scrollListener = new EndlessOnScrollListener(layoutManager) {
|
||||||
|
@Override
|
||||||
|
public void onScrolled(RecyclerView view, int dx, int dy) {
|
||||||
|
super.onScrolled(view, dx, dy);
|
||||||
|
|
||||||
|
if (composeButton != null) {
|
||||||
|
if (hideFab) {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
} else if (!composeButton.isShown()) {
|
||||||
|
composeButton.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
|
||||||
|
AccountListFragment.this.onLoadMore(view);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// Just use the basic scroll listener to load more accounts.
|
||||||
|
scrollListener = new EndlessOnScrollListener(layoutManager) {
|
||||||
|
@Override
|
||||||
|
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
|
||||||
|
AccountListFragment.this.onLoadMore(view);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
recyclerView.addOnScrollListener(scrollListener);
|
recyclerView.addOnScrollListener(scrollListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean actionButtonPresent() {
|
||||||
|
return type == Type.FOLLOWS || type == Type.FOLLOWERS;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroyView() {
|
public void onDestroyView() {
|
||||||
if (jumpToTopAllowed()) {
|
if (jumpToTopAllowed()) {
|
||||||
|
|
|
@ -172,7 +172,7 @@ public class NotificationsFragment extends SFragment implements
|
||||||
* guaranteed to be set until then.
|
* guaranteed to be set until then.
|
||||||
* Use a modified scroll listener that both loads more notifications as it goes, and hides
|
* Use a modified scroll listener that both loads more notifications as it goes, and hides
|
||||||
* the compose button on down-scroll. */
|
* the compose button on down-scroll. */
|
||||||
final FloatingActionButton composeButton = activity.composeButton;
|
final FloatingActionButton composeButton = activity.getActionButton();
|
||||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(
|
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(
|
||||||
activity);
|
activity);
|
||||||
preferences.registerOnSharedPreferenceChangeListener(this);
|
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
@ -182,14 +182,16 @@ public class NotificationsFragment extends SFragment implements
|
||||||
public void onScrolled(RecyclerView view, int dx, int dy) {
|
public void onScrolled(RecyclerView view, int dx, int dy) {
|
||||||
super.onScrolled(view, dx, dy);
|
super.onScrolled(view, dx, dy);
|
||||||
|
|
||||||
if (hideFab) {
|
if(composeButton != null) {
|
||||||
if (dy > 0 && composeButton.isShown()) {
|
if (hideFab) {
|
||||||
composeButton.hide(); // hides the button if we're scrolling down
|
if (dy > 0 && composeButton.isShown()) {
|
||||||
} else if (dy < 0 && !composeButton.isShown()) {
|
composeButton.hide(); // hides the button if we're scrolling down
|
||||||
composeButton.show(); // shows it if we are scrolling up
|
} else if (dy < 0 && !composeButton.isShown()) {
|
||||||
|
composeButton.show(); // shows it if we are scrolling up
|
||||||
|
}
|
||||||
|
} else if (!composeButton.isShown()) {
|
||||||
|
composeButton.show();
|
||||||
}
|
}
|
||||||
} else if (!composeButton.isShown()) {
|
|
||||||
composeButton.show();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,11 +34,11 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.keylesspalace.tusky.BuildConfig;
|
import com.keylesspalace.tusky.BuildConfig;
|
||||||
import com.keylesspalace.tusky.MainActivity;
|
|
||||||
import com.keylesspalace.tusky.R;
|
import com.keylesspalace.tusky.R;
|
||||||
import com.keylesspalace.tusky.adapter.FooterViewHolder;
|
import com.keylesspalace.tusky.adapter.FooterViewHolder;
|
||||||
import com.keylesspalace.tusky.adapter.TimelineAdapter;
|
import com.keylesspalace.tusky.adapter.TimelineAdapter;
|
||||||
import com.keylesspalace.tusky.entity.Status;
|
import com.keylesspalace.tusky.entity.Status;
|
||||||
|
import com.keylesspalace.tusky.interfaces.ActionButtonActivity;
|
||||||
import com.keylesspalace.tusky.interfaces.StatusActionListener;
|
import com.keylesspalace.tusky.interfaces.StatusActionListener;
|
||||||
import com.keylesspalace.tusky.network.MastodonApi;
|
import com.keylesspalace.tusky.network.MastodonApi;
|
||||||
import com.keylesspalace.tusky.receiver.TimelineReceiver;
|
import com.keylesspalace.tusky.receiver.TimelineReceiver;
|
||||||
|
@ -195,28 +195,29 @@ public class TimelineFragment extends SFragment implements
|
||||||
|
|
||||||
/* This is delayed until onActivityCreated solely because MainActivity.composeButton isn't
|
/* This is delayed until onActivityCreated solely because MainActivity.composeButton isn't
|
||||||
* guaranteed to be set until then. */
|
* guaranteed to be set until then. */
|
||||||
if (composeButtonPresent()) {
|
if (actionButtonPresent()) {
|
||||||
/* Use a modified scroll listener that both loads more statuses as it goes, and hides
|
/* Use a modified scroll listener that both loads more statuses as it goes, and hides
|
||||||
* the follow button on down-scroll. */
|
* the follow button on down-scroll. */
|
||||||
MainActivity activity = (MainActivity) getActivity();
|
ActionButtonActivity activity = (ActionButtonActivity) getActivity();
|
||||||
final FloatingActionButton composeButton = activity.composeButton;
|
final FloatingActionButton composeButton = activity.getActionButton();
|
||||||
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(
|
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||||
activity);
|
|
||||||
hideFab = preferences.getBoolean("fabHide", false);
|
hideFab = preferences.getBoolean("fabHide", false);
|
||||||
scrollListener = new EndlessOnScrollListener(layoutManager) {
|
scrollListener = new EndlessOnScrollListener(layoutManager) {
|
||||||
@Override
|
@Override
|
||||||
public void onScrolled(RecyclerView view, int dx, int dy) {
|
public void onScrolled(RecyclerView view, int dx, int dy) {
|
||||||
super.onScrolled(view, dx, dy);
|
super.onScrolled(view, dx, dy);
|
||||||
|
|
||||||
if (hideFab) {
|
if (composeButton != null) {
|
||||||
if (dy > 0 && composeButton.isShown()) {
|
if (hideFab) {
|
||||||
composeButton.hide(); // hides the button if we're scrolling down
|
if (dy > 0 && composeButton.isShown()) {
|
||||||
} else if (dy < 0 && !composeButton.isShown()) {
|
composeButton.hide(); // hides the button if we're scrolling down
|
||||||
composeButton.show(); // shows it if we are scrolling up
|
} else if (dy < 0 && !composeButton.isShown()) {
|
||||||
|
composeButton.show(); // shows it if we are scrolling up
|
||||||
|
}
|
||||||
|
} else if (!composeButton.isShown()) {
|
||||||
|
composeButton.show();
|
||||||
}
|
}
|
||||||
} else if (!composeButton.isShown()) {
|
}
|
||||||
composeButton.show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -438,8 +439,8 @@ public class TimelineFragment extends SFragment implements
|
||||||
return kind != Kind.TAG && kind != Kind.FAVOURITES;
|
return kind != Kind.TAG && kind != Kind.FAVOURITES;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean composeButtonPresent() {
|
private boolean actionButtonPresent() {
|
||||||
return kind != Kind.TAG && kind != Kind.FAVOURITES && kind != Kind.USER;
|
return kind != Kind.TAG && kind != Kind.FAVOURITES;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void jumpToTop() {
|
private void jumpToTop() {
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* Copyright 2017 Andrew Dawson
|
||||||
|
*
|
||||||
|
* This file is a part of Tusky.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Tusky 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 Tusky; if not,
|
||||||
|
* see <http://www.gnu.org/licenses>. */
|
||||||
|
|
||||||
|
package com.keylesspalace.tusky.interfaces;
|
||||||
|
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.design.widget.FloatingActionButton;
|
||||||
|
|
||||||
|
public interface ActionButtonActivity {
|
||||||
|
@Nullable
|
||||||
|
FloatingActionButton getActionButton();
|
||||||
|
}
|
Loading…
Reference in New Issue