Refactor ToolbarIconTintManager to a simpler API (#7240)
The original API used a callback where the caller needed to specify the icons of the menu items. However, the manager can find them on it's own. Since the callback was never used for anything else, I also removed it, which now means the ToolbarIconTintManager can now be used on it's own instead of instantiating an anonymous class that only overwrites the callback.
This commit is contained in:
parent
14cf3cb1fc
commit
da5972a3fd
|
@ -20,7 +20,6 @@ import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.content.res.AppCompatResources;
|
|
||||||
import androidx.documentfile.provider.DocumentFile;
|
import androidx.documentfile.provider.DocumentFile;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
|
@ -104,16 +103,8 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu
|
||||||
viewBinding.toolbar.setOnMenuItemClickListener(this);
|
viewBinding.toolbar.setOnMenuItemClickListener(this);
|
||||||
refreshToolbarState();
|
refreshToolbarState();
|
||||||
|
|
||||||
ToolbarIconTintManager iconTintManager = new ToolbarIconTintManager(getContext(),
|
ToolbarIconTintManager iconTintManager =
|
||||||
viewBinding.toolbar, viewBinding.collapsingToolbar) {
|
new ToolbarIconTintManager(viewBinding.toolbar, viewBinding.collapsingToolbar);
|
||||||
@Override
|
|
||||||
protected void doTint(Context themedContext) {
|
|
||||||
viewBinding.toolbar.getMenu().findItem(R.id.visit_website_item)
|
|
||||||
.setIcon(AppCompatResources.getDrawable(themedContext, R.drawable.ic_web));
|
|
||||||
viewBinding.toolbar.getMenu().findItem(R.id.share_item)
|
|
||||||
.setIcon(AppCompatResources.getDrawable(themedContext, R.drawable.ic_share));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
iconTintManager.updateTint();
|
iconTintManager.updateTint();
|
||||||
viewBinding.appBar.addOnOffsetChangedListener(iconTintManager);
|
viewBinding.appBar.addOnOffsetChangedListener(iconTintManager);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package de.danoeh.antennapod.ui.screen.feed;
|
package de.danoeh.antennapod.ui.screen.feed;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.LightingColorFilter;
|
import android.graphics.LightingColorFilter;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -15,7 +14,6 @@ import android.widget.AdapterView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.content.res.AppCompatResources;
|
|
||||||
import androidx.core.util.Pair;
|
import androidx.core.util.Pair;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
@ -161,16 +159,8 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
|
||||||
swipeActions = new SwipeActions(this, TAG).attachTo(viewBinding.recyclerView);
|
swipeActions = new SwipeActions(this, TAG).attachTo(viewBinding.recyclerView);
|
||||||
viewBinding.progressBar.setVisibility(View.VISIBLE);
|
viewBinding.progressBar.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
ToolbarIconTintManager iconTintManager = new ToolbarIconTintManager(
|
ToolbarIconTintManager iconTintManager =
|
||||||
viewBinding.toolbar.getContext(), viewBinding.toolbar, viewBinding.collapsingToolbar) {
|
new ToolbarIconTintManager(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();
|
iconTintManager.updateTint();
|
||||||
viewBinding.appBar.addOnOffsetChangedListener(iconTintManager);
|
viewBinding.appBar.addOnOffsetChangedListener(iconTintManager);
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,24 @@
|
||||||
package de.danoeh.antennapod.ui.screen.feed;
|
package de.danoeh.antennapod.ui.screen.feed;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.PorterDuff.Mode;
|
import android.graphics.PorterDuff.Mode;
|
||||||
import android.graphics.PorterDuffColorFilter;
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.view.ContextThemeWrapper;
|
import android.view.Menu;
|
||||||
|
|
||||||
import com.google.android.material.appbar.MaterialToolbar;
|
import com.google.android.material.appbar.MaterialToolbar;
|
||||||
import com.google.android.material.appbar.AppBarLayout;
|
import com.google.android.material.appbar.AppBarLayout;
|
||||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
||||||
import de.danoeh.antennapod.R;
|
|
||||||
|
|
||||||
public abstract class ToolbarIconTintManager implements AppBarLayout.OnOffsetChangedListener {
|
/**
|
||||||
private final Context context;
|
* A manager that automatically finds all icons in a collapsable toolbar and tints them according to the collapse state
|
||||||
|
* of the toolbar.
|
||||||
|
*/
|
||||||
|
public class ToolbarIconTintManager implements AppBarLayout.OnOffsetChangedListener {
|
||||||
private final CollapsingToolbarLayout collapsingToolbar;
|
private final CollapsingToolbarLayout collapsingToolbar;
|
||||||
private final MaterialToolbar toolbar;
|
private final MaterialToolbar toolbar;
|
||||||
private boolean isTinted = false;
|
private boolean isTinted = false;
|
||||||
|
|
||||||
public ToolbarIconTintManager(Context context, MaterialToolbar toolbar, CollapsingToolbarLayout collapsingToolbar) {
|
public ToolbarIconTintManager(MaterialToolbar toolbar, CollapsingToolbarLayout collapsingToolbar) {
|
||||||
this.context = context;
|
|
||||||
this.collapsingToolbar = collapsingToolbar;
|
this.collapsingToolbar = collapsingToolbar;
|
||||||
this.toolbar = toolbar;
|
this.toolbar = toolbar;
|
||||||
}
|
}
|
||||||
|
@ -32,16 +33,20 @@ public abstract class ToolbarIconTintManager implements AppBarLayout.OnOffsetCha
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateTint() {
|
public void updateTint() {
|
||||||
|
PorterDuffColorFilter filter = null;
|
||||||
if (isTinted) {
|
if (isTinted) {
|
||||||
doTint(new ContextThemeWrapper(context, R.style.Theme_AntennaPod_Dark));
|
filter = new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP);
|
||||||
safeSetColorFilter(toolbar.getNavigationIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
|
}
|
||||||
safeSetColorFilter(toolbar.getOverflowIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
|
|
||||||
safeSetColorFilter(toolbar.getCollapseIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
|
safeSetColorFilter(toolbar.getNavigationIcon(), filter);
|
||||||
} else {
|
safeSetColorFilter(toolbar.getOverflowIcon(), filter);
|
||||||
doTint(context);
|
safeSetColorFilter(toolbar.getCollapseIcon(), filter);
|
||||||
safeSetColorFilter(toolbar.getNavigationIcon(), null);
|
|
||||||
safeSetColorFilter(toolbar.getOverflowIcon(), null);
|
Menu menu = toolbar.getMenu();
|
||||||
safeSetColorFilter(toolbar.getCollapseIcon(), null);
|
for (int i = 0; i < menu.size(); i++) {
|
||||||
|
Drawable icon = menu.getItem(i).getIcon();
|
||||||
|
safeSetColorFilter(icon, filter);
|
||||||
|
menu.getItem(i).setIcon(icon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,10 +55,4 @@ public abstract class ToolbarIconTintManager implements AppBarLayout.OnOffsetCha
|
||||||
icon.setColorFilter(filter);
|
icon.setColorFilter(filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* View expansion was changed. Icons need to be tinted
|
|
||||||
* @param themedContext ContextThemeWrapper with dark theme while expanded
|
|
||||||
*/
|
|
||||||
protected abstract void doTint(Context themedContext);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue