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;
|
|
}
|
|
|
|
|
|
}
|
|
} |