#!/bin/bash set -e shopt -s globstar my_dir="$(dirname "$(realpath "$0")")" pushd "$my_dir" > /dev/null function add_alpha_to_color() { local color="$1" local alpha="$2" echo "$color" | sed "s|#|#$alpha|" } function add_noalpha_to_color() { local color="$1" local alpha="$2" python -c "print('#' + hex(int(255 - $alpha*(255-int('$color'[1:3], 16))))[2:] + hex(int(255 - $alpha*(255-int('$color'[3:5], 16))))[2:] + hex(int(255 - $alpha*(255-int('$color'[5:7], 16))))[2:])" } function theme_file() { local file="$1" local name="$2" local color="$3" local presence_color="$4" local name_lc=`echo "$name" | tr '[:upper:]' '[:lower:]'` local color_alpha25=`add_alpha_to_color "$color" "3f"` local color_noalpha12=`add_noalpha_to_color "$color" '0.12'` local target_file=`echo "$file" | sed "s|bluelight|$name_lc|g"` if [ "$file" = "$target_file" ]; then return fi cp "$file" "$target_file" sed -i "s|BlueLight|$name|g;s|bluelight|$name_lc|g;s|#03a9f4|$color|g;s|#3f03a9f4|$color_alpha25|g;s|#e0f4f3|$color_noalpha12|g" "$target_file" # Note: following might reference accent_sc again, without it being changed back sed -i "s|\\(\\).*\\(\\)|\\1$presence_color\\2|g" "$target_file" } function insert_above_comment() { local comment_pre="$1" local comment_post="$2" local file="$3" local comment="$4" local insert="$5" local indention="$6" if ! grep -q "$insert" "$file"; then cat "$file" | tr '\n' '\r' | sed "s|\\($comment_pre$comment$comment_post\\)|$insert\r$indention\\1|" | tr '\r' '\n' > "$file.tmp" mv "$file.tmp" "$file" fi } function insert_above_java_comment() { insert_above_comment "// " "" "$@" } function insert_above_xml_comment() { insert_above_comment "" "$@" } function generate_accent_common() { local name="$1" local name_str="$2" local name_lc=`echo "$name" | tr '[:upper:]' '[:lower:]'` insert_above_xml_comment "vector/src/main/res/values/strings_sc.xml" "do not change this comment for accent generation" "$name_str" " " } function generate_accent_light() { # Usage: # generate_accent local name="$1" local name_str="$2" local color_lt="$3" local color_presence_lt="$4" local name_lc=`echo "$name" | tr '[:upper:]' '[:lower:]'` # String generate_accent_common "$name" "$name_str" # Settings arrays insert_above_xml_comment "vector/src/main/res/values/arrays_sc.xml" \ "do not change this comment for light accent entry generation" \ "@string/sc_accent_$name_lc " \ " " insert_above_xml_comment "vector/src/main/res/values/arrays_sc.xml" \ "do not change this comment for light accent value generation" \ "$name_lc " \ " " insert_above_xml_comment "vector/src/main/res/values/arrays_sc.xml" \ "do not change this comment for light accent preview generation" \ "$color_lt " \ " " # Actual theming for f in **/"theme_sc_light_accent_bluelight.xml"; do theme_file "$f" "$name" "$color_lt" "$color_presence_lt" \; done # Selection code insert_above_java_comment "vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt" \ "Do not change this comment for automatic light theme insertion" \ "\"$name_lc\" -> R.style.AppTheme_SC_Light_$name" \ " " } function generate_accent_dark() { # Usage: # generate_accent local name="$1" local name_str="$2" local color_dk="$3" local color_presence_dk="$4" local name_lc=`echo "$name" | tr '[:upper:]' '[:lower:]'` # String generate_accent_common "$name" "$name_str" # Settings arrays insert_above_xml_comment "vector/src/main/res/values/arrays_sc.xml" \ "do not change this comment for dark accent entry generation" \ "@string/sc_accent_$name_lc " \ " " insert_above_xml_comment "vector/src/main/res/values/arrays_sc.xml" \ "do not change this comment for dark accent value generation" \ "$name_lc " \ " " insert_above_xml_comment "vector/src/main/res/values/arrays_sc.xml" \ "do not change this comment for dark accent preview generation" \ "$color_dk " \ " " # Actual theming for f in **/"theme_sc_accent_bluelight.xml"; do theme_file "$f" "$name" "$color_dk" "$color_presence_dk" \; done # Selection code insert_above_java_comment "vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt" \ "Do not change this comment for automatic black theme insertion" \ "\"$name_lc\" -> R.style.AppTheme_SC_$name" \ " " insert_above_java_comment "vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt" \ "Do not change this comment for automatic dark theme insertion" \ "\"$name_lc\" -> R.style.AppTheme_SC_Dark_$name" \ " " insert_above_java_comment "vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt" \ "Do not change this comment for automatic black colored theme insertion" \ "\"$name_lc\" -> R.style.AppTheme_SC_Colored_$name" \ " " insert_above_java_comment "vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt" \ "Do not change this comment for automatic dark colored theme insertion" \ "\"$name_lc\" -> R.style.AppTheme_SC_Dark_Colored_$name" \ " " insert_above_java_comment "vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt" \ "Do not change this comment for automatic attachment theme insertion" \ "\"$name_lc\" -> R.style.AppTheme_AttachmentsPreview_SC_$name" \ " " } function generate_accent() { # Usage: # generate_accent [ []] local name="$1" local color_lt="$2" local color_dk="$3" local color_presence="$4" local name_str="$5" if [ -z "$color_presence" ]; then color_presence_lt="?colorAccent" color_presence_dk="?colorAccent" else color_presence_lt="$color_presence" color_presence_dk="$color_presence" fi if [ -z "$name_str" ]; then name_str="$name" fi generate_accent_light "$name" "$name_str" "$color_lt" "$color_presence_lt" generate_accent_dark "$name" "$name_str" "$color_dk" "$color_presence_dk" } default_accent="@color/accent_sc" generate_accent "Amber" "#ffa000" "#ffab00" "$default_accent" generate_accent "BlueLight" "#03a9f4" "#03a9f4" "" "Light blue" generate_accent "Blue" "#2196F3" "#2196F3" "" generate_accent "Carnation" "#fb83b2" "#ffa6c9" "" generate_accent "Cyan" "#00bcd4" "#00bcd4" "" generate_accent "Denim" "#1560BD" "#1560BD" "" generate_accent "Gold" "#CFB53B" "#CFB53B" "" #generate_accent "GreenLight" "#8bc34a" "#8bc34a" "" "Light green" generate_accent "GreenDark" "#4CAF50" "#4CAF50" "" "Dark green" #generate_accent "Grey" "#808080" "#808080" "" #generate_accent "Hope" "#5fc72d" "#59ff3a" "" generate_accent "Indigo" "#5C6BC0" "#5C6BC0" "" generate_accent "Lava" "#B20120" "#EB0028" "$default_accent" generate_accent "Lime" "#C0CA33" "#AFB42B" "" generate_accent "Orange" "#ff9800" "#ff9800" "$default_accent" #generate_accent "Oxygen" "#53ADEF" "#53ADEF" "" generate_accent "Pink" "#e91e63" "#f48fb1" "" #generate_accent "Pixel" "#4285f4" "#3367d6" "" generate_accent "Purple" "#673ab7" "#9575CD" "" generate_accent "Red" "#ff0000" "#ff0000" "$default_accent" generate_accent "Teal" "#008577" "#80cbc4" "" generate_accent "Turquoise" "#00C1C1" "#00C1C1" "" generate_accent "Yellow" "#FBC02D" "#FBC02D" "$default_accent" # We have foreground on accent colors, better skip these #generate_accent "Grey" "#808080" "#808080" #generate_accent_light "Black" "Black" "#212121" #generate_accent_dark "White" "White" "#eeeeee" popd > /dev/null