package twrp import ( "android/soong/android" "android/soong/cc" "fmt" "os" "path" "strconv" "strings" ) func printThemeWarning(theme string) { if theme == "" { theme = "not set" } themeWarning := "***************************************************************************\n" themeWarning += "Could not find ui.xml for TW_THEME: " themeWarning += theme themeWarning += "\nSet TARGET_SCREEN_WIDTH and TARGET_SCREEN_HEIGHT to automatically select\n" themeWarning += "an appropriate theme, or set TW_THEME to one of the following:\n" themeWarning += "landscape_hdpi landscape_mdpi portrait_hdpi portrait_mdpi watch_mdpi\n" themeWarning += "****************************************************************************\n" themeWarning += "(theme selection failed; exiting)\n" fmt.Printf(themeWarning) } func printCustomThemeWarning(theme string, location string) { customThemeWarning := "****************************************************************************\n" customThemeWarning += "Could not find ui.xml for TW_CUSTOM_THEME: " customThemeWarning += theme + "\n" customThemeWarning += "Expected to find custom theme's ui.xml at: " customThemeWarning += location customThemeWarning += "Please fix this or set TW_THEME to one of the following:\n" customThemeWarning += "landscape_hdpi landscape_mdpi portrait_hdpi portrait_mdpi watch_mdpi\n" customThemeWarning += "****************************************************************************\n" customThemeWarning += "(theme selection failed; exiting)\n" fmt.Printf(customThemeWarning) } func copyThemeResources(ctx android.BaseContext, dirs []string, files []string) { outDir := ctx.Config().Getenv("OUT") twRes := outDir + "/recovery/root/twres/" recoveryDir := getRecoveryAbsDir(ctx) theme := determineTheme(ctx) for idx, dir := range dirs { _ = idx dirToCopy := "" destDir := twRes + path.Base(dir) baseDir := path.Base(dir) if baseDir == theme { destDir = twRes dirToCopy = recoveryDir + dir } else { dirToCopy = recoveryDir + dir } copyDir(dirToCopy, destDir) } for idx, file := range files { _ = idx fileToCopy := recoveryDir + file fileDest := twRes + path.Base(file) copyFile(fileToCopy, fileDest) } } func copyCustomTheme(ctx android.BaseContext, customTheme string) { outDir := ctx.Config().Getenv("OUT") twRes := outDir + "/recovery/root/twres/" fileDest := twRes + path.Base(customTheme) fileToCopy := fmt.Sprintf("%s%s", getBuildAbsDir(ctx), customTheme) copyFile(fileToCopy, fileDest) } func determineTheme(ctx android.BaseContext) string { guiWidth := 0 guiHeight := 0 if getMakeVars(ctx, "TW_CUSTOM_THEME") == "" { if getMakeVars(ctx, "TW_THEME") == "" { if getMakeVars(ctx, "DEVICE_RESOLUTION") == "" { width, err := strconv.Atoi(getMakeVars(ctx, "TARGET_SCREEN_WIDTH")) if err == nil { guiWidth = width } height, err := strconv.Atoi(getMakeVars(ctx, "TARGET_SCREEN_HEIGHT")) if err == nil { guiHeight = height } } else { deviceRes := getMakeVars(ctx, "DEVICE_RESOLUTION") width, err := strconv.Atoi(strings.Split(deviceRes, "x")[0]) if err == nil { guiWidth = width } height, err := strconv.Atoi(strings.Split(deviceRes, "x")[1]) if err == nil { guiHeight = height } } } if guiWidth > 100 { if guiHeight > 100 { if guiWidth > guiHeight { if guiWidth > 1280 { return "landscape_hdpi" } else { return "landscape_mdpi" } } else if guiWidth < guiHeight { if guiWidth > 720 { return "portrait_hdpi" } else { return "portrait_mdpi" } } else if guiWidth == guiHeight { return "watch_mdpi" } } } } return getMakeVars(ctx, "TW_THEME") } func copyTheme(ctx android.BaseContext) bool { var directories []string var files []string var customThemeLoc string localPath := ctx.ModuleDir() directories = append(directories, "gui/theme/common/fonts/") directories = append(directories, "gui/theme/common/languages/") if getMakeVars(ctx, "TW_EXTRA_LANGUAGES") == "true" { directories = append(directories, "gui/theme/extra-languages/fonts/") directories = append(directories, "gui/theme/extra-languages/languages/") } var theme = determineTheme(ctx) directories = append(directories, "gui/theme/"+theme) themeXML := fmt.Sprintf("gui/theme/common/%s.xml", strings.Split(theme, "_")[0]) files = append(files, themeXML) if getMakeVars(ctx, "TW_CUSTOM_THEME") == "" { defaultTheme := fmt.Sprintf("%s/theme/%s/ui.xml", localPath, theme) if android.ExistentPathForSource(ctx, defaultTheme).Valid() { fullDefaultThemePath := fmt.Sprintf("gui/theme/%s/ui.xml", theme) files = append(files, fullDefaultThemePath) } else { printThemeWarning(theme) return false } } else { customThemeLoc = getMakeVars(ctx, "TW_CUSTOM_THEME") if android.ExistentPathForSource(ctx, customThemeLoc).Valid() { } else { printCustomThemeWarning(customThemeLoc, getMakeVars(ctx, "TW_CUSTOM_THEME")) return false } } copyThemeResources(ctx, directories, files) if customThemeLoc != "" { copyCustomTheme(ctx, customThemeLoc) } return true } func globalFlags(ctx android.BaseContext) []string { var cflags []string if getMakeVars(ctx, "TW_DELAY_TOUCH_INIT_MS") != "" { cflags = append(cflags, "-DTW_DELAY_TOUCH_INIT_MS="+getMakeVars(ctx, "TW_DELAY_TOUCH_INIT_MS")) } if getMakeVars(ctx, "TW_EVENT_LOGGING") == "true" { cflags = append(cflags, "-D_EVENT_LOGGING") } if getMakeVars(ctx, "TW_USE_KEY_CODE_TOUCH_SYNC") != "" { cflags = append(cflags, "DTW_USE_KEY_CODE_TOUCH_SYNC="+getMakeVars(ctx, "TW_USE_KEY_CODE_TOUCH_SYNC")) } if getMakeVars(ctx, "TW_SCREEN_BLANK_ON_BOOT") != "" { cflags = append(cflags, "-DTW_SCREEN_BLANK_ON_BOOT") } if getMakeVars(ctx, "TW_OZIP_DECRYPT_KEY") != "" { cflags = append(cflags, "-DTW_OZIP_DECRYPT_KEY=\""+getMakeVars(ctx, "TW_OZIP_DECRYPT_KEY")+"\"") } else { cflags = append(cflags, "-DTW_OZIP_DECRYPT_KEY=0") } if getMakeVars(ctx, "TW_NO_SCREEN_BLANK") != "" { cflags = append(cflags, "-DTW_NO_SCREEN_BLANK") } if getMakeVars(ctx, "TW_NO_SCREEN_TIMEOUT") != "" { cflags = append(cflags, "-DTW_NO_SCREEN_TIMEOUT") } if getMakeVars(ctx, "TW_OEM_BUILD") != "" { cflags = append(cflags, "-DTW_OEM_BUILD") } if getMakeVars(ctx, "TW_X_OFFSET") != "" { cflags = append(cflags, "-DTW_X_OFFSET="+getMakeVars(ctx, "TW_X_OFFSET")) } if getMakeVars(ctx, "TW_Y_OFFSET") != "" { cflags = append(cflags, "-DTW_Y_OFFSET="+getMakeVars(ctx, "TW_Y_OFFSET")) } if getMakeVars(ctx, "TW_W_OFFSET") != "" { cflags = append(cflags, "-DTW_W_OFFSET="+getMakeVars(ctx, "TW_W_OFFSET")) } if getMakeVars(ctx, "TW_H_OFFSET") != "" { cflags = append(cflags, "-DTW_H_OFFSET="+getMakeVars(ctx, "TW_H_OFFSET")) } if getMakeVars(ctx, "TW_ROUND_SCREEN") == "true" { cflags = append(cflags, "-DTW_ROUND_SCREEN") } if getMakeVars(ctx, "TW_EXCLUDE_NANO") == "true" { cflags = append(cflags, "-DTW_EXCLUDE_NANO") } if getMakeVars(ctx, "AB_OTA_UPDATER") == "true" { cflags = append(cflags, "-DAB_OTA_UPDATER=1") } return cflags } func globalSrcs(ctx android.BaseContext) []string { var srcs []string if getMakeVars(ctx, "TWRP_CUSTOM_KEYBOARD") != "" { srcs = append(srcs, getMakeVars(ctx, "TWRP_CUSTOM_KEYBOARD")) } else { srcs = append(srcs, "hardwarekeyboard.cpp") } return srcs } func globalIncludes(ctx android.BaseContext) []string { var includes []string if getMakeVars(ctx, "TW_INCLUDE_CRYPTO") != "" { includes = append(includes, "bootable/recovery/crypto/fscrypt") } return includes } func libGuiDefaults(ctx android.LoadHookContext) { type props struct { Target struct { Android struct { Cflags []string Enabled *bool } } Cflags []string Srcs []string Include_dirs []string } p := &props{} p.Cflags = globalFlags(ctx) s := globalSrcs(ctx) p.Srcs = s i := globalIncludes(ctx) p.Include_dirs = i ctx.AppendProperties(p) if copyTheme(ctx) == false { os.Exit(-1) } } func init() { android.RegisterModuleType("libguitwrp_defaults", libGuiDefaultsFactory) } func libGuiDefaultsFactory() android.Module { module := cc.DefaultsFactory() android.AddLoadHook(module, libGuiDefaults) return module }