// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Text.RegularExpressions;
using Google.Android.AppBundle.Editor.Internal.BuildTools;
using UnityEditor;
using UnityEngine;
namespace Google.Android.AppBundle.Editor.Internal.AssetPacks
{
///
/// Tools for adding texture compression format targeting to folders of an Android App Bundle.
///
public static class TextureTargetingTools
{
///
/// The key used by bundletool to recognize a folder targeted for a specific texture format
/// (for example, "tcf" in "textures#tcf_astc").
///
private const string TextureCompressionFormatTargetingKey = "tcf";
///
/// Returns the string used to designate a texture compression format in bundletool.
///
public static string GetBundleToolTextureCompressionFormatName(TextureCompressionFormat format)
{
if (format == TextureCompressionFormat.Default)
{
return "";
}
var name = Enum.GetName(typeof(TextureCompressionFormat), format);
return name == null ? format.ToString() : name.ToLower();
}
///
/// Get the targeting suffix for a given texture compression format, to
/// be appended to a folder name containing AssetBundles.
///
public static string GetTargetingSuffix(TextureCompressionFormat format)
{
if (format == TextureCompressionFormat.Default)
{
return "";
}
return string.Format("#{0}_{1}", TextureCompressionFormatTargetingKey,
GetBundleToolTextureCompressionFormatName(format));
}
///
/// Parse the folder name for a texture compression format, if any, and return it as
/// well as the name of the folder without the targeting.
///
public static void GetTextureCompressionFormatAndStripSuffix(string folderName,
out TextureCompressionFormat targeting,
out string tcfStrippedFolderName)
{
targeting = TextureCompressionFormat.Default;
tcfStrippedFolderName = folderName;
// Parse the texture compression format used, if any, using the same convention
// as bundletool for folder suffixes.
Regex regex = new Regex(@"(?.+?)#tcf_(?.+)");
GroupCollection matchedGroups = regex.Match(folderName).Groups;
if (!matchedGroups["base"].Success || !matchedGroups["value"].Success)
{
// No texture compression format targeting found.
return;
}
string tcfValue = matchedGroups["value"].Captures[0].Value;
try
{
targeting = (TextureCompressionFormat) Enum.Parse(typeof(TextureCompressionFormat), tcfValue, true);
tcfStrippedFolderName = matchedGroups["base"].Captures[0].Value;
}
catch (ArgumentException)
{
Debug.LogWarningFormat(
"Ignoring unrecognized texture format \"{0}\" for folder: {1}",
tcfValue, folderName);
}
}
///
/// Returns true if the specified SDK version is less than 21 and false if it's greater than or equal to 21.
///
/// This method can be used (along with the existence of install-time asset packs) to determine whether this
/// app requires to support pre-L devices.
///
public static bool IsSdkVersionPreLollipop(AndroidSdkVersions sdkVersion)
{
#if UNITY_2021_2_OR_NEWER
// The minimum API level supported by Unity 2021.2+ is 22.
return false;
#else
return sdkVersion < AndroidSdkVersions.AndroidApiLevel21;
#endif
}
}
}