Improve collapsing toolbar state (#7277)

First this commit improves the threshold at which the icon color is
changed. We now ask the collapsing toolbar at which size it will be
collapsed instead of guessing.

Second, this commit also sets the appbar title (when collapsed) to the
podcast name in the podcast episode view.
This commit is contained in:
flofriday 2024-07-10 21:30:32 +02:00 committed by GitHub
parent ff5a2c78d8
commit 17b713e10c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 44 additions and 21 deletions

View File

@ -105,7 +105,6 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu
ToolbarIconTintManager iconTintManager = ToolbarIconTintManager iconTintManager =
new ToolbarIconTintManager(viewBinding.toolbar, viewBinding.collapsingToolbar); new ToolbarIconTintManager(viewBinding.toolbar, viewBinding.collapsingToolbar);
iconTintManager.updateTint();
viewBinding.appBar.addOnOffsetChangedListener(iconTintManager); viewBinding.appBar.addOnOffsetChangedListener(iconTintManager);
viewBinding.header.butShowInfo.setVisibility(View.INVISIBLE); viewBinding.header.butShowInfo.setVisibility(View.INVISIBLE);

View File

@ -51,6 +51,7 @@ import de.danoeh.antennapod.ui.TransitionEffect;
import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter; import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.danoeh.antennapod.ui.cleaner.HtmlToPlainText; import de.danoeh.antennapod.ui.cleaner.HtmlToPlainText;
import de.danoeh.antennapod.ui.common.IntentUtils; import de.danoeh.antennapod.ui.common.IntentUtils;
import de.danoeh.antennapod.ui.common.OnCollapseChangeListener;
import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter; import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter;
import de.danoeh.antennapod.ui.episodeslist.EpisodeItemViewHolder; import de.danoeh.antennapod.ui.episodeslist.EpisodeItemViewHolder;
import de.danoeh.antennapod.ui.episodeslist.EpisodeMultiSelectActionHandler; import de.danoeh.antennapod.ui.episodeslist.EpisodeMultiSelectActionHandler;
@ -161,8 +162,16 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
ToolbarIconTintManager iconTintManager = ToolbarIconTintManager iconTintManager =
new ToolbarIconTintManager(viewBinding.toolbar, viewBinding.collapsingToolbar); new ToolbarIconTintManager(viewBinding.toolbar, viewBinding.collapsingToolbar);
iconTintManager.updateTint();
viewBinding.appBar.addOnOffsetChangedListener(iconTintManager); viewBinding.appBar.addOnOffsetChangedListener(iconTintManager);
viewBinding.appBar.addOnOffsetChangedListener(new OnCollapseChangeListener(viewBinding.collapsingToolbar) {
@Override
public void onCollapseChanged(boolean isCollapsed) {
if (feed == null) {
return;
}
viewBinding.toolbar.setTitle(isCollapsed ? feed.getTitle() : "");
}
});
nextPageLoader = new MoreContentListFooterUtil(viewBinding.moreContent.moreContentListFooter); nextPageLoader = new MoreContentListFooterUtil(viewBinding.moreContent.moreContentListFooter);
nextPageLoader.setClickListener(() -> { nextPageLoader.setClickListener(() -> {

View File

@ -5,38 +5,27 @@ import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.view.Menu; import android.view.Menu;
import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.appbar.MaterialToolbar;
import de.danoeh.antennapod.ui.common.OnCollapseChangeListener;
/** /**
* A manager that automatically finds all icons in a collapsable toolbar and tints them according to the collapse state * A manager that automatically finds all icons in a collapsable toolbar and tints them according to the collapse state
* of the toolbar. * of the toolbar.
*/ */
public class ToolbarIconTintManager implements AppBarLayout.OnOffsetChangedListener { public class ToolbarIconTintManager extends OnCollapseChangeListener {
private final CollapsingToolbarLayout collapsingToolbar;
private final MaterialToolbar toolbar; private final MaterialToolbar toolbar;
private boolean isTinted = false;
public ToolbarIconTintManager(MaterialToolbar toolbar, CollapsingToolbarLayout collapsingToolbar) { public ToolbarIconTintManager(MaterialToolbar toolbar, CollapsingToolbarLayout collapsingToolbar) {
this.collapsingToolbar = collapsingToolbar; super(collapsingToolbar);
this.toolbar = toolbar; this.toolbar = toolbar;
this.onCollapseChanged(false);
} }
@Override @Override
public void onOffsetChanged(AppBarLayout appBarLayout, int offset) { public void onCollapseChanged(boolean isCollapsed) {
boolean tint = (collapsingToolbar.getHeight() + offset) > (2 * collapsingToolbar.getMinimumHeight()); PorterDuffColorFilter filter = isCollapsed ? null : new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP);
if (isTinted != tint) {
isTinted = tint;
updateTint();
}
}
public void updateTint() {
PorterDuffColorFilter filter = null;
if (isTinted) {
filter = new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP);
}
safeSetColorFilter(toolbar.getNavigationIcon(), filter); safeSetColorFilter(toolbar.getNavigationIcon(), filter);
safeSetColorFilter(toolbar.getOverflowIcon(), filter); safeSetColorFilter(toolbar.getOverflowIcon(), filter);

View File

@ -16,6 +16,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:scrimAnimationDuration="200" app:scrimAnimationDuration="200"
app:titleEnabled="false"
app:layout_scrollFlags="scroll|exitUntilCollapsed"> app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView <ImageView

View File

@ -0,0 +1,25 @@
package de.danoeh.antennapod.ui.common;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
public abstract class OnCollapseChangeListener implements AppBarLayout.OnOffsetChangedListener {
private final CollapsingToolbarLayout collapsingToolbar;
private boolean wasCollapsed = false;
public OnCollapseChangeListener(CollapsingToolbarLayout collapsingToolbar) {
this.collapsingToolbar = collapsingToolbar;
}
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int offset) {
boolean isCollapsed = (collapsingToolbar.getHeight() + offset)
< collapsingToolbar.getScrimVisibleHeightTrigger();
if (wasCollapsed != isCollapsed) {
wasCollapsed = isCollapsed;
onCollapseChanged(isCollapsed);
}
}
public abstract void onCollapseChanged(boolean isCollapsed);
}