File: AppleIconAssetsGenerator.cs
Web Access
Project: src\src\SingleProject\Resizetizer\src\Resizetizer.csproj (Microsoft.Maui.Resizetizer)
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
 
namespace Microsoft.Maui.Resizetizer
{
	internal class AppleIconAssetsGenerator
	{
		public AppleIconAssetsGenerator(ResizeImageInfo info, string appIconName, string intermediateOutputPath, DpiPath[] dpis, ILogger logger)
		{
			Info = info;
			Logger = logger;
			IntermediateOutputPath = intermediateOutputPath;
			AppIconName = appIconName;
			Dpis = dpis;
		}
 
		public string AppIconName { get; }
 
		public DpiPath[] Dpis { get; }
 
		public ResizeImageInfo Info { get; private set; }
		public string IntermediateOutputPath { get; private set; }
		public ILogger Logger { get; private set; }
 
		public IEnumerable<ResizedImageInfo> Generate()
		{
			var outputAppIconSetDir = Path.Combine(IntermediateOutputPath, DpiPath.Ios.AppIconPath.Replace("{name}", AppIconName));
			var outputAssetsDir = Path.Combine(outputAppIconSetDir, "..");
 
			Logger.Log("iOS App Icon Set Directory: " + outputAppIconSetDir);
 
			Directory.CreateDirectory(outputAppIconSetDir);
 
			var assetContentsFile = Path.Combine(outputAssetsDir, "Contents.json");
			var appIconSetContentsFile = Path.Combine(outputAppIconSetDir, "Contents.json");
 
			var (sourceExists, sourceModified) = Utils.FileExists(Info.Filename);
			var (destinationExists, destinationModified) = Utils.FileExists(appIconSetContentsFile);
 
			if (destinationModified > sourceModified)
			{
				Logger.Log($"Skipping `{Info.Filename}` => `{appIconSetContentsFile}` file is up to date.");
				return new List<ResizedImageInfo> {
					new ResizedImageInfo { Dpi = new DpiPath("", 1), Filename = appIconSetContentsFile }
				};
			}
 
			var appIconImagesJson = new List<string>();
 
			foreach (var dpi in Dpis)
			{
				foreach (var idiom in dpi.Idioms)
				{
					var w = dpi.Size.Value.Width.ToString("0.#", CultureInfo.InvariantCulture);
					var h = dpi.Size.Value.Height.ToString("0.#", CultureInfo.InvariantCulture);
					var s = dpi.Scale.ToString("0", CultureInfo.InvariantCulture);
 
					var imageIcon =
					$$"""
							{
								"idiom": "{{idiom}}",
								"size": "{{w}}x{{h}}",
								"scale": "{{s}}x",
								"filename": "{{AppIconName + dpi.FileSuffix + Resizer.RasterFileExtension}}"
							}
					""";
 
					appIconImagesJson.Add(imageIcon);
				}
			}
 
			var appIconContentsJson =
			$$"""
			{
				"images": [
			{{string.Join("," + Environment.NewLine, appIconImagesJson)}}
				],
				"properties": {},
				"info": {
					"version": 1,
					"author": "xcode"
				}
			}
			""";
 
			File.WriteAllText(appIconSetContentsFile, appIconContentsJson.Replace("\t", "  "));
 
			return new List<ResizedImageInfo> {
				//new ResizedImageInfo { Dpi = new DpiPath("", 1), Filename = assetContentsFile },
				new ResizedImageInfo { Dpi = new DpiPath("", 1), Filename = appIconSetContentsFile }
			};
		}
	}
}