diff --git a/Assets/Editor/AndroidPostProcess.cs b/Assets/Editor/AndroidPostProcess.cs new file mode 100644 index 0000000..63ec66f --- /dev/null +++ b/Assets/Editor/AndroidPostProcess.cs @@ -0,0 +1,114 @@ +using System.IO; +using System.Text; +using System.Xml; +using UnityEditor.Android; + +public class GenerateStatusBarVisibleAppManifest : IPostGenerateGradleAndroidProject +{ + public bool IsStatusBarTransparent + { + get { return true; } + } + + public readonly string ActivityName = "com.unity3d.nostatusbar.UnityPlayerActivityStatusBar"; + + public void OnPostGenerateGradleAndroidProject(string basePath) + { + var androidManifest = new AndroidManifest(GetManifestPath(basePath)); + + androidManifest.SetApplicationTheme(GetThemeName(IsStatusBarTransparent)); + androidManifest.SetStartingActivityName(ActivityName); + + androidManifest.Save(); + } + + public int callbackOrder { get { return 1; } } + + private string _manifestFilePath; + + private string GetThemeName(bool isTransparent) + { + return isTransparent ? "@style/UnityTransparentStatusBarTheme" : "@style/UnityStatusBarTheme"; + } + + private string GetManifestPath(string basePath) + { + if (string.IsNullOrEmpty(_manifestFilePath)) + { + var pathBuilder = new StringBuilder(basePath); + pathBuilder.Append(Path.DirectorySeparatorChar).Append("src"); + pathBuilder.Append(Path.DirectorySeparatorChar).Append("main"); + pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml"); + _manifestFilePath = pathBuilder.ToString(); + } + return _manifestFilePath; + } +} + + +internal class AndroidXmlDocument : XmlDocument +{ + private string m_Path; + protected XmlNamespaceManager nsMgr; + public readonly string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android"; + public AndroidXmlDocument(string path) + { + m_Path = path; + using (var reader = new XmlTextReader(m_Path)) + { + reader.Read(); + Load(reader); + } + nsMgr = new XmlNamespaceManager(NameTable); + nsMgr.AddNamespace("android", AndroidXmlNamespace); + } + + public string Save() + { + return SaveAs(m_Path); + } + + public string SaveAs(string path) + { + using (var writer = new XmlTextWriter(path, new UTF8Encoding(false))) + { + writer.Formatting = Formatting.Indented; + Save(writer); + } + return path; + } +} + + +internal class AndroidManifest : AndroidXmlDocument +{ + private readonly XmlElement ApplicationElement; + + public AndroidManifest(string path) : base(path) + { + ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement; + } + + private XmlAttribute CreateAndroidAttribute(string key, string value) + { + XmlAttribute attr = CreateAttribute("android", key, AndroidXmlNamespace); + attr.Value = value; + return attr; + } + + internal XmlNode GetActivityWithLaunchIntent() + { + return SelectSingleNode("/manifest/application/activity[intent-filter/action/@android:name='android.intent.action.MAIN' and " + + "intent-filter/category/@android:name='android.intent.category.LAUNCHER']", nsMgr); + } + + internal void SetApplicationTheme(string appTheme) + { + ApplicationElement.Attributes.Append(CreateAndroidAttribute("theme", appTheme)); + } + + internal void SetStartingActivityName(string activityName) + { + GetActivityWithLaunchIntent().Attributes.Append(CreateAndroidAttribute("name", activityName)); + } +} \ No newline at end of file diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml deleted file mode 100644 index 2417f82..0000000 --- a/Assets/Plugins/Android/AndroidManifest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index 8d5a479..b44b704 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This plugin also enables translucent status and navigation bars on KitKat (Andro ## How to Build 0. Put Unity's classes.jar into src/UnityShowAndroidStatusBar/libs/ -1. Run `gradlew assemble` from src/UnityAndroidPermissions/ +1. Run `gradlew assemble` from src/UnityShowAndroidStatusBar/ ## See Also Please refer to Google documentation for more details: https://developer.android.com/training/system-ui/index.html