159 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
 | 
						|
using System.Net;
 | 
						|
using UnityEditor;
 | 
						|
 | 
						|
namespace Guru.Editor
 | 
						|
{
 | 
						|
    using UnityEngine;
 | 
						|
    using System.IO;
 | 
						|
 | 
						|
    public class AndroidPushIconHelper
 | 
						|
    {
 | 
						|
        public static readonly int targetWidth = 96; // 目标宽度
 | 
						|
        public static readonly int targetHeight = 96;
 | 
						|
        private static readonly string LibName = "SDKRes";
 | 
						|
        private static readonly string PackageName = "com.guru.unity.res";
 | 
						|
        private static readonly string IconName = "ic_notification.png";
 | 
						|
 | 
						|
        private static readonly string ColorContent =
 | 
						|
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorAccent\">#{0}</color>\n</resources>";
 | 
						|
        private static readonly string ValueContent =
 | 
						|
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"default_notification_channel_id\" translatable=\"false\">{0}</string>\n</resources>";
 | 
						|
        private static readonly string[] iconNames = new string[]
 | 
						|
        {
 | 
						|
            "drawable-mdpi",
 | 
						|
            "drawable-hdpi",
 | 
						|
            "drawable-xhdpi",
 | 
						|
            "drawable-xxhdpi",
 | 
						|
            "drawable-xxxhdpi"
 | 
						|
        };
 | 
						|
        
 | 
						|
        
 | 
						|
        private static string FcmChannelId = "fcm_default_channel";
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 设置推送图标
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="source"></param>
 | 
						|
        /// <param name="color"></param>
 | 
						|
        public static bool SetPushIconAssets(Texture2D source, Color color = default(Color))
 | 
						|
        {
 | 
						|
            if (source == null)
 | 
						|
            {
 | 
						|
                Debug.LogError($"=== No Texture2D found ===");
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            return DeployAllIcons(source, color);
 | 
						|
        }
 | 
						|
        
 | 
						|
        private static Texture2D ResizeTexture(Texture2D source, int newWidth, int newHeight)
 | 
						|
        {
 | 
						|
            MakeTextureReadable(source);
 | 
						|
            
 | 
						|
            // Texture2D result = new Texture2D(newWidth, newHeight);
 | 
						|
            // Color[] newColors = new Color[newWidth * newHeight];
 | 
						|
            //
 | 
						|
            // for (int y = 0; y < newHeight; y++)
 | 
						|
            // {
 | 
						|
            //     for (int x = 0; x < newWidth; x++)
 | 
						|
            //     {
 | 
						|
            //         // 应用一些缩放逻辑来获取新的颜色值
 | 
						|
            //         newColors[x + y * newWidth] = source.GetPixelBilinear((float)x / newWidth * source.width, (float)y / newHeight * source.height);
 | 
						|
            //     }
 | 
						|
            // }
 | 
						|
            //
 | 
						|
            // result.SetPixels(newColors);
 | 
						|
            // result.Apply();
 | 
						|
            // return result;
 | 
						|
            
 | 
						|
            
 | 
						|
            RenderTexture rt=new RenderTexture(newWidth, newHeight,24);
 | 
						|
            RenderTexture.active = rt;
 | 
						|
            Graphics.Blit(source,rt);
 | 
						|
            Texture2D result=new Texture2D(newWidth,newHeight);
 | 
						|
            result.ReadPixels(new Rect(0,0,newWidth,newHeight),0,0);
 | 
						|
            result.Apply();
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
        
 | 
						|
        private static void MakeTextureReadable(Texture2D source)
 | 
						|
        {
 | 
						|
            if (source.isReadable) return;
 | 
						|
 | 
						|
            var path = AssetDatabase.GetAssetPath(source);
 | 
						|
            TextureImporter ti = (TextureImporter)AssetImporter.GetAtPath(path);
 | 
						|
            if (!ti.isReadable)
 | 
						|
            {
 | 
						|
                ti.isReadable = true;
 | 
						|
                ti.SaveAndReimport();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        
 | 
						|
        private static string ColorToHex(Color color)
 | 
						|
        {
 | 
						|
            return string.Format("{0:X2}{1:X2}{2:X2}", (int)(color.r * 255), (int)(color.g * 255), (int)(color.b * 255));
 | 
						|
        }
 | 
						|
        
 | 
						|
 | 
						|
        private static bool DeployAllIcons(Texture2D source, Color color)
 | 
						|
        {
 | 
						|
            var dir = AndroidLibHelper.CreateLibRoot(PackageName, LibName);
 | 
						|
            string path = "";
 | 
						|
            string content = "";
 | 
						|
            
 | 
						|
            var result = ResizeTexture(source, targetWidth, targetHeight);
 | 
						|
            byte[] bytes = result.EncodeToPNG();
 | 
						|
 | 
						|
 | 
						|
            var resPath = $"{dir}/res";
 | 
						|
            if (!Directory.Exists(resPath))
 | 
						|
            {
 | 
						|
                Directory.CreateDirectory(resPath);
 | 
						|
            }
 | 
						|
            
 | 
						|
            File.WriteAllBytes($"{resPath}/{IconName}", bytes); // Base Icon;
 | 
						|
            // ----- Build all  Icons ------
 | 
						|
            foreach (var iconName in iconNames)
 | 
						|
            {
 | 
						|
                var iconPath = $"{resPath}/{iconName}";
 | 
						|
                if (!Directory.Exists(iconPath))
 | 
						|
                {
 | 
						|
                    Directory.CreateDirectory(iconPath);
 | 
						|
                }
 | 
						|
                File.WriteAllBytes($"{iconPath}/{IconName}", bytes);
 | 
						|
            }
 | 
						|
 | 
						|
            var valuesPath = $"{resPath}/values";
 | 
						|
            if (!Directory.Exists(valuesPath)) Directory.CreateDirectory(valuesPath);
 | 
						|
            
 | 
						|
            // ----- Build colors.xml ------
 | 
						|
            path = $"{valuesPath}/colors.xml";
 | 
						|
            content = ColorContent.Replace("{0}", ColorToHex(color));
 | 
						|
            File.WriteAllText(path, content);
 | 
						|
            // ----- Build strings.xml ------
 | 
						|
            path = $"{valuesPath}/strings.xml";
 | 
						|
            content = ValueContent.Replace("{0}", FcmChannelId);
 | 
						|
            File.WriteAllText(path, content);
 | 
						|
            
 | 
						|
            // ----- Inject AndroidManifest.xml ------
 | 
						|
            var doc = AndroidManifestDoc.Load();
 | 
						|
            if (doc != null)
 | 
						|
            {
 | 
						|
                doc.SetMetadata("com.google.firebase.messaging.default_notification_icon", "@drawable/ic_notification", valueName:"resource");
 | 
						|
                doc.SetMetadata("com.google.firebase.messaging.default_notification_color", "@color/colorAccent", valueName:"resource");
 | 
						|
                doc.SetMetadata("com.google.firebase.messaging.default_notification_channel_id", "@string/default_notification_channel_id");
 | 
						|
                doc.Save();
 | 
						|
                Debug.Log("<color=#88ff00> --- Push Icon Build Success --- </color>");
 | 
						|
                
 | 
						|
                AssetDatabase.Refresh();
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
            
 | 
						|
            Debug.LogError("AndroidManifest.xml not found ...");
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
} |