October3d55/M/PICOXRPlugin/Source/PICOXRHMD/PICOXR_UPL.xml

605 lines
24 KiB
XML
Raw Normal View History

2025-07-29 14:53:32 +08:00
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright® 2015-2023 PICO Technology Co., Ltd. All rights reserved.
This plugin incorporates portions of the Unreal® Engine. Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere.
Unreal® Engine, Copyright 1998 2023, Epic Games, Inc. All rights reserved.
-->
<!--PICOXR plugin additions-->
<root xmlns:android="http://schemas.android.com/apk/res/android">
<!-- init section is always evaluated once per architecture -->
<init>
<log text="PICOXRHMD init"/>
<setBoolFromProperty result="bEnablePSensor" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnablePSensor" default="false"/>
<setStringFromProperty result="HandTrackingSupport" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="HandTrackingSupport" default="ControllersOnly"/>
<setBoolFromProperty result="bEnableEyeTracking" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableEyeTracking" default="false"/>
<setBoolFromProperty result="bEnableEyeTrackingFoveationRendering" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableEyeTrackingFoveationRendering" default="false"/>
<setBoolFromProperty result="bEnableEyeTrackingCalibration" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableEyeTrackingCalibration" default="false"/>
<setBoolFromProperty result="bEnableFaceTracking" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableFaceTracking" default="false"/>
<setBoolFromProperty result="bEnableBodyTracking" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableBodyTracking" default="false"/>
<setBoolFromProperty result="bUsingOSSplash" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bUsingOSSplash" default="false"/>
<setBoolFromProperty result="bHighFrequencyTracking" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bHighFrequencyTracking" default="false"/>
<setBoolFromProperty result="bAdaptiveHandModel" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bAdaptiveHandModel" default="false"/>
<setBoolFromProperty result="bEnableMRSafeguard" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableMRSafeguard" default="false"/>
<setBoolFromProperty result="bEnableVST" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableVST" default="false"/>
<setBoolFromProperty result="bEnableAnchor" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableAnchor" default="false"/>
<setBoolFromProperty result="bEnableCloudAnchor" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableCloudAnchor" default="false"/>
<setBoolFromProperty result="bEnableSceneCapture" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableSceneCapture" default="false"/>
<setBoolFromProperty result="bEnableMesh" ini="Engine" section="/Script/PICOXRHMD.PICOXRSettings" property="bEnableMesh" default="false"/>
</init>
<!-- optional updates applied to AndroidManifest.xml -->
<androidManifestUpdates>
<addPermission android:name="android.permission.CHANGE_CONFIGURATION" />
<addPermission android:name="android.permission.WRITE_SETTINGS" />
<setElement result="AuthActivityElement" value="activity"/>
<addAttribute tag="$AuthActivityElement" name="android:name" value="com.pico.loginpaysdk.auth.TransferStationActivity"/>
<addAttribute tag="$AuthActivityElement" name="android:theme" value="@android:style/Theme.Translucent.NoTitleBar"/>
<addAttribute tag="$AuthActivityElement" name="android:excludeFromRecents" value="true"/>
<addAttribute tag="$AuthActivityElement" name="android:exported" value="true"/>
<addAttribute tag="$AuthActivityElement" name="android:launchMode" value="singleTask"/>
<setElement result="IntentFilterElement" value="intent-filter"/>
<addElements tag="$IntentFilterElement">
<action android:name="com.pico.loginpaysdk.intent.action.AuthCallback"/>
<category android:name="android.intent.category.DEFAULT"/>
</addElements>
<addElement tag="$AuthActivityElement" name="IntentFilterElement"/>
<addElement tag="application" name="AuthActivityElement"/>
<addAttribute tag="application" name="android:hardwareAccelerated" value="false" />
<addAttribute tag="application" name="android:requestLegacyExternalStorage" value="true" />
<addAttribute tag="activity" name="android:screenOrientation" value="landscape" />
<addAttribute tag="activity" name="android:configChanges" value="screenSize|orientation|keyboardHidden|keyboard|navigation" android:hardwareAccelerated="false"/>
<addAttribute tag="activity" name="android:hardwareAccelerated" value="false" />
<addElements tag="application">
<meta-data android:name="pvr.app.type" android:value="vr" />
<meta-data android:name="pvr.sdk.version" android:value="UE5_3.2.3" />
<meta-data android:name="pxr.sdk.2dloading.flag" android:value="system" />
<meta-data android:name="pxr.sdk.version_code" android:value="5130" />
</addElements>
<!-- Add MR Flag -->
<if condition="bEnableAnchor">
<true>
<addPermission android:name="com.picovr.permission.SPATIAL_DATA" />
</true>
<false>
<if condition="bEnableSceneCapture">
<true>
<addPermission android:name="com.picovr.permission.SPATIAL_DATA" />
</true>
<false>
<if condition="bEnableMesh">
<true>
<addPermission android:name="com.picovr.permission.SPATIAL_DATA" />
</true>
</if>
</false>
</if>
</false>
</if>
<if condition="bEnableMRSafeguard">
<true>
<addElements tag="application">
<meta-data android:name="enable_mr_safeguard" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="enable_mr_safeguard" android:value="0" />
</addElements>
</false>
</if>
<if condition="bEnableVST">
<true>
<addElements tag="application">
<meta-data android:name="enable_vst" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="enable_vst" android:value="0" />
</addElements>
</false>
</if>
<if condition="bEnableAnchor">
<true>
<addElements tag="application">
<meta-data android:name="enable_spatial_anchor" android:value="1" />
<meta-data android:name="mr_map_mgr_auto_start" android:value="1" />
<meta-data android:name="enable_anchor" android:value="1" />
</addElements>
<if condition="bEnableCloudAnchor">
<true>
<addElements tag="application">
<meta-data android:name="enable_cloud_anchor" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="enable_cloud_anchor" android:value="0" />
</addElements>
</false>
</if>
</true>
<false>
<addElements tag="application">
<meta-data android:name="enable_spatial_anchor" android:value="0" />
<meta-data android:name="enable_cloud_anchor" android:value="0" />
<meta-data android:name="mr_map_mgr_auto_start" android:value="0" />
<meta-data android:name="enable_anchor" android:value="0" />
</addElements>
</false>
</if>
<if condition="bEnableSceneCapture">
<true>
<addElements tag="application">
<meta-data android:name="enable_scene_anchor" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="enable_scene_anchor" android:value="0" />
</addElements>
</false>
</if>
<if condition="bEnableMesh">
<true>
<addElements tag="application">
<meta-data android:name="enable_mesh_anchor" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="enable_mesh_anchor" android:value="0" />
</addElements>
</false>
</if>
<!-- Add MR Flag -->
<if condition="bUsingOSSplash">
<true>
<addElements tag="application">
<meta-data android:name="pvr.app.splash" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="pvr.app.splash" android:value="0" />
</addElements>
</false>
</if>
<!-- Add Hand Tracking Flag -->
<setBoolIsEqual result="bControllersOnly" arg1="$S(HandTrackingSupport)" arg2="ControllersOnly"/>
<setBoolIsEqual result="bControllersAndHands" arg1="$S(HandTrackingSupport)" arg2="ControllersAndHands"/>
<setBoolIsEqual result="bHandsOnly" arg1="$S(HandTrackingSupport)" arg2="HandsOnly"/>
<if condition="bControllersOnly">
<true>
<addElements tag="application">
<meta-data android:name="controller" android:value="1"/>
</addElements>
</true>
</if>
<if condition="bControllersAndHands">
<true>
<addPermission android:name="com.picovr.permission.HAND_TRACKING" />
<addElements tag="application">
<meta-data android:name="controller" android:value="1"/>
<meta-data android:name="handtracking" android:value="1"/>
</addElements>
</true>
</if>
<if condition="bHandsOnly">
<true>
<addPermission android:name="com.picovr.permission.HAND_TRACKING" />
<addElements tag="application">
<meta-data android:name="handtracking" android:value="1"/>
</addElements>
</true>
</if>
<setBoolOr result="bEnableHandTracking" arg1="$B(bControllersAndHands)" arg2="$B(bHandsOnly)"/>
<if condition="bEnableHandTracking">
<true>
<if condition="bHighFrequencyTracking">
<true>
<addElements tag="application">
<meta-data android:name="Hand_Tracking_HighFrequency" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="Hand_Tracking_HighFrequency" android:value="0" />
</addElements>
</false>
</if>
<if condition="bAdaptiveHandModel">
<true>
<addElements tag="application">
<meta-data android:name="Enable_AdaptiveHandModel" android:value="1" />
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="Enable_AdaptiveHandModel" android:value="0" />
</addElements>
</false>
</if>
</true>
<false>
<addElements tag="application">
<meta-data android:name="Hand_Tracking_HighFrequency" android:value="0" />
<meta-data android:name="Enable_AdaptiveHandModel" android:value="0" />
</addElements>
</false>
</if>
<!-- Add ET FT Flag -->
<setBool result="bEnableEyeTrackingPermission" value="false"/>
<setBoolOr result="bEnableEyeTrackingPermission" arg1="$B(bEnableEyeTrackingPermission)" arg2="$B(bEnableEyeTracking)"/>
<setBoolOr result="bEnableEyeTrackingPermission" arg1="$B(bEnableEyeTrackingPermission)" arg2="$B(bEnableEyeTrackingFoveationRendering)"/>
<if condition="bEnableEyeTrackingPermission">
<true>
<addPermission android:name="com.picovr.permission.EYE_TRACKING"/>
<addElements tag="application">
<meta-data android:name="picovr.software.eye_tracking" android:value=""/>
</addElements>
<if condition="bEnableEyeTrackingCalibration">
<true>
<addElements tag="application">
<meta-data android:name="eyetracking_calibration" android:value="true"/>
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="eyetracking_calibration" android:value="false"/>
</addElements>
</false>
</if>
</true>
<false>
<addElements tag="application">
<meta-data android:name="eyetracking_calibration" android:value="false" />
</addElements>
</false>
</if>
<if condition="bEnableFaceTracking">
<true>
<addPermission android:name="com.picovr.permission.FACE_TRACKING"/>
<addPermission android:name="android.permission.RECORD_AUDIO"/>
<addElements tag="application">
<meta-data android:name="picovr.software.face_tracking" android:value="false/true"/>
</addElements>
</true>
</if>
<!-- Add body Tracking Flag -->
<if condition="bEnableBodyTracking">
<true>
<addElements tag="application">
<meta-data android:name="PICO.swift.feature" android:value="1"/>
</addElements>
</true>
<false>
<addElements tag="application">
<meta-data android:name="PICO.swift.feature" android:value="0"/>
</addElements>
</false>
</if>
</androidManifestUpdates>
<!-- optional additions to proguard -->
<proguardAdditions>
<insert>
-keep class com.epicgames.unreal.GameActivity{*;}
-keep class com.psmart.aosoperation.SysActivity{*;}
</insert>
</proguardAdditions>
<!-- optional files or directories to copy to Intermediate/Android/APK -->
<resourceCopies>
<isArch arch="armeabi-v7a">
<copyFile src="$S(PluginDir)/../ThirdParty/PXRPlugin/PXRPlugin/Lib/armeabi-v7a/libpxr_api.so"
dst="$S(BuildDir)/libs/armeabi-v7a/libpxr_api.so" />
</isArch>
<isArch arch="arm64-v8a">
<copyFile src="$S(PluginDir)/../ThirdParty/PXRPlugin/PXRPlugin/Lib/arm64-v8a/libpxr_api.so"
dst="$S(BuildDir)/libs/arm64-v8a/libpxr_api.so" />
</isArch>
<copyFile src="$S(PluginDir)/../ThirdParty/PXRPlugin/PXRPlugin/ExtLibs/libpxr_api.jar"
dst="$S(BuildDir)/libs/libpxr_plugin.jar" />
<copyFile src="$S(PluginDir)/../ThirdParty/PXRPlugin/PXRPlugin/ExtLibs/pvrjar.jar"
dst="$S(BuildDir)/libs/pvrjar.jar" />
<copyFile src="$S(BuildDir)/../../../pico_splash.png" dst="$S(BuildDir)/assets/pico_splash.png" />
</resourceCopies>
<!-- optional additions to the GameActivity imports in GameActivity.java -->
<gameActivityImportAdditions>
<insert>
import com.psmart.aosoperation.NativeVerfyInterface;
import android.app.Instrumentation;
import android.os.RemoteException;
import java.util.List;
import com.psmart.aosoperation.MRCCalibration;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.pxr.xrlib.PicovrSDK;
<!--import about Content Protect -->
import com.psmart.aosoperation.SysActivity;
</insert>
</gameActivityImportAdditions>
<!-- optional additions to the GameActivity class in GameActivity.java -->
<gameActivityClassAdditions>
<insert>
public boolean AndroidThunkJava_IsOculusMobileApplication()
{
return true;
}
<!--Override dispatchKeyEvent-->
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
int action = event.getAction();
if (event.getKeyCode()==1001)
{
keyRemappingSendFakeKeyEvent(action , 96);
}
return super.dispatchKeyEvent(event);
}
<!--Send the input event 96 to unreal engine-->
private static void keyRemappingSendFakeKeyEvent(final int action,final int keyCode) {
new Thread(new Runnable() {
public void run() {
try {
Instrumentation inst=new Instrumentation();
final long eventTime = SystemClock.uptimeMillis();
KeyEvent event =new KeyEvent(eventTime - 50, eventTime - 50, action, keyCode, 0, 0, 1001, 0, KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_GAMEPAD);
int id = event.getDeviceId();
inst.sendKeySync(event);
}
catch (Exception e) {}
}
}).start();
}
public void EnableContentProtect(boolean bEnable)
{
SysActivity.SetSecure(this, bEnable);
}
public String GetDeviceSN( )
{
return SysActivity.getDeviceSN();
}
public int GetPsensorState()
{
return SysActivity.getPsensorState();
}
public void VolumeUp()
{
SysActivity.pxr_UpAudio();
}
public void VolumeDown()
{
SysActivity.pxr_DownAudio();
}
public void SetVolume(int volume)
{
SysActivity.pxr_ChangeAudio(volume);
}
public int GetMaxVolumeNumber()
{
int maxV = SysActivity.pxr_GetMaxAudionumber();
Log.debug("========== PICOXR_UPL: Max system volume:" + maxV+" ==========");
return maxV;
}
public int GetCurrentVolume()
{
int currentV = SysActivity.pxr_GetAudionumber();
Log.debug("========== PICOXR_UPL: Current system volume:" + currentV+" ==========");
return currentV;
}
private String getNewProp(String property)
{
// first try SystemProperties reflection
try
{
java.lang.reflect.Method get = Class.forName("android.os.SystemProperties").getMethod("get", new Class[]{String.class});
String propValue = (String)get.invoke(null, property);
if (propValue != null)
{
return propValue;
}
return "";
}
catch (Exception e)
{
}
// fall back to getprop command
Process process = null;
BufferedReader reader = null;
String result = "";
try
{
process = new ProcessBuilder().command("/system/bin/getprop", property).redirectErrorStream(true).start();
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = reader.readLine();
result = (line == null) ? "" : line;
}
catch (Exception e)
{
}
if (reader != null)
{
try
{
reader.close();
}
catch (IOException e)
{
}
}
if (process != null)
{
process.destroy();
}
return result;
}
public String getPXRProductName()
{
return getNewProp("sys.pxr.product.name");
}
public int GetCurrentBrightness()
{
int currentB = SysActivity.pxr_GetScreen_Brightness(this.getApplicationContext());
Log.debug("========== PICOXR_UPL: Current screen brightness:" + currentB+" ==========");
return currentB;
}
private MRCCalibration mMRCCalibration = null;
public float[] MRCGetCalibrationData(String path)
{
return mMRCCalibration.readCalibrationData(path);
}
public int GetPxrRuntimeVersion()
{
String packageName="com.pico.xr.openxr_runtime";
PackageManager manager = this.getApplicationContext().getPackageManager();
int code = 0;
try
{
PackageInfo info = manager.getPackageInfo(packageName, 0);
if(info ==null)
{
return 0;
}
code = info.versionCode;
}
catch (PackageManager.NameNotFoundException e){}
return code;
}
public int GetHmdBatteryLevel()
{
return SysActivity.getHmdBatteryLevel(this);
}
public void StartApplication(String packageName)
{
Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName);
if (launchIntent != null)
{
launchIntent.putExtra("enter_flag", 1);
startActivity(launchIntent);//null pointer check in case package name was not found
}
}
public String GetAndroidPackageName( )
{
return getApplicationContext().getPackageName();
}
</insert>
</gameActivityClassAdditions>
<!-- optional additions to GameActivity onCreate in GameActivity.java -->
<gameActivityOnCreateAdditions>
<insert>
Log.debug("========== PICOXR_UPL:gameActivityOnCreateAdditions ==========");
PicovrSDK.setJniActivity();
SysActivity.pxr_InitAudioDevice(this.getApplicationContext());
mMRCCalibration = new MRCCalibration();
</insert>
</gameActivityOnCreateAdditions>
<!-- optional additions to GameActivity onDestroy in GameActivity.java -->
<gameActivityOnDestroyAdditions>
<insert>
Log.debug("========== PICOXR_UPL:gameActivityOnDestroyAdditions ==========");
</insert>
</gameActivityOnDestroyAdditions>
<!-- optional additions to GameActivity onStart in GameActivity.java -->
<gameActivityOnStartAdditions>
<insert>
Log.debug("========== PICOXR_UPL:gameActivityOnStartAdditions ==========");
</insert>
<if condition="bEnablePSensor">
<true>
<insert>
Log.debug("========== PICOXR_UPL: initPsensor! ==========");
SysActivity.initPsensor(this);
</insert>
</true>
</if>
</gameActivityOnStartAdditions>
<!-- optional additions to GameActivity onStop in GameActivity.java -->
<gameActivityOnStopAdditions>
<insert>
Log.debug("========== PICOXR_UPL:gameActivityOnStopAdditions ==========");
</insert>
<if condition="bEnablePSensor">
<true>
<insert>
Log.debug("========== PICOXR_UPL: unregisterListener! ==========");
SysActivity.unregisterListener();
</insert>
</true>
</if>
</gameActivityOnStopAdditions>
<!-- optional additions to GameActivity onPause in GameActivity.java -->
<gameActivityOnPauseAdditions>
<insert>
Log.debug("========== PICOXR_UPL:gameActivityOnPauseAdditions ==========");
</insert>
</gameActivityOnPauseAdditions>
<!-- optional additions to GameActivity onResume in GameActivity.java -->
<gameActivityOnResumeAdditions>
<insert>
Log.debug("========== PICOXR_UPL:gameActivityOnResumeAdditions ==========");
</insert>
</gameActivityOnResumeAdditions>
<!-- optional additions to GameActivity onActivityResult in GameActivity.java -->
<gameActivityOnActivityResultAdditions>
<insert>
Log.debug("========== PICOXR_UPL:gameActivityOnActivityResultAdditions ==========");
</insert>
</gameActivityOnActivityResultAdditions>
<!-- optional libraries to load in GameActivity.java before libUE4.so -->
<soLoadLibrary>
</soLoadLibrary>
</root>