2025-02-21 10:21:19 +01:00
//-----------------------------------------------------------------------------
// Copyright 2016-2025 RenderHeads Ltd. All rights reserved.
//-----------------------------------------------------------------------------
2024-09-05 16:43:17 +02:00
using UnityEngine ;
using UnityEditor ;
2025-02-21 10:21:19 +01:00
using System ;
2024-09-05 16:43:17 +02:00
using System.IO ;
using System.Collections.Generic ;
using System.Linq ;
2025-02-21 10:21:19 +01:00
using UnityEditor.Compilation ;
2024-09-05 16:43:17 +02:00
namespace RenderHeads.Media.AVProVideo.Editor
{
/// <summary>
/// A window to display options to the user to help them report bugs
/// Also collects some metadata about the machine specs, plugin version etc
/// </summary>
public class SupportWindow : EditorWindow
{
private class MyPopupWindow : PopupWindowContent
{
private string _text ;
private string _url ;
private string _buttonMessage ;
public MyPopupWindow ( string text , string buttonMessage , string url )
{
_text = text ;
_url = url ;
_buttonMessage = buttonMessage ;
}
public override Vector2 GetWindowSize ( )
{
return new Vector2 ( 400 , 520 ) ;
}
public override void OnGUI ( Rect rect )
{
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "Copy-Paste this text, then " , EditorStyles . boldLabel ) ;
GUI . color = Color . green ;
if ( GUILayout . Button ( _buttonMessage , GUILayout . ExpandWidth ( true ) ) )
{
Application . OpenURL ( _url ) ;
}
GUILayout . EndHorizontal ( ) ;
GUI . color = Color . white ;
EditorGUILayout . TextArea ( _text ) ;
}
}
private static bool _isCreated = false ;
private static bool _isInit = false ;
private int _selectionIndex = 0 ;
2025-02-21 10:21:19 +01:00
private static string [ ] _gridNames = { "Help Resources" , "Update v2.x to v3.x" } ;
2024-09-05 16:43:17 +02:00
[MenuItem("Window/AVPro Video Support")]
public static void Init ( )
{
// Close window if it is already open
if ( _isInit | | _isCreated )
{
SupportWindow window = ( SupportWindow ) EditorWindow . GetWindow ( typeof ( SupportWindow ) ) ;
window . Close ( ) ;
return ;
}
_isCreated = true ;
// Get existing open window or if none, make a new one:
SupportWindow window2 = ScriptableObject . CreateInstance < SupportWindow > ( ) ;
if ( window2 ! = null )
{
window2 . SetupWindow ( ) ;
}
}
private void SetupWindow ( )
{
_isCreated = true ;
float width = 512f ;
float height = 512f ;
this . position = new Rect ( ( Screen . width / 2 ) - ( width / 2f ) , ( Screen . height / 2 ) - ( height / 2f ) , width , height ) ;
this . minSize = new Vector2 ( 530f , 510f ) ;
this . titleContent = new GUIContent ( "AVPro Video - Help & Support" ) ;
this . CreateGUI ( ) ;
this . ShowUtility ( ) ;
this . Repaint ( ) ;
}
private void CreateGUI ( )
{
_isInit = true ;
}
void OnEnable ( )
{
if ( ! _isCreated )
{
SetupWindow ( ) ;
}
}
void OnDisable ( )
{
_isInit = false ;
_isCreated = false ;
Repaint ( ) ;
}
void OnGUI ( )
{
if ( ! _isInit )
{
EditorGUILayout . LabelField ( "Initialising..." ) ;
return ;
}
GUILayout . Label ( "Having problems? We'll do our best to help.\n\nBelow is a collection of resources to help solve any issues you may encounter." , EditorStyles . wordWrappedLabel ) ;
GUILayout . Space ( 16f ) ;
/ * GUI . color = Color . white ;
GUI . backgroundColor = Color . clear ;
if ( _trySelfSolve )
{
GUI . color = Color . white ;
GUI . backgroundColor = new Color ( 0.8f , 0.8f , 0.8f , 0.1f ) ;
if ( EditorGUIUtility . isProSkin )
{
GUI . backgroundColor = Color . black ;
}
}
GUILayout . BeginVertical ( "box" ) ;
GUI . backgroundColor = Color . white ; * /
_selectionIndex = GUILayout . Toolbar ( _selectionIndex , _gridNames ) ;
GUILayout . Space ( 16f ) ;
/ * if ( GUILayout . Button ( "Try Solve the Issue Yourself" , EditorStyles . toolbarButton ) )
{
//_trySelfSolve = !_trySelfSolve;
_trySelfSolve = true ;
}
GUI . color = Color . white ;
if ( _trySelfSolve ) * /
if ( _selectionIndex = = 0 )
{
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "1) " ) ;
GUILayout . Label ( "Check you're using the latest version of AVPro Video via the Asset Store. This is version " + Helper . AVProVideoVersion , EditorStyles . wordWrappedLabel ) ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "2) " ) ;
GUILayout . Label ( "Look at the example projects and scripts in the Demos folder" ) ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "3) " ) ;
GUI . color = Color . green ;
if ( GUILayout . Button ( "Read the Documentation" , GUILayout . ExpandWidth ( false ) ) )
{
Application . OpenURL ( MediaPlayerEditor . LinkUserManual ) ;
}
GUI . color = Color . white ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "4) " ) ;
GUI . color = Color . green ;
if ( GUILayout . Button ( "Read the GitHub Issues" , GUILayout . ExpandWidth ( false ) ) )
{
Application . OpenURL ( MediaPlayerEditor . LinkGithubIssues ) ;
}
GUI . color = Color . white ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "5) " ) ;
GUI . color = Color . green ;
if ( GUILayout . Button ( "Read the Scripting Reference" , GUILayout . ExpandWidth ( false ) ) )
{
Application . OpenURL ( MediaPlayerEditor . LinkScriptingClassReference ) ;
}
GUI . color = Color . white ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "6) " ) ;
GUI . color = Color . green ;
if ( GUILayout . Button ( "Visit the AVPro Video Website" , GUILayout . ExpandWidth ( false ) ) )
{
Application . OpenURL ( MediaPlayerEditor . LinkPluginWebsite ) ;
}
GUI . color = Color . white ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "7) " ) ;
GUI . color = Color . green ;
if ( GUILayout . Button ( "Browse the Unity Forum" , GUILayout . ExpandWidth ( false ) ) )
{
Application . OpenURL ( MediaPlayerEditor . LinkForumPage ) ;
}
GUI . color = Color . white ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
}
else if ( _selectionIndex = = 1 )
{
GUILayout . Label ( "There are a number of files/folders that need to be removed going from AVPro Video version 2.x to AVPro Video v3.x in order for v3.x to build and run correctly.\n\nIn order to complete a smooth upgrade a project using AVPro Video v2.x to v3.x please follow the following steps:" , EditorStyles . wordWrappedLabel ) ;
GUILayout . Space ( 16f ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "1) Import the latest AVPro Video v3.x asset bundle into a project that already contains AVPro Video v2.x" , EditorStyles . wordWrappedLabel ) ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
GUILayout . BeginHorizontal ( ) ;
GUILayout . Label ( "2) Click the update button" ) ;
if ( GUILayout . Button ( "Update" , GUILayout . ExpandWidth ( true ) ) )
{
List < SFileToDelete > aFilesToDelete = new List < SFileToDelete > ( ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer.aar" , "d04cd71ba09f0a548ac774e50236a6f7" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-common.aar" , "782210c1836944347b3b8315635ef044" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-container.aar" , "2232bec870b56e04aa0107d97204456e" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-core.aar" , "782210c1836944347b3b8315658ef044" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-dash.aar" , "d06cd71ba09f0a548ac774e50236a6f7" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-database.aar" , "a35ee71df09a0a348ac774e75237a6a1" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-datasource.aar" , "d06cd71df09a0a348ac774e75237a6a1" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-decoder.aar" , "d06cd71ba09f0a548ac774e75236a6a1" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-extractor.aar" , "782210c2926744347b3b8315658ef044" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-hls.aar" , "d07cd71ba09f0a548ac774e50236a6f7" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-rtsp.aar" , "782210a1816945347b3b8315658ef052" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/exoplayer-smoothstreaming.aar" , "d08cd71ba09f0a548ac774e50236a6f7" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/extension-rtmp.aar" , "782210c1836944347b3b8315658ef041" , false ) ) ;
2025-02-21 10:21:19 +01:00
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/rtmp-client-3.2.0.aar" , "282210c1236912347b4b8315658af638" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/Android/guava-31.1-android.jar" , "986510c1836944347b3ba313758af501" , false ) ) ;
2024-09-05 16:43:17 +02:00
//
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/iOS/AVProVideo.framework" , "2a1facf97326449499b63c03811b1ab2" , true ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/iOS/AVProVideoBootstrap.m" , "4df32662530a57c4f83b79e6313690dc" , false ) ) ;
//
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/tvOS/AVProVideo.framework" , "bcf659e3a94d748d6a100d5531540d1a" , true ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Plugins/tvOS/AVProVideoBootstrap.m" , "154f23675acd6c54e8667de25ac31b67" , false ) ) ;
//
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Scripts/Internal/Players/AndroidMediaPlayer.cs" , "80eb525dd677aa440823910b09b23ae0" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Scripts/Internal/Players/AppleMediaPlayer.cs" , "3f68628a1ef6349648e502d1c66b5114" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Scripts/Internal/Players/AppleMediaPlayer+Native.cs" , "0bf374b5848b649e6b3840fe1dc03cd2" , false ) ) ;
aFilesToDelete . Add ( new SFileToDelete ( "Assets/AVProVideo/Runtime/Scripts/Internal/Players/AppleMediaPlayerExtensions.cs" , "e27ea5523e11f44c09e8d368eb1f2983" , false ) ) ;
2025-02-21 10:21:19 +01:00
// aFilesToDelete.Add( new SFileToDelete( "Assets/AVProVideo/Runtime/Scripts/Internal/Players/WindowsMediaPlayer_BufferedFrames.cs", "2b36cc2d6962ce34e86c5a83a0de6d4a", false) );
2024-09-05 16:43:17 +02:00
2025-02-21 10:21:19 +01:00
int iNumberFilesDeleted = DeleteFiles_V2_To_V3 ( aFilesToDelete , new [ ] { ".aar" , ".jar" , ".m" , ".cs" } ) ;
2024-09-05 16:43:17 +02:00
EditorUtility . DisplayDialog ( "Complete" , "Update from AVPro Video v2.x to v3.x is complete.\n\n" + iNumberFilesDeleted + " files/folders were removed in the process" , "ok" ) ;
2025-02-21 10:21:19 +01:00
AssetDatabase . Refresh ( ) ;
CompilationPipeline . RequestScriptCompilation ( ) ;
2024-09-05 16:43:17 +02:00
}
GUI . color = Color . white ;
GUILayout . FlexibleSpace ( ) ;
GUILayout . EndHorizontal ( ) ;
}
//GUILayout.EndVertical();
GUILayout . FlexibleSpace ( ) ;
if ( GUILayout . Button ( "Close" ) )
{
this . Close ( ) ;
2025-02-21 10:21:19 +01:00
}
2024-09-05 16:43:17 +02:00
}
private class SFileToDelete
{
public SFileToDelete ( string filename , string guid , bool bDirectory )
{
m_Filename = filename ;
m_guid = guid ;
m_FullPath = null ;
m_bIsDirectory = bDirectory ;
}
public string m_Filename ;
public string m_guid ;
public string m_FullPath ;
public bool m_bIsDirectory ;
} ;
private int DeleteFiles_V2_To_V3 ( List < SFileToDelete > aFilesToDelete , string [ ] allowedExtensions )
{
int iNumRemoved = 0 ;
try
{
// Folders first
IEnumerable < string > aAllFoders = Directory . GetDirectories ( Application . dataPath , "*" , SearchOption . AllDirectories ) ;
foreach ( string directoryPath in aAllFoders )
{
Uri relativeDirectory = ( new Uri ( Application . dataPath ) ) . MakeRelativeUri ( new Uri ( directoryPath ) ) ;
UnityEngine . Object asssetObject = AssetDatabase . LoadAssetAtPath < UnityEngine . Object > ( relativeDirectory . ToString ( ) ) ;
if ( asssetObject )
{
string guid ;
long file ;
if ( AssetDatabase . TryGetGUIDAndLocalFileIdentifier ( asssetObject , out guid , out file ) )
{
// Is this a file we want to delete?
foreach ( SFileToDelete sFileToDelete in aFilesToDelete )
{
if ( ! string . IsNullOrEmpty ( sFileToDelete . m_guid ) & &
2025-02-21 10:21:19 +01:00
sFileToDelete . m_bIsDirectory & &
2024-09-05 16:43:17 +02:00
sFileToDelete . m_guid . Equals ( guid ) )
{
// A hit, delete
Directory . Delete ( directoryPath , true ) ;
File . Delete ( directoryPath + ".meta" ) ;
iNumRemoved + = 2 ;
}
}
}
}
}
// Files
IEnumerable < string > aAllFiles = Directory . GetFiles ( Application . dataPath , "*.*" , SearchOption . AllDirectories ) . Where ( file = > allowedExtensions . Any ( file . ToLower ( ) . EndsWith ) ) ;
foreach ( string filePath in aAllFiles )
{
Uri relativeFilename = ( new Uri ( Application . dataPath ) ) . MakeRelativeUri ( new Uri ( filePath ) ) ;
2025-02-21 10:21:19 +01:00
UnityEngine . Object assetObject = AssetDatabase . LoadAssetAtPath < UnityEngine . Object > ( relativeFilename . ToString ( ) ) ;
if ( assetObject )
2024-09-05 16:43:17 +02:00
{
string guid ;
long file ;
2025-02-21 10:21:19 +01:00
if ( AssetDatabase . TryGetGUIDAndLocalFileIdentifier ( assetObject , out guid , out file ) )
2024-09-05 16:43:17 +02:00
{
// Is this a file we want to delete?
foreach ( SFileToDelete sFileToDelete in aFilesToDelete )
{
2025-02-21 10:21:19 +01:00
if ( ! string . IsNullOrEmpty ( sFileToDelete . m_guid ) & &
! sFileToDelete . m_bIsDirectory & &
2024-09-05 16:43:17 +02:00
sFileToDelete . m_guid . Equals ( guid ) )
{
// A hit, delete
File . Delete ( filePath ) ;
File . Delete ( filePath + ".meta" ) ;
iNumRemoved + = 2 ;
}
}
}
}
}
}
catch ( UnauthorizedAccessException UAEx )
{
Console . WriteLine ( UAEx . Message ) ;
}
catch ( PathTooLongException PathEx )
{
Console . WriteLine ( PathEx . Message ) ;
}
return iNumRemoved ;
}
private Rect buttonRect ;
}
}