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);
        }
示例#2
0
        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);
        }