import { readFile, readdir, writeFile } from 'fs/promises'
import { join } from 'path'
import { fileURLToPath } from 'url'
// sets the splashscreen & icon to one of three predefined themes (this makes it easier to tell, at a glance, which one is open)
// - release (the default production look)
// - nightly
// OR
// - development
const COLOURS = {
RELEASE: {
primary: '#f04242',
secondary: '#14a4df',
back: '#E4E4E4',
backDark: '#212121'
},
// catppucin mocha theme colours
NIGHTLY: {
primary: '#cdd6f4',
secondary: '#cdd6f4',
back: '#1e1e2e',
backDark: '#1e1e2e'
},
// inverted release colours
DEVELOPMENT: {
primary: '#E4E4E4',
secondary: '#E4E4E4',
back: '#f04242',
backDark: '#f04242'
},
// blue from the logo as the background colour
RC: {
primary: '#E4E4E4',
secondary: '#E4E4E4',
back: '#14a4df',
backDark: '#14a4df'
},
// solarised dark
FEATURE_BRANCH: {
primary: '#E4E4E4',
secondary: '#E4E4E4',
back: '#204b56',
backDark: '#204b56'
}
}
let colour = 'RELEASE'
for (const key in COLOURS) {
if (process.argv.indexOf(`--${key.toLowerCase().replaceAll('_', '-')}`) !== -1) {
colour = key
}
}
const currentTheme = COLOURS[colour]
const scriptDir = fileURLToPath(import.meta.url)
const drawablePath = join(scriptDir, '../../android/app/src/main/res/drawable/')
const foreground = join(drawablePath, 'ic_launcher_foreground.xml')
let foregroundXML = (await readFile(foreground)).toString()
foregroundXML = foregroundXML.replace(//g, `android:fillColor="${currentTheme.back}" />`)
await writeFile(background, backgroundXML)
/**
* @warning name is passed into regex unsantised; should never be given user input
* @param {string} xml
* @param {string} name
* @param {string} value
*/
function replaceItem(xml, name, value) {
return xml.replace(new RegExp(`- [^"]*?<\/item>`), `
- ${value}
`)
}
async function constructThemePath(isDark = false, version = 0) {
const resDirectory = join(scriptDir, '..', '..', 'android/app/src/main/res/')
const files = await readdir(resDirectory)
const versionsListed = files
.filter(file => file.startsWith(`values${isDark ? '-night-' : '-'}v`))
.map(file => parseInt(file.split('-v')[1]))
if (versionsListed.indexOf(version) !== -1) {
return join(resDirectory, `values${isDark ? '-night-' : '-'}v${version}`, 'themes.xml')
} else {
return join(resDirectory, 'values', 'themes.xml')
}
}
async function setValuesForThemeFile(values, isDark = false, version = 0) {
const themePath = await constructThemePath(isDark, version)
let themeXml = (await readFile(themePath)).toString()
for (const key in values) {
themeXml = replaceItem(themeXml, key, values[key])
}
await writeFile(themePath, themeXml)
}
await setValuesForThemeFile({
windowSplashScreenBackground: currentTheme.back,
windowSplashScreenIconBackgroundColor: currentTheme.back
}, false, 31)
await setValuesForThemeFile({
windowSplashScreenBackground: currentTheme.backDark,
windowSplashScreenIconBackgroundColor: currentTheme.backDark
}, true, 31)
await setValuesForThemeFile({
windowSplashScreenBackground: currentTheme.back,
windowSplashScreenIconBackgroundColor: currentTheme.back
}, false, 33)
await setValuesForThemeFile({
windowSplashScreenBackground: currentTheme.backDark,
windowSplashScreenIconBackgroundColor: currentTheme.backDark
}, true, 33)