Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c7dcb19 authored by Zhaofeng Li's avatar Zhaofeng Li Committed by Gitsaibot
Browse files

Follow system palette on devices supporting Material You

parent 4269ff17
Loading
Loading
Loading
Loading
+124 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--System palette (Android 12+)-->
    <style name="CalendarAppThemeLightMonet" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@android:color/system_accent1_500</item>
        <item name="colorPrimaryDark">@android:color/system_accent1_800</item>
        <item name="colorAccent">@android:color/system_accent2_500</item>
        <item name="light_dark">@color/bg_black</item>
        <item name="android:windowBackground">@android:color/system_neutral1_10</item>
        <item name="android:itemBackground">@android:color/system_neutral1_10</item>
        <item name="settings_titleText">?android:attr/textAppearanceLargeInverse</item>
        <item name="month_header_bgcolor">@color/month_other_bgcolor</item>
        <item name="agenda_general_bgcolor">@color/agenda_general_background_color</item>
        <item name="agenda_day_item_text_color">@color/agenda_day_item_text_color</item>
        <item name="edit_event_bgcolor">@android:color/system_neutral1_10</item>
        <item name="editEvent_small_color">@color/edit_event_small</item>
        <item name="recurrence_picker_bgcolor_up">@android:color/system_neutral1_10</item>
        <item name="recurrence_picker_bgcolor">@color/recurrence_picker_background</item>
        <item name="done_text_recurrence">@color/recurrence_done_text_color</item>
        <item name="spinner_privacy_presence_bgcolor">@color/spinner_privacy_popupBackground</item>
        <item name="event_info_bgcolor">@android:color/system_neutral1_10</item>
        <item name="event_info_scrollview_bgcolor">@android:color/system_neutral1_10</item>
        <item name="event_info_organizer_color">@color/event_info_organizer_color</item>
        <item name="event_info_description_color">@color/event_info_description_color</item>
        <item name="event_info_body_color">@color/event_info_body_color</item>
        <item name="event_info_label_color">@color/event_info_label_color</item>
        <item name="create_event_date_color">@color/create_event_date_color</item>
        <item name="calendar_owner_text_color">@color/calendar_owner_text_color</item>
        <item name="calendar_date_banner_bgcolor">@color/calendar_date_banner_background</item>
        <item name="app_bar_color">@android:color/system_accent1_500</item>
        <item name="autoCompleteTextViewStyle">@style/actionbar_cursor</item>
        <item name="minus_button">@drawable/ic_menu_remove_field_holo_light</item>
        <item name="ic_menu_email">@drawable/ic_menu_email_holo_light</item>
        <item name="calendar_future_bg_color">@color/calendar_future_bg_color</item>
        <item name="month_other_bgcolor">@color/month_other_bgcolor</item>
        <item name="settings_calendar_offline">@drawable/ic_sync_off_light</item>
        <item name="iconAboutAuthors">@android:color/black</item>
        <item name="iconAboutLicense">@android:color/black</item>
        <item name="iconSettingsAbout">@android:color/black</item>
        <item name="iconSettingsGeneral">@android:color/black</item>
        <item name="iconAddCalendar">@android:color/black</item>
        <item name="iconCalendarAccount">@android:color/black</item>
    </style>
    <style name="CalendarAppThemeDarkMonet" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">@android:color/system_accent1_500</item>
        <item name="colorPrimaryDark">@android:color/system_accent1_900</item>
        <item name="colorAccent">@android:color/system_accent2_400</item>
        <item name="light_dark">@android:color/white</item>
        <item name="android:windowBackground">@android:color/system_neutral1_800</item>
        <item name="android:itemBackground">@android:color/system_neutral1_800</item>
        <item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
        <item name="settings_titleText">?android:attr/textAppearanceLarge</item>
        <item name="month_header_bgcolor">@color/month_bgcolor_dark</item>
        <item name="agenda_general_bgcolor">@color/agenda_general_background_color_dark</item>
        <item name="agenda_day_item_text_color">@color/agenda_day_item_text_color_dark</item>
        <item name="edit_event_bgcolor">@color/edit_event_color_dark</item>
        <item name="editEvent_small_color">@color/edit_event_small_dark</item>
        <item name="recurrence_picker_bgcolor_up">@color/recurrence_picker_background_up_dark</item>
        <item name="recurrence_picker_bgcolor">@color/recurrence_picker_background_dark</item>
        <item name="done_text_recurrence">@color/recurrence_done_text_color_black</item>
        <item name="spinner_privacy_presence_bgcolor">@color/spinner_privacy_popupBackground_dark</item>
        <item name="event_info_bgcolor">@android:color/system_neutral1_800</item>
        <item name="event_info_scrollview_bgcolor">@android:color/system_neutral1_800</item>
        <item name="event_info_organizer_color">@color/event_info_organizer_color_dark</item>
        <item name="event_info_description_color">@color/event_info_description_color_dark</item>
        <item name="event_info_body_color">@color/event_info_body_color_dark</item>
        <item name="event_info_label_color">@color/event_info_label_color_dark</item>
        <item name="create_event_date_color">@color/create_event_date_color_dark</item>
        <item name="calendar_owner_text_color">@color/calendar_owner_text_color_dark</item>
        <item name="calendar_date_banner_bgcolor">@color/calendar_date_banner_background_dark</item>
        <item name="app_bar_color">@android:color/system_accent1_800</item>
        <item name="minus_button">@drawable/ic_menu_remove_field_holo_light_dark</item>
        <item name="ic_menu_email">@drawable/ic_menu_email_holo_dark</item>
        <item name="calendar_future_bg_color">@color/calendar_future_bg_color_dark</item>
        <item name="month_other_bgcolor">@color/month_other_bgcolor_dark</item>
        <item name="settings_calendar_offline">@drawable/ic_sync_off_dark</item>
        <item name="iconAboutAuthors">@android:color/white</item>
        <item name="iconAboutLicense">@android:color/white</item>
        <item name="iconSettingsAbout">@android:color/white</item>
        <item name="iconSettingsGeneral">@android:color/white</item>
        <item name="iconAddCalendar">@android:color/white</item>
        <item name="iconCalendarAccount">@android:color/white</item>
    </style>
    <style name="CalendarAppThemeBlackMonet" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/bg_black</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="light_dark">@android:color/white</item>
        <item name="android:windowBackground">@color/bg_black</item>
        <item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
        <item name="settings_titleText">?android:attr/textAppearanceLarge</item>
        <item name="month_header_bgcolor">@color/month_bgcolor_black</item>
        <item name="agenda_general_bgcolor">@color/agenda_general_background_color_black</item>
        <item name="agenda_day_item_text_color">@color/agenda_day_item_text_color_black</item>
        <item name="edit_event_bgcolor">@color/edit_event_color_black</item>
        <item name="editEvent_small_color">@color/edit_event_small_black</item>
        <item name="android:itemBackground">@color/bg_black</item>
        <item name="recurrence_picker_bgcolor_up">@color/recurrence_picker_background_up_black</item>
        <item name="recurrence_picker_bgcolor">@color/recurrence_picker_background_black</item>
        <item name="done_text_recurrence">@color/recurrence_done_text_color_black</item>
        <item name="spinner_privacy_presence_bgcolor">@color/spinner_privacy_popupBackground_black</item>
        <item name="event_info_bgcolor">@color/bg_black</item>
        <item name="event_info_scrollview_bgcolor">@color/bg_black</item>
        <item name="event_info_organizer_color">@color/event_info_organizer_color_black</item>
        <item name="event_info_description_color">@color/event_info_description_color_black</item>
        <item name="event_info_body_color">@color/event_info_body_color_black</item>
        <item name="event_info_label_color">@color/event_info_label_color_black</item>
        <item name="create_event_date_color">@color/create_event_date_color_black</item>
        <item name="calendar_owner_text_color">@color/calendar_owner_text_color_black</item>
        <item name="calendar_date_banner_bgcolor">@color/calendar_date_banner_background_black</item>
        <item name="app_bar_color">@color/app_bar_black</item>
        <item name="minus_button">@drawable/ic_menu_remove_field_holo_light_dark</item>
        <item name="ic_menu_email">@drawable/ic_menu_email_holo_dark</item>
        <item name="calendar_future_bg_color">@color/calendar_future_bg_color_black</item>
        <item name="month_other_bgcolor">@color/month_other_bgcolor_black</item>
        <item name="settings_calendar_offline">@drawable/ic_sync_off_dark</item>
        <item name="iconAboutAuthors">@android:color/white</item>
        <item name="iconAboutLicense">@android:color/white</item>
        <item name="iconSettingsAbout">@android:color/white</item>
        <item name="iconSettingsGeneral">@android:color/white</item>
        <item name="iconAddCalendar">@android:color/white</item>
        <item name="iconCalendarAccount">@android:color/white</item>
    </style>
