This commit is contained in:
2020-07-18 21:12:14 +08:00
parent 1361db18a9
commit 33dc6cea60
214 changed files with 16596 additions and 3104 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1c7a308d4b0404c13b070242a6b57fa6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1bb6a665b7d9041bab99a6efdbc705ca
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: 0a607dcda26e7614f86300c6ca717295
guid: 5fc918beb0f7cfe49a7f596d5b6b8768
folderAsset: yes
timeCreated: 1498722617
licenseType: Store
timeCreated: 1525098661
licenseType: Free
DefaultImporter:
userData:
assetBundleName:

View File

@@ -0,0 +1,31 @@
#if !UNITY_EDITOR && UNITY_ANDROID
using UnityEngine;
namespace NativeCameraNamespace
{
public class NCCallbackHelper : MonoBehaviour
{
private System.Action mainThreadAction = null;
private void Awake()
{
DontDestroyOnLoad( gameObject );
}
private void Update()
{
if( mainThreadAction != null )
{
System.Action temp = mainThreadAction;
mainThreadAction = null;
temp();
}
}
public void CallOnMainThread( System.Action function )
{
mainThreadAction = function;
}
}
}
#endif

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b2bbe0051e738ea4585119c46d863f19
timeCreated: 1545147258
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
#if !UNITY_EDITOR && UNITY_ANDROID
using UnityEngine;
namespace NativeCameraNamespace
{
public class NCCameraCallbackAndroid : AndroidJavaProxy
{
private readonly NativeCamera.CameraCallback callback;
private readonly NCCallbackHelper callbackHelper;
public NCCameraCallbackAndroid( NativeCamera.CameraCallback callback ) : base( "com.yasirkula.unity.NativeCameraMediaReceiver" )
{
this.callback = callback;
callbackHelper = new GameObject( "NCCallbackHelper" ).AddComponent<NCCallbackHelper>();
}
public void OnMediaReceived( string path )
{
callbackHelper.CallOnMainThread( () => MediaReceiveCallback( path ) );
}
private void MediaReceiveCallback( string path )
{
if( string.IsNullOrEmpty( path ) )
path = null;
try
{
if( callback != null )
callback( path );
}
finally
{
Object.Destroy( callbackHelper );
}
}
}
}
#endif

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 3cc8df584d2a4344b929a4f13a53723a
timeCreated: 1519060539
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
#if !UNITY_EDITOR && UNITY_ANDROID
using System.Threading;
using UnityEngine;
namespace NativeCameraNamespace
{
public class NCPermissionCallbackAndroid : AndroidJavaProxy
{
private object threadLock;
public int Result { get; private set; }
public NCPermissionCallbackAndroid( object threadLock ) : base( "com.yasirkula.unity.NativeCameraPermissionReceiver" )
{
Result = -1;
this.threadLock = threadLock;
}
public void OnPermissionResult( int result )
{
Result = result;
lock( threadLock )
{
Monitor.Pulse( threadLock );
}
}
}
}
#endif

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: bafa24bbc8c455f44a2b98dcbe6451bd
timeCreated: 1519060539
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 284037eba2526f54d9cf51b5d9bffcfa
timeCreated: 1569764737
licenseType: Free
PluginImporter:
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
data:
first:
Android: Android
second:
enabled: 1
settings: {}
data:
first:
Any:
second:
enabled: 0
settings: {}
data:
first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: 19fc6b8ce781591438a952d8aa9104f8
guid: 16fe39fd709533a4eba946790a8e3123
folderAsset: yes
timeCreated: 1521452097
licenseType: Store
licenseType: Free
DefaultImporter:
userData:
assetBundleName:

View File

