Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion OneSignalExample/Assets/OneSignal/Editor/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,30 @@
using System.Runtime.CompilerServices;
/*
* Modified MIT License
*
* Copyright 2022 OneSignal
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* 1. The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 2. All copies of substantial portions of the Software may only be used in connection
* with services provided by OneSignal.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("OneSignal.Packager")]
112 changes: 68 additions & 44 deletions OneSignalExample/Assets/OneSignal/Editor/OneSignalBootstrapper.cs
Original file line number Diff line number Diff line change
@@ -1,55 +1,79 @@
using System.Linq;
/*
* Modified MIT License
*
* Copyright 2022 OneSignal
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* 1. The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 2. All copies of substantial portions of the Software may only be used in connection
* with services provided by OneSignal.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

using System.Linq;
using UnityEditor;

/// <summary>
/// Handles informing the user on startup/import if the legacy SDK has been detected
/// </summary>
public static class OneSignalBootstrapper
{
namespace OneSignalSDK {
/// <summary>
/// Asks to open the SDK Setup if legacy files are found or core is missing
/// Handles informing the user on startup/import if the legacy SDK has been detected
/// </summary>
[InitializeOnLoadMethod]
public static void CheckForLegacy()
{
if (SessionState.GetBool(_sessionCheckKey, false))
return;

SessionState.SetBool(_sessionCheckKey, true);

EditorApplication.delayCall += _checkForLegacy;
}
public static class OneSignalBootstrapper {
/// <summary>
/// Asks to open the SDK Setup if legacy files are found or core is missing
/// </summary>
[InitializeOnLoadMethod] public static void CheckForLegacy() {
if (SessionState.GetBool(_sessionCheckKey, false))
return;

private static void _checkForLegacy()
{
#if !ONE_SIGNAL_INSTALLED
EditorApplication.delayCall += _showOpenSetupDialog;
#else
var inventory = AssetDatabase.LoadAssetAtPath<OneSignalFileInventory>(OneSignalFileInventory.AssetPath);
SessionState.SetBool(_sessionCheckKey, true);

if (inventory == null)
return; // error

var currentPaths = OneSignalFileInventory.GetCurrentPaths();
var diff = currentPaths.Except(inventory.DistributedPaths);
EditorApplication.delayCall += _checkForLegacy;
}

if (diff.Any())
private static void _checkForLegacy() {
#if !ONE_SIGNAL_INSTALLED
EditorApplication.delayCall += _showOpenSetupDialog;
#endif
}
#else
var inventory = AssetDatabase.LoadAssetAtPath<OneSignalFileInventory>(OneSignalFileInventory.AssetPath);

private static void _showOpenSetupDialog()
{
var dialogResult = EditorUtility.DisplayDialog(
"OneSignal",
"The project contains an outdated version of OneSignal SDK! We recommend running the OneSignal SDK Setup.",
"Open SDK Setup",
"Cancel"
);

if (dialogResult)
OneSignalSetupWindow.ShowWindow();
}
if (inventory == null)
return; // error

var currentPaths = OneSignalFileInventory.GetCurrentPaths();
var diff = currentPaths.Except(inventory.DistributedPaths);

private const string _sessionCheckKey = "onesignal.bootstrapper.check";
if (diff.Any())
EditorApplication.delayCall += _showOpenSetupDialog;
#endif
}

private static void _showOpenSetupDialog() {
var dialogResult = EditorUtility.DisplayDialog(
"OneSignal",
"The project contains an outdated version of OneSignal SDK! We recommend running the OneSignal SDK Setup.",
"Open SDK Setup",
"Cancel"
);

if (dialogResult)
OneSignalSetupWindow.ShowWindow();
}

private const string _sessionCheckKey = "onesignal.bootstrapper.check";
}
}
90 changes: 59 additions & 31 deletions OneSignalExample/Assets/OneSignal/Editor/OneSignalFileInventory.cs
Original file line number Diff line number Diff line change
@@ -1,42 +1,70 @@
/*
* Modified MIT License
*
* Copyright 2022 OneSignal
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* 1. The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 2. All copies of substantial portions of the Software may only be used in connection
* with services provided by OneSignal.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

using System.IO;
using System.Linq;
using UnityEngine;

/// <summary>
/// Inventory distributed with the *.unitypackage in order to determine if there are any legacy files in need of removal
/// </summary>
internal sealed class OneSignalFileInventory : ScriptableObject
{
namespace OneSignalSDK {
/// <summary>
/// Array of paths within the OneSignal directory which were determined to be part of the distributed unitypackage
/// Inventory distributed with the *.unitypackage in order to determine if there are any legacy files in need of removal
/// </summary>
public string[] DistributedPaths;
internal sealed class OneSignalFileInventory : ScriptableObject {
/// <summary>
/// Array of paths within the OneSignal directory which were determined to be part of the distributed unitypackage
/// </summary>
public string[] DistributedPaths;

/// <summary>
/// Array of current paths within the OneSignal directory
/// </summary>
public static string[] GetCurrentPaths()
=> ConvertPathsToUnix(Directory.GetFiles(PackageAssetsPath, "*", SearchOption.AllDirectories));
/// <summary>
/// Array of current paths within the OneSignal directory
/// </summary>
public static string[] GetCurrentPaths()
=> ConvertPathsToUnix(Directory.GetFiles(PackageAssetsPath, "*", SearchOption.AllDirectories));

/// <summary>
/// Makes sure <see cref="paths"/> are using forward slash to be Unix compatible.
/// https://docs.microsoft.com/en-us/dotnet/api/system.io.path.altdirectoryseparatorchar?view=net-5.0#examples
/// </summary>
/// <param name="paths">the paths to check and convert</param>
/// <returns>paths with / as the directory separator</returns>
public static string[] ConvertPathsToUnix(string[] paths) {
if (Path.DirectorySeparatorChar == Path.AltDirectorySeparatorChar)
return paths;

var fixedPaths = paths.Select(path =>
path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
);
/// <summary>
/// Makes sure <see cref="paths"/> are using forward slash to be Unix compatible.
/// https://docs.microsoft.com/en-us/dotnet/api/system.io.path.altdirectoryseparatorchar?view=net-5.0#examples
/// </summary>
/// <param name="paths">the paths to check and convert</param>
/// <returns>paths with / as the directory separator</returns>
public static string[] ConvertPathsToUnix(string[] paths) {
if (Path.DirectorySeparatorChar == Path.AltDirectorySeparatorChar)
return paths;

return fixedPaths.ToArray();
}
var fixedPaths = paths.Select(path =>
path.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
);

public const string AssetName = "OneSignalFileInventory.asset";
public static readonly string PackageAssetsPath = Path.Combine("Assets", "OneSignal");
public static readonly string EditorResourcesPath = Path.Combine(PackageAssetsPath, "Editor", "Resources");
public static readonly string AssetPath = Path.Combine(EditorResourcesPath, AssetName);
return fixedPaths.ToArray();
}

public const string AssetName = "OneSignalFileInventory.asset";
public static readonly string PackageAssetsPath = Path.Combine("Assets", "OneSignal");
public static readonly string EditorResourcesPath = Path.Combine(PackageAssetsPath, "Editor", "Resources");
public static readonly string AssetPath = Path.Combine(EditorResourcesPath, AssetName);
}
}
Original file line number Diff line number Diff line change
@@ -1,48 +1,74 @@
using System.Collections.Generic;
/*
* Modified MIT License
*
* Copyright 2022 OneSignal
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* 1. The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 2. All copies of substantial portions of the Software may only be used in connection
* with services provided by OneSignal.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

/// <summary>
/// Representation of the manifest file "dependency" entry.
/// </summary>
class Dependency
{
/// <summary>
/// The dependency name.
/// </summary>
public string Name { get; }
using System.Collections.Generic;

namespace OneSignalSDK {
/// <summary>
/// The dependency version.
/// Representation of the manifest file "dependency" entry.
/// </summary>
public string Version { get; private set; }
public class Dependency {
/// <summary>
/// The dependency name.
/// </summary>
public string Name { get; }

/// <summary>
/// Initializes a new instance of the <see cref="Dependency"/> class with provided properties.
/// </summary>
/// <param name="name">Dependency name.</param>
/// <param name="version">Dependency version.</param>
public Dependency(string name, string version)
{
Name = name;
Version = version;
}
/// <summary>
/// The dependency version.
/// </summary>
public string Version { get; private set; }

/// <summary>
/// Sets new dependency version.
/// </summary>
/// <param name="version">The version to be set for this dependency</param>
public void SetVersion(string version)
{
Version = version;
}
/// <summary>
/// Initializes a new instance of the <see cref="Dependency"/> class with provided properties.
/// </summary>
/// <param name="name">Dependency name.</param>
/// <param name="version">Dependency version.</param>
public Dependency(string name, string version) {
Name = name;
Version = version;
}

/// <summary>
/// Creates a dictionary from this object.
/// </summary>
/// <returns>Dependency object representation as Dictionary&lt;string, object&gt;.</returns>
public Dictionary<string, object> ToDictionary()
{
Dictionary<string, object> result = new Dictionary<string, object>();
result.Add(Name, Version);
return result;
/// <summary>
/// Sets new dependency version.
/// </summary>
/// <param name="version">The version to be set for this dependency</param>
public void SetVersion(string version) {
Version = version;
}

/// <summary>
/// Creates a dictionary from this object.
/// </summary>
/// <returns>Dependency object representation as Dictionary&lt;string, object&gt;.</returns>
public Dictionary<string, object> ToDictionary() {
Dictionary<string, object> result = new Dictionary<string, object>();
result.Add(Name, Version);

return result;
}
}
}
Loading