File: TizenResourceXmlGenerator.cs
Web Access
Project: src\src\SingleProject\Resizetizer\src\Resizetizer.csproj (Microsoft.Maui.Resizetizer)
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
 
namespace Microsoft.Maui.Resizetizer
{
	internal class TizenResourceXmlGenerator
	{
		static readonly IDictionary<string, string> resolutionMap = new Dictionary<string, string>(StringComparer.Ordinal)
		{
			{ "LDPI", "from 0 to 240" },
			{ "MDPI", "from 241 to 300" },
			{ "HDPI", "from 301 to 380" },
			{ "XHDPI", "from 381 to 480" },
			{ "XXHDPI", "from 481 to 600" },
		};
 
		const string NamespaceURI = "http://tizen.org/ns/rm";
 
		public TizenResourceXmlGenerator(string intermediateOutputPath, ILogger logger)
		{
			Logger = logger;
			IntermediateOutputPath = intermediateOutputPath;
		}
 
		public string IntermediateOutputPath { get; private set; }
 
		public ILogger Logger { get; private set; }
 
		public ResizedImageInfo Generate()
		{
			XmlDocument doc = new XmlDocument();
			XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
			doc.AppendChild(docNode);
 
			XmlNode rootNode = doc.CreateElement("res", NamespaceURI);
			doc.AppendChild(rootNode);
 
			XmlElement groupImageNode = doc.CreateElement("group-image", NamespaceURI);
			groupImageNode.SetAttribute("folder", "contents");
			rootNode.AppendChild(groupImageNode);
 
			XmlElement groupLayoutNode = doc.CreateElement("group-layout", NamespaceURI);
			groupLayoutNode.SetAttribute("folder", "contents");
			rootNode.AppendChild(groupLayoutNode);
 
			XmlElement groupSoundNode = doc.CreateElement("group-sound", NamespaceURI);
			groupSoundNode.SetAttribute("folder", "contents");
			rootNode.AppendChild(groupSoundNode);
 
			XmlElement groupBinNode = doc.CreateElement("group-bin", NamespaceURI);
			groupBinNode.SetAttribute("folder", "contents");
			rootNode.AppendChild(groupBinNode);
 
			string outputResourceDir = Path.Combine(IntermediateOutputPath, "res");
			string outputContentsDir = Path.Combine(outputResourceDir, "contents");
			string destination = Path.Combine(outputResourceDir, "res.xml");
 
			var contentsDirInfo = new DirectoryInfo(outputContentsDir);
			if (!contentsDirInfo.Exists)
			{
				Logger.Log("No 'res/contents/' directory to generate res.xml.");
				return null;
			}
			foreach (DirectoryInfo subDir in contentsDirInfo.GetDirectories())
			{
				if (subDir.Name.Contains("-"))
				{
					var resolution = subDir.Name.Split('-')[1];
					if (resolutionMap.TryGetValue(resolution, out string dpiRange))
					{
						foreach (XmlNode groupNode in rootNode)
						{
							XmlElement node = doc.CreateElement("node", NamespaceURI);
							node.SetAttribute("folder", $"contents/{subDir.Name}");
							node.SetAttribute("screen-dpi-range", dpiRange);
							groupNode.AppendChild(node);
 
							Logger.Log($"Add {subDir.Name} to {groupNode.Name}");
						}
					}
				}
			}
			doc.Save(destination);
			Logger.Log($"res.xml file has been saved in {outputResourceDir}");
			return new ResizedImageInfo() { Dpi = DpiPath.Tizen.Original, Filename = destination };
		}
	}
}