@@ -0,0 +1,66 @@
using System.IO;
using UnityEditor;
using UnityEngine;
#if UNITY_IOS
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
#endif
public class NCPostProcessBuild
{
private const bool ENABLED = true;
private const string CAMERA_USAGE_DESCRIPTION = "Capture media with camera";
private const string MICROPHONE_USAGE_DESCRIPTION = "Capture microphone input in videos";
[InitializeOnLoadMethod]
public static void ValidatePlugin()
{
string jarPath = "Assets/Plugins/NativeCamera/Android/NativeCamera.jar";
if( File.Exists( jarPath ) )
{
Debug.Log( "Deleting obsolete " + jarPath );
AssetDatabase.DeleteAsset( jarPath );
}
}
#if UNITY_IOS
#pragma warning disable 0162
[PostProcessBuild]
public static void OnPostprocessBuild( BuildTarget target, string buildPath )
{
if( !ENABLED )
return;
if( target == BuildTarget.iOS )
{
string pbxProjectPath = PBXProject.GetPBXProjectPath( buildPath );
string plistPath = Path.Combine( buildPath, "Info.plist" );
PBXProject pbxProject = new PBXProject();
pbxProject.ReadFromFile( pbxProjectPath );
#if UNITY_2019_3_OR_NEWER
string targetGUID = pbxProject.GetUnityFrameworkTargetGuid();
#else
string targetGUID = pbxProject.TargetGuidByName( PBXProject.GetUnityTargetName() );
#endif
pbxProject.AddBuildProperty( targetGUID, "OTHER_LDFLAGS", "-framework MobileCoreServices" );
pbxProject.AddBuildProperty( targetGUID, "OTHER_LDFLAGS", "-framework ImageIO" );
File.WriteAllText( pbxProjectPath, pbxProject.WriteToString() );
PlistDocument plist = new PlistDocument();
plist.ReadFromString( File.ReadAllText( plistPath ) );
PlistElementDict rootDict = plist.root;
rootDict.SetString( "NSCameraUsageDescription", CAMERA_USAGE_DESCRIPTION );
rootDict.SetString( "NSMicrophoneUsageDescription", MICROPHONE_USAGE_DESCRIPTION );
File.WriteAllText( plistPath, plist.WriteToString() );
}
}
#pragma warning restore 0162
#endif
}

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: fa3b57e342928704cb910789ae4dde20
timeCreated: 1521452119
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,15 @@
{
"name": "NativeCamera.Editor",
"references": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 31117d0234af0084b91a7e53b3d9e0a3
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,3 @@
{
"name": "NativeCamera.Runtime"
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b107fd1956cb3e04985108f5ee29e115
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,442 @@
using System;
using System.IO;
using UnityEngine;
using Object = UnityEngine.Object;
#if !UNITY_EDITOR && ( UNITY_ANDROID || UNITY_IOS )
using NativeCameraNamespace;
#endif
public static class NativeCamera
{
public struct ImageProperties
{
public readonly int width;
public readonly int height;
public readonly string mimeType;
public readonly ImageOrientation orientation;
public ImageProperties( int width, int height, string mimeType, ImageOrientation orientation )
{
this.width = width;
this.height = height;
this.mimeType = mimeType;
this.orientation = orientation;
}
}
public struct VideoProperties
{
public readonly int width;
public readonly int height;
public readonly long duration;
public readonly float rotation;
public VideoProperties( int width, int height, long duration, float rotation )
{
this.width = width;
this.height = height;
this.duration = duration;
this.rotation = rotation;
}
}
public enum Permission { Denied = 0, Granted = 1, ShouldAsk = 2 };
public enum Quality { Default = -1, Low = 0, Medium = 1, High = 2 };
public enum PreferredCamera { Default = -1, Rear = 0, Front = 1 }
// EXIF orientation: http://sylvana.net/jpegcrop/exif_orientation.html (indices are reordered)
public enum ImageOrientation { Unknown = -1, Normal = 0, Rotate90 = 1, Rotate180 = 2, Rotate270 = 3, FlipHorizontal = 4, Transpose = 5, FlipVertical = 6, Transverse = 7 };
public delegate void CameraCallback( string path );
#region Platform Specific Elements
#if !UNITY_EDITOR && UNITY_ANDROID
private static AndroidJavaClass m_ajc = null;
private static AndroidJavaClass AJC
{
get
{
if( m_ajc == null )
m_ajc = new AndroidJavaClass( "com.yasirkula.unity.NativeCamera" );
return m_ajc;
}
}
private static AndroidJavaObject m_context = null;
private static AndroidJavaObject Context
{
get
{
if( m_context == null )
{
using( AndroidJavaObject unityClass = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) )
{
m_context = unityClass.GetStatic<AndroidJavaObject>( "currentActivity" );
}
}
return m_context;
}
}
#elif !UNITY_EDITOR && UNITY_IOS
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern int _NativeCamera_CheckPermission();
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern int _NativeCamera_RequestPermission();
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern int _NativeCamera_CanOpenSettings();
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern void _NativeCamera_OpenSettings();
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern int _NativeCamera_HasCamera();
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern void _NativeCamera_TakePicture( string imageSavePath, int maxSize, int preferredCamera );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern void _NativeCamera_RecordVideo( int quality, int maxDuration, int preferredCamera );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeCamera_GetImageProperties( string path );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeCamera_GetVideoProperties( string path );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeCamera_GetVideoThumbnail( string path, string thumbnailSavePath, int maxSize, double captureTimeInSeconds );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeCamera_LoadImageAtPath( string path, string temporaryFilePath, int maxSize );
#endif
#if !UNITY_EDITOR && ( UNITY_ANDROID || UNITY_IOS )
private static string m_temporaryImagePath = null;
private static string TemporaryImagePath
{
get
{
if( m_temporaryImagePath == null )
{
m_temporaryImagePath = Path.Combine( Application.temporaryCachePath, "tmpImg" );
Directory.CreateDirectory( Application.temporaryCachePath );
}
return m_temporaryImagePath;
}
}
#endif
#if !UNITY_EDITOR && UNITY_IOS
private static string m_iOSSelectedImagePath = null;
private static string IOSSelectedImagePath
{
get
{
if( m_iOSSelectedImagePath == null )
{
m_iOSSelectedImagePath = Path.Combine( Application.temporaryCachePath, "CameraImg" );
Directory.CreateDirectory( Application.temporaryCachePath );
}
return m_iOSSelectedImagePath;
}
}
#endif
#endregion
#region Runtime Permissions
public static Permission CheckPermission()
{
#if !UNITY_EDITOR && UNITY_ANDROID
Permission result = (Permission) AJC.CallStatic<int>( "CheckPermission", Context );
if( result == Permission.Denied && (Permission) PlayerPrefs.GetInt( "NativeCameraPermission", (int) Permission.ShouldAsk ) == Permission.ShouldAsk )
result = Permission.ShouldAsk;
return result;
#elif !UNITY_EDITOR && UNITY_IOS
return (Permission) _NativeCamera_CheckPermission();
#else
return Permission.Granted;
#endif
}
public static Permission RequestPermission()
{
#if !UNITY_EDITOR && UNITY_ANDROID
object threadLock = new object();
lock( threadLock )
{
NCPermissionCallbackAndroid nativeCallback = new NCPermissionCallbackAndroid( threadLock );
AJC.CallStatic( "RequestPermission", Context, nativeCallback, PlayerPrefs.GetInt( "NativeCameraPermission", (int) Permission.ShouldAsk ) );
if( nativeCallback.Result == -1 )
System.Threading.Monitor.Wait( threadLock );
if( (Permission) nativeCallback.Result != Permission.ShouldAsk && PlayerPrefs.GetInt( "NativeCameraPermission", -1 ) != nativeCallback.Result )
{
PlayerPrefs.SetInt( "NativeCameraPermission", nativeCallback.Result );
PlayerPrefs.Save();
}
return (Permission) nativeCallback.Result;
}
#elif !UNITY_EDITOR && UNITY_IOS
return (Permission) _NativeCamera_RequestPermission();
#else
return Permission.Granted;
#endif
}
public static bool CanOpenSettings()
{
#if !UNITY_EDITOR && UNITY_IOS
return _NativeCamera_CanOpenSettings() == 1;
#else
return true;
#endif
}
public static void OpenSettings()
{
#if !UNITY_EDITOR && UNITY_ANDROID
AJC.CallStatic( "OpenSettings", Context );
#elif !UNITY_EDITOR && UNITY_IOS
_NativeCamera_OpenSettings();
#endif
}
#endregion
#region Camera Functions
public static Permission TakePicture( CameraCallback callback, int maxSize = -1, bool saveAsJPEG = true, PreferredCamera preferredCamera = PreferredCamera.Default )
{
Permission result = RequestPermission();
if( result == Permission.Granted && !IsCameraBusy() )
{
#if !UNITY_EDITOR && UNITY_ANDROID
AJC.CallStatic( "TakePicture", Context, new NCCameraCallbackAndroid( callback ), (int) preferredCamera );
#elif !UNITY_EDITOR && UNITY_IOS
if( maxSize <= 0 )
maxSize = SystemInfo.maxTextureSize;
NCCameraCallbackiOS.Initialize( callback );
_NativeCamera_TakePicture( IOSSelectedImagePath + ( saveAsJPEG ? ".jpeg" : ".png" ), maxSize, (int) preferredCamera );
#else
if( callback != null )
callback( null );
#endif
}
return result;
}
public static Permission RecordVideo( CameraCallback callback, Quality quality = Quality.Default, int maxDuration = 0, long maxSizeBytes = 0L, PreferredCamera preferredCamera = PreferredCamera.Default )
{
Permission result = RequestPermission();
if( result == Permission.Granted && !IsCameraBusy() )
{
#if !UNITY_EDITOR && UNITY_ANDROID
AJC.CallStatic( "RecordVideo", Context, new NCCameraCallbackAndroid( callback ), (int) preferredCamera, (int) quality, maxDuration, maxSizeBytes );
#elif !UNITY_EDITOR && UNITY_IOS
NCCameraCallbackiOS.Initialize( callback );
_NativeCamera_RecordVideo( (int) quality, maxDuration, (int) preferredCamera );
#else
if( callback != null )
callback( null );
#endif
}
return result;
}
public static bool DeviceHasCamera()
{
#if !UNITY_EDITOR && UNITY_ANDROID
return AJC.CallStatic<bool>( "HasCamera", Context );
#elif !UNITY_EDITOR && UNITY_IOS
return _NativeCamera_HasCamera() == 1;
#else
return true;
#endif
}
public static bool IsCameraBusy()
{
#if !UNITY_EDITOR && UNITY_IOS
return NCCameraCallbackiOS.IsBusy;
#else
return false;
#endif
}
#endregion
#region Utility Functions
public static Texture2D LoadImageAtPath( string imagePath, int maxSize = -1, bool markTextureNonReadable = true,
bool generateMipmaps = true, bool linearColorSpace = false )
{
if( string.IsNullOrEmpty( imagePath ) )
throw new ArgumentException( "Parameter 'imagePath' is null or empty!" );
if( !File.Exists( imagePath ) )
throw new FileNotFoundException( "File not found at " + imagePath );
if( maxSize <= 0 )
maxSize = SystemInfo.maxTextureSize;
#if !UNITY_EDITOR && UNITY_ANDROID
string loadPath = AJC.CallStatic<string>( "LoadImageAtPath", Context, imagePath, TemporaryImagePath, maxSize );
#elif !UNITY_EDITOR && UNITY_IOS
string loadPath = _NativeCamera_LoadImageAtPath( imagePath, TemporaryImagePath, maxSize );
#else
string loadPath = imagePath;
#endif
String extension = Path.GetExtension( imagePath ).ToLowerInvariant();
TextureFormat format = ( extension == ".jpg" || extension == ".jpeg" ) ? TextureFormat.RGB24 : TextureFormat.RGBA32;
Texture2D result = new Texture2D( 2, 2, format, generateMipmaps, linearColorSpace );
try
{
if( !result.LoadImage( File.ReadAllBytes( loadPath ), markTextureNonReadable ) )
{
Object.DestroyImmediate( result );
return null;
}
}
catch( Exception e )
{
Debug.LogException( e );
Object.DestroyImmediate( result );
return null;
}
finally
{
if( loadPath != imagePath )
{
try
{
File.Delete( loadPath );
}
catch { }
}
}
return result;
}
public static Texture2D GetVideoThumbnail( string videoPath, int maxSize = -1, double captureTimeInSeconds = -1.0 )
{
if( maxSize <= 0 )
maxSize = SystemInfo.maxTextureSize;
#if !UNITY_EDITOR && UNITY_ANDROID
string thumbnailPath = AJC.CallStatic<string>( "GetVideoThumbnail", Context, videoPath, TemporaryImagePath + ".png", false, maxSize, captureTimeInSeconds );
#elif !UNITY_EDITOR && UNITY_IOS
string thumbnailPath = _NativeCamera_GetVideoThumbnail( videoPath, TemporaryImagePath + ".png", maxSize, captureTimeInSeconds );
#else
string thumbnailPath = null;
#endif
if( !string.IsNullOrEmpty( thumbnailPath ) )
return LoadImageAtPath( thumbnailPath, maxSize );
else
return null;
}
public static ImageProperties GetImageProperties( string imagePath )
{
if( !File.Exists( imagePath ) )
throw new FileNotFoundException( "File not found at " + imagePath );
#if !UNITY_EDITOR && UNITY_ANDROID
string value = AJC.CallStatic<string>( "GetImageProperties", Context, imagePath );
#elif !UNITY_EDITOR && UNITY_IOS
string value = _NativeCamera_GetImageProperties( imagePath );
#else
string value = null;
#endif
int width = 0, height = 0;
string mimeType = null;
ImageOrientation orientation = ImageOrientation.Unknown;
if( !string.IsNullOrEmpty( value ) )
{
string[] properties = value.Split( '>' );
if( properties != null && properties.Length >= 4 )
{
if( !int.TryParse( properties[0].Trim(), out width ) )
width = 0;
if( !int.TryParse( properties[1].Trim(), out height ) )
height = 0;
mimeType = properties[2].Trim();
if( mimeType.Length == 0 )
{
String extension = Path.GetExtension( imagePath ).ToLowerInvariant();
if( extension == ".png" )
mimeType = "image/png";
else if( extension == ".jpg" || extension == ".jpeg" )
mimeType = "image/jpeg";
else if( extension == ".gif" )
mimeType = "image/gif";
else if( extension == ".bmp" )
mimeType = "image/bmp";
else
mimeType = null;
}
int orientationInt;
if( int.TryParse( properties[3].Trim(), out orientationInt ) )
orientation = (ImageOrientation) orientationInt;
}
}
return new ImageProperties( width, height, mimeType, orientation );
}
public static VideoProperties GetVideoProperties( string videoPath )
{
if( !File.Exists( videoPath ) )
throw new FileNotFoundException( "File not found at " + videoPath );
#if !UNITY_EDITOR && UNITY_ANDROID
string value = AJC.CallStatic<string>( "GetVideoProperties", Context, videoPath );
#elif !UNITY_EDITOR && UNITY_IOS
string value = _NativeCamera_GetVideoProperties( videoPath );
#else
string value = null;
#endif
int width = 0, height = 0;
long duration = 0L;
float rotation = 0f;
if( !string.IsNullOrEmpty( value ) )
{
string[] properties = value.Split( '>' );
if( properties != null && properties.Length >= 4 )
{
if( !int.TryParse( properties[0].Trim(), out width ) )
width = 0;
if( !int.TryParse( properties[1].Trim(), out height ) )
height = 0;
if( !long.TryParse( properties[2].Trim(), out duration ) )
duration = 0L;
if( !float.TryParse( properties[3].Trim(), out rotation ) )
rotation = 0f;
}
}
if( rotation == -90f )
rotation = 270f;
return new VideoProperties( width, height, duration, rotation );
}
#endregion
}

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: ce1403606c3629046a0147d3e705f7cc
guid: ff758a73b21d4a04aa6f95679b3da605
timeCreated: 1498722610
licenseType: Store
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []

View File

@@ -0,0 +1,90 @@
= Native Camera for Android & iOS =
Online documentation & example code available at: https://github.com/yasirkula/UnityNativeCamera
E-mail: yasirkula@gmail.com
1. ABOUT
This plugin helps you take pictures/record videos natively with your device's camera on Android & iOS.
2. HOW TO
NativeCamera no longer requires any manual setup on Android. If you were using an older version of the plugin, you need to remove NativeCamera's "<provider ... />" from your AndroidManifest.xml.
For reference, the legacy documentation is available at: https://github.com/yasirkula/UnityNativeCamera/wiki/Manual-Setup-for-Android
2.2. iOS Setup
There are two ways to set up the plugin on iOS:
2.2.a. Automated Setup for iOS
- (optional) change the value of CAMERA_USAGE_DESCRIPTION in Plugins/NativeCamera/Editor/NCPostProcessBuild.cs
2.2.b. Manual Setup for iOS
- set the value of ENABLED to false in NCPostProcessBuild.cs
- build your project
- enter a Camera Usage Description to Info.plist in Xcode
- insert "-framework MobileCoreServices -framework ImageIO" to the "Other Linker Flags" of Unity-iPhone Target
3. FAQ
- Can't use the camera, it says "Can't find ContentProvider, camera is inaccessible!" in Logcat
After building your project, verify that NativeCamera's "<provider ... />" tag is inserted in-between the "<application>...</application>" tags of PROJECT_PATH/Temp/StagingArea/AndroidManifest.xml. If not, please contact me.
- Can't use the camera, it says "java.lang.ClassNotFoundException: com.yasirkula.unity.NativeCamera" in Logcat
If your project uses ProGuard, try adding the following line to ProGuard filters: -keep class com.yasirkula.unity.* { *; }
4. SCRIPTING API
Please see the online documentation for a more in-depth documentation of the Scripting API: https://github.com/yasirkula/UnityNativeCamera
enum NativeCamera.Permission { Denied = 0, Granted = 1, ShouldAsk = 2 };
enum NativeCamera.Quality { Default = -1, Low = 0, Medium = 1, High = 2 };
enum NativeCamera.ImageOrientation { Unknown = -1, Normal = 0, Rotate90 = 1, Rotate180 = 2, Rotate270 = 3, FlipHorizontal = 4, Transpose = 5, FlipVertical = 6, Transverse = 7 }; // EXIF orientation: http://sylvana.net/jpegcrop/exif_orientation.html (indices are reordered)
delegate void CameraCallback( string path );
//// Accessing Camera ////
// This operation is asynchronous! After user takes a picture or cancels the operation, the callback is called (on main thread)
// CameraCallback takes a string parameter which stores the path of the captured image, or null if the operation is canceled
// maxSize: determines the maximum size of the returned image in pixels on iOS. A larger image will be down-scaled for better performance. If untouched, its value will be set to SystemInfo.maxTextureSize. Has no effect on Android
// saveAsJPEG: determines whether the image is saved as JPEG or PNG. Has no effect on Android
// preferredCamera: determines whether the rear camera or the front camera should be opened by default
NativeCamera.Permission NativeCamera.TakePicture( CameraCallback callback, int maxSize = -1, bool saveAsJPEG = true, PreferredCamera preferredCamera = PreferredCamera.Default );
// quality: determines the quality of the recorded video
// maxDuration: determines the maximum duration, in seconds, for the recorded video. If untouched, there will be no limit. Please note that the functionality of this parameter depends on whether the device vendor has added this capability to the camera or not. So, this parameter may not have any effect on some devices
// maxSizeBytes: determines the maximum size, in bytes, for the recorded video. If untouched, there will be no limit. This parameter has no effect on iOS. Please note that the functionality of this parameter depends on whether the device vendor has added this capability to the camera or not. So, this parameter may not have any effect on some devices
NativeCamera.Permission NativeCamera.RecordVideo( CameraCallback callback, Quality quality = Quality.Default, int maxDuration = 0, long maxSizeBytes = 0L, PreferredCamera preferredCamera = PreferredCamera.Default );
bool NativeCamera.DeviceHasCamera(); // returns false if the device doesn't have a camera. In this case, TakePicture and RecordVideo functions will not execute
bool NativeCamera.IsCameraBusy(); // returns true if the camera is currently open. In that case, another TakePicture or RecordVideo request will simply be ignored
//// Runtime Permissions ////
// Accessing camera is only possible when permission state is Permission.Granted. TakePicture and RecordVideo functions request permission internally (and return the result) but you can also check/request the permissions manually
NativeCamera.Permission NativeCamera.CheckPermission();
NativeCamera.Permission NativeCamera.RequestPermission();
// If permission state is Permission.Denied, user must grant the necessary permission(s) manually from the Settings (Android requires Storage and, if declared in AndroidManifest, Camera permissions; iOS requires Camera permission). These functions help you open the Settings directly from within the app
void NativeCamera.OpenSettings();
bool NativeCamera.CanOpenSettings();
//// Utility Functions ////
// Creates a Texture2D from the specified image file in correct orientation and returns it. Returns null, if something goes wrong
// maxSize: determines the maximum size of the returned Texture2D in pixels. Larger textures will be down-scaled. If untouched, its value will be set to SystemInfo.maxTextureSize. It is recommended to set a proper maxSize for better performance
// markTextureNonReadable: marks the generated texture as non-readable for better memory usage. If you plan to modify the texture later (e.g. GetPixels/SetPixels), set its value to false
// generateMipmaps: determines whether texture should have mipmaps or not
// linearColorSpace: determines whether texture should be in linear color space or sRGB color space
Texture2D NativeCamera.LoadImageAtPath( string imagePath, int maxSize = -1, bool markTextureNonReadable = true, bool generateMipmaps = true, bool linearColorSpace = false );
// Creates a Texture2D thumbnail from a video file and returns it. Returns null, if something goes wrong
// maxSize: determines the maximum size of the returned Texture2D in pixels. Larger thumbnails will be down-scaled. If untouched, its value will be set to SystemInfo.maxTextureSize. It is recommended to set a proper maxSize for better performance
// captureTimeInSeconds: determines the frame of the video that the thumbnail is captured from. If untouched, OS will decide this value
Texture2D NativeCamera.GetVideoThumbnail( string videoPath, int maxSize = -1, double captureTimeInSeconds = -1.0 );
// Returns an ImageProperties instance that holds the width, height and mime type information of an image file without creating a Texture2D object. Mime type will be null, if it can't be determined
NativeCamera.ImageProperties NativeCamera.GetImageProperties( string imagePath );
// Returns a VideoProperties instance that holds the width, height, duration (in milliseconds) and rotation information of a video file. To play a video in correct orientation, you should rotate it by rotation degrees clockwise. For a 90-degree or 270-degree rotated video, values of width and height should be swapped to get the display size of the video
NativeCamera.VideoProperties NativeCamera.GetVideoProperties( string videoPath );

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: e5d70289d6cc2ac4294d703db236f8d0
timeCreated: 1520539180
licenseType: Store
guid: 5a88d1b1b9d7b904b862304c20ed4db4
timeCreated: 1563308465
licenseType: Free
TextScriptImporter:
userData:
assetBundleName:

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: 9c623599351a41a4c84c20f73c9d8976
guid: 5576acd2a06eb72409e6ec4b7f204a4e
folderAsset: yes
timeCreated: 1498722622
licenseType: Store
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:

View File

@@ -0,0 +1,72 @@
#if !UNITY_EDITOR && UNITY_IOS
using UnityEngine;
namespace NativeCameraNamespace
{
public class NCCameraCallbackiOS : MonoBehaviour
{
private static NCCameraCallbackiOS instance;
private NativeCamera.CameraCallback callback;
private float nextBusyCheckTime;
public static bool IsBusy { get; private set; }
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern int _NativeCamera_IsCameraBusy();
public static void Initialize( NativeCamera.CameraCallback callback )
{
if( IsBusy )
return;
if( instance == null )
{
instance = new GameObject( "NCCameraCallbackiOS" ).AddComponent<NCCameraCallbackiOS>();
DontDestroyOnLoad( instance.gameObject );
}
instance.callback = callback;
instance.nextBusyCheckTime = Time.realtimeSinceStartup + 1f;
IsBusy = true;
}
private void Update()
{
if( IsBusy )
{
if( Time.realtimeSinceStartup >= nextBusyCheckTime )
{
nextBusyCheckTime = Time.realtimeSinceStartup + 1f;
if( _NativeCamera_IsCameraBusy() == 0 )
{
IsBusy = false;
if( callback != null )
{
callback( null );
callback = null;
}
}
}
}
}
public void OnMediaReceived( string path )
{
IsBusy = false;
if( string.IsNullOrEmpty( path ) )
path = null;
if( callback != null )
{
callback( path );
callback = null;
}
}
}
}
#endif

View File

@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: d8f19d5713752dc41bd377562677d8ee
timeCreated: 1519060539
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,507 @@
#import <Foundation/Foundation.h>
#import <MobileCoreServices/UTCoreTypes.h>
#import <ImageIO/ImageIO.h>
#import <AVFoundation/AVFoundation.h>
#import <UIKit/UIKit.h>
#ifdef UNITY_4_0 || UNITY_5_0
#import "iPhone_View.h"
#else
extern UIViewController* UnityGetGLViewController();
#endif
@interface UNativeCamera:NSObject
+ (int)checkPermission;
+ (int)requestPermission;
+ (int)canOpenSettings;
+ (void)openSettings;
+ (int)hasCamera;
+ (void)openCamera:(BOOL)imageMode defaultCamera:(int)defaultCamera savePath:(NSString *)imageSavePath maxImageSize:(int)maxImageSize videoQuality:(int)videoQuality maxVideoDuration:(int)maxVideoDuration;
+ (int)isCameraBusy;
+ (char *)getImageProperties:(NSString *)path;
+ (char *)getVideoProperties:(NSString *)path;
+ (char *)getVideoThumbnail:(NSString *)path savePath:(NSString *)savePath maximumSize:(int)maximumSize captureTime:(double)captureTime;
+ (char *)loadImageAtPath:(NSString *)path tempFilePath:(NSString *)tempFilePath maximumSize:(int)maximumSize;
@end
@implementation UNativeCamera
static NSString *pickedMediaSavePath;
static UIImagePickerController *imagePicker;
static int cameraMaxImageSize = -1;
static int imagePickerState = 0; // 0 -> none, 1 -> showing, 2 -> finished
// Credit: https://stackoverflow.com/a/20464727/2373034
+ (int)checkPermission {
if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
{
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusAuthorized)
return 1;
else if (status == AVAuthorizationStatusNotDetermined )
return 2;
else
return 0;
}
return 1;
}
// Credit: https://stackoverflow.com/a/20464727/2373034
+ (int)requestPermission {
if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
{
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusAuthorized)
return 1;
if (status == AVAuthorizationStatusNotDetermined) {
__block BOOL authorized = NO;
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
authorized = granted;
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
if (authorized)
return 1;
else
return 0;
}
return 0;
}
return 1;
}
// Credit: https://stackoverflow.com/a/25453667/2373034
+ (int)canOpenSettings {
if (&UIApplicationOpenSettingsURLString != NULL)
return 1;
else
return 0;
}
// Credit: https://stackoverflow.com/a/25453667/2373034
+ (void)openSettings {
if (&UIApplicationOpenSettingsURLString != NULL)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
+ (int)hasCamera {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
return 1;
return 0;
}
// Credit: https://stackoverflow.com/a/10531752/2373034
+ (void)openCamera:(BOOL)imageMode defaultCamera:(int)defaultCamera savePath:(NSString *)imageSavePath maxImageSize:(int)maxImageSize videoQuality:(int)videoQuality maxVideoDuration:(int)maxVideoDuration {
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
NSLog(@"Device has no registered cameras!");
UnitySendMessage("NCCameraCallbackiOS", "OnMediaReceived", "");
return;
}
if ((imageMode && ![[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera] containsObject:(NSString*)kUTTypeImage]) ||
(!imageMode && ![[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera] containsObject:(NSString*)kUTTypeMovie]))
{
NSLog(@"Camera does not support this operation!");
UnitySendMessage("NCCameraCallbackiOS", "OnMediaReceived", "");
return;
}
imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.allowsEditing = NO;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
if (imageMode)
imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];
else
{
imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeMovie];
if (maxVideoDuration > 0)
imagePicker.videoMaximumDuration = maxVideoDuration;
if (videoQuality == 0)
imagePicker.videoQuality = UIImagePickerControllerQualityTypeLow;
else if (videoQuality == 1)
imagePicker.videoQuality = UIImagePickerControllerQualityTypeMedium;
else if (videoQuality == 2)
imagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh;
}
if (defaultCamera == 0 && [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear])
imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
else if (defaultCamera == 1 && [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront])
imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
pickedMediaSavePath = imageSavePath;
cameraMaxImageSize = maxImageSize;
imagePickerState = 1;
[UnityGetGLViewController() presentViewController:imagePicker animated:YES completion:^{ imagePickerState = 0; }];
}
+ (int)isCameraBusy {
if (imagePickerState == 2)
return 1;
if (imagePicker != nil) {
if (imagePickerState == 1 || [imagePicker presentingViewController] == UnityGetGLViewController())
return 1;
imagePicker = nil;
return 0;
}
return 0;
}
// Credit: https://stackoverflow.com/a/4170099/2373034
+ (NSArray *)getImageMetadata:(NSString *)path {
int width = 0;
int height = 0;
int orientation = -1;
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:path], nil);
if (imageSource != nil) {
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:(__bridge NSString *)kCGImageSourceShouldCache];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (__bridge CFDictionaryRef)options);
CFRelease(imageSource);
CGFloat widthF = 0.0f, heightF = 0.0f;
if (imageProperties != nil) {
if (CFDictionaryContainsKey(imageProperties, kCGImagePropertyPixelWidth))
CFNumberGetValue((CFNumberRef)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth), kCFNumberCGFloatType, &widthF);
if (CFDictionaryContainsKey(imageProperties, kCGImagePropertyPixelHeight))
CFNumberGetValue((CFNumberRef)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight), kCFNumberCGFloatType, &heightF);
if (CFDictionaryContainsKey(imageProperties, kCGImagePropertyOrientation)) {
CFNumberGetValue((CFNumberRef)CFDictionaryGetValue(imageProperties, kCGImagePropertyOrientation), kCFNumberIntType, &orientation);
if (orientation > 4) { // landscape image
CGFloat temp = widthF;
widthF = heightF;
heightF = temp;
}
}
CFRelease(imageProperties);
}
width = (int)roundf(widthF);
height = (int)roundf(heightF);
}
return [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:width], [NSNumber numberWithInt:height], [NSNumber numberWithInt:orientation], nil];
}
+ (char *)getImageProperties:(NSString *)path {
NSArray *metadata = [self getImageMetadata:path];
int orientationUnity;
int orientation = [metadata[2] intValue];
// To understand the magic numbers, see ImageOrientation enum in NativeCamera.cs
// and http://sylvana.net/jpegcrop/exif_orientation.html
if (orientation == 1)
orientationUnity = 0;
else if (orientation == 2)
orientationUnity = 4;
else if (orientation == 3)
orientationUnity = 2;
else if (orientation == 4)
orientationUnity = 6;
else if (orientation == 5)
orientationUnity = 5;
else if (orientation == 6)
orientationUnity = 1;
else if (orientation == 7)
orientationUnity = 7;
else if (orientation == 8)
orientationUnity = 3;
else
orientationUnity = -1;
return [self getCString:[NSString stringWithFormat:@"%d>%d> >%d", [metadata[0] intValue], [metadata[1] intValue], orientationUnity]];
}
+ (char *)getVideoProperties:(NSString *)path {
CGSize size = CGSizeZero;
float rotation = 0;
long long duration = 0;
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:path] options:nil];
if (asset != nil) {
duration = (long long) round(CMTimeGetSeconds([asset duration]) * 1000);
CGAffineTransform transform = [asset preferredTransform];
NSArray<AVAssetTrack *>* videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo];
if (videoTracks != nil && [videoTracks count] > 0) {
size = [[videoTracks objectAtIndex:0] naturalSize];
transform = [[videoTracks objectAtIndex:0] preferredTransform];
}
rotation = atan2(transform.b, transform.a) * (180.0 / M_PI);
}
return [self getCString:[NSString stringWithFormat:@"%d>%d>%lld>%f", (int)roundf(size.width), (int)roundf(size.height), duration, rotation]];
}
+ (char *)getVideoThumbnail:(NSString *)path savePath:(NSString *)savePath maximumSize:(int)maximumSize captureTime:(double)captureTime {
AVAssetImageGenerator *thumbnailGenerator = [[AVAssetImageGenerator alloc] initWithAsset:[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:path] options:nil]];
thumbnailGenerator.appliesPreferredTrackTransform = YES;
thumbnailGenerator.maximumSize = CGSizeMake((CGFloat) maximumSize, (CGFloat) maximumSize);
thumbnailGenerator.requestedTimeToleranceBefore = kCMTimeZero;
thumbnailGenerator.requestedTimeToleranceAfter = kCMTimeZero;
if (captureTime < 0.0)
captureTime = 0.0;
else {
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:path] options:nil];
if (asset != nil) {
double videoDuration = CMTimeGetSeconds([asset duration]);
if (videoDuration > 0.0 && captureTime >= videoDuration - 0.1) {
if (captureTime > videoDuration)
captureTime = videoDuration;
thumbnailGenerator.requestedTimeToleranceBefore = CMTimeMakeWithSeconds(1.0, 600);
}
}
}
NSError *error = nil;
CGImageRef image = [thumbnailGenerator copyCGImageAtTime:CMTimeMakeWithSeconds(captureTime, 600) actualTime:nil error:&error];
if (image == nil) {
if (error != nil)
NSLog(@"Error generating video thumbnail: %@", error);
else
NSLog(@"Error generating video thumbnail...");
return "";
}
UIImage *thumbnail = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
if (![UIImagePNGRepresentation(thumbnail) writeToFile:savePath atomically:YES]) {
NSLog(@"Error saving thumbnail image");
return "";
}
return [self getCString:savePath];
}
+ (UIImage *)scaleImage:(UIImage *)image maxSize:(int)maxSize {
CGFloat width = image.size.width;
CGFloat height = image.size.height;
UIImageOrientation orientation = image.imageOrientation;
if (width <= maxSize && height <= maxSize && orientation != UIImageOrientationDown &&
orientation != UIImageOrientationLeft && orientation != UIImageOrientationRight &&
orientation != UIImageOrientationLeftMirrored && orientation != UIImageOrientationRightMirrored &&
orientation != UIImageOrientationUpMirrored && orientation != UIImageOrientationDownMirrored)
return image;
CGFloat scaleX = 1.0f;
CGFloat scaleY = 1.0f;
if (width > maxSize)
scaleX = maxSize / width;
if (height > maxSize)
scaleY = maxSize / height;
// Credit: https://github.com/mbcharbonneau/UIImage-Categories/blob/master/UIImage%2BAlpha.m
CGImageAlphaInfo alpha = CGImageGetAlphaInfo(image.CGImage);
BOOL hasAlpha = alpha == kCGImageAlphaFirst || alpha == kCGImageAlphaLast || alpha == kCGImageAlphaPremultipliedFirst || alpha == kCGImageAlphaPremultipliedLast;
CGFloat scaleRatio = scaleX < scaleY ? scaleX : scaleY;
CGRect imageRect = CGRectMake(0, 0, width * scaleRatio, height * scaleRatio);
UIGraphicsBeginImageContextWithOptions(imageRect.size, !hasAlpha, image.scale);
[image drawInRect:imageRect];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
+ (char *)loadImageAtPath:(NSString *)path tempFilePath:(NSString *)tempFilePath maximumSize:(int)maximumSize {
// Check if the image can be loaded by Unity without requiring a conversion to PNG
// Credit: https://stackoverflow.com/a/12048937/2373034
NSString *extension = [path pathExtension];
BOOL conversionNeeded = [extension caseInsensitiveCompare:@"jpg"] != NSOrderedSame && [extension caseInsensitiveCompare:@"jpeg"] != NSOrderedSame && [extension caseInsensitiveCompare:@"png"] != NSOrderedSame;
if (!conversionNeeded) {
// Check if the image needs to be processed at all
NSArray *metadata = [self getImageMetadata:path];
int orientationInt = [metadata[2] intValue]; // 1: correct orientation, [1,8]: valid orientation range
if (orientationInt == 1 && [metadata[0] intValue] <= maximumSize && [metadata[1] intValue] <= maximumSize)
return [self getCString:path];
}
UIImage *image = [UIImage imageWithContentsOfFile:path];
if (image == nil)
return [self getCString:path];
UIImage *scaledImage = [self scaleImage:image maxSize:maximumSize];
if (conversionNeeded || scaledImage != image) {
if (![UIImagePNGRepresentation(scaledImage) writeToFile:tempFilePath atomically:YES]) {
NSLog(@"Error creating scaled image");
return [self getCString:path];
}
return [self getCString:tempFilePath];
}
else
return [self getCString:path];
}
+ (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSString *path = nil;
if ([info[UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeImage]) { // took picture
// Temporarily save image as PNG
UIImage *image = info[UIImagePickerControllerEditedImage] ?: info[UIImagePickerControllerOriginalImage];
if (image == nil)
path = nil;
else {
NSString *extension = [pickedMediaSavePath pathExtension];
BOOL saveAsJPEG = [extension caseInsensitiveCompare:@"jpg"] == NSOrderedSame || [extension caseInsensitiveCompare:@"jpeg"] == NSOrderedSame;
// Try to save the image with metadata
// CANCELED: a number of users reported that this method results in 90-degree rotated images, uncomment at your own risk
// Credit: https://stackoverflow.com/a/15858955
/*NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
NSMutableDictionary *mutableMetadata = nil;
CFDictionaryRef metadataRef;
CFStringRef imageType;
if (saveAsJPEG) {
mutableMetadata = [metadata mutableCopy];
[mutableMetadata setObject:@(1.0) forKey:(__bridge NSString *)kCGImageDestinationLossyCompressionQuality];
metadataRef = (__bridge CFDictionaryRef)mutableMetadata;
imageType = kUTTypeJPEG;
}
else {
metadataRef = (__bridge CFDictionaryRef)metadata;
imageType = kUTTypePNG;
}
CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:pickedMediaSavePath], imageType , 1, NULL);
if (imageDestination == NULL )
NSLog(@"Failed to create image destination");
else {
CGImageDestinationAddImage(imageDestination, image.CGImage, metadataRef);
if (CGImageDestinationFinalize(imageDestination))
path = pickedMediaSavePath;
else
NSLog(@"Failed to finalize the image");
CFRelease(imageDestination);
}*/
if (path == nil) {
//NSLog(@"Attempting to save the image without metadata as fallback");
if ((saveAsJPEG && [UIImageJPEGRepresentation([self scaleImage:image maxSize:cameraMaxImageSize], 1.0) writeToFile:pickedMediaSavePath atomically:YES]) ||
(!saveAsJPEG && [UIImagePNGRepresentation([self scaleImage:image maxSize:cameraMaxImageSize]) writeToFile:pickedMediaSavePath atomically:YES]) )
path = pickedMediaSavePath;
else {
NSLog(@"Error saving image without metadata");
path = nil;
}
}
}
}
else { // recorded video
NSURL *mediaUrl = info[UIImagePickerControllerMediaURL] ?: info[UIImagePickerControllerReferenceURL];
if (mediaUrl == nil)
path = nil;
else
path = [mediaUrl path];
}
imagePicker = nil;
imagePickerState = 2;
UnitySendMessage("NCCameraCallbackiOS", "OnMediaReceived", [self getCString:path]);
[picker dismissViewControllerAnimated:NO completion:nil];
}
+ (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
imagePicker = nil;
UnitySendMessage("NCCameraCallbackiOS", "OnMediaReceived", "");
[picker dismissViewControllerAnimated:YES completion:nil];
}
// Credit: https://stackoverflow.com/a/37052118/2373034
+ (char *)getCString:(NSString *)source {
if (source == nil)
source = @"";
const char *sourceUTF8 = [source UTF8String];
char *result = (char*) malloc(strlen(sourceUTF8) + 1);
strcpy(result, sourceUTF8);
return result;
}
@end
extern "C" int _NativeCamera_CheckPermission() {
return [UNativeCamera checkPermission];
}
extern "C" int _NativeCamera_RequestPermission() {
return [UNativeCamera requestPermission];
}
extern "C" int _NativeCamera_CanOpenSettings() {
return [UNativeCamera canOpenSettings];
}
extern "C" void _NativeCamera_OpenSettings() {
[UNativeCamera openSettings];
}
extern "C" int _NativeCamera_HasCamera() {
return [UNativeCamera hasCamera];
}
extern "C" void _NativeCamera_TakePicture(const char* imageSavePath, int maxSize, int preferredCamera) {
[UNativeCamera openCamera:YES defaultCamera:preferredCamera savePath:[NSString stringWithUTF8String:imageSavePath] maxImageSize:maxSize videoQuality:-1 maxVideoDuration:-1];
}
extern "C" void _NativeCamera_RecordVideo(int quality, int maxDuration, int preferredCamera) {
[UNativeCamera openCamera:NO defaultCamera:preferredCamera savePath:nil maxImageSize:4096 videoQuality:quality maxVideoDuration:maxDuration];
}
extern "C" int _NativeCamera_IsCameraBusy() {
return [UNativeCamera isCameraBusy];
}
extern "C" char* _NativeCamera_GetImageProperties(const char* path) {
return [UNativeCamera getImageProperties:[NSString stringWithUTF8String:path]];
}
extern "C" char* _NativeCamera_GetVideoProperties(const char* path) {
return [UNativeCamera getVideoProperties:[NSString stringWithUTF8String:path]];
}
extern "C" char* _NativeCamera_GetVideoThumbnail(const char* path, const char* thumbnailSavePath, int maxSize, double captureTimeInSeconds) {
return [UNativeCamera getVideoThumbnail:[NSString stringWithUTF8String:path] savePath:[NSString stringWithUTF8String:thumbnailSavePath] maximumSize:maxSize captureTime:captureTimeInSeconds];
}
extern "C" char* _NativeCamera_LoadImageAtPath(const char* path, const char* temporaryFilePath, int maxSize) {
return [UNativeCamera loadImageAtPath:[NSString stringWithUTF8String:path] tempFilePath:[NSString stringWithUTF8String:temporaryFilePath] maximumSize:maxSize];
}

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: f71ce2f3d3a5dbd46af575e628ed9d6e
timeCreated: 1498722774
licenseType: Pro
PluginImporter:
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
data:
first:
Any:
second:
enabled: 0
settings: {}
data:
first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
data:
first:
iPhone: iOS
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,79 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Coolape;
public class NativeGalleryUtl
{
public static IEnumerator TakeScreenshotAndSave(string album, string fileName)
{
yield return new WaitForEndOfFrame();
Texture2D ss = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
ss.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
ss.Apply();
// Save the screenshot to Gallery/Photos
Debug.Log("Permission result: " + NativeGallery.SaveImageToGallery(ss, album, fileName));
// To avoid memory leaks
Object.Destroy(ss);
}
public static void PickImage(object callback, int maxSize = -1)
{
NativeGallery.Permission permission = NativeGallery.GetImageFromGallery((path) =>
{
Debug.Log("Image path: " + path);
if (path != null)
{
// Create Texture from selected image
Texture2D texture = NativeGallery.LoadImageAtPath(path, maxSize);
if (texture == null)
{
Debug.Log("Couldn't load texture from " + path);
return;
}
Utl.doCallback(callback, texture);
/*
// Assign texture to a temporary quad and destroy it after 5 seconds
GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad);
quad.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 2.5f;
quad.transform.forward = Camera.main.transform.forward;
quad.transform.localScale = new Vector3(1f, texture.height / (float)texture.width, 1f);
Material material = quad.GetComponent<Renderer>().material;
if (!material.shader.isSupported) // happens when Standard shader is not included in the build
material.shader = Shader.Find("Legacy Shaders/Diffuse");
material.mainTexture = texture;
Destroy(quad, 5f);
// If a procedural texture is not destroyed manually,
// it will only be freed after a scene change
Destroy(texture, 5f);
*/
}
}, "Select a PNG image", "image/png");
Debug.Log("Permission result: " + permission);
}
public static void PickVideo()
{
NativeGallery.Permission permission = NativeGallery.GetVideoFromGallery((path) =>
{
Debug.Log("Video path: " + path);
if (path != null)
{
// Play the selected video
Handheld.PlayFullScreenMovie("file://" + path);
}
}, "Select a video");
Debug.Log("Permission result: " + permission);
}
}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a032e025a802f4707bf50d1d51778b1f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 880df38a865ba4f91981f0af6cafd817
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 2d517fd0f2f85f24698df2775bee58e9
timeCreated: 1544889149
licenseType: Store
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 4c18d702b07a63945968db47201b95c9
timeCreated: 1519060539
licenseType: Store
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: a07afac614af1294d8e72a3c083be028
timeCreated: 1519060539
licenseType: Store
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 07368f3d2020fe6439475cfaa8578fd8
timeCreated: 1544891451
licenseType: Store
guid: 8ed2b1cd685da484194ba437e57d1e49
timeCreated: 1570374101
licenseType: Free
PluginImporter:
serializedVersion: 2
iconMap: {}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d8aa34e33afa341a180dea50b2bdad62
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -28,13 +28,21 @@ public class NGPostProcessBuild
PBXProject pbxProject = new PBXProject();
pbxProject.ReadFromFile( pbxProjectPath );
#if UNITY_2019_3_OR_NEWER
string targetGUID = pbxProject.GetUnityFrameworkTargetGuid();
#else
string targetGUID = pbxProject.TargetGuidByName( PBXProject.GetUnityTargetName() );
#endif
// Minimum supported iOS version on Unity 2018.1 and later is 8.0
#if !UNITY_2018_1_OR_NEWER
if( MINIMUM_TARGET_8_OR_ABOVE )
{
#endif
pbxProject.AddBuildProperty( targetGUID, "OTHER_LDFLAGS", "-framework Photos" );
pbxProject.AddBuildProperty( targetGUID, "OTHER_LDFLAGS", "-framework MobileCoreServices" );
pbxProject.AddBuildProperty( targetGUID, "OTHER_LDFLAGS", "-framework ImageIO" );
#if !UNITY_2018_1_OR_NEWER
}
else
{
@@ -43,6 +51,7 @@ public class NGPostProcessBuild
pbxProject.AddBuildProperty( targetGUID, "OTHER_LDFLAGS", "-framework MobileCoreServices" );
pbxProject.AddBuildProperty( targetGUID, "OTHER_LDFLAGS", "-framework ImageIO" );
}
#endif
pbxProject.RemoveFrameworkFromProject( targetGUID, "Photos.framework" );

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: dff1540cf22bfb749a2422f445cf9427
timeCreated: 1521452119
licenseType: Store
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []

View File

@@ -0,0 +1,15 @@
{
"name": "NativeGallery.Editor",
"references": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 3dffc8e654f00c545a82d0a5274d51eb
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,3 @@
{
"name": "NativeGallery.Runtime"
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 777e6aa34fa63442d979fd3ac881b77b
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -41,6 +41,7 @@ public static class NativeGallery
}
public enum Permission { Denied = 0, Granted = 1, ShouldAsk = 2 };
private enum MediaType { Image = 0, Video = 1, Audio = 2 };
// EXIF orientation: http://sylvana.net/jpegcrop/exif_orientation.html (indices are reordered)
public enum ImageOrientation { Unknown = -1, Normal = 0, Rotate90 = 1, Rotate180 = 2, Rotate270 = 3, FlipHorizontal = 4, Transpose = 5, FlipVertical = 6, Transverse = 7 };
@@ -99,10 +100,10 @@ public static class NativeGallery
private static extern void _NativeGallery_VideoWriteToAlbum( string path, string album );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern void _NativeGallery_PickImage( string imageSavePath, int maxSize );
private static extern void _NativeGallery_PickImage( string imageSavePath );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern void _NativeGallery_PickVideo();
private static extern void _NativeGallery_PickVideo( string videoSavePath );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeGallery_GetImageProperties( string path );
@@ -110,6 +111,9 @@ public static class NativeGallery
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeGallery_GetVideoProperties( string path );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeGallery_GetVideoThumbnail( string path, string thumbnailSavePath, int maxSize, double captureTimeInSeconds );
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern string _NativeGallery_LoadImageAtPath( string path, string temporaryFilePath, int maxSize );
#endif
@@ -122,28 +126,56 @@ public static class NativeGallery
{
if( m_temporaryImagePath == null )
{
m_temporaryImagePath = Path.Combine( Application.temporaryCachePath, "__tmpImG" );
m_temporaryImagePath = Path.Combine( Application.temporaryCachePath, "tmpImg" );
Directory.CreateDirectory( Application.temporaryCachePath );
}
return m_temporaryImagePath;
}
}
#endif
#if !UNITY_EDITOR && UNITY_IOS
private static string m_iOSSelectedImagePath = null;
private static string IOSSelectedImagePath
private static string m_selectedImagePath = null;
private static string SelectedImagePath
{
get
{
if( m_iOSSelectedImagePath == null )
if( m_selectedImagePath == null )
{
m_iOSSelectedImagePath = Path.Combine( Application.temporaryCachePath, "tmp.png" );
m_selectedImagePath = Path.Combine( Application.temporaryCachePath, "pickedImg" );
Directory.CreateDirectory( Application.temporaryCachePath );
}
return m_iOSSelectedImagePath;
return m_selectedImagePath;
}
}
private static string m_selectedVideoPath = null;
private static string SelectedVideoPath
{
get
{
if( m_selectedVideoPath == null )
{
m_selectedVideoPath = Path.Combine( Application.temporaryCachePath, "pickedVideo" );
Directory.CreateDirectory( Application.temporaryCachePath );
}
return m_selectedVideoPath;
}
}
private static string m_selectedAudioPath = null;
private static string SelectedAudioPath
{
get
{
if( m_selectedAudioPath == null )
{
m_selectedAudioPath = Path.Combine( Application.temporaryCachePath, "pickedAudio" );
Directory.CreateDirectory( Application.temporaryCachePath );
}
return m_selectedAudioPath;
}
}
#endif
@@ -213,37 +245,47 @@ public static class NativeGallery
#endregion
#region Save Functions
public static Permission SaveImageToGallery( byte[] mediaBytes, string album, string filenameFormatted, MediaSaveCallback callback = null )
public static Permission SaveImageToGallery( byte[] mediaBytes, string album, string filename, MediaSaveCallback callback = null )
{
return SaveToGallery( mediaBytes, album, filenameFormatted, true, callback );
return SaveToGallery( mediaBytes, album, filename, MediaType.Image, callback );
}
public static Permission SaveImageToGallery( string existingMediaPath, string album, string filenameFormatted, MediaSaveCallback callback = null )
public static Permission SaveImageToGallery( string existingMediaPath, string album, string filename, MediaSaveCallback callback = null )
{
return SaveToGallery( existingMediaPath, album, filenameFormatted, true, callback );
return SaveToGallery( existingMediaPath, album, filename, MediaType.Image, callback );
}
public static Permission SaveImageToGallery( Texture2D image, string album, string filenameFormatted, MediaSaveCallback callback = null )
public static Permission SaveImageToGallery( Texture2D image, string album, string filename, MediaSaveCallback callback = null )
{
if( image == null )
throw new ArgumentException( "Parameter 'image' is null!" );
if( filenameFormatted.EndsWith( ".jpeg" ) || filenameFormatted.EndsWith( ".jpg" ) )
return SaveToGallery( GetTextureBytes( image, true ), album, filenameFormatted, true, callback );
else if( filenameFormatted.EndsWith( ".png" ) )
return SaveToGallery( GetTextureBytes( image, false ), album, filenameFormatted, true, callback );
if( filename.EndsWith( ".jpeg" ) || filename.EndsWith( ".jpg" ) )
return SaveToGallery( GetTextureBytes( image, true ), album, filename, MediaType.Image, callback );
else if( filename.EndsWith( ".png" ) )
return SaveToGallery( GetTextureBytes( image, false ), album, filename, MediaType.Image, callback );
else
return SaveToGallery( GetTextureBytes( image, false ), album, filenameFormatted + ".png", true, callback );
return SaveToGallery( GetTextureBytes( image, false ), album, filename + ".png", MediaType.Image, callback );
}
public static Permission SaveVideoToGallery( byte[] mediaBytes, string album, string filenameFormatted, MediaSaveCallback callback = null )
public static Permission SaveVideoToGallery( byte[] mediaBytes, string album, string filename, MediaSaveCallback callback = null )
{
return SaveToGallery( mediaBytes, album, filenameFormatted, false, callback );
return SaveToGallery( mediaBytes, album, filename, MediaType.Video, callback );
}
public static Permission SaveVideoToGallery( string existingMediaPath, string album, string filenameFormatted, MediaSaveCallback callback = null )
public static Permission SaveVideoToGallery( string existingMediaPath, string album, string filename, MediaSaveCallback callback = null )
{
return SaveToGallery( existingMediaPath, album, filenameFormatted, false, callback );
return SaveToGallery( existingMediaPath, album, filename, MediaType.Video, callback );
}
private static Permission SaveAudioToGallery( byte[] mediaBytes, string album, string filename, MediaSaveCallback callback = null )
{
return SaveToGallery( mediaBytes, album, filename, MediaType.Audio, callback );
}
private static Permission SaveAudioToGallery( string existingMediaPath, string album, string filename, MediaSaveCallback callback = null )
{
return SaveToGallery( existingMediaPath, album, filename, MediaType.Audio, callback );
}
#endregion
@@ -257,24 +299,34 @@ public static class NativeGallery
#endif
}
public static Permission GetImageFromGallery( MediaPickCallback callback, string title = "", string mime = "image/*", int maxSize = -1 )
public static Permission GetImageFromGallery( MediaPickCallback callback, string title = "", string mime = "image/*" )
{
return GetMediaFromGallery( callback, true, mime, title, maxSize );
return GetMediaFromGallery( callback, MediaType.Image, mime, title );
}
public static Permission GetVideoFromGallery( MediaPickCallback callback, string title = "", string mime = "video/*" )
{
return GetMediaFromGallery( callback, false, mime, title, -1 );
return GetMediaFromGallery( callback, MediaType.Video, mime, title );
}
public static Permission GetImagesFromGallery( MediaPickMultipleCallback callback, string title = "", string mime = "image/*", int maxSize = -1 )
private static Permission GetAudioFromGallery( MediaPickCallback callback, string title = "", string mime = "audio/*" )
{
return GetMultipleMediaFromGallery( callback, true, mime, title, maxSize );
return GetMediaFromGallery( callback, MediaType.Audio, mime, title );
}
public static Permission GetImagesFromGallery( MediaPickMultipleCallback callback, string title = "", string mime = "image/*" )
{
return GetMultipleMediaFromGallery( callback, MediaType.Image, mime, title );
}
public static Permission GetVideosFromGallery( MediaPickMultipleCallback callback, string title = "", string mime = "video/*" )
{
return GetMultipleMediaFromGallery( callback, false, mime, title, -1 );
return GetMultipleMediaFromGallery( callback, MediaType.Video, mime, title );
}
private static Permission GetAudiosFromGallery( MediaPickMultipleCallback callback, string title = "", string mime = "audio/*" )
{
return GetMultipleMediaFromGallery( callback, MediaType.Audio, mime, title );
}
public static bool IsMediaPickerBusy()
@@ -288,7 +340,7 @@ public static class NativeGallery
#endregion
#region Internal Functions
private static Permission SaveToGallery( byte[] mediaBytes, string album, string filenameFormatted, bool isImage, MediaSaveCallback callback )
private static Permission SaveToGallery( byte[] mediaBytes, string album, string filename, MediaType mediaType, MediaSaveCallback callback )
{
Permission result = RequestPermission( false );
if( result == Permission.Granted )
@@ -299,20 +351,26 @@ public static class NativeGallery
if( album == null || album.Length == 0 )
throw new ArgumentException( "Parameter 'album' is null or empty!" );
if( filenameFormatted == null || filenameFormatted.Length == 0 )
throw new ArgumentException( "Parameter 'filenameFormatted' is null or empty!" );
if( filename == null || filename.Length == 0 )
throw new ArgumentException( "Parameter 'filename' is null or empty!" );
string path = GetSavePath( album, filenameFormatted );
if( string.IsNullOrEmpty( Path.GetExtension( filename ) ) )
Debug.LogWarning( "'filename' doesn't have an extension, this might result in unexpected behaviour!" );
string path = GetTemporarySavePath( filename );
#if UNITY_EDITOR
Debug.Log( "SaveToGallery called successfully in the Editor" );
#else
File.WriteAllBytes( path, mediaBytes );
#endif
SaveToGalleryInternal( path, album, isImage, callback );
SaveToGalleryInternal( path, album, mediaType, callback );
}
return result;
}
private static Permission SaveToGallery( string existingMediaPath, string album, string filenameFormatted, bool isImage, MediaSaveCallback callback )
private static Permission SaveToGallery( string existingMediaPath, string album, string filename, MediaType mediaType, MediaSaveCallback callback )
{
Permission result = RequestPermission( false );
if( result == Permission.Granted )
@@ -323,98 +381,115 @@ public static class NativeGallery
if( album == null || album.Length == 0 )
throw new ArgumentException( "Parameter 'album' is null or empty!" );
if( filenameFormatted == null || filenameFormatted.Length == 0 )
throw new ArgumentException( "Parameter 'filenameFormatted' is null or empty!" );
if( filename == null || filename.Length == 0 )
throw new ArgumentException( "Parameter 'filename' is null or empty!" );
string path = GetSavePath( album, filenameFormatted );
if( string.IsNullOrEmpty( Path.GetExtension( filename ) ) )
{
string originalExtension = Path.GetExtension( existingMediaPath );
if( string.IsNullOrEmpty( originalExtension ) )
Debug.LogWarning( "'filename' doesn't have an extension, this might result in unexpected behaviour!" );
else
filename += originalExtension;
}
string path = GetTemporarySavePath( filename );
#if UNITY_EDITOR
Debug.Log( "SaveToGallery called successfully in the Editor" );
#else
File.Copy( existingMediaPath, path, true );
#endif
SaveToGalleryInternal( path, album, isImage, callback );
SaveToGalleryInternal( path, album, mediaType, callback );
}
return result;
}
private static void SaveToGalleryInternal( string path, string album, bool isImage, MediaSaveCallback callback )
private static void SaveToGalleryInternal( string path, string album, MediaType mediaType, MediaSaveCallback callback )
{
#if !UNITY_EDITOR && UNITY_ANDROID
AJC.CallStatic( "MediaScanFile", Context, path );
AJC.CallStatic( "SaveMedia", Context, (int) mediaType, path, album );
File.Delete( path );
if( callback != null )
callback( null );
Debug.Log( "Saving to gallery: " + path );
#elif !UNITY_EDITOR && UNITY_IOS
NGMediaSaveCallbackiOS.Initialize( callback );
if( isImage )
_NativeGallery_ImageWriteToAlbum( path, album );
else
_NativeGallery_VideoWriteToAlbum( path, album );
if( mediaType == MediaType.Audio )
{
if( callback != null )
callback( "Saving audio files is not supported on iOS" );
return;
}
Debug.Log( "Saving to Pictures: " + Path.GetFileName( path ) );
NGMediaSaveCallbackiOS.Initialize( callback );
if( mediaType == MediaType.Image )
_NativeGallery_ImageWriteToAlbum( path, album );
else if( mediaType == MediaType.Video )
_NativeGallery_VideoWriteToAlbum( path, album );
#else
if( callback != null )
callback( null );
#endif
}
private static string GetSavePath( string album, string filenameFormatted )
private static string GetTemporarySavePath( string filename )
{
string saveDir;
#if !UNITY_EDITOR && UNITY_ANDROID
saveDir = AJC.CallStatic<string>( "GetMediaPath", album );
#else
saveDir = Application.persistentDataPath;
#endif
if( filenameFormatted.Contains( "{0}" ) )
{
int fileIndex = 0;
string path;
do
{
path = Path.Combine( saveDir, string.Format( filenameFormatted, ++fileIndex ) );
} while( File.Exists( path ) );
return path;
}
saveDir = Path.Combine( saveDir, filenameFormatted );
string saveDir = Path.Combine( Application.persistentDataPath, "NGallery" );
Directory.CreateDirectory( saveDir );
#if !UNITY_EDITOR && UNITY_IOS
// Ensure a unique temporary filename on iOS:
// iOS internally copies images/videos to Photos directory of the system,
// but the process is async. The redundant file is deleted by objective-c code
// automatically after the media is saved but while it is being saved, the file
// should NOT be overwritten. Therefore, always ensure a unique filename on iOS
if( File.Exists( saveDir ) )
string path = Path.Combine( saveDir, filename );
if( File.Exists( path ) )
{
return GetSavePath( album,
Path.GetFileNameWithoutExtension( filenameFormatted ) + " {0}" + Path.GetExtension( filenameFormatted ) );
}
#endif
int fileIndex = 0;
string filenameWithoutExtension = Path.GetFileNameWithoutExtension( filename );
string extension = Path.GetExtension( filename );
return saveDir;
do
{
path = Path.Combine( saveDir, string.Concat( filenameWithoutExtension, ++fileIndex, extension ) );
} while( File.Exists( path ) );
}
return path;
#else
return Path.Combine( saveDir, filename );
#endif
}
private static Permission GetMediaFromGallery( MediaPickCallback callback, bool imageMode, string mime, string title, int maxSize )
private static Permission GetMediaFromGallery( MediaPickCallback callback, MediaType mediaType, string mime, string title )
{
Permission result = RequestPermission( true );
if( result == Permission.Granted && !IsMediaPickerBusy() )
{
#if !UNITY_EDITOR && UNITY_ANDROID
AJC.CallStatic( "PickMedia", Context, new NGMediaReceiveCallbackAndroid( callback, null ), imageMode, false, mime, title );
string savePath;
if( mediaType == MediaType.Image )
savePath = SelectedImagePath;
else if( mediaType == MediaType.Video )
savePath = SelectedVideoPath;
else
savePath = SelectedAudioPath;
AJC.CallStatic( "PickMedia", Context, new NGMediaReceiveCallbackAndroid( callback, null ), (int) mediaType, false, savePath, mime, title );
#elif !UNITY_EDITOR && UNITY_IOS
NGMediaReceiveCallbackiOS.Initialize( callback );
if( imageMode )
{
if( maxSize <= 0 )
maxSize = SystemInfo.maxTextureSize;
_NativeGallery_PickImage( IOSSelectedImagePath, maxSize );
}
else
_NativeGallery_PickVideo();
if( mediaType == MediaType.Image )
_NativeGallery_PickImage( SelectedImagePath );
else if( mediaType == MediaType.Video )
_NativeGallery_PickVideo( SelectedVideoPath );
else if( callback != null ) // Selecting audio files is not supported on iOS
callback( null );
#else
if( callback != null )
callback( null );
@@ -424,7 +499,7 @@ public static class NativeGallery
return result;
}
private static Permission GetMultipleMediaFromGallery( MediaPickMultipleCallback callback, bool imageMode, string mime, string title, int maxSize )
private static Permission GetMultipleMediaFromGallery( MediaPickMultipleCallback callback, MediaType mediaType, string mime, string title )
{
Permission result = RequestPermission( true );
if( result == Permission.Granted && !IsMediaPickerBusy() )
@@ -432,7 +507,15 @@ public static class NativeGallery
if( CanSelectMultipleFilesFromGallery() )
{
#if !UNITY_EDITOR && UNITY_ANDROID
AJC.CallStatic( "PickMedia", Context, new NGMediaReceiveCallbackAndroid( null, callback ), imageMode, true, mime, title );
string savePath;
if( mediaType == MediaType.Image )
savePath = SelectedImagePath;
else if( mediaType == MediaType.Video )
savePath = SelectedVideoPath;
else
savePath = SelectedAudioPath;
AJC.CallStatic( "PickMedia", Context, new NGMediaReceiveCallbackAndroid( null, callback ), (int) mediaType, true, savePath, mime, title );
#else
if( callback != null )
callback( null );
@@ -568,6 +651,25 @@ public static class NativeGallery
return result;
}
public static Texture2D GetVideoThumbnail( string videoPath, int maxSize = -1, double captureTimeInSeconds = -1.0 )
{
if( maxSize <= 0 )
maxSize = SystemInfo.maxTextureSize;
#if !UNITY_EDITOR && UNITY_ANDROID
string thumbnailPath = AJC.CallStatic<string>( "GetVideoThumbnail", Context, videoPath, TemporaryImagePath + ".png", false, maxSize, captureTimeInSeconds );
#elif !UNITY_EDITOR && UNITY_IOS
string thumbnailPath = _NativeGallery_GetVideoThumbnail( videoPath, TemporaryImagePath + ".png", maxSize, captureTimeInSeconds );
#else
string thumbnailPath = null;
#endif
if( !string.IsNullOrEmpty( thumbnailPath ) )
return LoadImageAtPath( thumbnailPath, maxSize );
else
return null;
}
public static ImageProperties GetImageProperties( string imagePath )
{
if( !File.Exists( imagePath ) )
@@ -613,11 +715,6 @@ public static class NativeGallery
int orientationInt;
if( int.TryParse( properties[3].Trim(), out orientationInt ) )
orientation = (ImageOrientation) orientationInt;
#if !UNITY_EDITOR && UNITY_IOS
if( orientation == ImageOrientation.Unknown ) // selected media is saved in correct orientation on iOS
orientation = ImageOrientation.Normal;
#endif
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 89147d0c91efd4310bf3b6ab773df35b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -3,16 +3,18 @@
Online documentation & example code available at: https://github.com/yasirkula/UnityNativeGallery
E-mail: yasirkula@gmail.com
1. ABOUT
This plugin helps you interact with Gallery/Photos on Android & iOS.
2. HOW TO
for Android: set "Write Permission" to "External (SDCard)" in Player Settings
for iOS: there are two ways to set up the plugin on iOS:
a. Automated Setup for iOS
- change the value of PHOTO_LIBRARY_USAGE_DESCRIPTION in Plugins/NativeGallery/Editor/NGPostProcessBuild.cs (optional)
- if your minimum Deployment Target (iOS Version) is at least 8.0, set the value of MINIMUM_TARGET_8_OR_ABOVE to true in NGPostProcessBuild.cs
- (optional) change the value of PHOTO_LIBRARY_USAGE_DESCRIPTION in Plugins/NativeGallery/Editor/NGPostProcessBuild.cs
- (Unity 2017.4 or earlier) if your minimum Deployment Target (iOS Version) is at least 8.0, set the value of MINIMUM_TARGET_8_OR_ABOVE to true in NGPostProcessBuild.cs
b. Manual Setup for iOS
- set the value of ENABLED to false in NGPostProcessBuild.cs
@@ -22,7 +24,22 @@ b. Manual Setup for iOS
- insert "-weak_framework Photos -framework AssetsLibrary -framework MobileCoreServices -framework ImageIO" to the "Other Linker Flags" of Unity-iPhone Target (if your Deployment Target is at least 8.0, it is sufficient to insert "-framework Photos -framework MobileCoreServices -framework ImageIO")
- lastly, remove Photos.framework from Link Binary With Libraries of Unity-iPhone Target in Build Phases, if exists
3. SCRIPTING API
3. FAQ
- How can I fetch the path of the saved image or the original path of the picked image?
You can't. On iOS, these files are stored in an internal directory that we have no access to (I don't think there is even a way to fetch that internal path). On Android, with Storage Access Framework, the absolute path is hidden behind the SAF-layer. There are some tricks here and there to convert SAF-path to absolute path but they don't work in all cases (most of the snippets that can be found on Stackoverflow can't return the absolute path if the file is stored on external SD card).
- Can't access the Gallery, it says "java.lang.ClassNotFoundException: com.yasirkula.unity.NativeGallery" in Logcat
If your project uses ProGuard, try adding the following line to ProGuard filters: -keep class com.yasirkula.unity.* { *; }
- Nothing happens when I try to access the Gallery on Android
Make sure that you've set the "Write Permission" to "External (SDCard)" in Player Settings.
- Saving image/video doesn't work properly
Make sure that the "filename" parameter of the Save function includes the file's extension, as well
4. SCRIPTING API
Please see the online documentation for a more in-depth documentation of the Scripting API: https://github.com/yasirkula/UnityNativeGallery
enum NativeGallery.Permission { Denied = 0, Granted = 1, ShouldAsk = 2 };
@@ -34,14 +51,15 @@ delegate void MediaPickMultipleCallback( string[] paths );
//// Saving Media To Gallery/Photos ////
// On Android, your images are saved at DCIM/album/filenameFormatted. On iOS, the image will be saved in the corresponding album
// filenameFormatted is string.Format'ed to avoid overwriting the same file on Android, if desired. If, for example, you want your images to be saved in a format like "My img 1.png", "My img 2.png" and etc., you can set the filenameFormatted as "My img {0}.png". {0} here is replaced with a unique number to avoid overwriting an existing file. If you don't use a {0} in your filenameFormatted parameter and a file with the same name does exist at that path, the file will be overwritten. On the other hand, a saved image is never overwritten on iOS
// On Android, your images are saved at DCIM/album/filename. On iOS, the image will be saved in the corresponding album.
// NOTE: Make sure that the filename parameter includes the file's extension, as well
// IMPORTANT: NativeGallery will never overwrite existing media on the Gallery. If there is a name conflict, NativeGallery will ensure a unique filename. So don't put '{0}' in filename anymore (for new users, putting {0} in filename was recommended in order to ensure unique filenames in earlier versions, this is no longer necessary).
// MediaSaveCallback takes a string parameter which stores an error string if something goes wrong while saving the image/video, or null if it is saved successfully
NativeGallery.Permission NativeGallery.SaveImageToGallery( byte[] mediaBytes, string album, string filenameFormatted, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveImageToGallery( string existingMediaPath, string album, string filenameFormatted, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveImageToGallery( Texture2D image, string album, string filenameFormatted, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveVideoToGallery( byte[] mediaBytes, string album, string filenameFormatted, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveVideoToGallery( string existingMediaPath, string album, string filenameFormatted, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveImageToGallery( byte[] mediaBytes, string album, string filename, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveImageToGallery( string existingMediaPath, string album, string filename, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveImageToGallery( Texture2D image, string album, string filename, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveVideoToGallery( byte[] mediaBytes, string album, string filename, MediaSaveCallback callback = null );
NativeGallery.Permission NativeGallery.SaveVideoToGallery( string existingMediaPath, string album, string filename, MediaSaveCallback callback = null );
//// Retrieving Media From Gallery/Photos ////
@@ -50,11 +68,10 @@ NativeGallery.Permission NativeGallery.SaveVideoToGallery( string existingMediaP
// MediaPickCallback takes a string parameter which stores the path of the selected image/video, or null if nothing is selected
// MediaPickMultipleCallback takes a string[] parameter which stores the path(s) of the selected image(s)/video(s), or null if nothing is selected
// title: determines the title of the image picker dialog on Android. Has no effect on iOS
// mime: filters the available images/videos on Android. For example, to request a JPEG image from the user, mime can be set as "image/jpeg". Setting multiple mime types is not possible (in that case, you should leave mime as is). On iOS, selected images will always be in PNG format and thus, this parameter has no effect on iOS
// maxSize: determines the maximum size of the returned image in pixels on iOS. A larger image will be down-scaled for better performance. If untouched, its value will be set to SystemInfo.maxTextureSize. Has no effect on Android
NativeGallery.Permission NativeGallery.GetImageFromGallery( MediaPickCallback callback, string title = "", string mime = "image/*", int maxSize = -1 );
// mime: filters the available images/videos on Android. For example, to request a JPEG image from the user, mime can be set as "image/jpeg". Setting multiple mime types is not possible (in that case, you should leave mime as is). Has no effect on iOS
NativeGallery.Permission NativeGallery.GetImageFromGallery( MediaPickCallback callback, string title = "", string mime = "image/*" );
NativeGallery.Permission NativeGallery.GetVideoFromGallery( MediaPickCallback callback, string title = "", string mime = "video/*" );
NativeGallery.Permission NativeGallery.GetImagesFromGallery( MediaPickMultipleCallback callback, string title = "", string mime = "image/*", int maxSize = -1 );
NativeGallery.Permission NativeGallery.GetImagesFromGallery( MediaPickMultipleCallback callback, string title = "", string mime = "image/*" );
NativeGallery.Permission NativeGallery.GetVideosFromGallery( MediaPickMultipleCallback callback, string title = "", string mime = "video/*" );
// Returns true if selecting multiple images/videos from Gallery/Photos is possible on this device (only available on Android 18 and later; iOS not supported)
@@ -77,11 +94,20 @@ bool NativeGallery.CanOpenSettings();
//// Utility Functions ////
// Creates a Texture2D from the specified image file in correct orientation and returns it. Returns null, if something goes wrong
// maxSize: determines the maximum size of the returned Texture2D in pixels. Larger textures will be down-scaled. If untouched, its value will be set to SystemInfo.maxTextureSize. It is recommended to set a proper maxSize for better performance
// markTextureNonReadable: marks the generated texture as non-readable for better memory usage. If you plan to modify the texture later (e.g. GetPixels/SetPixels), set its value to false
// generateMipmaps: determines whether texture should have mipmaps or not
// linearColorSpace: determines whether texture should be in linear color space or sRGB color space
Texture2D NativeGallery.LoadImageAtPath( string imagePath, int maxSize = -1, bool markTextureNonReadable = true, bool generateMipmaps = true, bool linearColorSpace = false ): creates a Texture2D from the specified image file in correct orientation and returns it. Returns null, if something goes wrong
Texture2D NativeGallery.LoadImageAtPath( string imagePath, int maxSize = -1, bool markTextureNonReadable = true, bool generateMipmaps = true, bool linearColorSpace = false );
NativeGallery.ImageProperties NativeGallery.GetImageProperties( string imagePath ): returns an ImageProperties instance that holds the width, height and mime type information of an image file without creating a Texture2D object. Mime type will be null, if it can't be determined
NativeGallery.VideoProperties NativeGallery.GetVideoProperties( string videoPath ): returns a VideoProperties instance that holds the width, height, duration (in milliseconds) and rotation information of a video file
// Creates a Texture2D thumbnail from a video file and returns it. Returns null, if something goes wrong
// maxSize: determines the maximum size of the returned Texture2D in pixels. Larger thumbnails will be down-scaled. If untouched, its value will be set to SystemInfo.maxTextureSize. It is recommended to set a proper maxSize for better performance
// captureTimeInSeconds: determines the frame of the video that the thumbnail is captured from. If untouched, OS will decide this value
Texture2D NativeGallery.GetVideoThumbnail( string videoPath, int maxSize = -1, double captureTimeInSeconds = -1.0 );
// Returns an ImageProperties instance that holds the width, height and mime type information of an image file without creating a Texture2D object. Mime type will be null, if it can't be determined
NativeGallery.ImageProperties NativeGallery.GetImageProperties( string imagePath );
// Returns a VideoProperties instance that holds the width, height, duration (in milliseconds) and rotation information of a video file. To play a video in correct orientation, you should rotate it by rotation degrees clockwise. For a 90-degree or 270-degree rotated video, values of width and height should be swapped to get the display size of the video
NativeGallery.VideoProperties NativeGallery.GetVideoProperties( string videoPath );

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1852f26c8592c453f8f7423bf2a283d7
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c8af1e45d8c954cd0a87623adcbc246d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -42,13 +42,13 @@ namespace NativeGalleryNamespace
if( _NativeGallery_IsMediaPickerBusy() == 0 )
{
IsBusy = false;
if( callback != null )
{
callback( null );
callback = null;
}
IsBusy = false;
}
}
}
@@ -56,6 +56,8 @@ namespace NativeGalleryNamespace
public void OnMediaReceived( string path )
{
IsBusy = false;
if( string.IsNullOrEmpty( path ) )
path = null;
@@ -64,8 +66,6 @@ namespace NativeGalleryNamespace
callback( path );
callback = null;
}
IsBusy = false;
}
}
}

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 71fb861c149c2d1428544c601e52a33c
timeCreated: 1519060539
licenseType: Store
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 9cbb865d0913a0d47bb6d2eb3ad04c4f
timeCreated: 1519060539
licenseType: Store
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []

View File

@@ -18,20 +18,20 @@ + (int)requestPermission;
+ (int)canOpenSettings;
+ (void)openSettings;
+ (void)saveMedia:(NSString *)path albumName:(NSString *)album isImg:(BOOL)isImg;
+ (void)pickMedia:(BOOL)imageMode savePath:(NSString *)imageSavePath;
+ (void)pickMediaSetMaxSize:(int)maxSize;
+ (void)pickMedia:(BOOL)imageMode savePath:(NSString *)mediaSavePath;
+ (int)isMediaPickerBusy;
+ (char *)getImageProperties:(NSString *)path;
+ (char *)getVideoProperties:(NSString *)path;
+ (char *)getVideoThumbnail:(NSString *)path savePath:(NSString *)savePath maximumSize:(int)maximumSize captureTime:(double)captureTime;
+ (char *)loadImageAtPath:(NSString *)path tempFilePath:(NSString *)tempFilePath maximumSize:(int)maximumSize;
@end
@implementation UNativeGallery
static NSString *pickedMediaSavePath;
static NSString *resultPath;
static UIPopoverController *popup;
static UIImagePickerController *imagePicker;
static int pickMediaMaxSize = -1;
static int imagePickerState = 0; // 0 -> none, 1 -> showing (always in this state on iPad), 2 -> finished
#pragma clang diagnostic push
@@ -229,11 +229,11 @@ + (void)saveMediaOld:(NSString *)path albumName:(NSString *)album isImage:(BOOL)
[library addAssetsGroupAlbumWithName:album resultBlock:^(ALAssetsGroup *group) {
saveBlock(group);
}
failureBlock:^(NSError *error) {
NSLog(@"Error creating album: %@", error);
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
UnitySendMessage("NGMediaSaveCallbackiOS", "OnMediaSaveFailed", [self getCString:[error localizedDescription]]);
}];
failureBlock:^(NSError *error) {
NSLog(@"Error creating album: %@", error);
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
UnitySendMessage("NGMediaSaveCallbackiOS", "OnMediaSaveFailed", [self getCString:[error localizedDescription]]);
}];
}
} failureBlock:^(NSError* error) {
NSLog(@"Error listing albums: %@", error);
@@ -300,7 +300,7 @@ + (void)saveMediaNew:(NSString *)path albumName:(NSString *)album isImage:(BOOL)
}
// Credit: https://stackoverflow.com/a/10531752/2373034
+ (void)pickMedia:(BOOL)imageMode savePath:(NSString *)imageSavePath {
+ (void)pickMedia:(BOOL)imageMode savePath:(NSString *)mediaSavePath {
imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.allowsEditing = NO;
@@ -309,9 +309,17 @@ + (void)pickMedia:(BOOL)imageMode savePath:(NSString *)imageSavePath {
if (imageMode)
imagePicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];
else
{
imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeMovie, (NSString *)kUTTypeVideo, nil];
pickedMediaSavePath = imageSavePath;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
// Don't compress the picked video if possible
if ([[[UIDevice currentDevice] systemVersion] compare:@"11.0" options:NSNumericSearch] != NSOrderedAscending)
imagePicker.videoExportPreset = AVAssetExportPresetPassthrough;
#endif
}
pickedMediaSavePath = mediaSavePath;
imagePickerState = 1;
UIViewController *rootViewController = UnityGetGLViewController();
@@ -320,14 +328,10 @@ + (void)pickMedia:(BOOL)imageMode savePath:(NSString *)imageSavePath {
else { // iPad
popup = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
popup.delegate = self;
[popup presentPopoverFromRect:CGRectMake( rootViewController.view.frame.size.width / 2, rootViewController.view.frame.size.height / 4, 0, 0 ) inView:rootViewController.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[popup presentPopoverFromRect:CGRectMake( rootViewController.view.frame.size.width / 2, rootViewController.view.frame.size.height / 2, 1, 1 ) inView:rootViewController.view permittedArrowDirections:0 animated:YES];
}
}
+ (void)pickMediaSetMaxSize:(int)maxSize {
pickMediaMaxSize = maxSize;
}
+ (int)isMediaPickerBusy {
if (imagePickerState == 2)
return 1;
@@ -435,6 +439,50 @@ + (char *)getVideoProperties:(NSString *)path {
return [self getCString:[NSString stringWithFormat:@"%d>%d>%lld>%f", (int)roundf(size.width), (int)roundf(size.height), duration, rotation]];
}
+ (char *)getVideoThumbnail:(NSString *)path savePath:(NSString *)savePath maximumSize:(int)maximumSize captureTime:(double)captureTime {
AVAssetImageGenerator *thumbnailGenerator = [[AVAssetImageGenerator alloc] initWithAsset:[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:path] options:nil]];
thumbnailGenerator.appliesPreferredTrackTransform = YES;
thumbnailGenerator.maximumSize = CGSizeMake((CGFloat) maximumSize, (CGFloat) maximumSize);
thumbnailGenerator.requestedTimeToleranceBefore = kCMTimeZero;
thumbnailGenerator.requestedTimeToleranceAfter = kCMTimeZero;
if (captureTime < 0.0)
captureTime = 0.0;
else {
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:path] options:nil];
if (asset != nil) {
double videoDuration = CMTimeGetSeconds([asset duration]);
if (videoDuration > 0.0 && captureTime >= videoDuration - 0.1) {
if (captureTime > videoDuration)
captureTime = videoDuration;
thumbnailGenerator.requestedTimeToleranceBefore = CMTimeMakeWithSeconds(1.0, 600);
}
}
}
NSError *error = nil;
CGImageRef image = [thumbnailGenerator copyCGImageAtTime:CMTimeMakeWithSeconds(captureTime, 600) actualTime:nil error:&error];
if (image == nil) {
if (error != nil)
NSLog(@"Error generating video thumbnail: %@", error);
else
NSLog(@"Error generating video thumbnail...");
return "";
}
UIImage *thumbnail = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
if (![UIImagePNGRepresentation(thumbnail) writeToFile:savePath atomically:YES]) {
NSLog(@"Error saving thumbnail image");
return "";
}
return [self getCString:savePath];
}
+ (UIImage *)scaleImage:(UIImage *)image maxSize:(int)maxSize {
CGFloat width = image.size.width;
CGFloat height = image.size.height;
@@ -468,51 +516,158 @@ + (UIImage *)scaleImage:(UIImage *)image maxSize:(int)maxSize {
}
+ (char *)loadImageAtPath:(NSString *)path tempFilePath:(NSString *)tempFilePath maximumSize:(int)maximumSize {
NSArray *metadata = [self getImageMetadata:path];
int orientationInt = [metadata[2] intValue]; // 1: correct orientation, [1,8]: valid orientation range
if (( orientationInt <= 1 || orientationInt > 8 ) && [metadata[0] intValue] <= maximumSize && [metadata[1] intValue] <= maximumSize)
return [self getCString:path];
// Check if the image can be loaded by Unity without requiring a conversion to PNG
// Credit: https://stackoverflow.com/a/12048937/2373034
NSString *extension = [path pathExtension];
BOOL conversionNeeded = [extension caseInsensitiveCompare:@"jpg"] != NSOrderedSame && [extension caseInsensitiveCompare:@"jpeg"] != NSOrderedSame && [extension caseInsensitiveCompare:@"png"] != NSOrderedSame;
if (!conversionNeeded) {
// Check if the image needs to be processed at all
NSArray *metadata = [self getImageMetadata:path];
int orientationInt = [metadata[2] intValue]; // 1: correct orientation, [1,8]: valid orientation range
if (orientationInt == 1 && [metadata[0] intValue] <= maximumSize && [metadata[1] intValue] <= maximumSize)
return [self getCString:path];
}
UIImage *image = [UIImage imageWithContentsOfFile:path];
if (image == nil)
return [self getCString:path];
UIImage *scaledImage = [self scaleImage:image maxSize:maximumSize];
if (scaledImage != image) {
[UIImagePNGRepresentation(scaledImage) writeToFile:tempFilePath atomically:YES];
if (conversionNeeded || scaledImage != image) {
if (![UIImagePNGRepresentation(scaledImage) writeToFile:tempFilePath atomically:YES]) {
NSLog(@"Error creating scaled image");
return [self getCString:path];
}
return [self getCString:tempFilePath];
}
else
return [self getCString:path];
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSString *path;
resultPath = nil;
if ([info[UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeImage]) { // image picked
// Temporarily save image as PNG
UIImage *image = info[UIImagePickerControllerOriginalImage];
if (image == nil)
path = nil;
else {
[UIImagePNGRepresentation([self scaleImage:image maxSize:pickMediaMaxSize]) writeToFile:pickedMediaSavePath atomically:YES];
path = pickedMediaSavePath;
// On iOS 8.0 or later, try to obtain the raw data of the image (which allows picking gifs properly or preserving metadata)
if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending) {
PHAsset *asset = nil;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
if ([[[UIDevice currentDevice] systemVersion] compare:@"11.0" options:NSNumericSearch] != NSOrderedAscending) {
// Try fetching the source image via UIImagePickerControllerImageURL
NSURL *mediaUrl = info[UIImagePickerControllerImageURL];
if (mediaUrl != nil) {
NSString *imagePath = [mediaUrl path];
if (imagePath != nil && [[NSFileManager defaultManager] fileExistsAtPath:imagePath]) {
NSError *error;
NSString *newPath = [pickedMediaSavePath stringByAppendingPathExtension:[imagePath pathExtension]];
if (![[NSFileManager defaultManager] fileExistsAtPath:newPath] || [[NSFileManager defaultManager] removeItemAtPath:newPath error:&error]) {
if ([[NSFileManager defaultManager] copyItemAtPath:imagePath toPath:newPath error:&error]) {
resultPath = newPath;
NSLog(@"Copied source image from UIImagePickerControllerImageURL");
}
else
NSLog(@"Error copying image: %@", error);
}
else
NSLog(@"Error deleting existing image: %@", error);
}
}
if (resultPath == nil)
asset = info[UIImagePickerControllerPHAsset];
}
#endif
if (resultPath == nil) {
if (asset == nil) {
NSURL *mediaUrl = info[UIImagePickerControllerReferenceURL] ?: info[UIImagePickerControllerMediaURL];
if (mediaUrl != nil)
asset = [[PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:mediaUrl] options:nil] firstObject];
}
if (asset != nil) {
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
options.version = PHImageRequestOptionsVersionCurrent;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
if ([[[UIDevice currentDevice] systemVersion] compare:@"13.0" options:NSNumericSearch] != NSOrderedAscending) {
[[PHImageManager defaultManager] requestImageDataAndOrientationForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, CGImagePropertyOrientation orientation, NSDictionary *imageInfo) {
if (imageData != nil)
[self trySaveSourceImage:imageData withInfo:imageInfo];
else
NSLog(@"Couldn't fetch raw image data");
}];
}
else {
#endif
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *imageInfo) {
if (imageData != nil)
[self trySaveSourceImage:imageData withInfo:imageInfo];
else
NSLog(@"Couldn't fetch raw image data");
}];
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
}
#endif
}
}
}
if (resultPath == nil) {
// Temporarily save image as PNG
UIImage *image = info[UIImagePickerControllerOriginalImage];
if (image != nil) {
resultPath = [pickedMediaSavePath stringByAppendingPathExtension:@"png"];
if (![UIImagePNGRepresentation(image) writeToFile:resultPath atomically:YES]) {
NSLog(@"Error creating PNG image");
resultPath = nil;
}
}
else
NSLog(@"Error fetching original image from picker");
}
}
else { // video picked
NSURL *mediaUrl = info[UIImagePickerControllerMediaURL] ?: info[UIImagePickerControllerReferenceURL];
if (mediaUrl == nil)
path = nil;
else
path = [mediaUrl path];
if (mediaUrl != nil) {
resultPath = [mediaUrl path];
// On iOS 13, picked file becomes unreachable as soon as the UIImagePickerController disappears,
// in that case, copy the video to a temporary location
if ([[[UIDevice currentDevice] systemVersion] compare:@"13.0" options:NSNumericSearch] != NSOrderedAscending) {
NSError *error;
NSString *newPath = [pickedMediaSavePath stringByAppendingPathExtension:[resultPath pathExtension]];
if (![[NSFileManager defaultManager] fileExistsAtPath:newPath] || [[NSFileManager defaultManager] removeItemAtPath:newPath error:&error]) {
if ([[NSFileManager defaultManager] copyItemAtPath:resultPath toPath:newPath error:&error])
resultPath = newPath;
else {
NSLog(@"Error copying video: %@", error);
resultPath = nil;
}
}
else {
NSLog(@"Error deleting existing video: %@", error);
resultPath = nil;
}
}
}
}
popup = nil;
imagePicker = nil;
imagePickerState = 2;
UnitySendMessage("NGMediaReceiveCallbackiOS", "OnMediaReceived", [self getCString:path]);
UnitySendMessage("NGMediaReceiveCallbackiOS", "OnMediaReceived", [self getCString:resultPath]);
[picker dismissViewControllerAnimated:NO completion:nil];
}
#pragma clang diagnostic pop
+ (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
@@ -529,6 +684,36 @@ + (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverControl
UnitySendMessage("NGMediaReceiveCallbackiOS", "OnMediaReceived", "");
}
+ (void)trySaveSourceImage:(NSData *)imageData withInfo:(NSDictionary *)info {
NSString *filePath = info[@"PHImageFileURLKey"];
if (filePath != nil) // filePath can actually be an NSURL, convert it to NSString
filePath = [NSString stringWithFormat:@"%@", filePath];
if (filePath == nil || [filePath length] == 0)
{
filePath = info[@"PHImageFileUTIKey"];
if (filePath != nil)
filePath = [NSString stringWithFormat:@"%@", filePath];
}
if (filePath == nil || [filePath length] == 0)
resultPath = pickedMediaSavePath;
else
resultPath = [pickedMediaSavePath stringByAppendingPathExtension:[filePath pathExtension]];
NSError *error;
if (![[NSFileManager defaultManager] fileExistsAtPath:resultPath] || [[NSFileManager defaultManager] removeItemAtPath:resultPath error:&error]) {
if (![imageData writeToFile:resultPath atomically:YES]) {
NSLog(@"Error copying source image to file");
resultPath = nil;
}
}
else {
NSLog(@"Error deleting existing image: %@", error);
resultPath = nil;
}
}
// Credit: https://stackoverflow.com/a/37052118/2373034
+ (char *)getCString:(NSString *)source {
if (source == nil)
@@ -567,13 +752,12 @@ + (char *)getCString:(NSString *)source {
[UNativeGallery saveMedia:[NSString stringWithUTF8String:path] albumName:[NSString stringWithUTF8String:album] isImg:NO];
}
extern "C" void _NativeGallery_PickImage(const char* imageSavePath, int maxSize) {
[UNativeGallery pickMediaSetMaxSize:maxSize];
extern "C" void _NativeGallery_PickImage(const char* imageSavePath) {
[UNativeGallery pickMedia:YES savePath:[NSString stringWithUTF8String:imageSavePath]];
}
extern "C" void _NativeGallery_PickVideo() {
[UNativeGallery pickMedia:NO savePath:nil];
extern "C" void _NativeGallery_PickVideo(const char* videoSavePath) {
[UNativeGallery pickMedia:NO savePath:[NSString stringWithUTF8String:videoSavePath]];
}
extern "C" int _NativeGallery_IsMediaPickerBusy() {
@@ -588,6 +772,10 @@ + (char *)getCString:(NSString *)source {
return [UNativeGallery getVideoProperties:[NSString stringWithUTF8String:path]];
}
extern "C" char* _NativeGallery_GetVideoThumbnail(const char* path, const char* thumbnailSavePath, int maxSize, double captureTimeInSeconds) {
return [UNativeGallery getVideoThumbnail:[NSString stringWithUTF8String:path] savePath:[NSString stringWithUTF8String:thumbnailSavePath] maximumSize:maxSize captureTime:captureTimeInSeconds];
}
extern "C" char* _NativeGallery_LoadImageAtPath(const char* path, const char* temporaryFilePath, int maxSize) {
return [UNativeGallery loadImageAtPath:[NSString stringWithUTF8String:path] tempFilePath:[NSString stringWithUTF8String:temporaryFilePath] maximumSize:maxSize];
}

View File

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: 953e0b740eb03144883db35f72cad8a6
timeCreated: 1498722774
licenseType: Store
licenseType: Pro
PluginImporter:
serializedVersion: 2
iconMap: {}

8
Assets/3rd/Scripts.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3e47fe566f99c4c4bb3667394434195a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,61 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Coolape;
public static class MyCamera
{
public static NativeCamera.Permission getImage(object callback, int maxSize = -1)
{
NativeCamera.Permission pm;
pm = NativeCamera.CheckPermission();
if (pm == NativeCamera.Permission.Granted)
{
NativeCamera.TakePicture((path) =>
{
Utl.doCallback(callback, path);
}, maxSize, true, NativeCamera.PreferredCamera.Default);
}
return pm;
}
public static NativeCamera.Permission getImageFacing(object callback, int maxSize = -1)
{
NativeCamera.Permission pm;
pm = NativeCamera.CheckPermission();
if (pm == NativeCamera.Permission.Granted)
{
NativeCamera.TakePicture((path) =>
{
Utl.doCallback(callback, path);
}, maxSize, true, NativeCamera.PreferredCamera.Front);
}
return pm;
}
public static NativeCamera.Permission getVideo(object callback)
{
NativeCamera.Permission pm;
pm = NativeCamera.CheckPermission();
if (pm == NativeCamera.Permission.Granted)
{
NativeCamera.RecordVideo((path) =>
{
Utl.doCallback(callback, path);
});
}
return pm;
}
public static bool openSetting()
{
if (NativeCamera.CanOpenSettings())
{
NativeCamera.OpenSettings();
return true;
}
return false;
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: ddbd1086fc9d14bf6814614e75efda21
guid: 27474c449f2934a59b021704591ab111
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@@ -0,0 +1,47 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Coolape;
public static class MyGallery
{
public static NativeGallery.Permission getImage(object callback)
{
NativeGallery.Permission pm;
pm = NativeGallery.CheckPermission();
if (pm == NativeGallery.Permission.Granted)
{
NativeGallery.GetImageFromGallery((path) =>
{
Utl.doCallback(callback, path);
});
}
return pm;
}
public static NativeGallery.Permission getMultImages(object callback)
{
NativeGallery.Permission pm;
pm = NativeGallery.CheckPermission();
if (pm == NativeGallery.Permission.Granted)
{
NativeGallery.GetImagesFromGallery((pathList) =>
{
Utl.doCallback(callback, pathList);
});
}
return pm;
}
public static bool openSetting()
{
if (NativeGallery.CanOpenSettings())
{
NativeGallery.OpenSettings();
return true;
}
return false;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 64663a08f69c441d19f0d7a50eae5465
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -498,6 +498,7 @@ public class UIInput : MonoBehaviour
protected virtual void OnSelect (bool isSelected)
{
if (!enabled) return; // add by chenbin
if (isSelected)
{
#if !MOBILE

View File

@@ -1,12 +1,21 @@
using UnityEngine;
using System.Collections;
using Coolape;
using System.Collections.Generic;
[RequireComponent (typeof(UIPopupList))]
public class CLUIElementPopList : UIEventListener
{
UIPopupList _poplist;
public List<EventDelegate> onSelect = new List<EventDelegate>();
protected void ExecuteOnChange()
{
if (EventDelegate.IsValid(onSelect))
{
EventDelegate.Execute(onSelect, gameObject); // modify by chenbin
}
}
public UIPopupList poplist {
get {
if (_poplist == null) {
@@ -31,5 +40,6 @@ public class CLUIElementPopList : UIEventListener
{
string val = orgs [1].ToString ();
poplist.value = val;
ExecuteOnChange();
}
}

View File

@@ -1 +1 @@
tBchannelMapr?generalp'FmBuildLocation@iosBuildDmProductNameD添添办公CisThirdExitJmBundleVersionCode
tBchannelMapr?generalp'FmBuildLocation@iosBuildDmProductNameD添添办公CisThirdExitJmBundleVersionCode

File diff suppressed because it is too large Load Diff

View File

@@ -138,7 +138,7 @@ trCRM/upgradeRes4Publish/priority/lua/bio/BioUtl.lua,f64afdd9ccdf943f5d4ba2fc3c3
trCRM/upgradeRes4Publish/priority/lua/cfg/DBCfg.lua,3d0e60dbcdaa61b8553eee17f4d68b32
trCRM/upgradeRes4Publish/priority/lua/cfg/DBCfgTool.lua,a6760e05dcc5f91202e3659179a464e7
trCRM/upgradeRes4Publish/priority/lua/city/CLLCity.lua,b7ee9fffacb28d09ab08728a49dedc8e
trCRM/upgradeRes4Publish/priority/lua/db/DBCust.lua,f5d617f7342053a0236bb93b9d1a1e46
trCRM/upgradeRes4Publish/priority/lua/db/DBCust.lua,731d340cf928509a7459dfea0d34f3a5
trCRM/upgradeRes4Publish/priority/lua/db/DBMessage.lua,a80d8448cfdaebb072b3d7ec5f40bb60
trCRM/upgradeRes4Publish/priority/lua/db/DBOrder.lua,076cfb6761ed5c0568690aa273d8ee37
trCRM/upgradeRes4Publish/priority/lua/db/DBRoot.lua,c89d42f4c6ebe72da436e07ee70f69ad
@@ -149,9 +149,9 @@ trCRM/upgradeRes4Publish/priority/lua/json/rpc.lua,28c2f09ceb729d01052d8408eed0b
trCRM/upgradeRes4Publish/priority/lua/json/rpcserver.lua,48b8f5e53a1141652c38f8a5a8a77928
trCRM/upgradeRes4Publish/priority/lua/net/CLLNet.lua,947abdf2c019f44a26211acf6f31e2dd
trCRM/upgradeRes4Publish/priority/lua/net/CLLNetSerialize.lua,30c24f11d46d7b887bf32177acb92c81
trCRM/upgradeRes4Publish/priority/lua/net/NetProto.lua,434601ac6cfd2ce441a0009f109f0757
trCRM/upgradeRes4Publish/priority/lua/net/NetProto.lua,45fa84a08829940b752de51f3e244d2e
trCRM/upgradeRes4Publish/priority/lua/net/NetProtoUsermgrClient.lua,f65df462666ca9fca7f16c2954984527
trCRM/upgradeRes4Publish/priority/lua/public/CLLInclude.lua,476b749169d54c4b08e8749743983d92
trCRM/upgradeRes4Publish/priority/lua/public/CLLInclude.lua,acd2930ce707586398f07b9586363436
trCRM/upgradeRes4Publish/priority/lua/public/CLLIncludeBase.lua,87bcfc58c6d99be6fe89102d7323c95e
trCRM/upgradeRes4Publish/priority/lua/public/CLLPool.lua,3e6a97eb07cfdff7c399eb3e956ba77c
trCRM/upgradeRes4Publish/priority/lua/public/CLLPrefs.lua,1719d57c97fe0d8f2c9d1596cb6e2ac8
@@ -163,7 +163,7 @@ trCRM/upgradeRes4Publish/priority/lua/toolkit/CLLPrintEx.lua,86d891ec4d8bfa55337
trCRM/upgradeRes4Publish/priority/lua/toolkit/CLLUpdateUpgrader.lua,bfff3548aa7cd983c3de46e5defae423
trCRM/upgradeRes4Publish/priority/lua/toolkit/CLLVerManager.lua,39b154e796d60c2c40ebcc427a5c05e8
trCRM/upgradeRes4Publish/priority/lua/toolkit/KKLogListener.lua,85784ec79aefde29be3ef308e7b5203b
trCRM/upgradeRes4Publish/priority/lua/toolkit/LuaUtl.lua,96b4f88eea21e061eff2e3f76fbb623b
trCRM/upgradeRes4Publish/priority/lua/toolkit/LuaUtl.lua,cde8ec272382f95abe0320714201b387
trCRM/upgradeRes4Publish/priority/lua/toolkit/MyUtl.lua,0fc6aaf236b8ee14c9660ddb68f63b1d
trCRM/upgradeRes4Publish/priority/lua/toolkit/curve-families.png,d0b6b9b8a623a188aeae2fb688a8a0e5
trCRM/upgradeRes4Publish/priority/lua/toolkit/curve.lua,f97735ed6c39accb55cdae44b62b5b38
@@ -184,8 +184,9 @@ trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustList.lua,121935e641c34f4
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustProc.lua,3f9f33de3630a03463952058ba795128
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustStar.lua,ed39330cf68d1e1e062bc8311d1e8d44
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellExtendField.lua,1b18f9bdb869156c26bc4f1131a2dd6c
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellExtendFieldRoot.lua,39703716cb222091e69ae0eefbf54f5f
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellExtendFieldRoot.lua,e2a1a87681380484a6e5ba27f2ca5c03
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellGuidPage.lua,7b3c3f567c3e0d92065913101b08ddd0
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellImage.lua,22bbf5d8704540ab66e713b768dd6ef2
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellMessageGroup.lua,14a960604f49e2b34e0c115561bb45a3
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellPopCheckbox.lua,25adbf58789186d43c15cfe65d2e8501
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellProductList.lua,b2827429c70df8b7aa8e87451a96bf67
@@ -204,19 +205,19 @@ trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPLoginCoolape.lua,5873be60edc8
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPPopList.lua,896c4b35a6cd0d4f86ed5c0ba532ea00
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPSceneManager.lua,b1b848791df37e59bdf7d5acf9cb9273
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPSplash.lua,8ce0b645f948233e6328b20a07a5999c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPStart.lua,4bf6daac6cc6e35679ca2bad64b0c18e
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPStart.lua,756c08832a0f69ec66e386da4fd35ca7
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPWWWProgress.lua,b713ddf9f0af8602ec48f71162181d6d
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPWebView.lua,093deec807e28be04df4d593bcff9e38
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPMain.lua,24f616b9384dc0eefa9955fabb1d05f1
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPMine.lua,8ef3b142a4375bdb311d15f962a3a9f2
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPMsg.lua,f72d285313cb63ff775722473af9a5f9
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPTasks.lua,1cd7b0d9c92e9fce1eb3b99195fea068
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPTasks.lua,ad3d36656af6d646814046ff9059ab72
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRBasePanel.lua,dc088058987b435c998a9709297a88e6
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPConfirm2.lua,bd0ea9f50708dedd598b517c1dfc739f
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPConnect.lua,e6c7e0aafd60eb1de8bf0ab7758bac11
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCusFilter.lua,f0452e3d6cfa59244dc7b9dd8f5a475d
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustDetail.lua,3fc6451c6f494803506287fc7a51e755
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustFilter.lua,0725109e55276b5158f6ce642d28dfa6
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustFilter.lua,450e7e75ebfe83bb65d59beb3ce60782
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustList.lua,473a578d9811d494d8cf58c7fc6a45b9
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustListProc.lua,1973dc8d949ed85e01b09aff328d1033
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPEditPrice.lua,ceb906ae12222324b9a61f4b83ec7e58
@@ -225,8 +226,8 @@ trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPLogin.lua,e18549cd43b8e476b5c2
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPModifyFiled.lua,99b250c386ce8dad9c10c8f4fe9874f1
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPMoreProc4Cust.lua,cc11fe3b2530891e91e2c649762d06f8
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewCust.lua,48fffb94cf7ab94e6c0b2e542bf2d08e
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewFollow.lua,ef981e78f783343271b8c655f358084c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewOrder.lua,cc63f363eb32dda89ab4e4b4956c0014
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewFollow.lua,336ea3b9be70d8d1fff12f59c101193a
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewOrder.lua,fd9e0f654d9fc598d78f14299505fe7d
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPPlaySoundRecord.lua,ded1f35f04bd0d84bfa8fd74ddf926aa
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPPopCheckBoxs.lua,508171a924c113573b01a396e8217cc2
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPResetPasswordStep1.lua,def4741f89df3925682e53df01bb70cc
@@ -240,11 +241,11 @@ trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPSysMsgList.lua,518461e7bf8f3b3
trCRM/upgradeRes4Publish/priority/ui/other/Android/AlertRoot.unity3d,c30044a6e7bf14ddb7a87c4f51d1f073
trCRM/upgradeRes4Publish/priority/ui/other/Android/Frame1.unity3d,622d3ea7e4f9aa1d11f6492cabffa445
trCRM/upgradeRes4Publish/priority/ui/other/Android/Frame2.unity3d,d057ea60bdf5dd821705a9f7e67e5171
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputCheckboxs.unity3d,eecf93435d855908ef5d364f5dcbaffd
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputDate.unity3d,126902c484a19b9f09e7bae17655611a
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputMultText.unity3d,cd2ced3b17c33b4750ddcade27f6b98f
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputPoplist.unity3d,7af548695c754297fbf27cfedeb54a14
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputText.unity3d,d27c231bd910b5d72c90a86efda2a660
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputCheckboxs.unity3d,a929e8a7fd7ba3bc89bdda0686b6d7dd
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputDate.unity3d,2a350eede0835511478be0acab26101c
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputMultText.unity3d,e07d80bb7138625773b65173d2d9680e
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputPoplist.unity3d,e40080e427014e2c3897f4a85414b1a8
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputText.unity3d,c013e2e5d6cf85b427db0330d5765b87
trCRM/upgradeRes4Publish/priority/ui/other/Android/reportform1.unity3d,5d061e9c5511ae3b978dbfe2be87f35e
trCRM/upgradeRes4Publish/priority/ui/other/Android/reportform2.unity3d,de5097255fc8126d368e9693106347dc
trCRM/upgradeRes4Publish/priority/ui/other/Android/reportform3.unity3d,f0a5622c709a4d4ec6ac76c0c1e8abb5
@@ -260,7 +261,7 @@ trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustListProc.unity3d,b2d
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelEditPrice.unity3d,baa0e7f3e00e62b0d5cb5263d7583000
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelGuid.unity3d,d58c2f53bba85cb8e969e744ff706f3a
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelHotWheel.unity3d,7a3ae06303e65f59f15af5b906b7a471
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelLogin.unity3d,01e2d641bf61652b730108d269a56d6b
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelLogin.unity3d,5cac11a5557933d49c37a554c76a730f
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelLoginCoolape.unity3d,efb09b206c444d66d10720371645049b
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMain.unity3d,a56567b78909e1992695a97cb19d3e1c
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMask4Panel.unity3d,ed5e0d7cc2ba83e33435bddc760b5f9d
@@ -270,7 +271,7 @@ trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMoreProc4Cust.unity3d,0a
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMsg.unity3d,e0d5c4eb46bc7c1734c79206bd0962e0
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewCust.unity3d,e1b7e9cecfa7c0104e475a8d84cc28db
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewFollow.unity3d,3ee9577410d709f08bf37e7c9a2b19a1
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewOrder.unity3d,c4a2f36dec38a689f49f356f05a62d88
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewOrder.unity3d,a36eb5726ffa300ee44ffe16b48312dd
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPlaySoundRecord.unity3d,14e1a1da65735a1ac9a4256be49a4e40
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPopCheckBoxs.unity3d,ac475eab72569cc86cc098951c114716
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPopList.unity3d,a0ba753b0deecff9a85c8cd2b60013dd
@@ -285,8 +286,8 @@ trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSplash.unity3d,2691ddc66
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelStart.unity3d,50cfab21f360ee339c94b1111be09fef
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSysMsgDetail.unity3d,91e06baebc3ec7e9b2a5c108ced50b52
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSysMsgList.unity3d,b48b08a37217bb43ef7a94566f79fec0
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelTasks.unity3d,82aaf6542a4ad8546a55f66997d61f66
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelTasks.unity3d,003d70126d4efbaf73eb9bc83e4ba142
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelWWWProgress.unity3d,d9cbe9d08670eedbee77ba97330f4118
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelWebView.unity3d,e5372cdacc520ff8ba318ce09b681772
trCRM/upgradeRes4Publish/priority/ui/panel/Android/ToastRoot.unity3d,28e85a4963ed89f85f2451670a154f04
trCRM/upgradeRes4Publish/priority/ui/panel/Android/ToastRoot.unity3d,412c3557a187689acaa1d79d7d555836
trCRM/upgradeRes4Publish/priority/www/baidumap.html,d210e48796dd96343f9c17bc1d230136

View File

@@ -1,295 +1,312 @@
trCRM/upgradeRes/other/uiAtlas/logo/Android/logo.unity3d,849e7b3d08491890c6e021896c8ec39c
trCRM/upgradeRes/priority/lua/json/rpcserver.lua,48b8f5e53a1141652c38f8a5a8a77928
trCRM/upgradeRes/priority/lua/public/CLLPool.lua,3e6a97eb07cfdff7c399eb3e956ba77c
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_check.unity3d,19ab7fd3e0e61658db44cb333c6fad0e
trCRM/upgradeRes/priority/lua/public/CLLQueue.lua,065303c980678b25b11854bfec1690f3
trCRM/upgradeRes/other/uiAtlas/coolape/Android/button.unity3d,efe93bdf676ef2d5195d52abe42ab833
trCRM/upgradeRes/priority/lua/ui/cell/CLLFrame2.lua,e25ce84ca55cd643d527d09cedd6228a
trCRM/upgradeRes/other/uiAtlas/cust/Android/order.unity3d,0b796b27d351f49010fb3c3921f1a843
trCRM/upgradeRes/priority/lua/ui/cell/TRCellMessageGroup.lua,14a960604f49e2b34e0c115561bb45a3
trCRM/upgradeRes/other/uiAtlas/public/Android/_empty.unity3d,69ddb5d00f576f414974eaff196cb6cc
trCRM/upgradeRes/other/uiAtlas/cust/Android/add.unity3d,ceb10233c0fc59270d66e1cb5c93bb49
trCRM/upgradeRes/priority/ui/panel/Android/PanelSetting.unity3d,e28ed051439e06abe8ffc14ebf9cf1d2
trCRM/upgradeRes/priority/lua/db/DBCust.lua,f5d617f7342053a0236bb93b9d1a1e46
trCRM/upgradeRes/other/uiAtlas/public/Android/radio_full.unity3d,299e73e63c854e9d88dc63f1c19a45f9
trCRM/upgradeRes/other/uiAtlas/cust/Android/cus_tel.unity3d,692b010c775fb99d05d342f5ad0272fa
trCRM/upgradeRes/priority/lua/ui/panel/CLLPSceneManager.lua,b1b848791df37e59bdf7d5acf9cb9273
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_wait.unity3d,4171ead446231d4429305811f6e91fbc
trCRM/upgradeRes/other/uiAtlas/cust/Android/input.unity3d,44e1403bbf15c7313dff8cad78d39287
trCRM/upgradeRes/priority/ui/panel/Android/PanelWWWProgress.unity3d,d9cbe9d08670eedbee77ba97330f4118
trCRM/upgradeRes/priority/lua/ui/panel/CLLPStart.lua,4bf6daac6cc6e35679ca2bad64b0c18e
trCRM/upgradeRes/other/uiAtlas/cust/Android/get.unity3d,04bf77dfe50c327c85966f9fdd1350c6
trCRM/upgradeRes/priority/ui/other/Android/InputMultText.unity3d,cd2ced3b17c33b4750ddcade27f6b98f
trCRM/upgradeRes/priority/lua/ui/panel/TRPGuid.lua,ee29c8c2537cd4c445afe1397450cdae
trCRM/upgradeRes/priority/lua/toolkit/CLLVerManager.lua,39b154e796d60c2c40ebcc427a5c05e8
trCRM/upgradeRes/priority/lua/CLLMainLua.lua,c0cae0cd02eba21111cf005f6c608901
trCRM/upgradeRes/priority/ui/panel/Android/PanelMsg.unity3d,e0d5c4eb46bc7c1734c79206bd0962e0
trCRM/upgradeRes/other/uiAtlas/cust/Android/play.unity3d,ae412dff53c914bcfcd0ca92255bb33e
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_order.unity3d,26bc3076031940af6069ef5a9143fb5a
trCRM/upgradeRes/priority/lua/ui/panel/TRBasePanel.lua,dc088058987b435c998a9709297a88e6
trCRM/upgradeRes/other/uiAtlas/cust/Android/right.unity3d,b991891eb2939a880c223d677605faf4
trCRM/upgradeRes/priority/lua/ui/panel/CLLPWebView.lua,093deec807e28be04df4d593bcff9e38
trCRM/upgradeRes/priority/lua/ui/cell/TRCellReportform3.lua,f83300f176e1c35d62e00e69539998f3
trCRM/upgradeRes/priority/lua/ui/panel/TRPSelectCompany.lua,28ca57d169af022ec621dece879bdcfc
trCRM/upgradeRes/other/uiAtlas/work/Android/work_bg_noshadow.unity3d,4aee082b48104519ba82bad6aac83cf3
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_4.unity3d,67187ab01b7b863b2a7f37b430212a3d
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_password2.unity3d,5dc8eaeca2eeedb771451233e5d8bf98
trCRM/upgradeRes/priority/ui/panel/Android/PanelWebView.unity3d,e5372cdacc520ff8ba318ce09b681772
trCRM/upgradeRes/priority/lua/cfg/DBCfgTool.lua,a6760e05dcc5f91202e3659179a464e7
trCRM/upgradeRes/other/uiAtlas/order/Android/system.unity3d,570fa72b2d385d604cc7c9f7516965da
trCRM/upgradeRes/other/uiAtlas/cust/Android/suc.unity3d,0ec570e88b0dfc2b82a4f8e5bb84edc0
trCRM/upgradeRes/priority/ui/panel/Android/PanelPlaySoundRecord.unity3d,14e1a1da65735a1ac9a4256be49a4e40
trCRM/upgradeRes/priority/lua/ui/cell/TRCellRecord.lua,ca94ed9775ca9f03569e49d4ad1f3e14
trCRM/upgradeRes/priority/lua/db/DBRoot.lua,c89d42f4c6ebe72da436e07ee70f69ad
trCRM/upgradeRes/priority/ui/panel/Android/PanelMoreProc4Cust.unity3d,0a1669987fdd4ce81f5b7cba8ce77876
trCRM/upgradeRes/other/uiAtlas/cust/Android/pause.unity3d,f67cbbc84b61bc281f486e4e18fb177f
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_set.unity3d,c53cddeef8f62d67a2a4110447466536
trCRM/upgradeRes/priority/lua/json/json.lua,a2914572290611d3da35f4a7eec92022
trCRM/upgradeRes/other/uiAtlas/cust/Android/full_star.unity3d,6f6aa242a0a793b6eea6edc8c8de437d
trCRM/upgradeRes/other/uiAtlas/hotwheel/Android/loading.unity3d,2f74f17f1282c12ab63108377b4798e0
trCRM/upgradeRes/priority/lua/ui/panel/CLLPBackplate.lua,ae946f1cec5baad680f4e8a0f7e71223
trCRM/upgradeRes/other/uiAtlas/cust/Android/check.unity3d,aa21836aaae62d8f719a930aefe37ea7
trCRM/upgradeRes/priority/lua/ui/panel/TRPSelectProduct.lua,59750609585193c66d08adfa8544d946
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCompany.lua,b145bc086a8b1657a314622614dcb70a
trCRM/upgradeRes/priority/lua/toolkit/CLLPrintEx.lua,86d891ec4d8bfa5533704c142fc97235
trCRM/upgradeRes/priority/lua/ui/panel/CLLPConfirm.lua,e652190d378dc120a0805230692f0fc9
trCRM/upgradeRes/priority/ui/panel/Android/PanelMine.unity3d,1ec2853e1a8660c4cadcace8f333f5af
trCRM/upgradeRes/other/uiAtlas/work/Android/work_color.unity3d,043e8a3cdee29da6e5c909432f25d6f8
trCRM/upgradeRes/other/uiAtlas/order/Android/close.unity3d,1b49cc4db64de50d13ee029447a3d49d
trCRM/upgradeRes/priority/ui/panel/Android/PanelCalender.unity3d,acf45d3619beb2deb72cce95732c68c4
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_me.unity3d,b6060c4f6b1cf669b21b5d4f8b23efbe
trCRM/upgradeRes/other/uiAtlas/public/Android/radio.unity3d,4f2c80de666b97ea02084f059d2a5ed0
trCRM/upgradeRes/priority/lua/bio/BioType.lua,4667e9def8191cbf2b9dc25e928bc23f
trCRM/upgradeRes/other/uiAtlas/hotwheel/Android/hotWheel_prog.unity3d,0c507387d1167154fe67f1719c3531bd
trCRM/upgradeRes/other/uiAtlas/cust/Android/task.unity3d,737ce6fdd55d7642f690531d9410ff6a
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_news.unity3d,3a1afa79dbc710c3ddd6f65cf62f4a19
trCRM/upgradeRes/priority/lua/public/CLLIncludeBase.lua,87bcfc58c6d99be6fe89102d7323c95e
trCRM/upgradeRes/priority/ui/panel/Android/PanelResetPasswordStep1.unity3d,150f48b7b68e00e8b3e513ec2b75333a
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustStar.lua,ed39330cf68d1e1e062bc8311d1e8d44
trCRM/upgradeRes/priority/lua/ui/cell/TRCellExtendFieldRoot.lua,39703716cb222091e69ae0eefbf54f5f
trCRM/upgradeRes/other/uiAtlas/hotwheel/Android/hotWheel_bg.unity3d,b5d2bc7180f9d280014726814ec8b9fe
trCRM/upgradeRes/priority/lua/ui/panel/CSPMine.lua,8ef3b142a4375bdb311d15f962a3a9f2
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_5.unity3d,7edfb781be444c18d010e53386334015
trCRM/upgradeRes/priority/ui/panel/Android/PanelSysMsgDetail.unity3d,91e06baebc3ec7e9b2a5c108ced50b52
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_me2.unity3d,6efa661cb74e62dfdc75bdbeaeeceb39
trCRM/upgradeRes/priority/ui/panel/Android/PanelResetPasswordStep3.unity3d,2f18b6d6198b1678ba10a72dcdd1fbaa
trCRM/upgradeRes/priority/lua/ui/panel/TRPSysMsgDetail.lua,6266494c653deda1b5a391cc7f38a06a
trCRM/upgradeRes/other/uiAtlas/news/Android/news_3.unity3d,5f130cc66d813a2b339757e8a31cee8c
trCRM/upgradeRes/priority/lua/ui/panel/CLLPPopList.lua,896c4b35a6cd0d4f86ed5c0ba532ea00
trCRM/upgradeRes/priority/lua/ui/cell/TRCellPopCheckbox.lua,25adbf58789186d43c15cfe65d2e8501
trCRM/upgradeRes/other/uiAtlas/cust/Android/border.unity3d,bf2cd1f2bdb27efc9c2e27943dcb8974
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_about.unity3d,3da9c9416127c69bc20c281f44520f6e
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_peo.unity3d,9c9562e576e93bacb7f2a0d0f08523ee
trCRM/upgradeRes/priority/lua/toolkit/MyUtl.lua,0fc6aaf236b8ee14c9660ddb68f63b1d
trCRM/upgradeRes/other/uiAtlas/coolape/Android/input.unity3d,b3ad3f57c51c02ff798a50a37d6c9cab
trCRM/upgradeRes/other/uiAtlas/public/Android/choose.unity3d,e31379a28ab86046414db1fb23cd2bf6
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_time.unity3d,16ca1ec9a44b8633ca032c3c8cdf1a9b
trCRM/upgradeRes/priority/lua/toolkit/CLLUpdateUpgrader.lua,bfff3548aa7cd983c3de46e5defae423
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustFilter.lua,2fb22f9248e4af86ab42482151a5b141
trCRM/upgradeRes/priority/ui/other/Android/reportform2.unity3d,de5097255fc8126d368e9693106347dc
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewCust.lua,48fffb94cf7ab94e6c0b2e542bf2d08e
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewFollow.unity3d,3ee9577410d709f08bf37e7c9a2b19a1
trCRM/upgradeRes/other/uiAtlas/cust/Android/record.unity3d,afd45ba065ba86f138b8c92b9794c722
trCRM/upgradeRes/priority/lua/ui/panel/TRPConnect.lua,e6c7e0aafd60eb1de8bf0ab7758bac11
trCRM/upgradeRes/priority/ui/other/Android/Frame1.unity3d,622d3ea7e4f9aa1d11f6492cabffa445
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_fingerprint.unity3d,de777211a380a09ea82e1092a9fba414
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustProc.lua,3f9f33de3630a03463952058ba795128
trCRM/upgradeRes/priority/lua/ui/cell/CSCellBottomBtn.lua,afbf445995d42e012635f3d355ce6d9e
trCRM/upgradeRes/other/uiAtlas/news/Android/news_4.unity3d,8c7beff66dc0cfe9f44082bdacc8007c
trCRM/upgradeRes/priority/lua/ui/cell/TRCellSysMessageList.lua,1ce46f4b3a1a8b728e447c12e7df1831
trCRM/upgradeRes/other/uiAtlas/login/Android/log_invisible.unity3d,e1a5814af01e17e83e9939c9f1839524
trCRM/upgradeRes/other/uiAtlas/cust/Android/del.unity3d,453d38d3af66e108db0d2bb827426bd7
trCRM/upgradeRes/other/uiAtlas/cust/Android/funnel.unity3d,cb6f2a2b14c53ed86c122a4da2c3984b
trCRM/upgradeRes/other/uiAtlas/login/Android/log_people.unity3d,7ff36c94c74e4a8e09e1896978c13381
trCRM/upgradeRes/other/uiAtlas/cust/Android/remove.unity3d,b460d3a275be876e0cfa0ca96777260f
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustDetail.lua,3fc6451c6f494803506287fc7a51e755
trCRM/upgradeRes/priority/lua/bio/BioOutputStream.lua,84fd65eb0d1a166e77447f61254d62b5
trCRM/upgradeRes/other/uiAtlas/cust/Android/play2.unity3d,0b6ede536ea7b5084a1de22265b04840
trCRM/upgradeRes/priority/lua/ui/panel/TRPResetPasswordStep2.lua,af8af3fde5f3526b36c48517a5da89d0
trCRM/upgradeRes/other/uiAtlas/work/Android/work_bg_shadow.unity3d,10087f2ab389bdfd71cfce8a6c466038
trCRM/upgradeRes/priority/ui/panel/Android/PanelSplash.unity3d,2691ddc66dff5da22fda3ffe11c897dd
trCRM/upgradeRes/priority/ui/other/Android/InputCheckboxs.unity3d,eecf93435d855908ef5d364f5dcbaffd
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustList.lua,121935e641c34f4e3f9293381d7ff359
trCRM/upgradeRes/priority/ui/panel/Android/PanelLogin.unity3d,5cac11a5557933d49c37a554c76a730f
trCRM/upgradeRes/other/uiAtlas/cust/Android/msg.unity3d,7f98a936769044c856c6082beb3559e3
trCRM/upgradeRes/priority/ui/panel/Android/PanelBackplate.unity3d,861c2420c86f0da27dd58a6f73dfb942
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_notice.unity3d,8ccab8900911e68fc8e0b46f6c1e0372
trCRM/upgradeRes/priority/ui/panel/Android/PanelMask4Panel.unity3d,ed5e0d7cc2ba83e33435bddc760b5f9d
trCRM/upgradeRes/other/uiAtlas/public/Android/check.unity3d,d11f6d5b126c6a0fbf34ced5734cb66f
trCRM/upgradeRes/priority/ui/panel/Android/ToastRoot.unity3d,28e85a4963ed89f85f2451670a154f04
trCRM/upgradeRes/other/uiAtlas/work/Android/work_ranking.unity3d,9a0b0f94d60e9ff144193c83915b21fa
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_work.unity3d,8a889dc1fe3b56bff4435f441ce5580e
trCRM/upgradeRes/priority/lua/ui/panel/CSPMain.lua,24f616b9384dc0eefa9955fabb1d05f1
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustListProc.unity3d,b2dd2f01b5ffbfc4db73c670c2eb4646
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_2.unity3d,3bcd13c7b2003a1bcf92aaa4d2dbf6fe
trCRM/upgradeRes/priority/lua/net/NetProtoUsermgrClient.lua,f65df462666ca9fca7f16c2954984527
trCRM/upgradeRes/other/uiAtlas/cust/Android/search.unity3d,7420a0a7cc725ff494761009ebe811d7
trCRM/upgradeRes/priority/lua/db/DBUser.lua,f5151070816fc7da19ae939c9533bbf9
trCRM/upgradeRes/other/uiAtlas/work/Android/work_head_bg.unity3d,20f535a454df3fff37230bbcc3bc8244
trCRM/upgradeRes/other/uiAtlas/icon/Android/company_1.unity3d,8ba9f20b736fb17e2f6ee414df072492
trCRM/upgradeRes/priority/lua/db/DBOrder.lua,076cfb6761ed5c0568690aa273d8ee37
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_3.unity3d,651d81480c5ea1ff8aa4ccdf7e0a6058
trCRM/upgradeRes/priority/ui/panel/Android/PanelPopCheckBoxs.unity3d,ac475eab72569cc86cc098951c114716
trCRM/upgradeRes/priority/lua/ui/cell/TRCellGuidPage.lua,7b3c3f567c3e0d92065913101b08ddd0
trCRM/upgradeRes/priority/ui/panel/Android/PanelHotWheel.unity3d,7a3ae06303e65f59f15af5b906b7a471
trCRM/upgradeRes/priority/ui/panel/Android/PanelServers.unity3d,1613390ef03ce766ec3680f99949122b
trCRM/upgradeRes/priority/lua/ui/cell/TRCellReportform2.lua,47ac1164b1ffb27397953ccb032fd2d7
trCRM/upgradeRes/other/uiAtlas/public/Android/company_bg.unity3d,2153c725242937cf5fce727da9626dad
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_unread.unity3d,f1b29d8592cdd49f3a526be6b524ad9f
trCRM/upgradeRes/priority/lua/ui/cell/TRCellReportform1.lua,d31b42aa50089defb22bde59b5c0474d
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewOrder.lua,cc63f363eb32dda89ab4e4b4956c0014
trCRM/upgradeRes/priority/ui/panel/Android/PanelModifyFiled.unity3d,331f7d063411e0c231eaeccee4df73d1
trCRM/upgradeRes/other/uiAtlas/news/Android/news_1.unity3d,51120d82352e936df826b05696b89b19
trCRM/upgradeRes/priority/ui/other/Android/Frame2.unity3d,d057ea60bdf5dd821705a9f7e67e5171
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_enterprise.unity3d,59d7dae785dea4fa88b52f40a8d167cf
trCRM/upgradeRes/priority/lua/ui/panel/TRPResetPasswordStep1.lua,def4741f89df3925682e53df01bb70cc
trCRM/upgradeRes/other/uiAtlas/cust/Android/cus_task.unity3d,a4f148630912414f1d5e94d5a6a02e2d
trCRM/upgradeRes/priority/ui/panel/Android/PanelConfirm.unity3d,4526242a599f63c0bac766360a515e23
trCRM/upgradeRes/priority/lua/ui/panel/TRPPopCheckBoxs.lua,508171a924c113573b01a396e8217cc2
trCRM/upgradeRes/priority/ui/panel/Android/PanelResetPasswordStep2.unity3d,c3e2e353bd7e604e384a3e9e35d37893
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_data.unity3d,70dd24370cd051acb45bab65464459ee
trCRM/upgradeRes/priority/lua/ui/panel/TRPSetting.lua,45f706ba538ab2b39364826b8fc7e214
trCRM/upgradeRes/other/uiAtlas/cust/Android/follow.unity3d,fffb80792073e4f2849c743d061d685a
trCRM/upgradeRes/priority/lua/ui/panel/TRPConfirm2.lua,bd0ea9f50708dedd598b517c1dfc739f
trCRM/upgradeRes/priority/lua/ui/panel/CSPMsg.lua,f72d285313cb63ff775722473af9a5f9
trCRM/upgradeRes/priority/ui/other/Android/InputToggles.unity3d,847a6d2cbf79b767094155404ef708b1
trCRM/upgradeRes/other/uiAtlas/public/Android/check_full.unity3d,282038ef4b24e802b0c936877871200c
trCRM/upgradeRes/priority/lua/ui/cell/CLLCellServer.lua,1e9de9f0b4bbc703296808c1ba179c29
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_check.unity3d,d9092d78af855e769abff1223f650a9d
trCRM/upgradeRes/other/uiAtlas/work/Android/icon_bg.unity3d,60926842e889a8a621443f4f646aa9e2
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustList.lua,473a578d9811d494d8cf58c7fc6a45b9
trCRM/upgradeRes/other/uiAtlas/login/Android/log_bg.unity3d,a7398f0f48b3b469e31bea6dac45457e
trCRM/upgradeRes/priority/lua/ui/cell/CLLUICalenderDay.lua,6e7400e2dd535ced93960c1e18fa2458
trCRM/upgradeRes/other/uiAtlas/news/Android/news_bg.unity3d,b13e253b3a1689bf665ea7c3edecc519
trCRM/upgradeRes/priority/lua/ui/cell/TRCellExtendField.lua,1b18f9bdb869156c26bc4f1131a2dd6c
trCRM/upgradeRes/other/uiAtlas/work/Android/work_bg.unity3d,3b42ecd8d30203eb5dcc65cb3a0ad815
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustFilter.unity3d,90d589021f3db8641b14920daf93f1dc
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_4.unity3d,d1cf8069716943cc112a2946b22efddd
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_2.unity3d,3ce2779b6bfbaef177e0446661ec2f82
trCRM/upgradeRes/priority/ui/other/Android/InputDate.unity3d,126902c484a19b9f09e7bae17655611a
trCRM/upgradeRes/priority/lua/ui/panel/TRPPlaySoundRecord.lua,ded1f35f04bd0d84bfa8fd74ddf926aa
trCRM/upgradeRes/priority/ui/panel/Android/PanelPopList.unity3d,a0ba753b0deecff9a85c8cd2b60013dd
trCRM/upgradeRes/priority/lua/public/CLLPrefs.lua,1719d57c97fe0d8f2c9d1596cb6e2ac8
trCRM/upgradeRes/priority/lua/ui/cell/TRCellProductSelected.lua,e7f4b1e06a54d5fa52cf9a4ed00f5233
trCRM/upgradeRes/priority/ui/panel/Android/PanelSysMsgList.unity3d,b48b08a37217bb43ef7a94566f79fec0
trCRM/upgradeRes/other/uiAtlas/guid/Android/2.unity3d,6b83b2d5a2dfc1f08744077e669c3ed0
trCRM/upgradeRes/priority/lua/net/CLLNetSerialize.lua,30c24f11d46d7b887bf32177acb92c81
trCRM/upgradeRes/other/uiAtlas/cust/Android/screen.unity3d,b488e337b72f2cd07dadd1e08640243d
trCRM/upgradeRes/priority/lua/db/DBStatistics.lua,e64ad532dabb2cb70c4053e223770969
trCRM/upgradeRes/priority/lua/toolkit/BitUtl.lua,82e46240625342d5afe8ea68a609c9cb
trCRM/upgradeRes/priority/ui/other/Android/InputToggle.unity3d,4b8616c8acc8691a4b8510fdc103ec75
trCRM/upgradeRes/priority/ui/panel/Android/PanelConnect.unity3d,f80a29df002dc606e21fd69fbea40021
trCRM/upgradeRes/priority/ui/panel/Android/PanelMain.unity3d,a56567b78909e1992695a97cb19d3e1c
trCRM/upgradeRes/priority/lua/ui/panel/TRPModifyFiled.lua,99b250c386ce8dad9c10c8f4fe9874f1
trCRM/upgradeRes/priority/lua/public/class.lua,cc0f201cc55c59f8bc8f623853382b9c
trCRM/upgradeRes/priority/lua/ui/cell/TRCellProductList.lua,b2827429c70df8b7aa8e87451a96bf67
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewOrder.unity3d,c4a2f36dec38a689f49f356f05a62d88
trCRM/upgradeRes/other/uiAtlas/login/Android/log_visible.unity3d,884f69f0dd0c2a58af5ad891f23e985e
trCRM/upgradeRes/other/uiAtlas/coolape/Android/name.unity3d,f5b44185a57a97ce6971f20a4054d990
trCRM/upgradeRes/other/uiAtlas/order/Android/shut.unity3d,7a13d4859459f052143028b0656aef43
trCRM/upgradeRes/priority/ui/other/Android/InputPoplist.unity3d,7af548695c754297fbf27cfedeb54a14
trCRM/upgradeRes/other/uiAtlas/logo/Android/logo2.unity3d,1bddae3d3fe67d91fc6b5c6f9dbb0bea
trCRM/upgradeRes/priority/lua/cfg/DBCfg.lua,3d0e60dbcdaa61b8553eee17f4d68b32
trCRM/upgradeRes/other/uiAtlas/cust/Android/limt.unity3d,d48f498211748b192a7b10a932aec8be
trCRM/upgradeRes/other/uiAtlas/cust/Android/write.unity3d,cbf2cca163ccc6839cf9154547edd6f8
trCRM/upgradeRes/other/uiAtlas/cust/Android/important.unity3d,17f0d1ab4133e3a6542404d8e5fb0b7d
trCRM/upgradeRes/other/uiAtlas/guid/Android/3.unity3d,6fafc74e9a154b5b3c19accabd3e11b0
trCRM/upgradeRes/priority/lua/ui/panel/TRPCusFilter.lua,f0452e3d6cfa59244dc7b9dd8f5a475d
trCRM/upgradeRes/priority/lua/ui/cell/CLToastRoot.lua,5809bbdd4b059a64e8129c55b146b514
trCRM/upgradeRes/priority/ui/other/Android/reportform3.unity3d,f0a5622c709a4d4ec6ac76c0c1e8abb5
trCRM/upgradeRes/priority/lua/ui/panel/CLLPLoginCoolape.lua,5873be60edc8f1407dc9fb53ec567ebf
trCRM/upgradeRes/priority/lua/ui/panel/TRPEditPrice.lua,ceb906ae12222324b9a61f4b83ec7e58
trCRM/upgradeRes/other/uiAtlas/login/Android/log_password.unity3d,6a41f099b79cda5941cf720c1452b5a5
trCRM/upgradeRes/other/uiAtlas/order/Android/add.unity3d,bf6728a3e41783ee7d63c130107a16e1
trCRM/upgradeRes/priority/lua/ui/panel/TRPSysMsgList.lua,518461e7bf8f3b3420fa9377a23db86a
trCRM/upgradeRes/other/uiAtlas/order/Android/upload.unity3d,a7cb722ecba5f405105f0cfda4695e74
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_news2.unity3d,a35e85b68569bf1adc16bdee3a609fdd
trCRM/upgradeRes/priority/ui/panel/Android/PanelSelectProduct.unity3d,d54579853bc1e958ced6fa6e3d928d2b
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustFilter.lua,0725109e55276b5158f6ce642d28dfa6
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustFilterGroup.lua,93cdb67f51a62110b38e133b065f8f85
trCRM/upgradeRes/priority/lua/ui/panel/CLLPWWWProgress.lua,b713ddf9f0af8602ec48f71162181d6d
trCRM/upgradeRes/priority/ui/panel/Android/PanelEditPrice.unity3d,baa0e7f3e00e62b0d5cb5263d7583000
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_work2.unity3d,eca0bd19a59ce72be19d7cdcbf9c5dac
trCRM/upgradeRes/priority/ui/panel/Android/PanelTasks.unity3d,003d70126d4efbaf73eb9bc83e4ba142
trCRM/upgradeRes/other/uiAtlas/cust/Android/phone.unity3d,36e34519b910a11de3531994f607a140
trCRM/upgradeRes/priority/ui/panel/Android/PanelConfirm2.unity3d,d199779b559cef259ebbfe686ba42703
trCRM/upgradeRes/other/uiAtlas/cust/Android/peo.unity3d,939edcb747217aa4b0deb1d9a34f16b8
trCRM/upgradeRes/priority/ui/other/Android/AlertRoot.unity3d,c30044a6e7bf14ddb7a87c4f51d1f073
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustList.unity3d,95f9affe3cc17545ceca81ac7124c322
trCRM/upgradeRes/other/uiAtlas/cust/Android/more.unity3d,f05eafb34336f1fcb5d614ad30217011
trCRM/upgradeRes/priority/lua/db/DBMessage.lua,a80d8448cfdaebb072b3d7ec5f40bb60
trCRM/upgradeRes/other/uiAtlas/public/Android/on_off_bg.unity3d,96fcd3ce2ee9ffa2941973cefea6511d
trCRM/upgradeRes/priority/lua/ui/panel/CLLPSplash.lua,8ce0b645f948233e6328b20a07a5999c
trCRM/upgradeRes/other/uiAtlas/order/Android/ipt_bg.unity3d,89541a2aaed40069c1f0ce363c5a8e2a
trCRM/upgradeRes/other/uiAtlas/guid/Android/1.unity3d,7654268e7c4bc7cea47f584d306f503d
trCRM/upgradeRes/priority/lua/toolkit/KKLogListener.lua,85784ec79aefde29be3ef308e7b5203b
trCRM/upgradeRes/priority/lua/bio/BioUtl.lua,f64afdd9ccdf943f5d4ba2fc3c3241ef
trCRM/upgradeRes/priority/lua/ui/cell/CLLUICellPoplist.lua,18d47301d459fd66ed63b902546e8619
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_1.unity3d,aca2dfb1fbece45c7333447195bc7efe
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewFollow.lua,ef981e78f783343271b8c655f358084c
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_password.unity3d,04bebaa914245dd4d2376f9ded0ad15f
trCRM/upgradeRes/priority/lua/ui/panel/CLLPLogin.lua,f2ba83d01af3371bee83945f470facd5
trCRM/upgradeRes/priority/lua/net/CLLNet.lua,947abdf2c019f44a26211acf6f31e2dd
trCRM/upgradeRes/priority/lua/ui/panel/CLLPHotWheel.lua,1760aa9933da4b421f1c6093d802cb4f
trCRM/upgradeRes/priority/ui/panel/Android/PanelLoginCoolape.unity3d,efb09b206c444d66d10720371645049b
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_1.unity3d,41ae133fd4da0f2bf01316f91cf67fb8
trCRM/upgradeRes/priority/ui/panel/Android/PanelStart.unity3d,50cfab21f360ee339c94b1111be09fef
trCRM/upgradeRes/other/uiAtlas/mine/Android/log_bg.unity3d,fd1470749300ec31bcbe7f59686152d7
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_remind.unity3d,99a50a17b34f464693ac84d1c6f38966
trCRM/upgradeRes/priority/www/baidumap.html,d210e48796dd96343f9c17bc1d230136
trCRM/upgradeRes/priority/ui/panel/Android/PanelSelectCompany.unity3d,2aa019a477ea5b160780ded080dc82ec
trCRM/upgradeRes/priority/lua/toolkit/LuaUtl.lua,96b4f88eea21e061eff2e3f76fbb623b
trCRM/upgradeRes/priority/lua/city/CLLCity.lua,b7ee9fffacb28d09ab08728a49dedc8e
trCRM/upgradeRes/other/uiAtlas/news/Android/news_bg_num2.unity3d,bfdbfc9e1fd1f91de555c0801d278d25
trCRM/upgradeRes/priority/lua/ui/cell/CLLCellWWWProgress.lua,ec0258e77f76c8b681d0f02e7a5ff342
trCRM/upgradeRes/priority/lua/ui/panel/CLLPCalender.lua,232cf2b7f74f088e8b44c4c47cda5e95
trCRM/upgradeRes/priority/ui/other/Android/InputText.unity3d,d27c231bd910b5d72c90a86efda2a660
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustListProc.lua,1973dc8d949ed85e01b09aff328d1033
trCRM/upgradeRes/other/uiAtlas/icon/Android/icon_26_no.unity3d,c16242cb394b0720d1c2e1e0289c1c4a
trCRM/upgradeRes/other/uiAtlas/cust/Android/position.unity3d,e60132eb1d8cfbc71046611111fd3099
trCRM/upgradeRes/other/uiAtlas/cust/Android/time.unity3d,38bf54e9fbf1c1d8af2cead294d1b61e
trCRM/upgradeRes/other/uiAtlas/cust/Android/bg.unity3d,37a58d5a79d3691b2c32a74422721ee7
trCRM/upgradeRes/priority/lua/public/CLLInclude.lua,476b749169d54c4b08e8749743983d92
trCRM/upgradeRes/other/uiAtlas/work/Android/380bg.unity3d,0634e3823e2492d32424733dd05779af
trCRM/upgradeRes/priority/lua/ui/cell/CLLUICalenderMonth.lua,16af9ed096ad6b902a156f6e0a20021f
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_3.unity3d,2834e3cc399b70e7621065ad4ddaedf6
trCRM/upgradeRes/other/uiAtlas/cust/Android/oean.unity3d,3cea16f73014b0b19797a3213467af0a
trCRM/upgradeRes/priority/lua/ui/panel/CSPTasks.lua,ad3d36656af6d646814046ff9059ab72
trCRM/upgradeRes/priority/lua/ui/panel/TRPLogin.lua,e18549cd43b8e476b5c2d1414594c592
trCRM/upgradeRes/priority/lua/public/CLLStack.lua,579069654d88a15e43c818a6b8079b15
trCRM/upgradeRes/priority/atlas/Android/atlasAllReal.unity3d,6b50b4e4afbdc66704ed49d4b15135f9
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewCust.unity3d,e1b7e9cecfa7c0104e475a8d84cc28db
trCRM/upgradeRes/other/uiAtlas/public/Android/button2.unity3d,1a48080b1d43367921fc09b430fffaf5
trCRM/upgradeRes/priority/lua/ui/panel/TRPResetPasswordStep3.lua,0d3be662e0a236b709d8f1f9d6b3321e
trCRM/upgradeRes/priority/lua/net/NetProto.lua,434601ac6cfd2ce441a0009f109f0757
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_set2.unity3d,e528f24899ef583c113ca69bbb510ebd
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_opinion.unity3d,1935579d226c7400323115d8be90421d
trCRM/upgradeRes/other/uiAtlas/coolape/Android/user.unity3d,dc5411391ea0beae4ecc9a4541f1cb21
trCRM/upgradeRes/priority/lua/ui/cell/CLLFrame1.lua,1fd4e80adb13bd0d3cb0d7449922667b
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustDetail.unity3d,7049ee32087377d48468ccee634e67c7
trCRM/upgradeRes/priority/ui/panel/Android/PanelGuid.unity3d,d58c2f53bba85cb8e969e744ff706f3a
trCRM/upgradeRes/priority/lua/ui/panel/TRPMoreProc4Cust.lua,cc11fe3b2530891e91e2c649762d06f8
trCRM/upgradeRes/other/uiAtlas/news/Android/news_bg_num1.unity3d,2ed88c277f983b8d1a3dedf73d735239
trCRM/upgradeRes/priority/ui/panel/Android/PanelSceneManager.unity3d,c83769673e1c0793d88547c05d20a82e
trCRM/upgradeRes/priority/localization/Chinese.txt,08ac586b625d0a126a610344a1846e8f
trCRM/upgradeRes/other/uiAtlas/login/Android/log_sms.unity3d,8677ba455b4c85e5f1230986ff1032cf
trCRM/upgradeRes/other/uiAtlas/cust/Android/star.unity3d,f9684ea4b4e3a4206fc898bc6e4651ab
trCRM/upgradeRes/priority/lua/toolkit/curve.lua,f97735ed6c39accb55cdae44b62b5b38
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_customer.unity3d,5676922ef1749c311285d1a207b8397b
trCRM/upgradeRes/priority/lua/bio/BioInputStream.lua,b3f94b1017db307427c6e39a8ee4d60e
trCRM/upgradeRes/other/uiAtlas/order/Android/ipt.unity3d,68e98b41456c62324871a1c86caefafc
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_bg_20.unity3d,8e81d4a650273e24b7f129d1f814f5fa
trCRM/upgradeRes/other/uiAtlas/login/Android/log_no.unity3d,2ee604556b4fff6186f2bad067ed8695
trCRM/upgradeRes/other/uiAtlas/cust/Android/cus_followup.unity3d,a722ae8374cf3aa0fd87fc6d74ddabfd
trCRM/upgradeRes/other/uiAtlas/cust/Android/kuang.unity3d,a6ce8e74b0631e79ce2e03f2fed3baea
trCRM/upgradeRes/other/uiAtlas/news/Android/news_2.unity3d,802f5fec3b39fb208b1bd8a400801081
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_remind.unity3d,04a96d237c5e80ab044a54e7c063e368
trCRM/upgradeRes/priority/ui/other/Android/reportform1.unity3d,5d061e9c5511ae3b978dbfe2be87f35e
trCRM/upgradeRes/other/uiAtlas/public/Android/button.unity3d,ff51e79201ecbd61247f8db792009aff
trCRM/upgradeRes/priority/lua/ui/cell/TRCellExtendField.lua,be687e94841bf222fa7b0c6a7a591156
trCRM/upgradeRes/other/uiAtlas/public/Android/on_off.unity3d,69b1b8dfdfc0afecdd9fdd9dbd5fb98a
trCRM/upgradeRes/other/uiAtlas/coolape/Android/logo.unity3d,c712e48e071a87fb6668333774da19a6
trCRM/upgradeRes/priority/lua/ui/cell/CLCellToast.lua,6e350721fca8167bd621df86ad982326
trCRM/upgradeRes/priority/lua/json/rpc.lua,28c2f09ceb729d01052d8408eed0b57a
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_clean_up.unity3d,51e9fd3012fca7d448c3578c281bd15e
trCRM/upgradeRes/priority/lua/toolkit/curve-families.png,d0b6b9b8a623a188aeae2fb688a8a0e5
trCRM/upgradeRes/other/uiAtlas/icon/Android/icon_26_no.unity3d,c16242cb394b0720d1c2e1e0289c1c4a
trCRM/upgradeRes/other/uiAtlas/logo/Android/logo.unity3d,849e7b3d08491890c6e021896c8ec39c
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_2.unity3d,3ce2779b6bfbaef177e0446661ec2f82
trCRM/upgradeRes/other/uiAtlas/order/Android/add.unity3d,bf6728a3e41783ee7d63c130107a16e1
trCRM/upgradeRes/priority/lua/ui/panel/CSPMine.lua,2dd00dde001dd24d01df96a841ce2f91
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_5.unity3d,7edfb781be444c18d010e53386334015
trCRM/upgradeRes/other/uiAtlas/cust/Android/limt.unity3d,d48f498211748b192a7b10a932aec8be
trCRM/upgradeRes/priority/lua/toolkit/BitUtl.lua,82e46240625342d5afe8ea68a609c9cb
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustFilterGroup.lua,93cdb67f51a62110b38e133b065f8f85
trCRM/upgradeRes/priority/ui/panel/Android/PanelConfirm.unity3d,cc945b5bffde4fec044e5660d2a5fe82
trCRM/upgradeRes/other/uiAtlas/cust/Android/oean.unity3d,3cea16f73014b0b19797a3213467af0a
trCRM/upgradeRes/priority/lua/ui/cell/TRCellRecord.lua,ca94ed9775ca9f03569e49d4ad1f3e14
trCRM/upgradeRes/priority/atlas/Android/atlasAllReal.unity3d,ea072d32d1080c13d24c10eb53dc010e
trCRM/upgradeRes/priority/ui/other/Android/InputMultText.unity3d,e4554fe97f92473cff5bfd8f1443b8a7
trCRM/upgradeRes/priority/ui/panel/Android/PanelResetPasswordStep2.unity3d,c3e2e353bd7e604e384a3e9e35d37893
trCRM/upgradeRes/priority/ui/other/Android/EmptySpace.unity3d,b9f173d21c2bc1854fb84e50f11dbed8
trCRM/upgradeRes/other/uiAtlas/login/Android/log_people.unity3d,7ff36c94c74e4a8e09e1896978c13381
trCRM/upgradeRes/priority/ui/panel/Android/PanelOrderList.unity3d,ce405f9722a7c2ab354a4091d49faa62
trCRM/upgradeRes/priority/lua/db/DBRoot.lua,2de10366932579d84506e9ca7aff0971
trCRM/upgradeRes/other/uiAtlas/public/Android/choose.unity3d,e31379a28ab86046414db1fb23cd2bf6
trCRM/upgradeRes/other/uiAtlas/cust/Android/position.unity3d,e60132eb1d8cfbc71046611111fd3099
trCRM/upgradeRes/other/uiAtlas/cust/Android/bg.unity3d,37a58d5a79d3691b2c32a74422721ee7
trCRM/upgradeRes/priority/ui/panel/Android/PanelMsg.unity3d,e0d5c4eb46bc7c1734c79206bd0962e0
trCRM/upgradeRes/priority/lua/ui/cell/CLToastRoot.lua,5809bbdd4b059a64e8129c55b146b514
trCRM/upgradeRes/priority/lua/ui/panel/TRPResetPasswordStep2.lua,af8af3fde5f3526b36c48517a5da89d0
trCRM/upgradeRes/other/uiAtlas/order/Android/close.unity3d,1b49cc4db64de50d13ee029447a3d49d
trCRM/upgradeRes/priority/lua/ui/panel/CLLPCalender.lua,232cf2b7f74f088e8b44c4c47cda5e95
trCRM/upgradeRes/other/uiAtlas/guid/Android/1.unity3d,7654268e7c4bc7cea47f584d306f503d
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_1.unity3d,aca2dfb1fbece45c7333447195bc7efe
trCRM/upgradeRes/other/uiAtlas/login/Android/log_visible.unity3d,884f69f0dd0c2a58af5ad891f23e985e
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustProc.lua,3f9f33de3630a03463952058ba795128
trCRM/upgradeRes/priority/ui/panel/Android/PanelGuid.unity3d,d58c2f53bba85cb8e969e744ff706f3a
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_password2.unity3d,5dc8eaeca2eeedb771451233e5d8bf98
trCRM/upgradeRes/priority/lua/net/NetProtoUsermgrClient.lua,f65df462666ca9fca7f16c2954984527
trCRM/upgradeRes/priority/lua/toolkit/CLLVerManager.lua,39b154e796d60c2c40ebcc427a5c05e8
trCRM/upgradeRes/other/uiAtlas/coolape/Android/button.unity3d,efe93bdf676ef2d5195d52abe42ab833
trCRM/upgradeRes/priority/ui/other/Android/InputToggles.unity3d,847a6d2cbf79b767094155404ef708b1
trCRM/upgradeRes/other/uiAtlas/public/Android/radio_full.unity3d,299e73e63c854e9d88dc63f1c19a45f9
trCRM/upgradeRes/priority/lua/ui/cell/CLLCellWWWProgress.lua,ec0258e77f76c8b681d0f02e7a5ff342
trCRM/upgradeRes/priority/lua/public/CLLPool.lua,3e6a97eb07cfdff7c399eb3e956ba77c
trCRM/upgradeRes/other/uiAtlas/cust/Android/msg.unity3d,7f98a936769044c856c6082beb3559e3
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_bg_20.unity3d,8e81d4a650273e24b7f129d1f814f5fa
trCRM/upgradeRes/priority/ui/other/Android/Frame1.unity3d,622d3ea7e4f9aa1d11f6492cabffa445
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_check.unity3d,d9092d78af855e769abff1223f650a9d
trCRM/upgradeRes/priority/lua/ui/panel/TRPMyInfor.lua,6f9a3135448a4746c463a41295275c57
trCRM/upgradeRes/other/uiAtlas/cust/Android/record.unity3d,afd45ba065ba86f138b8c92b9794c722
trCRM/upgradeRes/priority/lua/ui/panel/TRPSetting.lua,45f706ba538ab2b39364826b8fc7e214
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_news2.unity3d,a35e85b68569bf1adc16bdee3a609fdd
trCRM/upgradeRes/priority/ui/other/Android/AlertRoot.unity3d,c30044a6e7bf14ddb7a87c4f51d1f073
trCRM/upgradeRes/priority/ui/other/Android/InputDate.unity3d,b9645fe9ff5972788d341acc70b7be30
trCRM/upgradeRes/priority/lua/ui/panel/TRPGuid.lua,ee29c8c2537cd4c445afe1397450cdae
trCRM/upgradeRes/other/uiAtlas/guid/Android/3.unity3d,6fafc74e9a154b5b3c19accabd3e11b0
trCRM/upgradeRes/other/uiAtlas/coolape/Android/password.unity3d,ae473953dbd84c6f9a4e736f5101f4a2
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_4.unity3d,67187ab01b7b863b2a7f37b430212a3d
trCRM/upgradeRes/priority/lua/bio/BioType.lua,4667e9def8191cbf2b9dc25e928bc23f
trCRM/upgradeRes/priority/localization/Chinese.txt,08ac586b625d0a126a610344a1846e8f
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_check.unity3d,19ab7fd3e0e61658db44cb333c6fad0e
trCRM/upgradeRes/priority/ui/other/Android/InputToggle.unity3d,4b8616c8acc8691a4b8510fdc103ec75
trCRM/upgradeRes/other/uiAtlas/cust/Android/important.unity3d,17f0d1ab4133e3a6542404d8e5fb0b7d
trCRM/upgradeRes/priority/ui/panel/Android/PanelWebView.unity3d,e5372cdacc520ff8ba318ce09b681772
trCRM/upgradeRes/priority/lua/ui/panel/TRPConfirm2.lua,bd0ea9f50708dedd598b517c1dfc739f
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_4.unity3d,d1cf8069716943cc112a2946b22efddd
trCRM/upgradeRes/other/uiAtlas/cust/Android/suc.unity3d,0ec570e88b0dfc2b82a4f8e5bb84edc0
trCRM/upgradeRes/other/uiAtlas/hotwheel/Android/loading.unity3d,2f74f17f1282c12ab63108377b4798e0
trCRM/upgradeRes/priority/ui/panel/Android/PanelLogin.unity3d,5cac11a5557933d49c37a554c76a730f
trCRM/upgradeRes/other/uiAtlas/cust/Android/cus_followup.unity3d,a722ae8374cf3aa0fd87fc6d74ddabfd
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewCust.lua,c3f8563afb97d79992a35de8c3ee9ba6
trCRM/upgradeRes/other/uiAtlas/login/Android/log_invisible.unity3d,e1a5814af01e17e83e9939c9f1839524
trCRM/upgradeRes/other/uiAtlas/login/Android/log_sms.unity3d,8677ba455b4c85e5f1230986ff1032cf
trCRM/upgradeRes/priority/lua/ui/panel/TRPConnect.lua,e6c7e0aafd60eb1de8bf0ab7758bac11
trCRM/upgradeRes/priority/lua/ui/panel/CLLPStart.lua,756c08832a0f69ec66e386da4fd35ca7
trCRM/upgradeRes/other/uiAtlas/work/Android/work_bg_shadow.unity3d,10087f2ab389bdfd71cfce8a6c466038
trCRM/upgradeRes/other/uiAtlas/work/Android/work_bg_noshadow.unity3d,4aee082b48104519ba82bad6aac83cf3
trCRM/upgradeRes/other/uiAtlas/icon/Android/company_1.unity3d,8ba9f20b736fb17e2f6ee414df072492
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustDetail.unity3d,b22b74b2ee1d57cccbaa92c6971dd9df
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_notice.unity3d,8ccab8900911e68fc8e0b46f6c1e0372
trCRM/upgradeRes/other/uiAtlas/work/Android/work_ranking.unity3d,9a0b0f94d60e9ff144193c83915b21fa
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_password.unity3d,04bebaa914245dd4d2376f9ded0ad15f
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_work2.unity3d,eca0bd19a59ce72be19d7cdcbf9c5dac
trCRM/upgradeRes/priority/ui/other/Android/reportform2.unity3d,de5097255fc8126d368e9693106347dc
trCRM/upgradeRes/priority/lua/ui/panel/CLLPSceneManager.lua,b1b848791df37e59bdf7d5acf9cb9273
trCRM/upgradeRes/other/uiAtlas/cust/Android/full_star.unity3d,6f6aa242a0a793b6eea6edc8c8de437d
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_time.unity3d,16ca1ec9a44b8633ca032c3c8cdf1a9b
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewFollowSimple.unity3d,d0f73f4324743d77717668fdcda14680
trCRM/upgradeRes/priority/ui/panel/Android/ToastRoot.unity3d,412c3557a187689acaa1d79d7d555836
trCRM/upgradeRes/priority/ui/panel/Android/PanelResetPasswordStep1.unity3d,150f48b7b68e00e8b3e513ec2b75333a
trCRM/upgradeRes/priority/lua/ui/cell/CLLUICalenderMonth.lua,16af9ed096ad6b902a156f6e0a20021f
trCRM/upgradeRes/priority/lua/db/DBTextures.lua,fd2b6a27eee4bcec69b1fd1b4bec92ba
trCRM/upgradeRes/other/uiAtlas/work/Android/icon_bg.unity3d,60926842e889a8a621443f4f646aa9e2
trCRM/upgradeRes/priority/ui/other/Android/InputPoplist.unity3d,99670420a41bf33b055763d28c547a26
trCRM/upgradeRes/other/uiAtlas/work/Android/work_bg.unity3d,3b42ecd8d30203eb5dcc65cb3a0ad815
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustListProc.lua,1973dc8d949ed85e01b09aff328d1033
trCRM/upgradeRes/other/uiAtlas/coolape/Android/name.unity3d,f5b44185a57a97ce6971f20a4054d990
trCRM/upgradeRes/other/uiAtlas/cust/Android/time.unity3d,38bf54e9fbf1c1d8af2cead294d1b61e
trCRM/upgradeRes/priority/ui/panel/Android/PanelLoginCoolape.unity3d,efb09b206c444d66d10720371645049b
trCRM/upgradeRes/priority/lua/toolkit/CLLPrintEx.lua,86d891ec4d8bfa5533704c142fc97235
trCRM/upgradeRes/priority/lua/ui/panel/TRPResetPasswordStep1.lua,def4741f89df3925682e53df01bb70cc
trCRM/upgradeRes/other/uiAtlas/cust/Android/kuang.unity3d,a6ce8e74b0631e79ce2e03f2fed3baea
trCRM/upgradeRes/other/uiAtlas/logo/Android/logo2.unity3d,1bddae3d3fe67d91fc6b5c6f9dbb0bea
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_me.unity3d,b6060c4f6b1cf669b21b5d4f8b23efbe
trCRM/upgradeRes/priority/ui/panel/Android/PanelPlaySoundRecord.unity3d,14e1a1da65735a1ac9a4256be49a4e40
trCRM/upgradeRes/other/uiAtlas/cust/Android/phone.unity3d,36e34519b910a11de3531994f607a140
trCRM/upgradeRes/other/uiAtlas/cust/Android/input.unity3d,44e1403bbf15c7313dff8cad78d39287
trCRM/upgradeRes/priority/lua/db/DBCust.lua,8a34500a2252a4b7780c5d3aacabb1ee
trCRM/upgradeRes/priority/ui/panel/Android/PanelMoreProc4Cust.unity3d,0a1669987fdd4ce81f5b7cba8ce77876
trCRM/upgradeRes/priority/ui/other/Android/reportform3.unity3d,f0a5622c709a4d4ec6ac76c0c1e8abb5
trCRM/upgradeRes/priority/lua/toolkit/LuaUtl.lua,cde8ec272382f95abe0320714201b387
trCRM/upgradeRes/priority/lua/ui/panel/CLLPLogin.lua,f2ba83d01af3371bee83945f470facd5
trCRM/upgradeRes/priority/ui/other/Android/reportform1.unity3d,5d061e9c5511ae3b978dbfe2be87f35e
trCRM/upgradeRes/priority/lua/ui/cell/TRCellProductList.lua,b2827429c70df8b7aa8e87451a96bf67
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_enterprise.unity3d,59d7dae785dea4fa88b52f40a8d167cf
trCRM/upgradeRes/other/uiAtlas/public/Android/_empty.unity3d,69ddb5d00f576f414974eaff196cb6cc
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_me2.unity3d,6efa661cb74e62dfdc75bdbeaeeceb39
trCRM/upgradeRes/priority/ui/panel/Android/PanelStart.unity3d,50cfab21f360ee339c94b1111be09fef
trCRM/upgradeRes/other/uiAtlas/cust/Android/write.unity3d,cbf2cca163ccc6839cf9154547edd6f8
trCRM/upgradeRes/other/uiAtlas/cust/Android/star.unity3d,f9684ea4b4e3a4206fc898bc6e4651ab
trCRM/upgradeRes/priority/lua/toolkit/curve-families.png,d0b6b9b8a623a188aeae2fb688a8a0e5
trCRM/upgradeRes/other/uiAtlas/cust/Android/play.unity3d,ae412dff53c914bcfcd0ca92255bb33e
trCRM/upgradeRes/priority/ui/panel/Android/PanelWWWProgress.unity3d,d9cbe9d08670eedbee77ba97330f4118
trCRM/upgradeRes/other/uiAtlas/order/Android/ipt.unity3d,68e98b41456c62324871a1c86caefafc
trCRM/upgradeRes/priority/lua/ui/cell/TRCellReportform3.lua,f83300f176e1c35d62e00e69539998f3
trCRM/upgradeRes/priority/ui/panel/Android/PanelPopList.unity3d,a0ba753b0deecff9a85c8cd2b60013dd
trCRM/upgradeRes/priority/lua/ui/panel/CSPMain.lua,24f616b9384dc0eefa9955fabb1d05f1
trCRM/upgradeRes/priority/ui/panel/Android/PanelConnect.unity3d,f80a29df002dc606e21fd69fbea40021
trCRM/upgradeRes/priority/lua/ui/cell/TRCellPopCheckbox.lua,25adbf58789186d43c15cfe65d2e8501
trCRM/upgradeRes/other/uiAtlas/news/Android/news_bg.unity3d,b13e253b3a1689bf665ea7c3edecc519
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustFilter.lua,2fb22f9248e4af86ab42482151a5b141
trCRM/upgradeRes/other/uiAtlas/coolape/Android/input.unity3d,b3ad3f57c51c02ff798a50a37d6c9cab
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewOrder.unity3d,068f97e365e79ae11418ff16a1cf2f89
trCRM/upgradeRes/other/uiAtlas/cust/Android/right.unity3d,b991891eb2939a880c223d677605faf4
trCRM/upgradeRes/other/uiAtlas/cust/Android/follow.unity3d,fffb80792073e4f2849c743d061d685a
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_2.unity3d,3bcd13c7b2003a1bcf92aaa4d2dbf6fe
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewFollowSimple.lua,720f3ff97d9b71a9108fd949bf779b30
trCRM/upgradeRes/priority/lua/public/CLLQueue.lua,065303c980678b25b11854bfec1690f3
trCRM/upgradeRes/priority/ui/other/Android/Frame2.unity3d,d057ea60bdf5dd821705a9f7e67e5171
trCRM/upgradeRes/other/uiAtlas/hotwheel/Android/hotWheel_bg.unity3d,b5d2bc7180f9d280014726814ec8b9fe
trCRM/upgradeRes/priority/lua/ui/cell/TRCellMessageGroup.lua,14a960604f49e2b34e0c115561bb45a3
trCRM/upgradeRes/priority/ui/panel/Android/PanelFollowList.unity3d,74006579cdb0ea8b4e120e1b52dd5c55
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_set.unity3d,c53cddeef8f62d67a2a4110447466536
trCRM/upgradeRes/priority/ui/panel/Android/PanelPopCheckBoxs.unity3d,d3a8693784b6cc7ff00ee50fc8625f69
trCRM/upgradeRes/priority/lua/city/CLLCity.lua,b7ee9fffacb28d09ab08728a49dedc8e
trCRM/upgradeRes/priority/lua/ui/panel/TRPFollowList.lua,42de16eb98a338177801da06f8fc5895
trCRM/upgradeRes/priority/lua/public/CLLStack.lua,579069654d88a15e43c818a6b8079b15
trCRM/upgradeRes/priority/lua/db/DBOrder.lua,076cfb6761ed5c0568690aa273d8ee37
trCRM/upgradeRes/priority/lua/ui/panel/CSPMsg.lua,f72d285313cb63ff775722473af9a5f9
trCRM/upgradeRes/other/uiAtlas/work/Android/work_head_bg.unity3d,20f535a454df3fff37230bbcc3bc8244
trCRM/upgradeRes/priority/lua/ui/panel/TRPLogin.lua,e18549cd43b8e476b5c2d1414594c592
trCRM/upgradeRes/priority/lua/cfg/DBCfgTool.lua,a6760e05dcc5f91202e3659179a464e7
trCRM/upgradeRes/priority/ui/other/Android/InputCheckboxs.unity3d,a929e8a7fd7ba3bc89bdda0686b6d7dd
trCRM/upgradeRes/priority/lua/ui/cell/TRCellGuidPage.lua,7b3c3f567c3e0d92065913101b08ddd0
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewOrder.lua,38a15680b2d8765d9ba614c9a81c641d
trCRM/upgradeRes/priority/lua/ui/panel/CLLPLoginCoolape.lua,5873be60edc8f1407dc9fb53ec567ebf
trCRM/upgradeRes/priority/lua/ui/panel/TRPAbout.lua,ded7b5021b8837a537e426614cc2171e
trCRM/upgradeRes/priority/lua/bio/BioOutputStream.lua,84fd65eb0d1a166e77447f61254d62b5
trCRM/upgradeRes/priority/lua/db/DBMessage.lua,a80d8448cfdaebb072b3d7ec5f40bb60
trCRM/upgradeRes/priority/lua/db/DBStatistics.lua,e64ad532dabb2cb70c4053e223770969
trCRM/upgradeRes/priority/lua/ui/panel/TRPCusFilter.lua,f0452e3d6cfa59244dc7b9dd8f5a475d
trCRM/upgradeRes/other/uiAtlas/public/Android/company_bg.unity3d,2153c725242937cf5fce727da9626dad
trCRM/upgradeRes/priority/lua/public/CLLPrefs.lua,1719d57c97fe0d8f2c9d1596cb6e2ac8
trCRM/upgradeRes/priority/ui/panel/Android/PanelModifyFiled.unity3d,331f7d063411e0c231eaeccee4df73d1
trCRM/upgradeRes/priority/ui/panel/Android/PanelMyInfor.unity3d,94f1b88c66705acd7f798affef48c540
trCRM/upgradeRes/priority/lua/ui/panel/TRPResetPasswordStep3.lua,0d3be662e0a236b709d8f1f9d6b3321e
trCRM/upgradeRes/priority/ui/panel/Android/PanelConfirm2.unity3d,d199779b559cef259ebbfe686ba42703
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_peo.unity3d,9c9562e576e93bacb7f2a0d0f08523ee
trCRM/upgradeRes/priority/lua/bio/BioUtl.lua,f64afdd9ccdf943f5d4ba2fc3c3241ef
trCRM/upgradeRes/priority/ui/panel/Android/PanelSysMsgDetail.unity3d,91e06baebc3ec7e9b2a5c108ced50b52
trCRM/upgradeRes/priority/ui/panel/Android/PanelMask4Panel.unity3d,ed5e0d7cc2ba83e33435bddc760b5f9d
trCRM/upgradeRes/priority/lua/ui/cell/TRCellExtendFieldRoot.lua,c38ffa7d9111dc4bedeaba97a6d5a661
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustList.unity3d,40fb760b32740191d3b4fa3f84de1720
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_remind.unity3d,04a96d237c5e80ab044a54e7c063e368
trCRM/upgradeRes/priority/ui/panel/Android/PanelSysMsgList.unity3d,b48b08a37217bb43ef7a94566f79fec0
trCRM/upgradeRes/other/uiAtlas/cust/Android/remove.unity3d,b460d3a275be876e0cfa0ca96777260f
trCRM/upgradeRes/priority/ui/panel/Android/PanelMain.unity3d,a56567b78909e1992695a97cb19d3e1c
trCRM/upgradeRes/other/uiAtlas/cust/Android/cus_tel.unity3d,692b010c775fb99d05d342f5ad0272fa
trCRM/upgradeRes/priority/lua/db/DBUser.lua,f5151070816fc7da19ae939c9533bbf9
trCRM/upgradeRes/priority/lua/ui/panel/TRBasePanel.lua,dc088058987b435c998a9709297a88e6
trCRM/upgradeRes/priority/lua/public/class.lua,cc0f201cc55c59f8bc8f623853382b9c
trCRM/upgradeRes/other/uiAtlas/login/Android/log_bg.unity3d,a7398f0f48b3b469e31bea6dac45457e
trCRM/upgradeRes/other/uiAtlas/cust/Android/peo.unity3d,939edcb747217aa4b0deb1d9a34f16b8
trCRM/upgradeRes/other/uiAtlas/news/Android/news_2.unity3d,802f5fec3b39fb208b1bd8a400801081
trCRM/upgradeRes/other/uiAtlas/order/Android/upload.unity3d,a7cb722ecba5f405105f0cfda4695e74
trCRM/upgradeRes/other/uiAtlas/cust/Android/screen.unity3d,b488e337b72f2cd07dadd1e08640243d
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_about.unity3d,3da9c9416127c69bc20c281f44520f6e
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustStar.lua,ed39330cf68d1e1e062bc8311d1e8d44
trCRM/upgradeRes/other/uiAtlas/logo/Android/512.unity3d,c51445206c8f94af0fcbbe4befa8ae05
trCRM/upgradeRes/priority/lua/ui/panel/CLLPSplash.lua,8ce0b645f948233e6328b20a07a5999c
trCRM/upgradeRes/priority/www/baidumap.html,d210e48796dd96343f9c17bc1d230136
trCRM/upgradeRes/priority/lua/ui/panel/CLLPHotWheel.lua,1760aa9933da4b421f1c6093d802cb4f
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustFilter.unity3d,90d589021f3db8641b14920daf93f1dc
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_work.unity3d,8a889dc1fe3b56bff4435f441ce5580e
trCRM/upgradeRes/other/uiAtlas/guid/Android/2.unity3d,6b83b2d5a2dfc1f08744077e669c3ed0
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_order.unity3d,26bc3076031940af6069ef5a9143fb5a
trCRM/upgradeRes/priority/lua/ui/cell/CLLFrame1.lua,1fd4e80adb13bd0d3cb0d7449922667b
trCRM/upgradeRes/other/uiAtlas/cust/Android/task.unity3d,737ce6fdd55d7642f690531d9410ff6a
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_unread.unity3d,f1b29d8592cdd49f3a526be6b524ad9f
trCRM/upgradeRes/other/uiAtlas/public/Android/on_off_bg.unity3d,96fcd3ce2ee9ffa2941973cefea6511d
trCRM/upgradeRes/priority/lua/toolkit/MyUtl.lua,44306fc53f8711f95e0698e2613563cf
trCRM/upgradeRes/priority/lua/net/CLLNetSerialize.lua,30c24f11d46d7b887bf32177acb92c81
trCRM/upgradeRes/other/uiAtlas/public/Android/button.unity3d,ff51e79201ecbd61247f8db792009aff
trCRM/upgradeRes/priority/lua/ui/cell/TRCellEmptySpace.lua,42b2a61f171153603c9adda32bf7cb7d
trCRM/upgradeRes/other/uiAtlas/news/Android/news_3.unity3d,5f130cc66d813a2b339757e8a31cee8c
trCRM/upgradeRes/priority/ui/panel/Android/PanelSetting.unity3d,e28ed051439e06abe8ffc14ebf9cf1d2
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_remind.unity3d,99a50a17b34f464693ac84d1c6f38966
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewFollow.lua,336ea3b9be70d8d1fff12f59c101193a
trCRM/upgradeRes/priority/lua/ui/panel/TRPSysMsgList.lua,518461e7bf8f3b3420fa9377a23db86a
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_3.unity3d,651d81480c5ea1ff8aa4ccdf7e0a6058
trCRM/upgradeRes/priority/lua/bio/BioInputStream.lua,b3f94b1017db307427c6e39a8ee4d60e
trCRM/upgradeRes/priority/ui/panel/Android/PanelResetPasswordStep3.unity3d,2f18b6d6198b1678ba10a72dcdd1fbaa
trCRM/upgradeRes/priority/lua/ui/cell/CSCellBottomBtn.lua,afbf445995d42e012635f3d355ce6d9e
trCRM/upgradeRes/other/uiAtlas/coolape/Android/user.unity3d,dc5411391ea0beae4ecc9a4541f1cb21
trCRM/upgradeRes/priority/lua/ui/cell/TRCellReportform1.lua,d31b42aa50089defb22bde59b5c0474d
trCRM/upgradeRes/other/uiAtlas/work/Android/work_color.unity3d,043e8a3cdee29da6e5c909432f25d6f8
trCRM/upgradeRes/other/uiAtlas/cust/Android/order.unity3d,0b796b27d351f49010fb3c3921f1a843
trCRM/upgradeRes/priority/lua/ui/panel/CSPTasks.lua,778f0d663544d0b2379e87b50ea49031
trCRM/upgradeRes/priority/lua/ui/cell/CLLUICellPoplist.lua,18d47301d459fd66ed63b902546e8619
trCRM/upgradeRes/priority/lua/ui/panel/TRPNewFollowTask.lua,7fe7010d91b43edf001169feb70ce395
trCRM/upgradeRes/priority/ui/panel/Android/PanelSceneManager.unity3d,c83769673e1c0793d88547c05d20a82e
trCRM/upgradeRes/other/uiAtlas/cust/Android/funnel.unity3d,cb6f2a2b14c53ed86c122a4da2c3984b
trCRM/upgradeRes/priority/ui/panel/Android/PanelAbout.unity3d,2c583d1e0c0eabc9e831a40c2be189e8
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_fingerprint.unity3d,de777211a380a09ea82e1092a9fba414
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_opinion.unity3d,1935579d226c7400323115d8be90421d
trCRM/upgradeRes/priority/lua/CLLMainLua.lua,c0cae0cd02eba21111cf005f6c608901
trCRM/upgradeRes/other/uiAtlas/login/Android/log_no.unity3d,2ee604556b4fff6186f2bad067ed8695
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustFilter.lua,450e7e75ebfe83bb65d59beb3ce60782
trCRM/upgradeRes/priority/lua/public/CLLInclude.lua,acd2930ce707586398f07b9586363436
trCRM/upgradeRes/priority/lua/toolkit/KKLogListener.lua,85784ec79aefde29be3ef308e7b5203b
trCRM/upgradeRes/priority/ui/panel/Android/PanelSplash.unity3d,2691ddc66dff5da22fda3ffe11c897dd
trCRM/upgradeRes/priority/lua/ui/cell/CLLFrame2.lua,e25ce84ca55cd643d527d09cedd6228a
trCRM/upgradeRes/other/uiAtlas/main/Android/icon_news.unity3d,3a1afa79dbc710c3ddd6f65cf62f4a19
trCRM/upgradeRes/priority/lua/ui/panel/TRPSelectCompany.lua,28ca57d169af022ec621dece879bdcfc
trCRM/upgradeRes/other/uiAtlas/cust/Android/border.unity3d,bf2cd1f2bdb27efc9c2e27943dcb8974
trCRM/upgradeRes/other/uiAtlas/news/Android/news_bg_num2.unity3d,bfdbfc9e1fd1f91de555c0801d278d25
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_set2.unity3d,e528f24899ef583c113ca69bbb510ebd
trCRM/upgradeRes/priority/lua/ui/panel/CLLPConfirm.lua,e652190d378dc120a0805230692f0fc9
trCRM/upgradeRes/other/uiAtlas/public/Android/radio.unity3d,4f2c80de666b97ea02084f059d2a5ed0
trCRM/upgradeRes/other/uiAtlas/public/Android/button2.unity3d,1a48080b1d43367921fc09b430fffaf5
trCRM/upgradeRes/other/uiAtlas/cust/Android/play2.unity3d,0b6ede536ea7b5084a1de22265b04840
trCRM/upgradeRes/other/uiAtlas/cust/Android/check.unity3d,aa21836aaae62d8f719a930aefe37ea7
trCRM/upgradeRes/priority/lua/ui/cell/TRCellSysMessageList.lua,1ce46f4b3a1a8b728e447c12e7df1831
trCRM/upgradeRes/priority/lua/json/rpc.lua,28c2f09ceb729d01052d8408eed0b57a
trCRM/upgradeRes/priority/lua/ui/panel/CLLPPopList.lua,896c4b35a6cd0d4f86ed5c0ba532ea00
trCRM/upgradeRes/priority/lua/ui/cell/TRCellReportform2.lua,47ac1164b1ffb27397953ccb032fd2d7
trCRM/upgradeRes/priority/ui/panel/Android/PanelTasks.unity3d,2739446b89e4fb5c449abb46ff406785
trCRM/upgradeRes/other/uiAtlas/mine/Android/me_customer.unity3d,5676922ef1749c311285d1a207b8397b
trCRM/upgradeRes/priority/lua/net/NetProto.lua,3493f7ceb04a0b147ce63d323e3553af
trCRM/upgradeRes/other/uiAtlas/public/Android/tips_3.unity3d,2834e3cc399b70e7621065ad4ddaedf6
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_clean_up.unity3d,51e9fd3012fca7d448c3578c281bd15e
trCRM/upgradeRes/priority/lua/ui/cell/CLCellToast.lua,6e350721fca8167bd621df86ad982326
trCRM/upgradeRes/other/uiAtlas/mine/Android/myset_data.unity3d,70dd24370cd051acb45bab65464459ee
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewFollowTask.unity3d,00abbad1fdb08fdf2dcdcd6f2a70f95c
trCRM/upgradeRes/priority/lua/toolkit/CLLUpdateUpgrader.lua,bfff3548aa7cd983c3de46e5defae423
trCRM/upgradeRes/other/uiAtlas/news/Android/news_1.unity3d,51120d82352e936df826b05696b89b19
trCRM/upgradeRes/other/uiAtlas/cust/Android/add.unity3d,ceb10233c0fc59270d66e1cb5c93bb49
trCRM/upgradeRes/priority/lua/ui/cell/TRCellProductSelected.lua,e7f4b1e06a54d5fa52cf9a4ed00f5233
trCRM/upgradeRes/priority/lua/public/CLLIncludeBase.lua,87bcfc58c6d99be6fe89102d7323c95e
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustList.lua,473a578d9811d494d8cf58c7fc6a45b9
trCRM/upgradeRes/priority/ui/panel/Android/PanelMine.unity3d,11da82174234ef319918c3e06f3775d6
trCRM/upgradeRes/priority/lua/cfg/DBCfg.lua,3d0e60dbcdaa61b8553eee17f4d68b32
trCRM/upgradeRes/other/uiAtlas/order/Android/ipt_bg.unity3d,89541a2aaed40069c1f0ce363c5a8e2a
trCRM/upgradeRes/other/uiAtlas/order/Android/system.unity3d,570fa72b2d385d604cc7c9f7516965da
trCRM/upgradeRes/other/uiAtlas/login/Android/log_password.unity3d,6a41f099b79cda5941cf720c1452b5a5
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewFollow.unity3d,3ee9577410d709f08bf37e7c9a2b19a1
trCRM/upgradeRes/other/uiAtlas/cust/Android/pause.unity3d,f67cbbc84b61bc281f486e4e18fb177f
trCRM/upgradeRes/priority/lua/ui/panel/CLLPWWWProgress.lua,b713ddf9f0af8602ec48f71162181d6d
trCRM/upgradeRes/priority/lua/ui/cell/CLLCellServer.lua,1e9de9f0b4bbc703296808c1ba179c29
trCRM/upgradeRes/priority/lua/ui/panel/TRPModifyFiled.lua,99b250c386ce8dad9c10c8f4fe9874f1
trCRM/upgradeRes/priority/ui/other/Android/InputText.unity3d,7b419ca2ec17017ed14ac42561ab0a01
trCRM/upgradeRes/other/uiAtlas/news/Android/new2_wait.unity3d,4171ead446231d4429305811f6e91fbc
trCRM/upgradeRes/priority/ui/panel/Android/PanelNewCust.unity3d,059a6d8bc6830d6eea05685f17829c14
trCRM/upgradeRes/priority/ui/panel/Android/PanelServers.unity3d,1613390ef03ce766ec3680f99949122b
trCRM/upgradeRes/priority/lua/ui/panel/TRPCustDetail.lua,e32c3b520335c1b2966d8a503518275c
trCRM/upgradeRes/priority/ui/panel/Android/PanelCalender.unity3d,56aa22c08fd4a18488f213a650f67ff1
trCRM/upgradeRes/other/uiAtlas/cust/Android/del.unity3d,453d38d3af66e108db0d2bb827426bd7
trCRM/upgradeRes/priority/lua/ui/panel/CLLPWebView.lua,093deec807e28be04df4d593bcff9e38
trCRM/upgradeRes/priority/lua/json/json.lua,a2914572290611d3da35f4a7eec92022
trCRM/upgradeRes/priority/lua/ui/panel/TRPSysMsgDetail.lua,6266494c653deda1b5a391cc7f38a06a
trCRM/upgradeRes/priority/lua/ui/panel/TRPSelectProduct.lua,59750609585193c66d08adfa8544d946
trCRM/upgradeRes/other/uiAtlas/cust/Android/get.unity3d,04bf77dfe50c327c85966f9fdd1350c6
trCRM/upgradeRes/other/uiAtlas/cust/Android/more.unity3d,f05eafb34336f1fcb5d614ad30217011
trCRM/upgradeRes/priority/ui/panel/Android/PanelCustListProc.unity3d,5d32d590b8c5383f6c523b06132fb12f
trCRM/upgradeRes/other/uiAtlas/hotwheel/Android/hotWheel_prog.unity3d,0c507387d1167154fe67f1719c3531bd
trCRM/upgradeRes/other/uiAtlas/cust/Android/search.unity3d,7420a0a7cc725ff494761009ebe811d7
trCRM/upgradeRes/other/uiAtlas/news/Android/news_4.unity3d,8c7beff66dc0cfe9f44082bdacc8007c
trCRM/upgradeRes/priority/lua/ui/panel/TRPMoreProc4Cust.lua,cc11fe3b2530891e91e2c649762d06f8
trCRM/upgradeRes/priority/ui/panel/Android/PanelSelectCompany.unity3d,2aa019a477ea5b160780ded080dc82ec
trCRM/upgradeRes/priority/ui/panel/Android/PanelBackplate.unity3d,861c2420c86f0da27dd58a6f73dfb942
trCRM/upgradeRes/priority/ui/panel/Android/PanelHotWheel.unity3d,7a3ae06303e65f59f15af5b906b7a471
trCRM/upgradeRes/priority/lua/ui/panel/TRPPlaySoundRecord.lua,ded1f35f04bd0d84bfa8fd74ddf926aa
trCRM/upgradeRes/other/uiAtlas/mine/Android/log_bg.unity3d,fd1470749300ec31bcbe7f59686152d7
trCRM/upgradeRes/priority/lua/json/rpcserver.lua,48b8f5e53a1141652c38f8a5a8a77928
trCRM/upgradeRes/priority/lua/net/CLLNet.lua,947abdf2c019f44a26211acf6f31e2dd
trCRM/upgradeRes/other/uiAtlas/coolape/Android/logo.unity3d,c712e48e071a87fb6668333774da19a6
trCRM/upgradeRes/priority/lua/ui/cell/CLLUICalenderDay.lua,6e7400e2dd535ced93960c1e18fa2458
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCustList.lua,21f43d920caab4d30c9ce7f9a1255603
trCRM/upgradeRes/priority/lua/ui/panel/TRPPopCheckBoxs.lua,508171a924c113573b01a396e8217cc2
trCRM/upgradeRes/other/uiAtlas/news/Android/news_bg_num1.unity3d,2ed88c277f983b8d1a3dedf73d735239
trCRM/upgradeRes/other/uiAtlas/public/Android/check.unity3d,d11f6d5b126c6a0fbf34ced5734cb66f
trCRM/upgradeRes/other/uiAtlas/public/Android/check_full.unity3d,282038ef4b24e802b0c936877871200c
trCRM/upgradeRes/other/uiAtlas/work/Android/380bg.unity3d,0634e3823e2492d32424733dd05779af
trCRM/upgradeRes/other/uiAtlas/cust/Android/cus_task.unity3d,a4f148630912414f1d5e94d5a6a02e2d
trCRM/upgradeRes/priority/lua/ui/panel/CLLPBackplate.lua,ae946f1cec5baad680f4e8a0f7e71223
trCRM/upgradeRes/priority/ui/panel/Android/PanelSelectProduct.unity3d,d54579853bc1e958ced6fa6e3d928d2b
trCRM/upgradeRes/priority/lua/ui/panel/TRPOrderList.lua,3655882d094b886c89c7e48099136a46
trCRM/upgradeRes/priority/lua/ui/panel/TRPEditPrice.lua,ceb906ae12222324b9a61f4b83ec7e58
trCRM/upgradeRes/other/uiAtlas/work/Android/work_icon_1.unity3d,41ae133fd4da0f2bf01316f91cf67fb8
trCRM/upgradeRes/other/uiAtlas/order/Android/shut.unity3d,7a13d4859459f052143028b0656aef43
trCRM/upgradeRes/priority/lua/toolkit/curve.lua,f97735ed6c39accb55cdae44b62b5b38
trCRM/upgradeRes/priority/ui/panel/Android/PanelEditPrice.unity3d,baa0e7f3e00e62b0d5cb5263d7583000
trCRM/upgradeRes/priority/lua/ui/cell/TRCellCompany.lua,b145bc086a8b1657a314622614dcb70a
trCRM/upgradeRes/priority/lua/ui/cell/TRCellImage.lua,604691a3a96bbdb9cf88f20e2adf027c

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
trCRM/upgradeRes4Publish/other/uiAtlas/logo/Android/logo.unity3d,849e7b3d08491890c6e021896c8ec39c
trCRM/upgradeRes4Publish/other/uiAtlas/hotwheel/Android/hotWheel_prog.unity3d,0c507387d1167154fe67f1719c3531bd
trCRM/upgradeRes4Publish/priority/lua/toolkit/LuaUtl.lua,96b4f88eea21e061eff2e3f76fbb623b
trCRM/upgradeRes4Publish/priority/lua/toolkit/LuaUtl.lua,cde8ec272382f95abe0320714201b387
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/me_check.unity3d,19ab7fd3e0e61658db44cb333c6fad0e
trCRM/upgradeRes4Publish/priority/lua/public/CLLQueue.lua,065303c980678b25b11854bfec1690f3
trCRM/upgradeRes4Publish/other/uiAtlas/coolape/Android/button.unity3d,efe93bdf676ef2d5195d52abe42ab833
@@ -10,9 +10,10 @@ trCRM/upgradeRes4Publish/other/uiAtlas/main/Android/icon_work2.unity3d,eca0bd19a
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/_empty.unity3d,69ddb5d00f576f414974eaff196cb6cc
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/add.unity3d,ceb10233c0fc59270d66e1cb5c93bb49
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSetting.unity3d,e28ed051439e06abe8ffc14ebf9cf1d2
trCRM/upgradeRes4Publish/priority/lua/toolkit/CLLUpdateUpgrader.lua,bfff3548aa7cd983c3de46e5defae423
trCRM/upgradeRes4Publish/priority/lua/db/DBCust.lua,8a34500a2252a4b7780c5d3aacabb1ee
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/radio_full.unity3d,299e73e63c854e9d88dc63f1c19a45f9
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPGuid.lua,ee29c8c2537cd4c445afe1397450cdae
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPLogin.lua,f2ba83d01af3371bee83945f470facd5
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPSceneManager.lua,b1b848791df37e59bdf7d5acf9cb9273
trCRM/upgradeRes4Publish/priority/lua/ui/cell/CLLUICellPoplist.lua,18d47301d459fd66ed63b902546e8619
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/input.unity3d,44e1403bbf15c7313dff8cad78d39287
@@ -20,32 +21,31 @@ trCRM/upgradeRes4Publish/priority/lua/net/NetProtoUsermgrClient.lua,f65df462666c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCusFilter.lua,f0452e3d6cfa59244dc7b9dd8f5a475d
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelWWWProgress.unity3d,d9cbe9d08670eedbee77ba97330f4118
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSysMsgList.unity3d,b48b08a37217bb43ef7a94566f79fec0
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPStart.lua,4bf6daac6cc6e35679ca2bad64b0c18e
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPStart.lua,756c08832a0f69ec66e386da4fd35ca7
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/get.unity3d,04bf77dfe50c327c85966f9fdd1350c6
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputMultText.unity3d,cd2ced3b17c33b4750ddcade27f6b98f
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputMultText.unity3d,e4554fe97f92473cff5bfd8f1443b8a7
trCRM/upgradeRes4Publish/priority/lua/json/rpcserver.lua,48b8f5e53a1141652c38f8a5a8a77928
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPConfirm2.lua,bd0ea9f50708dedd598b517c1dfc739f
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPopList.unity3d,a0ba753b0deecff9a85c8cd2b60013dd
trCRM/upgradeRes4Publish/priority/lua/toolkit/CLLVerManager.lua,39b154e796d60c2c40ebcc427a5c05e8
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSceneManager.unity3d,c83769673e1c0793d88547c05d20a82e
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewFollowTask.unity3d,00abbad1fdb08fdf2dcdcd6f2a70f95c
trCRM/upgradeRes4Publish/priority/lua/CLLMainLua.lua,c0cae0cd02eba21111cf005f6c608901
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMsg.unity3d,e0d5c4eb46bc7c1734c79206bd0962e0
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/play.unity3d,ae412dff53c914bcfcd0ca92255bb33e
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/me_order.unity3d,26bc3076031940af6069ef5a9143fb5a
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRBasePanel.lua,dc088058987b435c998a9709297a88e6
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewFollowTask.lua,7fe7010d91b43edf001169feb70ce395
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/right.unity3d,b991891eb2939a880c223d677605faf4
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/company_bg.unity3d,2153c725242937cf5fce727da9626dad
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellReportform3.lua,f83300f176e1c35d62e00e69539998f3
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPSelectCompany.lua,28ca57d169af022ec621dece879bdcfc
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_bg_noshadow.unity3d,4aee082b48104519ba82bad6aac83cf3
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewOrder.unity3d,c4a2f36dec38a689f49f356f05a62d88
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewOrder.unity3d,068f97e365e79ae11418ff16a1cf2f89
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/myset_password2.unity3d,5dc8eaeca2eeedb771451233e5d8bf98
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/record.unity3d,afd45ba065ba86f138b8c92b9794c722
trCRM/upgradeRes4Publish/priority/lua/cfg/DBCfgTool.lua,a6760e05dcc5f91202e3659179a464e7
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/suc.unity3d,0ec570e88b0dfc2b82a4f8e5bb84edc0
trCRM/upgradeRes4Publish/priority/lua/toolkit/CLLPrintEx.lua,86d891ec4d8bfa5533704c142fc97235
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellRecord.lua,ca94ed9775ca9f03569e49d4ad1f3e14
trCRM/upgradeRes4Publish/other/uiAtlas/main/Android/icon_work.unity3d,8a889dc1fe3b56bff4435f441ce5580e
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/follow.unity3d,fffb80792073e4f2849c743d061d685a
trCRM/upgradeRes4Publish/priority/ui/other/Android/Frame2.unity3d,d057ea60bdf5dd821705a9f7e67e5171
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/pause.unity3d,f67cbbc84b61bc281f486e4e18fb177f
@@ -58,7 +58,8 @@ trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/news_bg_num1.unity3d,2ed88c2
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/me_set2.unity3d,e528f24899ef583c113ca69bbb510ebd
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/new2_wait.unity3d,4171ead446231d4429305811f6e91fbc
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_color.unity3d,043e8a3cdee29da6e5c909432f25d6f8
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCalender.unity3d,acf45d3619beb2deb72cce95732c68c4
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCalender.unity3d,56aa22c08fd4a18488f213a650f67ff1
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelAbout.unity3d,2c583d1e0c0eabc9e831a40c2be189e8
trCRM/upgradeRes4Publish/other/uiAtlas/main/Android/icon_me.unity3d,b6060c4f6b1cf669b21b5d4f8b23efbe
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/radio.unity3d,4f2c80de666b97ea02084f059d2a5ed0
trCRM/upgradeRes4Publish/priority/lua/bio/BioType.lua,4667e9def8191cbf2b9dc25e928bc23f
@@ -67,36 +68,37 @@ trCRM/upgradeRes4Publish/other/uiAtlas/main/Android/icon_news.unity3d,3a1afa79db
trCRM/upgradeRes4Publish/priority/lua/public/CLLIncludeBase.lua,87bcfc58c6d99be6fe89102d7323c95e
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelResetPasswordStep1.unity3d,150f48b7b68e00e8b3e513ec2b75333a
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustStar.lua,ed39330cf68d1e1e062bc8311d1e8d44
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellExtendFieldRoot.lua,39703716cb222091e69ae0eefbf54f5f
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellExtendFieldRoot.lua,c38ffa7d9111dc4bedeaba97a6d5a661
trCRM/upgradeRes4Publish/other/uiAtlas/hotwheel/Android/hotWheel_bg.unity3d,b5d2bc7180f9d280014726814ec8b9fe
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPMine.lua,8ef3b142a4375bdb311d15f962a3a9f2
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPMine.lua,2dd00dde001dd24d01df96a841ce2f91
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_icon_5.unity3d,7edfb781be444c18d010e53386334015
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSysMsgDetail.unity3d,91e06baebc3ec7e9b2a5c108ced50b52
trCRM/upgradeRes4Publish/other/uiAtlas/main/Android/icon_me2.unity3d,6efa661cb74e62dfdc75bdbeaeeceb39
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellReportform1.lua,d31b42aa50089defb22bde59b5c0474d
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewFollow.lua,ef981e78f783343271b8c655f358084c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewFollow.lua,336ea3b9be70d8d1fff12f59c101193a
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/news_3.unity3d,5f130cc66d813a2b339757e8a31cee8c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPPopList.lua,896c4b35a6cd0d4f86ed5c0ba532ea00
trCRM/upgradeRes4Publish/priority/lua/ui/cell/CLLFrame2.lua,e25ce84ca55cd643d527d09cedd6228a
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/border.unity3d,bf2cd1f2bdb27efc9c2e27943dcb8974
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/me_about.unity3d,3da9c9416127c69bc20c281f44520f6e
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/new2_peo.unity3d,9c9562e576e93bacb7f2a0d0f08523ee
trCRM/upgradeRes4Publish/priority/lua/toolkit/MyUtl.lua,0fc6aaf236b8ee14c9660ddb68f63b1d
trCRM/upgradeRes4Publish/priority/lua/toolkit/MyUtl.lua,44306fc53f8711f95e0698e2613563cf
trCRM/upgradeRes4Publish/other/uiAtlas/coolape/Android/input.unity3d,b3ad3f57c51c02ff798a50a37d6c9cab
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellSysMessageList.lua,1ce46f4b3a1a8b728e447c12e7df1831
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/news_bg.unity3d,b13e253b3a1689bf665ea7c3edecc519
trCRM/upgradeRes4Publish/priority/lua/db/DBRoot.lua,c89d42f4c6ebe72da436e07ee70f69ad
trCRM/upgradeRes4Publish/priority/lua/db/DBRoot.lua,2de10366932579d84506e9ca7aff0971
trCRM/upgradeRes4Publish/other/uiAtlas/login/Android/log_sms.unity3d,8677ba455b4c85e5f1230986ff1032cf
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPSetting.lua,45f706ba538ab2b39364826b8fc7e214
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustFilter.lua,2fb22f9248e4af86ab42482151a5b141
trCRM/upgradeRes4Publish/other/uiAtlas/guid/Android/1.unity3d,7654268e7c4bc7cea47f584d306f503d
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewFollow.unity3d,3ee9577410d709f08bf37e7c9a2b19a1
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPopList.unity3d,a0ba753b0deecff9a85c8cd2b60013dd
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellProductList.lua,b2827429c70df8b7aa8e87451a96bf67
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPConnect.lua,e6c7e0aafd60eb1de8bf0ab7758bac11
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputCheckboxs.unity3d,eecf93435d855908ef5d364f5dcbaffd
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputCheckboxs.unity3d,a929e8a7fd7ba3bc89bdda0686b6d7dd
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSceneManager.unity3d,c83769673e1c0793d88547c05d20a82e
trCRM/upgradeRes4Publish/priority/ui/other/Android/Frame1.unity3d,622d3ea7e4f9aa1d11f6492cabffa445
trCRM/upgradeRes4Publish/priority/ui/panel/Android/ToastRoot.unity3d,28e85a4963ed89f85f2451670a154f04
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputText.unity3d,d27c231bd910b5d72c90a86efda2a660
trCRM/upgradeRes4Publish/priority/ui/panel/Android/ToastRoot.unity3d,412c3557a187689acaa1d79d7d555836
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPAbout.lua,ded7b5021b8837a537e426614cc2171e
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustProc.lua,3f9f33de3630a03463952058ba795128
trCRM/upgradeRes4Publish/priority/lua/ui/cell/CSCellBottomBtn.lua,afbf445995d42e012635f3d355ce6d9e
trCRM/upgradeRes4Publish/priority/lua/db/DBStatistics.lua,e64ad532dabb2cb70c4053e223770969
@@ -110,6 +112,7 @@ trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPSysMsgDetail.lua,6266494c653de
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/funnel.unity3d,cb6f2a2b14c53ed86c122a4da2c3984b
trCRM/upgradeRes4Publish/other/uiAtlas/login/Android/log_people.unity3d,7ff36c94c74e4a8e09e1896978c13381
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/remove.unity3d,b460d3a275be876e0cfa0ca96777260f
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelLoginCoolape.unity3d,efb09b206c444d66d10720371645049b
trCRM/upgradeRes4Publish/priority/lua/bio/BioOutputStream.lua,84fd65eb0d1a166e77447f61254d62b5
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/play2.unity3d,0b6ede536ea7b5084a1de22265b04840
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPResetPasswordStep2.lua,af8af3fde5f3526b36c48517a5da89d0
@@ -123,13 +126,17 @@ trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelLogin.unity3d,5cac11a555
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/msg.unity3d,7f98a936769044c856c6082beb3559e3
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/on_off.unity3d,69b1b8dfdfc0afecdd9fdd9dbd5fb98a
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellPopCheckbox.lua,25adbf58789186d43c15cfe65d2e8501
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPOrderList.lua,3655882d094b886c89c7e48099136a46
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/new2_notice.unity3d,8ccab8900911e68fc8e0b46f6c1e0372
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMask4Panel.unity3d,ed5e0d7cc2ba83e33435bddc760b5f9d
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMine.unity3d,1ec2853e1a8660c4cadcace8f333f5af
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMine.unity3d,11da82174234ef319918c3e06f3775d6
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPlaySoundRecord.unity3d,14e1a1da65735a1ac9a4256be49a4e40
trCRM/upgradeRes4Publish/priority/ui/other/Android/reportform2.unity3d,de5097255fc8126d368e9693106347dc
trCRM/upgradeRes4Publish/priority/lua/db/DBCust.lua,f5d617f7342053a0236bb93b9d1a1e46
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelOrderList.unity3d,ce405f9722a7c2ab354a4091d49faa62
trCRM/upgradeRes4Publish/other/uiAtlas/main/Android/icon_work.unity3d,8a889dc1fe3b56bff4435f441ce5580e
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPMain.lua,24f616b9384dc0eefa9955fabb1d05f1
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustListProc.unity3d,b2dd2f01b5ffbfc4db73c670c2eb4646
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustListProc.unity3d,5d32d590b8c5383f6c523b06132fb12f
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPFollowList.lua,42de16eb98a338177801da06f8fc5895
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPBackplate.lua,ae946f1cec5baad680f4e8a0f7e71223
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/new2_time.unity3d,16ca1ec9a44b8633ca032c3c8cdf1a9b
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/search.unity3d,7420a0a7cc725ff494761009ebe811d7
@@ -138,21 +145,22 @@ trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_head_bg.unity3d,20f535a
trCRM/upgradeRes4Publish/other/uiAtlas/icon/Android/company_1.unity3d,8ba9f20b736fb17e2f6ee414df072492
trCRM/upgradeRes4Publish/priority/lua/db/DBOrder.lua,076cfb6761ed5c0568690aa273d8ee37
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_icon_3.unity3d,651d81480c5ea1ff8aa4ccdf7e0a6058
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPopCheckBoxs.unity3d,ac475eab72569cc86cc098951c114716
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPopCheckBoxs.unity3d,d3a8693784b6cc7ff00ee50fc8625f69
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellGuidPage.lua,7b3c3f567c3e0d92065913101b08ddd0
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustFilter.unity3d,90d589021f3db8641b14920daf93f1dc
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelHotWheel.unity3d,7a3ae06303e65f59f15af5b906b7a471
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/myset_check.unity3d,d9092d78af855e769abff1223f650a9d
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellReportform2.lua,47ac1164b1ffb27397953ccb032fd2d7
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/new2_unread.unity3d,f1b29d8592cdd49f3a526be6b524ad9f
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewOrder.lua,cc63f363eb32dda89ab4e4b4956c0014
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewOrder.lua,38a15680b2d8765d9ba614c9a81c641d
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelModifyFiled.unity3d,331f7d063411e0c231eaeccee4df73d1
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewFollowSimple.unity3d,d0f73f4324743d77717668fdcda14680
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/news_1.unity3d,51120d82352e936df826b05696b89b19
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPCalender.lua,232cf2b7f74f088e8b44c4c47cda5e95
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/me_enterprise.unity3d,59d7dae785dea4fa88b52f40a8d167cf
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPResetPasswordStep1.lua,def4741f89df3925682e53df01bb70cc
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/cus_task.unity3d,a4f148630912414f1d5e94d5a6a02e2d
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelConfirm.unity3d,4526242a599f63c0bac766360a515e23
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelConfirm.unity3d,cc945b5bffde4fec044e5660d2a5fe82
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPPopCheckBoxs.lua,508171a924c113573b01a396e8217cc2
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelResetPasswordStep2.unity3d,c3e2e353bd7e604e384a3e9e35d37893
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/news_bg_num2.unity3d,bfdbfc9e1fd1f91de555c0801d278d25
@@ -169,20 +177,23 @@ trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustList.lua,473a578d9811d494d
trCRM/upgradeRes4Publish/other/uiAtlas/login/Android/log_bg.unity3d,a7398f0f48b3b469e31bea6dac45457e
trCRM/upgradeRes4Publish/priority/lua/ui/cell/CLLUICalenderDay.lua,6e7400e2dd535ced93960c1e18fa2458
trCRM/upgradeRes4Publish/other/uiAtlas/guid/Android/2.unity3d,6b83b2d5a2dfc1f08744077e669c3ed0
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellExtendField.lua,1b18f9bdb869156c26bc4f1131a2dd6c
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellExtendField.lua,be687e94841bf222fa7b0c6a7a591156
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_bg.unity3d,3b42ecd8d30203eb5dcc65cb3a0ad815
trCRM/upgradeRes4Publish/other/uiAtlas/coolape/Android/name.unity3d,f5b44185a57a97ce6971f20a4054d990
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPMyInfor.lua,6f9a3135448a4746c463a41295275c57
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMoreProc4Cust.unity3d,0a1669987fdd4ce81f5b7cba8ce77876
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_icon_4.unity3d,d1cf8069716943cc112a2946b22efddd
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelLoginCoolape.unity3d,efb09b206c444d66d10720371645049b
trCRM/upgradeRes4Publish/priority/lua/db/DBTextures.lua,fd2b6a27eee4bcec69b1fd1b4bec92ba
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/tips_2.unity3d,3ce2779b6bfbaef177e0446661ec2f82
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputDate.unity3d,126902c484a19b9f09e7bae17655611a
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputDate.unity3d,b9645fe9ff5972788d341acc70b7be30
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelFollowList.unity3d,74006579cdb0ea8b4e120e1b52dd5c55
trCRM/upgradeRes4Publish/other/uiAtlas/hotwheel/Android/loading.unity3d,2f74f17f1282c12ab63108377b4798e0
trCRM/upgradeRes4Publish/priority/lua/ui/cell/CLCellToast.lua,6e350721fca8167bd621df86ad982326
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSelectProduct.unity3d,d54579853bc1e958ced6fa6e3d928d2b
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelResetPasswordStep3.unity3d,2f18b6d6198b1678ba10a72dcdd1fbaa
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellProductSelected.lua,e7f4b1e06a54d5fa52cf9a4ed00f5233
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/write.unity3d,cbf2cca163ccc6839cf9154547edd6f8
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelStart.unity3d,50cfab21f360ee339c94b1111be09fef
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/button2.unity3d,1a48080b1d43367921fc09b430fffaf5
trCRM/upgradeRes4Publish/priority/lua/net/CLLNetSerialize.lua,30c24f11d46d7b887bf32177acb92c81
trCRM/upgradeRes4Publish/other/uiAtlas/order/Android/shut.unity3d,7a13d4859459f052143028b0656aef43
@@ -191,13 +202,13 @@ trCRM/upgradeRes4Publish/priority/lua/ui/cell/CLLFrame1.lua,1fd4e80adb13bd0d3cb0
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPSplash.lua,8ce0b645f948233e6328b20a07a5999c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPModifyFiled.lua,99b250c386ce8dad9c10c8f4fe9874f1
trCRM/upgradeRes4Publish/priority/lua/public/class.lua,cc0f201cc55c59f8bc8f623853382b9c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPTasks.lua,ad3d36656af6d646814046ff9059ab72
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CSPTasks.lua,778f0d663544d0b2379e87b50ea49031
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/new2_remind.unity3d,04a96d237c5e80ab044a54e7c063e368
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPResetPasswordStep3.lua,0d3be662e0a236b709d8f1f9d6b3321e
trCRM/upgradeRes4Publish/other/uiAtlas/login/Android/log_visible.unity3d,884f69f0dd0c2a58af5ad891f23e985e
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/myset_remind.unity3d,99a50a17b34f464693ac84d1c6f38966
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/check.unity3d,d11f6d5b126c6a0fbf34ced5734cb66f
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputPoplist.unity3d,7af548695c754297fbf27cfedeb54a14
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputPoplist.unity3d,99670420a41bf33b055763d28c547a26
trCRM/upgradeRes4Publish/other/uiAtlas/logo/Android/logo2.unity3d,1bddae3d3fe67d91fc6b5c6f9dbb0bea
trCRM/upgradeRes4Publish/priority/lua/cfg/DBCfg.lua,3d0e60dbcdaa61b8553eee17f4d68b32
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/limt.unity3d,d48f498211748b192a7b10a932aec8be
@@ -212,35 +223,39 @@ trCRM/upgradeRes4Publish/other/uiAtlas/login/Android/log_password.unity3d,6a41f0
trCRM/upgradeRes4Publish/other/uiAtlas/order/Android/add.unity3d,bf6728a3e41783ee7d63c130107a16e1
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPSysMsgList.lua,518461e7bf8f3b3420fa9377a23db86a
trCRM/upgradeRes4Publish/priority/www/baidumap.html,d210e48796dd96343f9c17bc1d230136
trCRM/upgradeRes4Publish/priority/ui/other/Android/EmptySpace.unity3d,b9f173d21c2bc1854fb84e50f11dbed8
trCRM/upgradeRes4Publish/other/uiAtlas/order/Android/upload.unity3d,a7cb722ecba5f405105f0cfda4695e74
trCRM/upgradeRes4Publish/other/uiAtlas/main/Android/icon_news2.unity3d,a35e85b68569bf1adc16bdee3a609fdd
trCRM/upgradeRes4Publish/priority/lua/public/CLLPool.lua,3e6a97eb07cfdff7c399eb3e956ba77c
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustFilter.lua,0725109e55276b5158f6ce642d28dfa6
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustFilter.lua,450e7e75ebfe83bb65d59beb3ce60782
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPWWWProgress.lua,b713ddf9f0af8602ec48f71162181d6d
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelEditPrice.unity3d,baa0e7f3e00e62b0d5cb5263d7583000
trCRM/upgradeRes4Publish/priority/lua/public/CLLStack.lua,579069654d88a15e43c818a6b8079b15
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelTasks.unity3d,003d70126d4efbaf73eb9bc83e4ba142
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelTasks.unity3d,2739446b89e4fb5c449abb46ff406785
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/phone.unity3d,36e34519b910a11de3531994f607a140
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelConfirm2.unity3d,d199779b559cef259ebbfe686ba42703
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/peo.unity3d,939edcb747217aa4b0deb1d9a34f16b8
trCRM/upgradeRes4Publish/priority/ui/other/Android/AlertRoot.unity3d,c30044a6e7bf14ddb7a87c4f51d1f073
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustList.unity3d,95f9affe3cc17545ceca81ac7124c322
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustList.unity3d,40fb760b32740191d3b4fa3f84de1720
trCRM/upgradeRes4Publish/priority/lua/toolkit/CLLUpdateUpgrader.lua,bfff3548aa7cd983c3de46e5defae423
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/more.unity3d,f05eafb34336f1fcb5d614ad30217011
trCRM/upgradeRes4Publish/priority/lua/db/DBMessage.lua,a80d8448cfdaebb072b3d7ec5f40bb60
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/on_off_bg.unity3d,96fcd3ce2ee9ffa2941973cefea6511d
trCRM/upgradeRes4Publish/priority/ui/other/Android/InputText.unity3d,7b419ca2ec17017ed14ac42561ab0a01
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/me_set.unity3d,c53cddeef8f62d67a2a4110447466536
trCRM/upgradeRes4Publish/priority/lua/toolkit/KKLogListener.lua,85784ec79aefde29be3ef308e7b5203b
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewFollowSimple.lua,720f3ff97d9b71a9108fd949bf779b30
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/380bg.unity3d,0634e3823e2492d32424733dd05779af
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/tips_1.unity3d,aca2dfb1fbece45c7333447195bc7efe
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustListProc.lua,1973dc8d949ed85e01b09aff328d1033
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPLogin.lua,f2ba83d01af3371bee83945f470facd5
trCRM/upgradeRes4Publish/other/uiAtlas/logo/Android/512.unity3d,c51445206c8f94af0fcbbe4befa8ae05
trCRM/upgradeRes4Publish/priority/lua/net/CLLNet.lua,947abdf2c019f44a26211acf6f31e2dd
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_icon_2.unity3d,3bcd13c7b2003a1bcf92aaa4d2dbf6fe
trCRM/upgradeRes4Publish/priority/lua/ui/cell/CLLUICalenderMonth.lua,16af9ed096ad6b902a156f6e0a20021f
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewCust.lua,48fffb94cf7ab94e6c0b2e542bf2d08e
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelPlaySoundRecord.unity3d,14e1a1da65735a1ac9a4256be49a4e40
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPNewCust.lua,c3f8563afb97d79992a35de8c3ee9ba6
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelMyInfor.unity3d,94f1b88c66705acd7f798affef48c540
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_icon_1.unity3d,41ae133fd4da0f2bf01316f91cf67fb8
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelStart.unity3d,50cfab21f360ee339c94b1111be09fef
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellEmptySpace.lua,42b2a61f171153603c9adda32bf7cb7d
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/log_bg.unity3d,fd1470749300ec31bcbe7f59686152d7
trCRM/upgradeRes4Publish/other/uiAtlas/work/Android/work_ranking.unity3d,9a0b0f94d60e9ff144193c83915b21fa
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSelectCompany.unity3d,2aa019a477ea5b160780ded080dc82ec
@@ -255,7 +270,7 @@ trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelGuid.unity3d,d58c2f53bba
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/check_full.unity3d,282038ef4b24e802b0c936877871200c
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/time.unity3d,38bf54e9fbf1c1d8af2cead294d1b61e
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/bg.unity3d,37a58d5a79d3691b2c32a74422721ee7
trCRM/upgradeRes4Publish/priority/lua/public/CLLInclude.lua,476b749169d54c4b08e8749743983d92
trCRM/upgradeRes4Publish/priority/lua/public/CLLInclude.lua,acd2930ce707586398f07b9586363436
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelSplash.unity3d,2691ddc66dff5da22fda3ffe11c897dd
trCRM/upgradeRes4Publish/other/uiAtlas/order/Android/ipt_bg.unity3d,89541a2aaed40069c1f0ce363c5a8e2a
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/kuang.unity3d,a6ce8e74b0631e79ce2e03f2fed3baea
@@ -264,13 +279,13 @@ trCRM/upgradeRes4Publish/other/uiAtlas/login/Android/log_no.unity3d,2ee604556b4f
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellMessageGroup.lua,14a960604f49e2b34e0c115561bb45a3
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPLogin.lua,e18549cd43b8e476b5c2d1414594c592
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/new2_bg_20.unity3d,8e81d4a650273e24b7f129d1f814f5fa
trCRM/upgradeRes4Publish/priority/atlas/Android/atlasAllReal.unity3d,6b50b4e4afbdc66704ed49d4b15135f9
trCRM/upgradeRes4Publish/priority/atlas/Android/atlasAllReal.unity3d,ea072d32d1080c13d24c10eb53dc010e
trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/star.unity3d,f9684ea4b4e3a4206fc898bc6e4651ab
trCRM/upgradeRes4Publish/priority/lua/ui/panel/CLLPHotWheel.lua,1760aa9933da4b421f1c6093d802cb4f
trCRM/upgradeRes4Publish/priority/lua/net/NetProto.lua,434601ac6cfd2ce441a0009f109f0757
trCRM/upgradeRes4Publish/priority/lua/net/NetProto.lua,3493f7ceb04a0b147ce63d323e3553af
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/me_opinion.unity3d,1935579d226c7400323115d8be90421d
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustDetail.lua,3fc6451c6f494803506287fc7a51e755
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustDetail.unity3d,7049ee32087377d48468ccee634e67c7
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPCustDetail.lua,e32c3b520335c1b2966d8a503518275c
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelCustDetail.unity3d,b22b74b2ee1d57cccbaa92c6971dd9df
trCRM/upgradeRes4Publish/other/uiAtlas/public/Android/choose.unity3d,e31379a28ab86046414db1fb23cd2bf6
trCRM/upgradeRes4Publish/priority/lua/ui/panel/TRPMoreProc4Cust.lua,cc11fe3b2530891e91e2c649762d06f8
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/myset_data.unity3d,70dd24370cd051acb45bab65464459ee
@@ -284,8 +299,9 @@ trCRM/upgradeRes4Publish/other/uiAtlas/cust/Android/cus_tel.unity3d,692b010c775f
trCRM/upgradeRes4Publish/other/uiAtlas/news/Android/news_2.unity3d,802f5fec3b39fb208b1bd8a400801081
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/myset_fingerprint.unity3d,de777211a380a09ea82e1092a9fba414
trCRM/upgradeRes4Publish/priority/ui/other/Android/reportform1.unity3d,5d061e9c5511ae3b978dbfe2be87f35e
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustList.lua,121935e641c34f4e3f9293381d7ff359
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewCust.unity3d,e1b7e9cecfa7c0104e475a8d84cc28db
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellCustList.lua,21f43d920caab4d30c9ce7f9a1255603
trCRM/upgradeRes4Publish/priority/lua/ui/cell/TRCellImage.lua,604691a3a96bbdb9cf88f20e2adf027c
trCRM/upgradeRes4Publish/priority/ui/panel/Android/PanelNewCust.unity3d,059a6d8bc6830d6eea05685f17829c14
trCRM/upgradeRes4Publish/other/uiAtlas/order/Android/system.unity3d,570fa72b2d385d604cc7c9f7516965da
trCRM/upgradeRes4Publish/priority/lua/json/rpc.lua,28c2f09ceb729d01052d8408eed0b57a
trCRM/upgradeRes4Publish/other/uiAtlas/mine/Android/myset_clean_up.unity3d,51e9fd3012fca7d448c3578c281bd15e

View File

@@ -180,11 +180,11 @@ public static class XluaGenCodeConfig
typeof(CLUIElement),
typeof(CLUIElementDate),
typeof(CLUIElementPopList),
typeof(InvokeEx),
//==========================
typeof(MyMain),
typeof(MyCfg),
typeof(NativeGallery),
typeof(NativeGalleryUtl),
typeof(LBSUtl),
typeof(MyWWWTexture),
typeof(MyLocation),
@@ -200,6 +200,9 @@ public static class XluaGenCodeConfig
typeof(CLUIPopListPanel),
typeof(CLUIScrollViewWithEvent),
typeof(Client4Stomp),
typeof(MyGallery),
typeof(NativeCamera),
typeof(MyCamera),
};
//C#静态调用Lua的配置包括事件的原型仅可以配delegateinterface

View File

@@ -539,7 +539,7 @@ MonoBehaviour:
autoResizeBoxCollider: 1
hideIfOffScreen: 0
keepAspectRatio: 0
aspectRatio: 1.3333334
aspectRatio: 0.48828125
--- !u!65 &447471687
BoxCollider:
m_ObjectHideFlags: 0
@@ -1143,7 +1143,7 @@ MonoBehaviour:
autoResizeBoxCollider: 0
hideIfOffScreen: 0
keepAspectRatio: 0
aspectRatio: 12
aspectRatio: 12.2
keepCrispWhenShrunk: 1
mTrueTypeFont: {fileID: 0}
mFont: {fileID: 7005176185871406937, guid: 7d76ebfe2dca9412195ae21f35d1b138, type: 3}

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: 6600cae924a2e47d1afe4667c36c4cf1
TextureImporter:
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 9
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 2
aniso: 1
mipBias: -100
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 2
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: 4
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 1
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
vertices: []
indices:
edges: []
weights: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1809,6 +1809,20 @@ MonoBehaviour:
paddingTop: 0
paddingBottom: 0
path: trCRM/upgradeRes4Dev/other/uiAtlas/order/system.png
- name: logo_512
x: 0
y: 0
width: 512
height: 512
borderLeft: 0
borderRight: 0
borderTop: 0
borderBottom: 0
paddingLeft: 0
paddingRight: 0
paddingTop: 0
paddingBottom: 0
path: trCRM/upgradeRes4Dev/other/uiAtlas/logo/512.png
mPixelSize: 1
mReplacement: {fileID: 0}
mCoordinates: 0

View File

@@ -27,7 +27,8 @@ DBCust.FilterGroup = {
custTypeList = "custTypeList", -- list 客户类型
dealFlagList = "dealFlagList", -- list 客户状态
loginNoList = "loginNoList", -- list 归属工号
taskList = "taskList" -- list 任务名称
taskList = "taskList", -- list 任务名称
followUpTypeList = "followUpTypeList" -- 跟进类型
}
DBCust.FieldType = {
@@ -37,7 +38,16 @@ DBCust.FieldType = {
number = "数字文本框",
dateTime = "时间文本框",
text = "普通文本框",
phone = "电话号码框"
phone = "电话号码框",
empty ="empty"
}
---@class _FieldMode
_FieldMode = {
inputOnly = 0, -- 纯输入
showOnly = 1, -- 纯展示模式
modifyOnly = 2, -- 修改模式
showAndModify = 3, -- 展示械式同时也可以modify
button = 4, -- 类似按钮的功能
}
DBCust.onGetFilter = function(data)

View File

@@ -4,12 +4,14 @@ require "db.DBCust"
require "db.DBStatistics"
require "db.DBUser"
require "db.DBOrder"
require "db.DBTextures"
---@class DBRoot
DBRoot = {}
DBRoot.db = {}
DBRoot.init = function()
DBMessage.init()
DBTextures.init()
NetProto.setReceiveCMDCallback(DBRoot.onReceiveData)
end
@@ -18,6 +20,7 @@ DBRoot.clean = function()
DBMessage.clean()
DBCust.clean()
DBStatistics.clean()
DBTextures.clean()
end
DBRoot.funcs = {

View File

@@ -0,0 +1,53 @@
DBTextures = {}
local db = {}
function DBTextures.init()
InvokeEx.cancelInvoke(DBTextures.releaseTimeout)
InvokeEx.invoke(DBTextures.releaseTimeout, 60)
end
function DBTextures.clean()
InvokeEx.cancelInvoke(DBTextures.releaseTimeout)
for k, v in ipairs(db) do
GameObject.DestroyImmediate(v)
end
db = {}
end
function DBTextures.releaseTimeout()
for k, v in ipairs(db) do
if DateEx.nowMS - v.lastUseTime > 300000 then
GameObject.DestroyImmediate(v.texture)
db[k] = nil
end
end
end
---@return UnityEngine.UnityWebRequest
function DBTextures.getByUrl(url, callback, orgs)
local tt = db[url]
if tt then
tt.lastUseTime = DateEx.nowMS
db[url] = tt
Utl.doCallback(callback, tt.texture, orgs)
return nil
end
local request =
WWWEx.get(
url,
nil,
CLAssetType.texture,
function(content)
db[url] = {texture = content, lastUseTime = DateEx.nowMS}
Utl.doCallback(callback, content, orgs)
end,
nil,
orgs,
true,
1
)
return request
end
return DBTextures

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0c5a5751e2f924a6abdab89e00841a0f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -241,6 +241,7 @@ NetProto.cmds = {
load_wfTicket_Settings = "load_WfTicket_Settings", -- 工单配置信息
selectProductInfo = "selectProductInfo", -- 商品列表
createWfInfo = "createWfInfo", -- 创建订单
create_followUp_task = "create_followUp_task", -- 创建跟进预约
}
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
@@ -566,5 +567,12 @@ NetProto.send.createWfInfo = function(workFlowInfo, callback, timeOutSec)
NetProto.sendSocket(content, callback, timeOutSec)
end
NetProto.send.create_followUp_task = function(followUpTaskJson, callback, timeOutSec)
local content = {}
content.action = NetProto.cmds.create_followUp_task
content.followUpTaskJson = followUpTaskJson
content.followUpTaskJson.groupId = NetProto.groupId
NetProto.sendSocket(content, callback, timeOutSec)
end
------------------------------------------------------
return NetProto

View File

@@ -261,7 +261,13 @@ Mp3PlayerByUrl = CS.Mp3PlayerByUrl
CLUICheckbox = CS.CLUICheckbox
---@type CLUIPopListPanel
CLUIPopListPanel = CS.CLUIPopListPanel
CLUIScrollViewWithEvent= CS.CLUIScrollViewWithEvent
CLUIScrollViewWithEvent = CS.CLUIScrollViewWithEvent
---@type MyGallery
MyGallery = CS.MyGallery
---@type NativeCamera
NativeCamera = CS.NativeCamera
---@type MyCamera
MyCamera = CS.MyCamera
-------------------------------------------------------
json = require("json.json")

View File

@@ -317,11 +317,13 @@ function hideTopPanel(p)
end
end
---@param go UnityEngine.GameObject
function SetActive(go, isActive)
if (go == nil) then
return
end
NGUITools.SetActive(go, isActive)
-- NGUITools.SetActive(go, isActive)
go:SetActive(isActive)
end
function getCC(transform, path, com)

View File

@@ -85,7 +85,7 @@ MyUtl.doCall = function(custId, phoneNo, cust)
hideHotWheel()
if content.success then
MyUtl.toastS("拨号成功!")
getPanelAsy("PanelNewFollow", onLoadedPanelTT, cust)
getPanelAsy("PanelNewFollowSimple", onLoadedPanelTT, cust)
end
end
)

View File

@@ -67,6 +67,7 @@ function _cell.uiEventDelegate(go)
local goName = go.name
if goName == "ButtonFollow" then
elseif goName == "ButtonTask" then
getPanelAsy("PanelNewFollowTask", onLoadedPanelTT, mData)
elseif goName == "ButtonContact" then
MyUtl.callCust(mData)
end

View File

@@ -0,0 +1,30 @@
-- xx单元
local _cell = {}
---@type Coolape.CLCellLua
local csSelf = nil
local transform = nil
local mData = nil
local uiobjs = {}
-- 初始化,只调用一次
function _cell.init(csObj)
csSelf = csObj
transform = csSelf.transform
---@type UIWidget
uiobjs.widget = csSelf:GetComponent("UIWidget")
end
-- 显示,
-- 注意c#侧不会在调用show时调用refresh
function _cell.show(go, data)
mData = data
uiobjs.widget.height = mData.height or 40
end
-- 取得数据
function _cell.getData()
return mData
end
--------------------------------------------
return _cell

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 60ac659ac409f43f6b5e7ec6133bf1cd
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,17 +1,20 @@
---@class _ParamFieldAttr
---@field id
---@field attrType
---@field ifMust boolean 1:true
---@field ifTime boolean 1:true
---@field cannotEdit
---@field attrName
---@field attrValue
---@field id
---@field checkMin
---@field checkMax
---@field popOptions
---@field popValues
---@field donotJoinKey boolean 是否要拼接key
---@field height numb 高度只有在emptyspace有用
---@class _ParamCellExtendFiled
---@field isEditMode boolean
---@field showMode _FieldMode
---@field attr _ParamFieldAttr
---@field onSelect function 当选择了poplist
---@field onClick function 当点击了输入框
@@ -39,10 +42,6 @@ function _cell.init(csObj)
uiobjs.spriteBg = getCC(transform, "Background", "UISprite")
end
-- if uiobjs.spriteBg then
-- uiobjs.spriteBg.width = NumEx.getIntPart(CSPMain.contentRect.z)
-- end
uiobjs.boxCollider = csSelf:GetComponent("BoxCollider")
---@type UIInput
uiobjs.input = csSelf:GetComponent("UIInput")
@@ -67,35 +66,6 @@ function _cell.show(go, data)
attr = mData.attr
attr.ifMust = attr.ifMust or 0
if data.isEditMode then
_cell.enabeldObj(uiobjs.boxCollider, true)
if uiobjs.Label then
uiobjs.Label.text = uiobjs.inputLabel
end
if uiobjs.input then
uiobjs.input.defaultText = uiobjs.inputLabel
end
_cell.enabeldObj(uiobjs.Label4, true)
_cell.enabeldObj(uiobjs.SpriteRight, true)
if uiobjs.ButtonReset then
uiobjs.ButtonReset.disabled = false
end
else
_cell.enabeldObj(uiobjs.boxCollider, false)
if uiobjs.Label then
uiobjs.Label.text = ""
end
if uiobjs.input then
uiobjs.input.defaultText = ""
end
_cell.enabeldObj(uiobjs.Label4, false)
_cell.enabeldObj(uiobjs.SpriteRight, false)
if uiobjs.ButtonReset then
uiobjs.ButtonReset.disabled = true
end
end
local jsonKey
if attr.donotJoinKey then
jsonKey = attr.id
@@ -114,7 +84,6 @@ function _cell.show(go, data)
uiobjs.checkbox.labeName.text = attr.attrName
end
_cell.enabeldObj(uiobjs.input, true)
if attr.attrType == DBCust.FieldType.text then
uiobjs.input.keyboardType = UIInput.KeyboardType.Default
elseif attr.attrType == DBCust.FieldType.number then
@@ -126,14 +95,15 @@ function _cell.show(go, data)
elseif attr.attrType == DBCust.FieldType.multext then
uiobjs.input.keyboardType = UIInput.KeyboardType.Default
elseif attr.attrType == DBCust.FieldType.dateTime then
_cell.enabeldObj(uiobjs.input, false)
local elementDate = csSelf:GetComponent("CLUIElementDate")
if elementDate then
elementDate.isSetTime = ((attr.ifTime and attr.ifTime == 1) and true or false)
end
elseif attr.attrType == DBCust.FieldType.checkbox then
_cell.enabeldObj(uiobjs.input, false)
local max = tonumber(attr.checkMax) or 0
uiobjs.checkbox.isMultMode = (max > 1) or (max == 0)
uiobjs.checkbox:init(attr)
elseif attr.attrType == DBCust.FieldType.popuplist then
_cell.enabeldObj(uiobjs.input, false)
if attr.popOptions then
uiobjs.popList:refreshItems(attr.popOptions, attr.popValues)
else
@@ -146,6 +116,9 @@ function _cell.show(go, data)
uiobjs.popList:refreshItems(array, array)
end
end
-- 设置展示的模式
_cell.setElementMode(mData.showMode or _FieldMode.inputOnly)
end
function _cell.enabeldObj(obj, val)
@@ -154,6 +127,123 @@ function _cell.enabeldObj(obj, val)
end
end
function _cell.setElementMode(mode)
local isPopList = uiobjs.popList
local isPopCheckbox = uiobjs.checkbox
---@type UIInput
local input = uiobjs.input
local inputOnGUI = csSelf:GetComponent("UIInputOnGUI")
local boxcollider = uiobjs.boxCollider
local ButtonReset = uiobjs.ButtonReset
if mode == _FieldMode.inputOnly then
_cell.enabeldObj(boxcollider, true)
_cell.enabeldObj(inputOnGUI, true)
_cell.enabeldObj(input, true)
if uiobjs.Label2 then
uiobjs.Label2.color = ColorEx.getColor(0xff999999)
end
if uiobjs.ButtonReset then
uiobjs.ButtonReset.disabled = false
end
if uiobjs.Label then
uiobjs.Label.text = uiobjs.inputLabel
end
if uiobjs.input then
uiobjs.input.defaultText = uiobjs.inputLabel
end
_cell.enabeldObj(uiobjs.Label4, true) -- multext
if
attr.attrType == DBCust.FieldType.dateTime or attr.attrType == DBCust.FieldType.checkbox or
attr.attrType == DBCust.FieldType.popuplist
then
_cell.enabeldObj(uiobjs.SpriteRight, true)
else
_cell.enabeldObj(uiobjs.SpriteRight, false)
end
elseif mode == _FieldMode.showOnly then
_cell.enabeldObj(boxcollider, false)
_cell.enabeldObj(inputOnGUI, false)
_cell.enabeldObj(input, false)
if uiobjs.Label2 then
uiobjs.Label2.color = ColorEx.getColor(0xff999999)
end
if uiobjs.ButtonReset then
uiobjs.ButtonReset.disabled = true
end
if uiobjs.Label then
uiobjs.Label.text = ""
end
if uiobjs.input then
uiobjs.input.defaultText = ""
end
_cell.enabeldObj(uiobjs.Label4, false)
_cell.enabeldObj(uiobjs.SpriteRight, false)
elseif mode == _FieldMode.modifyOnly then
_cell.enabeldObj(boxcollider, true)
_cell.enabeldObj(inputOnGUI, false)
_cell.enabeldObj(input, false)
if uiobjs.Label2 then
uiobjs.Label2.color = ColorEx.getColor(0xff999999)
end
if uiobjs.ButtonReset then
uiobjs.ButtonReset.disabled = true
end
if uiobjs.Label then
uiobjs.Label.text = uiobjs.inputLabel
end
if uiobjs.input then
uiobjs.input.defaultText = uiobjs.inputLabel
end
_cell.enabeldObj(uiobjs.Label4, true)
_cell.enabeldObj(uiobjs.SpriteRight, true)
elseif mode == _FieldMode.showAndModify then
_cell.enabeldObj(boxcollider, true)
_cell.enabeldObj(inputOnGUI, false)
_cell.enabeldObj(input, false)
if uiobjs.Label2 then
uiobjs.Label2.color = ColorEx.getColor(0xff999999)
end
if uiobjs.ButtonReset then
uiobjs.ButtonReset.disabled = true
end
if uiobjs.Label then
uiobjs.Label.text = ""
end
if uiobjs.input then
uiobjs.input.defaultText = ""
end
_cell.enabeldObj(uiobjs.Label4, false)
_cell.enabeldObj(uiobjs.SpriteRight, true)
elseif mode == _FieldMode.button then
_cell.enabeldObj(boxcollider, true)
_cell.enabeldObj(inputOnGUI, false)
_cell.enabeldObj(input, false)
if uiobjs.Label2 then
uiobjs.Label2.color = ColorEx.getColor(0xff363636)
end
if uiobjs.ButtonReset then
uiobjs.ButtonReset.disabled = true
end
if uiobjs.Label then
uiobjs.Label.text = ""
end
if uiobjs.input then
uiobjs.input.defaultText = ""
end
_cell.enabeldObj(uiobjs.Label4, false)
_cell.enabeldObj(uiobjs.SpriteRight, true)
end
-- 再次修正input
if
attr.attrType == DBCust.FieldType.dateTime or attr.attrType == DBCust.FieldType.checkbox or
attr.attrType == DBCust.FieldType.popuplist
then
_cell.enabeldObj(input, false)
end
end
-- 取得数据
function _cell.getData()
return mData
@@ -164,12 +254,12 @@ function _cell.uiEventDelegate(go)
-- 说明大文本框改变了
NGUITools.AddWidgetCollider(csSelf.gameObject, false)
uiobjs.Label4.enabled = (uiobjs.element.value == "" and true or false)
Utl.doCallback(mData.onMultTextInputChg, csSelf.gameObject)
Utl.doCallback(mData.onMultTextInputChg, uiobjs.element)
elseif
attr.attrType == DBCust.FieldType.number or attr.attrType == DBCust.FieldType.phone or
attr.attrType == DBCust.FieldType.text
then
Utl.doCallback(mData.onInputChange, csSelf.gameObject)
Utl.doCallback(mData.onInputChange, uiobjs.element)
end
end
@@ -178,9 +268,9 @@ function _cell.onNotifyLua(go)
attr.attrType == DBCust.FieldType.popuplist or attr.attrType == DBCust.FieldType.checkbox or
attr.attrType == DBCust.FieldType.dateTime
then
Utl.doCallback(mData.onSelect, csSelf.gameObject)
Utl.doCallback(mData.onSelect, uiobjs.element)
else
Utl.doCallback(mData.onClick, csSelf.gameObject)
Utl.doCallback(mData.onClick, uiobjs.element)
end
end

View File

@@ -15,6 +15,7 @@ local uiobjs = {}
local fieldsObjs = {}
local queue = CLLQueue.new()
local isLoading = false
local count = 0
-- 初始化,只调用一次
function _cell.init(csObj)
@@ -36,18 +37,6 @@ function _cell.show(go, data)
end
function _cell.refresh()
--[[
local taskId = tostring(cust.taskId)
if (not isFieldLoading) or taskId ~= oldtaskId then
isFieldLoading = true
oldtaskId = taskId
fields = DBCust.getFieldsByTask(taskId)
if fields and #fields > 0 then
showHotWheel()
_cell.initField(1, taskId)
end
end
]]
if queue:size() == 0 then
return
end
@@ -56,7 +45,9 @@ function _cell.refresh()
mData = queue:deQueue()
if mData.fields and #(mData.fields) > 0 then
showHotWheel()
_cell.initField(1)
for i, v in ipairs(mData.fields) do
_cell.initField(i)
end
else
_cell.onFinisInitFields()
end
@@ -73,6 +64,8 @@ function _cell.initField(index)
name = "InputMultText"
elseif fileAttr.attrType == DBCust.FieldType.checkbox then
name = "InputCheckboxs"
elseif fileAttr.attrType == DBCust.FieldType.empty then
name = "EmptySpace"
else
name = "InputText"
end
@@ -82,36 +75,45 @@ end
---@param go UnityEngine.GameObject
function _cell.onLoadField(name, go, orgs)
local index = orgs
go.transform.parent = transform
go.transform.localScale = Vector3.one
go.transform.localEulerAngles = Vector3.zero
---@type _ParamCellExtendFiled
local param = mData.fields[index]
local cell = go:GetComponent("CLCellLua")
SetActive(go, true)
if param.attr.attrType == DBCust.FieldType.multext then
-- 要设置一次
param.orgOnMultTextInputChg = param.onMultTextInputChg
param.onMultTextInputChg = _cell.onMultTextInputChg
end
cell:init(param, nil)
table.insert(fieldsObjs, cell)
uiobjs.Table:Reposition()
fieldsObjs[index] = cell
count = count + 1
Utl.doCallback(mData.onLoadOneField, cell)
if index == #(mData.fields) then
if count == #(mData.fields) then
_cell.onFinisInitFields()
else
_cell.initField(index + 1)
end
end
function _cell.onFinisInitFields()
isLoading = false
uiobjs.Table:Reposition()
for i, cell in ipairs(fieldsObjs) do
-- 在完成的时候时候再处理,是为了保证加进去的顺序不变
cell.transform.parent = transform
cell.transform.localScale = Vector3.one
cell.transform.localEulerAngles = Vector3.zero
SetActive(cell.gameObject, true)
uiobjs.Table:Reposition()
end
uiobjs.formRoot:setValue(mData.data)
uiobjs.Table.repositionNow = true
hideHotWheel()
Utl.doCallback(mData.onFinish, csSelf.gameObject)
_cell.refresh()
csSelf:invoke4Lua(
function()
Utl.doCallback(mData.onFinish, csSelf.gameObject)
isLoading = false
-- 再次处理
_cell.refresh()
end,
0.1
)
end
function _cell.release()
@@ -120,6 +122,7 @@ function _cell.release()
CLUIOtherObjPool.returnObj(v.gameObject)
end
fieldsObjs = {}
count = 0
end
function _cell.onMultTextInputChg(go)
@@ -139,5 +142,11 @@ function _cell.getData()
return mData
end
function _cell.OnDisable()
if #(fieldsObjs) > 0 then
printe("动态加载的字段没有释放")
end
end
--------------------------------------------
return _cell

View File

@@ -0,0 +1,69 @@
---@class _ParamCellImage
---@field path string
---@field onDelete function
-- xx单元
local _cell = {}
---@type Coolape.CLCellLua
local csSelf = nil
local transform = nil
---@type _ParamCellImage
local mData = nil
local uiobjs = {}
-- 初始化,只调用一次
function _cell.init(csObj)
csSelf = csObj
transform = csSelf.transform
---@type UITexture
uiobjs.texture = csSelf:GetComponent("UITexture")
end
-- 显示,
-- 注意c#侧不会在调用show时调用refresh
function _cell.show(go, data)
mData = data
local url
if startswith(mData.path, "/") then
url = joinStr("file://", mData.path)
else
url = mData.path
end
print(url)
if uiobjs.texture.mainTexture and uiobjs.texture.mainTexture.name == mData.path then
else
_cell.release()
DBTextures.getByUrl(url, _cell.onGetTextue, mData.path)
end
end
function _cell.onGetTextue(content, orgs)
if mData.path ~= orgs then
GameObject.DestroyImmediate(content)
content = nil
return
end
_cell.release()
content.name = orgs
uiobjs.texture.mainTexture = content
end
function _cell.release()
if uiobjs.texture.mainTexture ~= nil then
uiobjs.texture.mainTexture = nil
end
end
-- 取得数据
function _cell.getData()
return mData
end
function _cell.uiEventDelegate(go)
if go.name == "ButtonDel" then
Utl.doCallback(mData.onDelete, mData)
end
end
--------------------------------------------
return _cell

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b0b74c6ac6d214694bf232a299e48b6b
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -43,7 +43,7 @@ function CLLPStart.setLuasAtBegainning()
-- 日志监听
if ReporterMessageReceiver.self and ReporterMessageReceiver.self.gameObject then
-- if KKWhiteList.isWhiteName() then
ReporterMessageReceiver.self.gameObject:SetActive(false)
ReporterMessageReceiver.self.gameObject:SetActive(true)
-- else
-- ReporterMessageReceiver.self.gameObject:SetActive(false)
-- end

View File

@@ -80,6 +80,10 @@ function CSPMine.uiEventDelegate(go)
MyLocation.self:getMyLocation(CSPMine.onGetLocation)
elseif goName == "ButtonSetting" or goName == "ButtonMySetting" then
getPanelAsy("PanelSetting", onLoadedPanelTT)
elseif goName == "SpriteTopBg" then
getPanelAsy("PanelMyInfor", onLoadedPanelTT)
elseif goName == "ButtonAbout" then
getPanelAsy("PanelAbout", onLoadedPanelTT)
end
end

View File

@@ -154,9 +154,14 @@ function CSPTasks.setEventDelegate()
getPanelAsy("PanelCustList", onLoadedPanelTT)
end,
ButtonRecord = function()
getPanelAsy("PanelFollowList", onLoadedPanelTT)
end,
ButtonCustOcean = function()
end
end,
ButtonOrder = function()
getPanelAsy("PanelOrderList", onLoadedPanelTT)
end,
}
end
-- 处理ui上的事件例如点击等

View File

@@ -0,0 +1,136 @@
---@type IDBasePanel
local TRBasePanel = require("ui.panel.TRBasePanel")
---@class TRPAbout:TRBasePanel 邮件列表
local TRPAbout = class("TRPAbout", TRBasePanel)
local uiobjs = {}
-- 初始化,只会调用一次
function TRPAbout:init(csObj)
TRPAbout.super.init(self, csObj)
self:initFiledsAttr()
self:setEventDelegate()
MyUtl.setContentView(getChild(self.transform, "PanelContent"), 132 + 500, 0)
---@type UIScrollView
uiobjs.scrollView = getCC(self.transform, "PanelContent", "UIScrollView")
---@type UITable
uiobjs.Table = getCC(uiobjs.scrollView.transform, "Table", "UITable")
---@type CLUIFormRoot
uiobjs.TableForm = uiobjs.Table:GetComponent("CLUIFormRoot")
---@type Coolape.CLCellLua
uiobjs.TableLua = uiobjs.Table:GetComponent("CLCellLua")
end
function TRPAbout:initFiledsAttr()
---@type _ParamFieldAttr
local attr
self.baseFiledsAttr = {}
attr = {}
attr.attrName = "更新动态"
attr.id = "upgrade"
attr.attrType = DBCust.FieldType.text
attr.ifMust = 0
attr.donotJoinKey = true
table.insert(self.baseFiledsAttr, attr)
attr = {}
attr.attrName = "服务协议"
attr.id = "serviceAgreement"
attr.attrType = DBCust.FieldType.text
attr.ifMust = 0
attr.donotJoinKey = true
table.insert(self.baseFiledsAttr, attr)
attr = {}
attr.attrName = "发布评价"
attr.id = "assess"
attr.attrType = DBCust.FieldType.text
attr.ifMust = 0
attr.donotJoinKey = true
table.insert(self.baseFiledsAttr, attr)
end
-- 设置数据
---@param paras _ParamTRPAbout
function TRPAbout:setData(paras)
self.mdata = {}
end
-- 显示在c#中。show为调用refreshshow和refresh的区别在于当页面已经显示了的情况当页面再次出现在最上层时只会调用refresh
function TRPAbout:show()
---@type _ParamCellExtendFiledRoot
local fieldRootInfor = {}
fieldRootInfor.fields = {}
fieldRootInfor.data = self.mdata
fieldRootInfor.onFinish = self:wrapFunc(self.reposition)
for i, v in ipairs(self.baseFiledsAttr) do
---@type _ParamCellExtendFiled
local d = {}
d.attr = v
d.showMode = _FieldMode.button
d.onClick = self:wrapFunc(self.onClickField)
d.onSelect = self:wrapFunc(self.onSelectField)
table.insert(fieldRootInfor.fields, d)
end
uiobjs.TableLua:init(fieldRootInfor, nil)
end
---@param el CLUIElement
function TRPAbout:onClickField(el)
if el.jsonKey == "upgrade" then
-- 更新
elseif el.jsonKey == "serviceAgreement" then
-- 显示协议
elseif el.jsonKey == "assess" then
-- 评价(这个做起来麻烦)
end
end
function TRPAbout:onSelectField(go)
end
function TRPAbout:reposition()
uiobjs.Table:Reposition()
uiobjs.Table.repositionNow = true
uiobjs.scrollView:ResetPosition()
end
-- 刷新
function TRPAbout:refresh()
uiobjs.TableLua.luaTable.release()
end
-- 关闭页面
function TRPAbout:hide()
uiobjs.TableLua.luaTable.release()
end
-- 网络请求的回调cmd指命succ成功失败msg消息paras服务器下行数据
function TRPAbout:procNetwork(cmd, succ, msg, paras)
if (succ == NetSuccess) then
--[[
if cmd == xx then
end
]]
end
end
function TRPAbout:setEventDelegate()
self.EventDelegate = {}
end
-- 处理ui上的事件例如点击等
function TRPAbout:uiEventDelegate(go)
local func = self.EventDelegate[go.name]
if func then
func(go)
end
end
-- 当顶层页面发生变化时回调
function TRPAbout:onTopPanelChange(topPanel)
end
--------------------------------------------
return TRPAbout

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 77275b0fc303540009ae226937adc14b
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -246,6 +246,7 @@ function TRPCustDetail:setEventDelegate()
ButtonNewFollow = function()
end,
ButtonNewTask = function()
getPanelAsy("PanelNewFollowTask", onLoadedPanelTT, self.mdata)
end,
ButtonCall = function()
MyUtl.callCust(self.mdata)

View File

@@ -75,7 +75,7 @@ function TRPCustFilter:setData(paras)
end
d = {}
d.title = "任务类型"
d.title = "客户类型"
d.key = DBCust.FilterGroup.custTypeList
d.key2 = "custType"
d.list = DBCust.getFilter(DBCust.FilterGroup.custTypeList)

View File

@@ -0,0 +1,223 @@
---@type IDBasePanel
local TRBasePanel = require("ui.panel.TRBasePanel")
---@class TRPFollowList:TRBasePanel 邮件列表
local TRPFollowList = class("TRPFollowList", TRBasePanel)
local uiobjs = {}
-- 初始化,只会调用一次
function TRPFollowList:init(csObj)
TRPFollowList.super.init(self, csObj)
self:setEventDelegate()
MyUtl.setContentView(getChild(self.transform, "PanelContent"), 132 + 132 + 40, 0)
uiobjs.InputSeachKey = getCC(self.transform, "Top/InputSeachKey", "UIInput")
uiobjs.ButtonFilterSp = getCC(self.transform, "Top/ButtonFilter", "UISprite")
uiobjs.ButtonFilterLb = getCC(uiobjs.ButtonFilterSp.transform, "Label", "UILabel")
---@type CLUIScrollViewWithEvent
uiobjs.scrollView = getCC(self.transform, "PanelContent", "CLUIScrollViewWithEvent")
uiobjs.scrollView:init(
self:wrapFunc(self.onShowRefreshFlg),
self:wrapFunc(self.onhideRefreshFlg),
self:wrapFunc(self.refreshList)
)
---@type Coolape.CLUILoopGrid
uiobjs.Grid = getCC(uiobjs.scrollView.transform, "Grid", "CLUILoopGrid")
uiobjs.ButtonEndList = getChild(uiobjs.Grid.transform, "ButtonEndList")
uiobjs.ButtonEndListLb = getCC(uiobjs.ButtonEndList, "Label", "UILabel")
uiobjs.ButtonHeadList = getChild(uiobjs.Grid.transform, "ButtonHeadList")
end
-- 设置数据
---@param paras _ParamTRPFollowList
function TRPFollowList:setData(paras)
self.mdata = paras
end
-- 显示在c#中。show为调用refreshshow和refresh的区别在于当页面已经显示了的情况当页面再次出现在最上层时只会调用refresh
function TRPFollowList:show()
uiobjs.InputSeachKey.value = ""
self:refreshFilterBtnStatus()
self:showList({})
showHotWheel()
NetProto.send.list_customers(self.filterValue, "", 1)
end
function TRPFollowList:showList(list)
SetActive(uiobjs.ButtonHeadList.gameObject, false)
SetActive(uiobjs.ButtonEndList.gameObject, false)
uiobjs.Grid:setList(
list or {},
self:wrapFunc(self.initCell),
self:wrapFunc(self.onHeadList),
self:wrapFunc(self.onEndList)
)
uiobjs.scrollView:ResetPosition()
end
function TRPFollowList:appList(list)
SetActive(uiobjs.ButtonEndList.gameObject, false)
uiobjs.Grid:appendList(list)
end
function TRPFollowList:onShowRefreshFlg()
-- printe("TRPFollowList:onShowRefreshFlg")
uiobjs.ButtonHeadList.transform.localPosition = Vector3(0, 395, 0)
SetActive(uiobjs.ButtonHeadList.gameObject, true)
end
function TRPFollowList:onhideRefreshFlg()
-- printe("TRPFollowList:onhideRefreshFlg")
SetActive(uiobjs.ButtonHeadList.gameObject, false)
end
function TRPFollowList:refreshList()
local queryKey = uiobjs.InputSeachKey.value
showHotWheel()
NetProto.send.list_customers(self.filterValue, queryKey, 1)
end
function TRPFollowList:onHeadList(head)
printw("到最顶端了")
-- uiobjs.ButtonHeadList.transform.localPosition = Vector3(0, 250, 0)
-- SetActive(uiobjs.ButtonHeadList.gameObject, true)
end
function TRPFollowList:onEndList(tail)
printw("到最后了==" .. tail.name)
if self.pageInfo and self.pageInfo.current_page < self.pageInfo.total_pages then
local queryKey = uiobjs.InputSeachKey.value
showHotWheel()
-- 取得下一页
NetProto.send.list_customers(self.filterValue, queryKey, self.pageInfo.current_page + 1)
else
uiobjs.ButtonEndList.localPosition = tail.transform.localPosition + Vector3.up * -335
SetActive(uiobjs.ButtonEndList.gameObject, true)
end
end
function TRPFollowList:initCell(cell, data)
cell:init(data, self:wrapFunc(self.onClickCell))
end
function TRPFollowList:onClickCell(cell, data)
getPanelAsy("PanelCustDetail", onLoadedPanelTT, data)
end
function TRPFollowList:refreshFilterBtnStatus()
if self:hadFilterVal() then
uiobjs.ButtonFilterLb.color = ColorEx.getColor(0xff2990dc)
uiobjs.ButtonFilterSp.color = ColorEx.getColor(0xff2990dc)
uiobjs.ButtonFilterSp.spriteName = "cust_funnel"
else
uiobjs.ButtonFilterLb.color = ColorEx.getColor(0xff999999)
uiobjs.ButtonFilterSp.color = ColorEx.getColor(0xff999999)
uiobjs.ButtonFilterSp.spriteName = "cust_screen"
end
end
function TRPFollowList:hadFilterVal()
for i, v in ipairs(self.filters or {}) do
for j, f in ipairs(v.list) do
if f.selected then
return true
end
end
end
return false
end
-- 刷新
function TRPFollowList:refresh()
end
-- 关闭页面
function TRPFollowList:hide()
self.filterValue = nil
end
-- 网络请求的回调cmd指命succ成功失败msg消息paras服务器下行数据
function TRPFollowList:procNetwork(cmd, succ, msg, paras)
if (succ == NetSuccess) then
if cmd == NetProto.cmds.list_customers then
local result = paras.result or {}
self.pageInfo = result.meta
if self.pageInfo and self.pageInfo.current_page > 1 then
self:appList(result.data)
else
self:showList(result.data)
end
hideHotWheel()
elseif cmd == NetProto.cmds.update_customer then
uiobjs.Grid:refreshContentOnly()
elseif cmd == NetProto.cmds.save_customer then
self:refreshList()
end
end
end
function TRPFollowList:setEventDelegate()
self.EventDelegate = {
ButtonAddCust = function()
getPanelAsy("PanelNewCust", onLoadedPanelTT)
end,
ButtonFilter = function()
getPanelAsy(
"PanelCustFilter",
onLoadedPanelTT,
{
callback = self:wrapFunc(self.onSetFilter),
queryKey = uiobjs.InputSeachKey.value,
defautFilter = self.filters
}
)
end,
InputSeachKey = function()
local queryKey = uiobjs.InputSeachKey.value
NetProto.send.list_customers(self.filterValue, queryKey, 1)
end
}
end
function TRPFollowList:getFilterStr()
if not self.filters then
return ""
end
local ret = {}
for i, g in ipairs(self.filters) do
local list = {}
for j, f in ipairs(g.list) do
if f.selected and f.value ~= -1 then
table.insert(list, f.value)
end
end
ret[g.key2] = table.concat(list, ",")
end
return ret
end
function TRPFollowList:onSetFilter(filters, queryKey)
local oldqueryKey = uiobjs.InputSeachKey.value
uiobjs.InputSeachKey.value = queryKey
self.filters = filters
self:refreshFilterBtnStatus()
local queryKey = uiobjs.InputSeachKey.value
queryKey = trim(queryKey)
showHotWheel()
self.filterValue = self:getFilterStr()
if oldqueryKey == queryKey then
NetProto.send.list_customers(self.filterValue, queryKey, 1)
else
-- 会触发input的onChange事件
end
end
-- 处理ui上的事件例如点击等
function TRPFollowList:uiEventDelegate(go)
local func = self.EventDelegate[go.name]
if func then
func()
end
end
-- 当顶层页面发生变化时回调
function TRPFollowList:onTopPanelChange(topPanel)
end
--------------------------------------------
return TRPFollowList

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9c4440fd5b0834ec99547d54ad460778
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Some files were not shown because too many files have changed in this diff Show More