Files
Bachelor-Arbeit-Thomas-Wichert/Assets/Oculus/VR/Editor/OVRExperimentalCheck.cs
2025-07-21 09:11:14 +02:00

146 lines
5.3 KiB
C#

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* Licensed under the Oculus SDK License Agreement (the "License");
* you may not use the Oculus SDK except in compliance with the License,
* which is provided at the time of installation or download, or which
* otherwise accompanies this software in either electronic or hard copy form.
*
* You may obtain a copy of the License at
*
* https://developer.oculus.com/licenses/oculussdk/
*
* Unless required by applicable law or agreed to in writing, the Oculus SDK
* 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.Collections.Generic;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
class OVRExperimentalCheck : IPreprocessBuildWithReport
{
public int callbackOrder => 0;
public void OnPreprocessBuild(BuildReport report)
{
if (report.summary.platformGroup != BuildTargetGroup.Android) return;
if ((report.summary.options & BuildOptions.AutoRunPlayer) == 0) return;
const string experimentalEnabledProp = "debug.oculus.experimentalEnabled";
var config = OVRProjectConfig.GetProjectConfig(false);
if (!config) return;
var enabledInProject = config.experimentalFeaturesEnabled;
if (!enabledInProject) return;
var adbTool = new OVRADBTool(OVRConfig.Instance.GetAndroidSDKPath());
if (!adbTool.isReady) return;
var devices = adbTool.GetDevices();
if (devices.Count == 0) return;
var disabledDevices = new List<string>();
foreach (var device in devices)
{
// If we can't read the system prop at all, just ignore
if (!TryGetSystemProperty(adbTool, device, experimentalEnabledProp, out var expSysPropSet))
continue;
var deviceIsExpEnabled = expSysPropSet == 1;
if (!deviceIsExpEnabled)
{
disabledDevices.Add(device);
}
}
if (disabledDevices.Count == 0) return;
const string menuTitle = "Oculus Experimental";
var plural = disabledDevices.Count > 1;
switch (EditorUtility.DisplayDialogComplex(
title: menuTitle,
message:
$"You have enabled experimental features in the project, but the connected device{(plural ? "s" : "")} {string.Join(", ", disabledDevices)} {(plural ? "do" : "does")} not have experimental features enabled ({experimentalEnabledProp}). Would you like to enable them now?",
ok: $"Yes, enable experimental features",
cancel: "Cancel build",
alt: "No, continue build"))
{
case 0:
{
var failedDevices = new List<string>();
foreach (var device in disabledDevices)
{
var exitCode = adbTool.RunCommand(new[]
{
"-s", device,
"shell", "setprop", experimentalEnabledProp, "1"
}, null, out var stdout, out var stderr);
if (exitCode != 0 || !string.IsNullOrEmpty(stdout))
{
failedDevices.Add(device);
Debug.LogError(exitCode != 0
? $"Failed to enable {experimentalEnabledProp} on {device} with error code {exitCode}:\n{stderr}"
: $"Failed to enable {experimentalEnabledProp} on {device}:\n{stdout}");
}
else
{
Debug.Log($"Successfully set {experimentalEnabledProp} to 1 on {device}.");
}
}
if (failedDevices.Count > 0)
{
EditorUtility.DisplayDialog(menuTitle,
$"Failed to set {experimentalEnabledProp} to 1 on the following devices: {string.Join(", ", failedDevices)}",
"Ok");
}
break;
}
case 1:
{
throw new BuildFailedException(
$"Build canceled because {experimentalEnabledProp} is not enabled on {string.Join(", ", disabledDevices)}.");
}
case 2: break;
}
}
static bool TryGetSystemProperty(OVRADBTool adbTool, string device, string property, string defaultValue,
out string value)
{
if (adbTool.RunCommand(new[]
{
"-s", device,
"shell", "getprop", property
}, null, out var stdout, out _) != 0)
{
value = defaultValue;
return false;
}
stdout = stdout?.Trim();
value = string.IsNullOrEmpty(stdout) ? defaultValue : stdout;
return true;
}
static bool TryGetSystemProperty(OVRADBTool adbTool, string device, string property, out int value)
{
value = 0;
return TryGetSystemProperty(adbTool, device, property, "0", out var strValue) &&
int.TryParse(strValue, out value);
}
}