</resources>
 No newline at end of file
+37 −1
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@ import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.util.Log;

import androidx.annotation.NonNull;

import ws.xsoh.etar.R;
@@ -14,6 +16,7 @@ import ws.xsoh.etar.R;
 * Created by Gitsaibot on 01.07.16.
 */
public class DynamicTheme {
    private static final String TAG = "DynamicTheme";

    private static final String THEME_PREF = "pref_theme";
    private static final String COLOR_PREF = "pref_color";
@@ -28,6 +31,7 @@ public class DynamicTheme {
    private static final String GREEN  = "green";
    private static final String RED  = "red";
    private static final String PURPLE = "purple";
    private static final String MONET = "monet";
    private int currentTheme;


@@ -52,8 +56,34 @@ public class DynamicTheme {

    private static int getSelectedTheme(Activity activity) {
        String theme = getTheme(activity) + getPrimaryColor(activity);

        if (theme.endsWith("monet") && !Utils.isMonetAvailable(activity.getApplicationContext())) {
            // Fall back to teal theme
            Log.d(TAG, "Monet theme chosen but system does not support Material You");
            theme = getTheme(activity) + "teal";
        }

        boolean pureBlack = Utils.getSharedPreference(activity, PURE_BLACK_NIGHT_MODE, false);
        switch (theme) {
            // System palette (Android 12+)
            case SYSTEM+MONET:
                if (isSystemInDarkTheme(activity)) {
                    if (pureBlack) {
                        return R.style.CalendarAppThemeBlackMonet;
                    } else {
                        return R.style.CalendarAppThemeDarkMonet;
                    }
                } else {
                    return R.style.CalendarAppThemeLightMonet;
                }
            case LIGHT+MONET:
                return R.style.CalendarAppThemeLightMonet;
            case DARK+MONET:
                return R.style.CalendarAppThemeDarkMonet;
            case BLACK+MONET:
                return R.style.CalendarAppThemeBlackMonet;

            // Colors
            case SYSTEM+TEAL:
                if (isSystemInDarkTheme(activity)) {
                    if (pureBlack) {
@@ -156,8 +186,12 @@ public class DynamicTheme {
    }

    public static String getPrimaryColor(Context context) {
        if (Utils.isMonetAvailable(context)) {
            return MONET;
        } else {
            return Utils.getSharedPreference(context, COLOR_PREF, TEAL);
        }
    }

    private static String getSuffix(Context context) {
        String theme = getTheme(context);
@@ -191,6 +225,8 @@ public class DynamicTheme {
                return R.color.colorRedPrimary;
            case PURPLE:
                return R.color.colorPurplePrimary;
            case MONET:
                return android.R.color.system_accent1_500;
            default:
                throw new UnsupportedOperationException("Unknown color name : " + name);
        }
+30 −0
Original line number Diff line number Diff line
@@ -204,6 +204,36 @@ public class Utils {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
    }

    /**
     * Returns whether the system supports Material You.
     *
     * As of Android 12.0, Material You is only available on some devices (Pixel, select Samsung
     * devices). On other devices (e.g., AOSP-based ROMs), the system_* color resources will still
     * exist but cannot be configured by the user.
     */
    public static boolean isMonetAvailable(Context context) {
        if (Build.VERSION.SDK_INT < 31) {
            return false;
        }

        // Wallpaper-based theming requires a color extraction engine and is enabled when the `flag_monet`
        // config flag is enabled in SystemUI. It's unclear how to access this information from a
        // normal application.
        //
        // To determine whether Material You is available on the device, we use a naive heuristic which
        // is to compare the palette against known default values in AOSP.
        Resources resources = context.getResources();
        int probe1 = resources.getColor(android.R.color.system_accent1_500, context.getTheme());
        int probe2 = resources.getColor(android.R.color.system_accent2_500, context.getTheme());
        if (probe1 == Color.parseColor("#007fac") && probe2 == Color.parseColor("#657985")) {
            // AOSP palette
            Log.d(TAG, "Material You not available - Detected AOSP palette");
            return false;
        }

        return true;
    }

    public static int getViewTypeFromIntentAndSharedPref(Activity activity) {
        Intent intent = activity.getIntent();
        Bundle extras = intent.getExtras();
+5 −0
Original line number Diff line number Diff line
@@ -135,6 +135,11 @@ class GeneralPreferences : PreferenceFragmentCompat(),
            ringtonePref.summary = ringtoneDisplayString ?: ""
        }

        if (Utils.isMonetAvailable(requireContext())) {
            // Palette is controlled by user wallpaper
            preferenceScreen.removePreferenceRecursively(KEY_COLOR_PREF);
        }

        buildSnoozeDelayEntries()
        buildDefaultReminderPrefEntries()
        defaultEventDurationPref.summary = defaultEventDurationPref.entry