public override bool RunTask() { var resource_name_case_map = MonoAndroidHelper.LoadResourceCaseMap(ResourceNameCaseMap); var acw_map = MonoAndroidHelper.LoadAcwMapFile(AcwMapFile); var customViewMap = MonoAndroidHelper.LoadCustomViewMapFile(BuildEngine4, CustomViewMapFile); var processed = new HashSet <string> (); foreach (var kvp in acw_map) { var key = kvp.Key; var value = kvp.Value; if (key == value) { continue; } if (customViewMap.TryGetValue(key, out HashSet <string> resourceFiles)) { foreach (var file in resourceFiles) { if (processed.Contains(file)) { continue; } if (!File.Exists(file)) { continue; } var document = XDocument.Load(file, options: LoadOptions.SetLineInfo); var e = document.Root; bool update = false; foreach (var elem in AndroidResource.GetElements(e).Prepend(e)) { update |= TryFixCustomView(elem, acw_map, (level, message) => { ITaskItem resdir = ResourceDirectories?.FirstOrDefault(x => file.StartsWith(x.ItemSpec, StringComparison.OrdinalIgnoreCase)) ?? null; switch (level) { case TraceLevel.Error: Log.FixupResourceFilenameAndLogCodedError("XA1002", message, file, resdir?.ItemSpec, resource_name_case_map); break; case TraceLevel.Warning: Log.FixupResourceFilenameAndLogCodedError("XA1001", message, file, resdir?.ItemSpec, resource_name_case_map); break; default: Log.LogDebugMessage(message); break; } }); } foreach (XAttribute a in AndroidResource.GetAttributes(e)) { update |= TryFixCustomClassAttribute(a, acw_map); update |= TryFixFragment(a, acw_map); } if (update) { var lastModified = File.GetLastWriteTimeUtc(file); if (document.SaveIfChanged(file)) { Log.LogDebugMessage($"Fixed up Custom Views in {file}"); File.SetLastWriteTimeUtc(file, lastModified); } } processed.Add(file); } } } var output = new Dictionary <string, ITaskItem> (processed.Count); foreach (var file in processed) { ITaskItem resdir = ResourceDirectories?.FirstOrDefault(x => file.StartsWith(x.ItemSpec)) ?? null; var hash = resdir?.GetMetadata("Hash") ?? null; var stamp = resdir?.GetMetadata("StampFile") ?? null; var filename = !string.IsNullOrEmpty(hash) ? hash : "compiled"; var stampFile = !string.IsNullOrEmpty(stamp) ? stamp : $"{filename}.stamp"; Log.LogDebugMessage($"{filename} {stampFile}"); output.Add(file, new TaskItem(Path.GetFullPath(file), new Dictionary <string, string> { { "StampFile", stampFile }, { "Hash", filename }, { "Resource", resdir?.ItemSpec ?? file }, })); } Processed = output.Values.ToArray(); return(!Log.HasLoggedErrors); }
public override bool Execute() { var resource_name_case_map = MonoAndroidHelper.LoadResourceCaseMap(ResourceNameCaseMap); var acw_map = MonoAndroidHelper.LoadAcwMapFile(AcwMapFile); var customViewMap = MonoAndroidHelper.LoadCustomViewMapFile(BuildEngine4, CustomViewMapFile); var processed = new HashSet <string> (); foreach (var kvp in acw_map) { var key = kvp.Key; var value = kvp.Value; if (key == value) { continue; } if (customViewMap.TryGetValue(key, out HashSet <string> resourceFiles)) { foreach (var file in resourceFiles) { if (processed.Contains(file)) { continue; } if (!File.Exists(file)) { continue; } var document = XDocument.Load(file); var e = document.Root; bool update = false; foreach (var elem in AndroidResource.GetElements(e).Prepend(e)) { update |= TryFixCustomView(elem, acw_map, (level, message) => { ITaskItem resdir = ResourceDirectories?.FirstOrDefault(x => file.StartsWith(x.ItemSpec)) ?? null; switch (level) { case TraceLevel.Error: Log.FixupResourceFilenameAndLogCodedError("XA1002", message, file, resdir.ItemSpec, resource_name_case_map); break; case TraceLevel.Warning: Log.FixupResourceFilenameAndLogCodedError("XA1001", message, file, resdir.ItemSpec, resource_name_case_map); break; default: Log.LogDebugMessage(message); break; } }); } foreach (XAttribute a in AndroidResource.GetAttributes(e)) { update |= TryFixCustomClassAttribute(a, acw_map); update |= TryFixFragment(a, acw_map); } if (update) { document.Save(file); } processed.Add(file); } } } return(!Log.HasLoggedErrors); }