Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix icon scrolling new #6479

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
Expand Up @@ -23,14 +23,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import androidx.appcompat.content.res.AppCompatResources;
import com.google.android.material.appbar.MaterialToolbar;
import androidx.documentfile.provider.DocumentFile;
import androidx.fragment.app.Fragment;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.snackbar.Snackbar;
import com.joanzapata.iconify.Iconify;
import de.danoeh.antennapod.R;
Expand All @@ -46,7 +44,7 @@
import de.danoeh.antennapod.ui.glide.FastBlurTransformation;
import de.danoeh.antennapod.ui.statistics.StatisticsFragment;
import de.danoeh.antennapod.ui.statistics.feed.FeedStatisticsFragment;
import de.danoeh.antennapod.view.ToolbarIconTintManager;
import de.danoeh.antennapod.view.ToolbarColorManager;
import io.reactivex.Completable;
import io.reactivex.Maybe;
import io.reactivex.MaybeOnSubscribe;
Expand All @@ -56,6 +54,7 @@
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

/**
Expand All @@ -81,6 +80,7 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu
private View infoContainer;
private View header;
private MaterialToolbar toolbar;
private ToolbarColorManager toolbarColorManager;

public static FeedInfoFragment newInstance(Feed feed) {
FeedInfoFragment fragment = new FeedInfoFragment();
Expand Down Expand Up @@ -120,18 +120,10 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
refreshToolbarState();

AppBarLayout appBar = root.findViewById(R.id.appBar);
CollapsingToolbarLayout collapsingToolbar = root.findViewById(R.id.collapsing_toolbar);
ToolbarIconTintManager iconTintManager = new ToolbarIconTintManager(getContext(), toolbar, collapsingToolbar) {
@Override
protected void doTint(Context themedContext) {
toolbar.getMenu().findItem(R.id.visit_website_item)
.setIcon(AppCompatResources.getDrawable(themedContext, R.drawable.ic_web));
toolbar.getMenu().findItem(R.id.share_item)
.setIcon(AppCompatResources.getDrawable(themedContext, R.drawable.ic_share));
}
};
iconTintManager.updateTint();
appBar.addOnOffsetChangedListener(iconTintManager);
toolbarColorManager = new ToolbarColorManager(getActivity(), toolbar, Arrays.asList(
toolbar.getMenu().findItem(R.id.share_item).getIcon(),
toolbar.getMenu().findItem(R.id.visit_website_item).getIcon()));
appBar.addOnOffsetChangedListener(toolbarColorManager);

imgvCover = root.findViewById(R.id.imgvCover);
txtvTitle = root.findViewById(R.id.txtvTitle);
Expand Down Expand Up @@ -275,6 +267,14 @@ public void onDestroy() {
}
}

@Override
public void onPause() {
super.onPause();
if (toolbarColorManager != null) {
toolbarColorManager.resetStatusBar();
}
}

private void refreshToolbarState() {
toolbar.getMenu().findItem(R.id.reconnect_local_folder).setVisible(feed != null && feed.isLocalFeed());
toolbar.getMenu().findItem(R.id.share_item).setVisible(feed != null && !feed.isLocalFeed());
Expand Down
@@ -1,6 +1,5 @@
package de.danoeh.antennapod.fragment;

import android.content.Context;
import android.content.res.Configuration;
import android.graphics.LightingColorFilter;
import android.os.Bundle;
Expand All @@ -17,7 +16,7 @@
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;

import com.google.android.material.appbar.MaterialToolbar;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
Expand Down Expand Up @@ -62,7 +61,7 @@
import de.danoeh.antennapod.model.feed.FeedItemFilter;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.ui.glide.FastBlurTransformation;
import de.danoeh.antennapod.view.ToolbarIconTintManager;
import de.danoeh.antennapod.view.ToolbarColorManager;
import de.danoeh.antennapod.view.viewholder.EpisodeItemViewHolder;
import io.reactivex.Maybe;
import io.reactivex.Observable;
Expand All @@ -74,6 +73,7 @@
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

Expand All @@ -97,6 +97,8 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
private FeedItemListFragmentBinding viewBinding;
private MultiSelectSpeedDialBinding speedDialBinding;

private ToolbarColorManager toolbarColorManager;

/**
* Creates new ItemlistFragment which shows the Feeditems of a specific
* feed. Sets 'showFeedtitle' to false
Expand Down Expand Up @@ -149,18 +151,12 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
swipeActions = new SwipeActions(this, TAG).attachTo(viewBinding.recyclerView);
viewBinding.progressBar.setVisibility(View.VISIBLE);

ToolbarIconTintManager iconTintManager = new ToolbarIconTintManager(
getContext(), viewBinding.toolbar, viewBinding.collapsingToolbar) {
@Override
protected void doTint(Context themedContext) {
viewBinding.toolbar.getMenu().findItem(R.id.refresh_item)
.setIcon(AppCompatResources.getDrawable(themedContext, R.drawable.ic_refresh));
viewBinding.toolbar.getMenu().findItem(R.id.action_search)
.setIcon(AppCompatResources.getDrawable(themedContext, R.drawable.ic_search));
}
};
iconTintManager.updateTint();
viewBinding.appBar.addOnOffsetChangedListener(iconTintManager);
toolbarColorManager = new ToolbarColorManager(
getActivity(), viewBinding.toolbar,
Arrays.asList(viewBinding.toolbar.getMenu().findItem(R.id.refresh_item).getIcon(),
viewBinding.toolbar.getMenu().findItem(R.id.action_search).getIcon()));

viewBinding.appBar.addOnOffsetChangedListener(toolbarColorManager);

nextPageLoader = new MoreContentListFooterUtil(viewBinding.moreContent.moreContentListFooter);
nextPageLoader.setClickListener(() -> {
Expand Down Expand Up @@ -230,6 +226,14 @@ public void onDestroyView() {
adapter.endSelectMode();
}

@Override
public void onPause() {
super.onPause();
if (toolbarColorManager != null) {
toolbarColorManager.resetStatusBar();
}
}

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putBoolean(KEY_UP_ARROW, displayUpArrow);
Expand Down
@@ -0,0 +1,99 @@
package de.danoeh.antennapod.view;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.TypedValue;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.ColorUtils;
import androidx.fragment.app.FragmentManager;

import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.elevation.SurfaceColors;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import de.danoeh.antennapod.R;

public class ToolbarColorManager implements AppBarLayout.OnOffsetChangedListener {
private final Activity activity;
private final MaterialToolbar toolbar;
private final int colorBackgroundToolbar;
private final int colorToolbarIcons;
private final List<Drawable> toolbarIconsToTint;
private final int originalStatusBarColor;

public ToolbarColorManager(Activity activity, MaterialToolbar toolbar, List<Drawable> toolbarIconsToTint) {
this.activity = activity;
this.toolbar = toolbar;

/*Toolbar color is Surface_2 in Material 3
(see https://m3.material.io/components/top-app-bar/specs#d950a7cc-c1e7-4d69-a6f4-b8ff92cc5b3a)*/
this.colorBackgroundToolbar = SurfaceColors.SURFACE_2.getColor(activity);

