Support for Android 15's color contrast setting WIP

This commit is contained in:
Grishka 2024-10-25 02:40:33 +03:00
parent 14209dc785
commit 3026bd5c51
17 changed files with 296 additions and 31 deletions

View File

@ -243,7 +243,7 @@ public class SplashFragment extends AppKitFragment{
@Override
public boolean wantsLightNavigationBar(){
return true;
return false;
}
@Override

View File

@ -2,10 +2,16 @@ package org.joinmastodon.android.fragments.settings;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Pair;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.PushSubscriptionManager;
import org.joinmastodon.android.api.session.AccountActivationInfo;
import org.joinmastodon.android.api.session.AccountSession;
@ -14,12 +20,22 @@ import org.joinmastodon.android.fragments.HomeFragment;
import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment;
import org.joinmastodon.android.model.viewmodel.CheckableListItem;
import org.joinmastodon.android.model.viewmodel.ListItem;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.SimpleViewHolder;
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.updater.GithubSelfUpdater;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.palette.graphics.Palette;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import me.grishka.appkit.Nav;
import me.grishka.appkit.utils.V;
public class SettingsDebugFragment extends BaseSettingsFragment<Void>{
private CheckableListItem<Void> donationsStagingItem;
@ -38,7 +54,8 @@ public class SettingsDebugFragment extends BaseSettingsFragment<Void>{
new ListItem<>("Reset pre-reply sheets", null, this::onResetPreReplySheetsClick),
new ListItem<>("Clear dismissed donation campaigns", null, this::onClearDismissedCampaignsClick),
donationsStagingItem=new CheckableListItem<>("Use staging environment for donations", "Restart app to apply", CheckableListItem.Style.SWITCH, getPrefs().getBoolean("donationsStaging", false), this::toggleCheckableItem),
new ListItem<>("Delete cached instance info", null, this::onDeleteInstanceInfoClick)
new ListItem<>("Delete cached instance info", null, this::onDeleteInstanceInfoClick),
new ListItem<>("View dynamic color values", null, this::onViewColorsClick)
));
if(!GithubSelfUpdater.needSelfUpdating()){
resetUpdateItem.isEnabled=selfUpdateItem.isEnabled=false;
@ -101,6 +118,58 @@ public class SettingsDebugFragment extends BaseSettingsFragment<Void>{
Toast.makeText(getActivity(), "Instances removed from database", Toast.LENGTH_LONG).show();
}
private void onViewColorsClick(ListItem<?> item){
ArrayList<Pair<Integer, String>> attrs=new ArrayList<>();
Field[] fields=R.attr.class.getFields();
try{
for(Field fld:fields){
if(fld.getName().startsWith("color") && fld.getType().equals(int.class)){
attrs.add(new Pair<>((Integer)fld.get(null), fld.getName()));
}
}
}catch(IllegalAccessException x){
Toast.makeText(getActivity(), x.toString(), Toast.LENGTH_SHORT).show();
return;
}
class ColorsAdapter extends RecyclerView.Adapter<SimpleViewHolder>{
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
TextView view=new TextView(getActivity());
int pad=V.dp(16);
view.setPadding(pad, pad, pad, pad);
view.setTextSize(14);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
return new SimpleViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
Pair<Integer, String> attr=attrs.get(position);
TextView view=(TextView) holder.itemView;
int color=UiUtils.getThemeColor(getActivity(), attr.first);
view.setBackgroundColor(color);
view.setText(String.format("%s\n#%06X", attr.second, (color & 0xFF000000) != 0xFF000000 ? color : (color & 0xFFFFFF)));
view.setTextColor(new Palette.Swatch(color | 0xFF000000, 1).getBodyTextColor());
}
@Override
public int getItemCount(){
return attrs.size();
}
}
RecyclerView rv=new RecyclerView(getActivity());
rv.setLayoutManager(new LinearLayoutManager(getActivity()));
rv.setAdapter(new ColorsAdapter());
new M3AlertDialogBuilder(getActivity())
.setTitle("Dynamic colors")
.setView(rv)
.setPositiveButton(R.string.ok, null)
.show();
}
private void restartUI(){
Bundle args=new Bundle();
args.putString("account", accountID);

View File

@ -0,0 +1,15 @@
package org.joinmastodon.android.ui;
public enum ColorContrastMode{
DEFAULT,
MEDIUM,
HIGH;
public static ColorContrastMode fromContrastValue(float value){
if(value>0.75f)
return HIGH;
if(value>0.25f)
return MEDIUM;
return DEFAULT;
}
}

View File

@ -5,6 +5,7 @@ import android.text.TextPaint;
import android.text.style.TypefaceSpan;
import org.joinmastodon.android.R;
import org.joinmastodon.android.ui.ColorContrastMode;
import org.joinmastodon.android.ui.utils.UiUtils;
import androidx.annotation.NonNull;
@ -21,7 +22,11 @@ public abstract class BaseMonospaceSpan extends TypefaceSpan{
@Override
public void updateDrawState(@NonNull TextPaint paint){
super.updateDrawState(paint);
paint.setColor(UiUtils.getThemeColor(context, R.attr.colorRichTextText));
if(!UiUtils.isDarkTheme() && UiUtils.getColorContrastMode(context)==ColorContrastMode.HIGH){
}else{
paint.setColor(UiUtils.getThemeColor(context, R.attr.colorRichTextText));
}
paint.setTextSize(paint.getTextSize()*0.9375f);
paint.baselineShift=V.dp(-1);
}

View File

@ -41,16 +41,7 @@ public class BlockQuoteSpan extends CharacterStyle implements LeadingMarginSpan{
@Override
public void drawLeadingMargin(@NonNull Canvas c, @NonNull Paint p, int x, int dir, int top, int baseline, int bottom, @NonNull CharSequence text, int start, int end, boolean first, @NonNull Layout layout){
if(text instanceof Spanned s && s.getSpanStart(this)==start){
int color;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.S && UiUtils.isDarkTheme()){
color=UiUtils.alphaBlendColors(
context.getColor(android.R.color.system_accent3_700),
context.getColor(android.R.color.system_accent3_800),
0.5f
);
}else{
color=UiUtils.getThemeColor(context, R.attr.colorRichTextDecorations);
}
int color=UiUtils.getThemeColor(context, R.attr.colorRichTextDecorations);
int level=s.getSpans(start, end, LeadingMarginSpan.class).length-1;
if(dir<0){ // RTL
if(level==0){

View File

@ -2,6 +2,7 @@ package org.joinmastodon.android.ui.utils;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.UiModeManager;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ComponentName;
@ -75,6 +76,7 @@ import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.SearchResults;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.ColorContrastMode;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.Snackbar;
import org.joinmastodon.android.ui.sheets.BlockAccountConfirmationSheet;
@ -721,9 +723,21 @@ public class UiUtils{
public static void setUserPreferredTheme(Context context){
context.setTheme(switch(GlobalUserPreferences.theme){
case AUTO -> R.style.Theme_Mastodon_AutoLightDark;
case LIGHT -> R.style.Theme_Mastodon_Light;
case DARK -> R.style.Theme_Mastodon_Dark;
case AUTO -> switch(getColorContrastMode(context)){
case DEFAULT -> R.style.Theme_Mastodon_AutoLightDark;
case MEDIUM -> R.style.Theme_Mastodon_AutoLightDark_MediumContrast;
case HIGH -> R.style.Theme_Mastodon_AutoLightDark_HighContrast;
};
case LIGHT -> switch(getColorContrastMode(context)){
case DEFAULT -> R.style.Theme_Mastodon_Light;
case MEDIUM -> R.style.Theme_Mastodon_Light_MediumContrast;
case HIGH -> R.style.Theme_Mastodon_Light_HighContrast;
};
case DARK -> switch(getColorContrastMode(context)){
case DEFAULT -> R.style.Theme_Mastodon_Dark;
case MEDIUM -> R.style.Theme_Mastodon_Dark_MediumContrast;
case HIGH -> R.style.Theme_Mastodon_Dark_HighContrast;
};
});
}
@ -1086,4 +1100,10 @@ public class UiUtils{
rv.scrollBy(0, -topItemOffset);
}
}
public static ColorContrastMode getColorContrastMode(Context context){
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
return ColorContrastMode.DEFAULT;
return ColorContrastMode.fromContrastValue(context.getSystemService(UiModeManager.class).getContrast());
}
}

View File

@ -95,11 +95,7 @@ public class LinkCardHolder<T extends LinkCardHolder.LinkCardProvider> extends S
String[] authorParts=itemView.getContext().getString(R.string.article_by_author, "{author}").split("\\{author\\}");
String before=authorParts.length>0 ? authorParts[0].trim() : "";
String after=authorParts.length>1 ? authorParts[1].trim() : "";
if(!TextUtils.isEmpty(before)){
authorBefore.setText(before);
}else{
authorBefore.setText("");
}
authorBefore.setText(before);
if(TextUtils.isEmpty(after)){
authorAfter.setVisibility(View.GONE);
}else{

View File

@ -24,6 +24,10 @@ public class CheckIconSelectableTextView extends TextView{
super(context, attrs, defStyle);
}
protected int getCheckmarkColorAttribute(){
return R.attr.colorM3OnSurface;
}
@Override
protected void drawableStateChanged(){
super.drawableStateChanged();
@ -32,7 +36,7 @@ public class CheckIconSelectableTextView extends TextView{
currentlySelected=isSelected();
Drawable start=currentlySelected ? getResources().getDrawable(R.drawable.ic_baseline_check_18, getContext().getTheme()).mutate() : null;
if(start!=null)
start.setTint(UiUtils.getThemeColor(getContext(), R.attr.colorM3OnSurface));
start.setTint(UiUtils.getThemeColor(getContext(), getCheckmarkColorAttribute()));
Drawable end=getCompoundDrawablesRelative()[2];
setCompoundDrawablesRelativeWithIntrinsicBounds(start, null, end, null);
}

View File

@ -35,6 +35,10 @@ public class FilterChipView extends CheckIconSelectableTextView{
updatePadding();
}
protected int getCheckmarkColorAttribute(){
return R.attr.colorM3OnSecondaryContainer;
}
private void updatePadding(){
int vertical=V.dp(6);
Drawable[] drawables=getCompoundDrawablesRelative();

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/system_accent3_700" android:lStar="25"/>
</selector>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/system_accent3_800" android:lStar="15"/>
</selector>

View File

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Mastodon.AutoLightDark" parent="Theme.Mastodon.Dark"/>
<style name="Theme.Mastodon.AutoLightDark.MediumContrast" parent="Theme.Mastodon.Dark.MediumContrast"/>
<style name="Theme.Mastodon.AutoLightDark.HighContrast" parent="Theme.Mastodon.Dark.HighContrast"/>
</resources>

View File

@ -51,5 +51,5 @@
<color name="ext_rich_text_decoration_light">@android:color/system_accent3_200</color>
<color name="ext_rich_text_text_dark">@android:color/system_accent3_200</color>
<color name="ext_rich_text_container_dark">@android:color/system_accent3_800</color>
<color name="ext_rich_text_decoration_dark">#0f0</color> <!-- it's "tertiary 35" but oh well -->
<color name="ext_rich_text_decoration_dark">@color/m3_sys_accent3_750</color>
</resources>

View File

@ -1,4 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="overlay_ripple_alpha" format="float" type="dimen">0.12</item>
<!-- light theme -->
<color name="m3_sys_light_primary">@android:color/system_primary_light</color>
<color name="m3_sys_light_on_primary">@android:color/system_on_primary_light</color>
<color name="m3_sys_light_primary_container">@android:color/system_primary_container_light</color>
<color name="m3_sys_light_on_primary_container">@android:color/system_on_primary_container_light</color>
<color name="m3_sys_light_secondary">@android:color/system_secondary_light</color>
<color name="m3_sys_light_on_secondary">@android:color/system_on_secondary_light</color>
<color name="m3_sys_light_secondary_container">@android:color/system_secondary_container_light</color>
<color name="m3_sys_light_on_secondary_container">@android:color/system_on_secondary_container_light</color>
<color name="m3_sys_light_tertiary">@android:color/system_tertiary_light</color>
<color name="m3_sys_light_on_tertiary">@android:color/system_on_tertiary_light</color>
<color name="m3_sys_light_tertiary_container">@android:color/system_tertiary_container_light</color>
<color name="m3_sys_light_on_tertiary_container">@android:color/system_on_tertiary_container_light</color>
<color name="m3_sys_light_background">@android:color/system_background_light</color>
<color name="m3_sys_light_on_background">@android:color/system_on_background_light</color>
<color name="m3_sys_light_surface">@android:color/system_surface_light</color>
<color name="m3_sys_light_on_surface">@android:color/system_on_surface_light</color>
<color name="m3_sys_light_surface_variant">@android:color/system_surface_variant_light</color>
<color name="m3_sys_light_on_surface_variant">@android:color/system_on_surface_variant_light</color>
<color name="m3_sys_light_outline">@android:color/system_outline_light</color>
<color name="m3_sys_light_outline_variant">@android:color/system_outline_variant_light</color>
<color name="m3_sys_light_error">@android:color/system_error_light</color>
<color name="m3_sys_light_on_error">@android:color/system_on_error_light</color>
<color name="m3_sys_light_error_container">@android:color/system_error_container_light</color>
<color name="m3_sys_light_on_error_container">@android:color/system_on_error_container_light</color>
<color name="ext_rich_text_text_light_medium_contrast">@android:color/system_accent3_800</color>
<color name="ext_rich_text_container_light_medium_contrast">@android:color/system_accent3_100</color>
<color name="ext_rich_text_decoration_light_medium_contrast">@android:color/system_accent3_300</color>
<color name="ext_rich_text_text_light_high_contrast">@color/m3_sys_accent3_850</color>
<color name="ext_rich_text_container_light_high_contrast">@android:color/system_accent3_200</color>
<color name="ext_rich_text_decoration_light_high_contrast">@android:color/system_accent3_500</color>
<!-- dark theme -->
<color name="m3_sys_dark_primary">@android:color/system_primary_dark</color>
<color name="m3_sys_dark_on_primary">@android:color/system_on_primary_dark</color>
<color name="m3_sys_dark_primary_container">@android:color/system_primary_container_dark</color>
<color name="m3_sys_dark_on_primary_container">@android:color/system_on_primary_container_dark</color>
<color name="m3_sys_dark_secondary">@android:color/system_secondary_dark</color>
<color name="m3_sys_dark_on_secondary">@android:color/system_on_secondary_dark</color>
<color name="m3_sys_dark_secondary_container">@android:color/system_secondary_container_dark</color>
<color name="m3_sys_dark_on_secondary_container">@android:color/system_on_secondary_container_dark</color>
<color name="m3_sys_dark_tertiary">@android:color/system_tertiary_dark</color>
<color name="m3_sys_dark_on_tertiary">@android:color/system_on_tertiary_dark</color>
<color name="m3_sys_dark_tertiary_container">@android:color/system_tertiary_container_dark</color>
<color name="m3_sys_dark_on_tertiary_container">@android:color/system_on_tertiary_container_dark</color>
<color name="m3_sys_dark_background">@android:color/system_background_dark</color>
<color name="m3_sys_dark_on_background">@android:color/system_on_background_dark</color>
<color name="m3_sys_dark_surface">@android:color/system_surface_dark</color>
<color name="m3_sys_dark_on_surface">@android:color/system_on_surface_dark</color>
<color name="m3_sys_dark_surface_variant">@android:color/system_surface_variant_dark</color>
<color name="m3_sys_dark_on_surface_variant">@android:color/system_on_surface_variant_dark</color>
<color name="m3_sys_dark_outline">@android:color/system_outline_dark</color>
<color name="m3_sys_dark_outline_variant">@android:color/system_outline_variant_dark</color>
<color name="m3_sys_dark_error">@android:color/system_error_dark</color>
<color name="m3_sys_dark_on_error">@android:color/system_on_error_dark</color>
<color name="m3_sys_dark_error_container">@android:color/system_error_container_dark</color>
<color name="m3_sys_dark_on_error_container">@android:color/system_on_error_container_dark</color>
</resources>

View File

@ -32,7 +32,17 @@
<attr name="colorSensitiveOverlay" format="color"/>
<attr name="colorWhite" format="color"/>
<attr name="colorFavorite" format="color" />
<attr name="colorOnFavorite" format="color"/>
<attr name="colorFavoriteContainer" format="color" />
<attr name="colorOnFavoriteContainer" format="color"/>
<attr name="colorBoost" format="color" />
<attr name="colorOnBoost" format="color"/>
<attr name="colorBoostContainer" format="color" />
<attr name="colorOnBoostContainer" format="color"/>
<attr name="colorBookmark" format="color" />
<attr name="colorOnBookmark" format="color"/>
<attr name="colorBookmarkContainer" format="color" />
<attr name="colorOnBookmarkContainer" format="color"/>
<attr name="colorRichTextText" format="color"/>
<attr name="colorRichTextContainer" format="color"/>
<attr name="colorRichTextDecorations" format="color"/>

View File

@ -31,6 +31,10 @@
<color name="m3_sys_light_on_surface_variant">#49454F</color>
<color name="m3_sys_light_outline">#79747E</color>
<color name="m3_sys_light_outline_variant">#CAC4D0</color>
<color name="m3_sys_light_error">#B3261E</color>
<color name="m3_sys_light_on_error">#FFF</color>
<color name="m3_sys_light_error_container">#F9DEDC</color>
<color name="m3_sys_light_on_error_container">#410E0B</color>
<!-- dark theme -->
<color name="m3_sys_dark_primary">#D0BCFF</color>
@ -53,6 +57,10 @@
<color name="m3_sys_dark_on_surface_variant">#CAC4D0</color>
<color name="m3_sys_dark_outline">#938F99</color>
<color name="m3_sys_dark_outline_variant">#49454F</color>
<color name="m3_sys_dark_error">#F2B8B5</color>
<color name="m3_sys_dark_on_error">#601410</color>
<color name="m3_sys_dark_error_container">#8C1D18</color>
<color name="m3_sys_dark_on_error_container">#F9DEDC</color>
<!-- extended colors -->
<color name="ext_favorite_light">#E89A00</color>
@ -107,6 +115,12 @@
<color name="ext_rich_text_text_light">#6C3646</color>
<color name="ext_rich_text_container_light">#FFD9E1</color>
<color name="ext_rich_text_decoration_light">#FDB2C5</color>
<color name="ext_rich_text_text_light_medium_contrast">#6C3646</color>
<color name="ext_rich_text_container_light_medium_contrast">#FFD9E1</color>
<color name="ext_rich_text_decoration_light_medium_contrast">#FDB2C5</color>
<color name="ext_rich_text_text_light_high_contrast">#6C3646</color>
<color name="ext_rich_text_container_light_high_contrast">#FFD9E1</color>
<color name="ext_rich_text_decoration_light_high_contrast">#FDB2C5</color>
<color name="ext_rich_text_text_dark">#FDB2C5</color>
<color name="ext_rich_text_container_dark">#512030</color>
<color name="ext_rich_text_decoration_dark">#7A4152</color>

View File

@ -48,16 +48,28 @@
<item name="colorM3OutlineVariant">@color/m3_sys_light_outline_variant</item>
<item name="colorM3DisabledBackground">#1F1F1F1F</item>
<item name="colorM3PressedOverlay">@color/m3_sys_light_on_primary</item>
<item name="colorM3Error">#B3261E</item>
<item name="colorM3OnError">#FFF</item>
<item name="colorM3ErrorContainer">#F9DEDC</item>
<item name="colorM3OnErrorContainer">#410E0B</item>
<item name="colorM3Error">@color/m3_sys_light_error</item>
<item name="colorM3OnError">@color/m3_sys_light_on_error</item>
<item name="colorM3ErrorContainer">@color/m3_sys_light_error_container</item>
<item name="colorM3OnErrorContainer">@color/m3_sys_light_on_error_container</item>
<item name="colorM3PrimaryInverse">@color/m3_sys_dark_primary</item>
<item name="colorM3SurfaceInverse">@color/m3_sys_dark_surface</item>
<item name="colorM3OnSurfaceInverse">@color/m3_sys_dark_on_surface</item>
<item name="colorWhite">#FFF</item>
<!-- custom M3 color attrs -->
<item name="colorFavorite">@color/ext_favorite_light</item>
<item name="colorOnFavorite">@color/ext_on_favorite_light</item>
<item name="colorFavoriteContainer">@color/ext_favorite_container_light</item>
<item name="colorOnFavoriteContainer">@color/ext_on_favorite_container_light</item>
<item name="colorBoost">@color/ext_boost_light</item>
<item name="colorOnBoost">@color/ext_on_boost_light</item>
<item name="colorBoostContainer">@color/ext_boost_container_light</item>
<item name="colorOnBoostContainer">@color/ext_on_boost_container_light</item>
<item name="colorBookmark">@color/ext_bookmark_light</item>
<item name="colorOnBookmark">@color/ext_on_bookmark_light</item>
<item name="colorBookmarkContainer">@color/ext_bookmark_container_light</item>
<item name="colorOnBookmarkContainer">@color/ext_on_bookmark_container_light</item>
<item name="colorRichTextText">@color/ext_rich_text_text_light</item>
<item name="colorRichTextContainer">@color/ext_rich_text_container_light</item>
<item name="colorRichTextDecorations">@color/ext_rich_text_decoration_light</item>
@ -119,16 +131,28 @@
<item name="colorM3OutlineVariant">@color/m3_sys_dark_outline_variant</item>
<item name="colorM3DisabledBackground">#1FE3E3E3</item>
<item name="colorM3PressedOverlay">@color/m3_sys_dark_primary</item>
<item name="colorM3Error">#F2B8B5</item>
<item name="colorM3OnError">#601410</item>
<item name="colorM3ErrorContainer">#8C1D18</item>
<item name="colorM3OnErrorContainer">#F9DEDC</item>
<item name="colorM3Error">@color/m3_sys_dark_error</item>
<item name="colorM3OnError">@color/m3_sys_dark_on_error</item>
<item name="colorM3ErrorContainer">@color/m3_sys_dark_error_container</item>
<item name="colorM3OnErrorContainer">@color/m3_sys_dark_on_error_container</item>
<item name="colorM3PrimaryInverse">@color/m3_sys_light_primary</item>
<item name="colorM3SurfaceInverse">@color/m3_sys_light_surface</item>
<item name="colorM3OnSurfaceInverse">@color/m3_sys_light_on_surface</item>
<item name="colorWhite">#000</item>
<!-- custom M3 color attrs -->
<item name="colorFavorite">@color/ext_favorite_dark</item>
<item name="colorOnFavorite">@color/ext_on_favorite_dark</item>
<item name="colorFavoriteContainer">@color/ext_favorite_container_dark</item>
<item name="colorOnFavoriteContainer">@color/ext_on_favorite_container_dark</item>
<item name="colorBoost">@color/ext_boost_dark</item>
<item name="colorOnBoost">@color/ext_on_boost_dark</item>
<item name="colorBoostContainer">@color/ext_boost_container_dark</item>
<item name="colorOnBoostContainer">@color/ext_on_boost_container_dark</item>
<item name="colorBookmark">@color/ext_bookmark_dark</item>
<item name="colorOnBookmark">@color/ext_on_bookmark_dark</item>
<item name="colorBookmarkContainer">@color/ext_bookmark_container_dark</item>
<item name="colorOnBookmarkContainer">@color/ext_on_bookmark_container_dark</item>
<item name="colorRichTextText">@color/ext_rich_text_text_dark</item>
<item name="colorRichTextContainer">@color/ext_rich_text_container_dark</item>
<item name="colorRichTextDecorations">@color/ext_rich_text_decoration_dark</item>
@ -143,6 +167,48 @@
<item name="android:textAppearanceLargePopupMenu">@style/popup_menu_item_text</item>
</style>
<style name="Theme.Mastodon.Light.MediumContrast">
<item name="colorFavorite">@color/ext_favorite_light_medium_contrast</item>
<item name="colorOnFavorite">@color/ext_on_favorite_light_medium_contrast</item>
<item name="colorFavoriteContainer">@color/ext_favorite_container_light_medium_contrast</item>
<item name="colorOnFavoriteContainer">@color/ext_on_favorite_container_light_medium_contrast</item>
<item name="colorBoost">@color/ext_boost_light_medium_contrast</item>
<item name="colorOnBoost">@color/ext_on_boost_light_medium_contrast</item>
<item name="colorBoostContainer">@color/ext_boost_container_light_medium_contrast</item>
<item name="colorOnBoostContainer">@color/ext_on_boost_container_light_medium_contrast</item>
<item name="colorBookmark">@color/ext_bookmark_light_medium_contrast</item>
<item name="colorOnBookmark">@color/ext_on_bookmark_light_medium_contrast</item>
<item name="colorBookmarkContainer">@color/ext_bookmark_container_light_medium_contrast</item>
<item name="colorOnBookmarkContainer">@color/ext_on_bookmark_container_light_medium_contrast</item>
<item name="colorRichTextText">@color/ext_rich_text_text_light_medium_contrast</item>
<item name="colorRichTextContainer">@color/ext_rich_text_container_light_medium_contrast</item>
<item name="colorRichTextDecorations">@color/ext_rich_text_decoration_light_medium_contrast</item>
</style>
<style name="Theme.Mastodon.Light.HighContrast">
<item name="colorFavorite">@color/ext_favorite_light_high_contrast</item>
<item name="colorOnFavorite">@color/ext_on_favorite_light_high_contrast</item>
<item name="colorFavoriteContainer">@color/ext_favorite_container_light_high_contrast</item>
<item name="colorOnFavoriteContainer">@color/ext_on_favorite_container_light_high_contrast</item>
<item name="colorBoost">@color/ext_boost_light_high_contrast</item>
<item name="colorOnBoost">@color/ext_on_boost_light_high_contrast</item>
<item name="colorBoostContainer">@color/ext_boost_container_light_high_contrast</item>
<item name="colorOnBoostContainer">@color/ext_on_boost_container_light_high_contrast</item>
<item name="colorBookmark">@color/ext_bookmark_light_high_contrast</item>
<item name="colorOnBookmark">@color/ext_on_bookmark_light_high_contrast</item>
<item name="colorBookmarkContainer">@color/ext_bookmark_container_light_high_contrast</item>
<item name="colorOnBookmarkContainer">@color/ext_on_bookmark_container_light_high_contrast</item>
<item name="colorRichTextText">@color/ext_rich_text_text_light_high_contrast</item>
<item name="colorRichTextContainer">@color/ext_rich_text_container_light_high_contrast</item>
<item name="colorRichTextDecorations">@color/ext_rich_text_decoration_light_high_contrast</item>
</style>
<style name="Theme.Mastodon.Dark.MediumContrast">
</style>
<style name="Theme.Mastodon.Dark.HighContrast">
</style>
<style name="Theme.Mastodon.Dark.SplashFragment">
<item name="colorM3Primary">#563ACC</item>
<item name="colorM3OnPrimary">#FFF</item>
@ -151,6 +217,8 @@
</style>
<style name="Theme.Mastodon.AutoLightDark" parent="Theme.Mastodon.Light"/>
<style name="Theme.Mastodon.AutoLightDark.MediumContrast" parent="Theme.Mastodon.Light.MediumContrast"/>
<style name="Theme.Mastodon.AutoLightDark.HighContrast" parent="Theme.Mastodon.Light.HighContrast"/>
<style name="Theme.Mastodon.Toolbar" parent="android:ThemeOverlay.Material.ActionBar">
<item name="android:colorPrimary">?colorM3Background</item>