//Get toolbar icon color (also dependent on theme)
TypedValue typedValueToolbarIconColor = new TypedValue();
Resources.Theme theme = activity.getTheme();
theme.resolveAttribute(R.attr.colorOnSurface, typedValueToolbarIconColor, true);
this.colorToolbarIcons = typedValueToolbarIconColor.data;

//Compile list of all icons needing to be tinted from constructor + toolbar defaults
this.toolbarIconsToTint = new ArrayList<>();
this.toolbarIconsToTint.addAll(toolbarIconsToTint);
this.toolbarIconsToTint.addAll(Arrays.asList(toolbar.getNavigationIcon(), toolbar.getOverflowIcon(),
toolbar.getCollapseIcon()));

//Save original status bar color so that it can be restored when the activity is destroyed
originalStatusBarColor = activity.getWindow().getStatusBarColor();

/*Reset status bar color whenever a new fragment come in foreground
Check if activity is of AppCompatActivity to prevent ClassCastExceptions*/
if (activity instanceof AppCompatActivity) {
FragmentManager fragmentManager = ((AppCompatActivity) activity).getSupportFragmentManager();
fragmentManager.addOnBackStackChangedListener(this::resetStatusBar);
}
}

@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int offset) {
int alpha = Math.min(Math.abs((offset) * 2), 255);
int newToolbarColor = ColorUtils.setAlphaComponent(colorBackgroundToolbar, alpha);

//Update toolbar background color as well as update icon tint
toolbar.setBackgroundColor(newToolbarColor);
updateTint(alpha / 255f);

/*Check if version is newer than marshmello because on older versions the bright toolbar with white icons
would not create sufficient contrast, thus we must keep the default status bar*/
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.getWindow().setStatusBarColor(newToolbarColor);
}
}

public void updateTint(float progress) {
int color = ColorUtils.blendARGB(Color.WHITE, colorToolbarIcons, progress);
ColorFilter colorFilter = new PorterDuffColorFilter(color, Mode.SRC_ATOP);
for (Drawable drawable : toolbarIconsToTint) {
if (drawable != null) {
drawable.setColorFilter(colorFilter);
}
}
}

/**
* Call this function whenever the activity this <class>toolbarIconTintManager</class> is onPause
* Resets status bar color back to initial so that the status bar appearance does not permanently get altered
*/
public void resetStatusBar() {
activity.getWindow().setStatusBarColor(originalStatusBarColor);
}
}

This file was deleted.