Files
LayaNative2.0/Conch/build/conchRuntime/proj.ios/conchRuntime/conchRuntime.mm
T
2020-11-11 16:17:13 +08:00

871 lines
32 KiB
Plaintext

#import "conchRuntime.h"
#import <util/JCColor.h>
#import "../../../../source/conch/JCScriptRuntime.h"
#import "../../../../source/conch/CToObjectC.h"
#import "conchConfig.h"
#import "LayaToast.h"
#import "Notification/LayaNotifyManager.h"
#import <downloadCache/JCIosFileSource.h>
#import "../../../../source/conch/JCConch.h"
#import "../../../../source/conch/Audio/JCAudioManager.h"
#import "../../../../source/conch/JSWrapper/JSInterface/JSInterface.h"
#import "LayaEditBoxDelegate.h"
#import "LayaEditBox.h"
#import "TouchFilter.h"
#import "Audio/JCMp3Player.h"
#import "LayaWebView.h"
#import "Reachability/Reachability.h"
#import "LayaAlert.h"
#import "CToObjectCIOS.h"
#import "Reflection/refection.h"
#import <AudioToolBox/AudioSession.h>
#import "LayaDeviceSensor.h"
#import <resource/JCFileResManager.h>
#import "JCSystemConfig.h"
#import "LayaVideoPlayer.h"
@implementation FuncObj
-(id)init:(std::function<void(void)>)func
{
self = [super init];
if( self != nil)
{
m_Fuction = func;
return self;
}
return nil;
}
@end
@implementation conchRuntime
extern bool g_bGLCanvasSizeChanged;
extern int g_nInnerWidth;
extern int g_nInnerHeight;
extern std::string gRedistPath;
extern std::string gResourcePath;
extern std::string gAssetRootPath;
extern bool gbBackground;
//------------------------------------------------------------------------------
static conchRuntime* g_pIOSConchRuntime = nil;
laya::JCConch* m_pConchEngine = NULL;
+(conchRuntime*)GetIOSConchRuntime
{
return g_pIOSConchRuntime;
}
-(id)initWithView:(GLKView*)pGLView EAGLContext:(EAGLContext*) pGLContext downloadThreadNum:(int)nDownloadThreadNum URL:(NSString*)pUrl
{
self = [super init];
if( self != nil )
{
if (pUrl != nil)
{
g_kSystemConfig.m_strStartURL = pUrl.UTF8String;
}
m_bEngineInited = false;
m_pGLKView = nil;
m_pGLContext = nil;
m_pConchEngine = NULL;
m_pTouchFilter = NULL;
for( int i = 0; i < 10; i++ )
{
m_vTouch[i] = NULL;
}
m_nTouchCount = 0;
m_nGLViewOffset = 0;
m_pEditBox = NULL;
m_pEditBoxDelegate = NULL;
m_pMp3Player = NULL;
m_pWebView = NULL;
m_pNetworkListener = NULL;
m_fRetinaValue = 1;
m_nsRootResourcePath = nil;
m_nsRootCachePath = nil;
m_pNSTimer = nil;
m_bIgnoreCurEvent = false;
m_fIOSVersion = 0;
g_pIOSConchRuntime = self;
m_pJSRunLoop = nil;
m_pLayaAlert=[[LayaAlert alloc]init];
m_pReflection = [[Reflection alloc] init];
[self setConchRuntimeParam:pGLView EAGLContext:pGLContext downloadThreadNum:nDownloadThreadNum];
m_nCurrentOrientation=-1;
m_bStopEngine=false;
return self;
}
return nil;
}
-(id)initWithView:(GLKView*)pGLView EAGLContext:(EAGLContext*) pGLContext downloadThreadNum:(int)nDownloadThreadNum;
{
self = [self initWithView:pGLView EAGLContext:pGLContext downloadThreadNum:nDownloadThreadNum URL:nil];
if( self != nil )
{
return self;
}
return nil;
}
-(void)setConchRuntimeParam:(GLKView*)pGLView EAGLContext:(EAGLContext*) pGLContext downloadThreadNum:(int)nDownloadThreadNum;
{
float fIOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
//获得retina屏的缩放值
float fRetinaValue = [UIScreen mainScreen].scale;
float fIosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if( fIosVersion >= 8.0 )
fRetinaValue = [UIScreen mainScreen].nativeScale;
m_pGLKView = pGLView;
m_pGLContext = pGLContext;
m_fRetinaValue = fRetinaValue;
m_nsRootResourcePath = [self getResourcePath];
m_nsRootCachePath = [self getRootCachePath];
NSLog(@"AppVersion=%@",[conchConfig GetInstance]->m_sAppVersion );
if( [conchConfig GetInstance]->m_bNotification)
{
[[LayaNotifyManager GetInstance]deleteAllNotify];
}
m_pTouchFilter = new JCTouchFilter();
m_nTouchCount = 0;
m_fIOSVersion = fIosVersion;
m_pResolution = new CGPoint();
CGRect kRect = [UIScreen mainScreen].bounds;
int nOrientationType = [conchConfig GetInstance]->m_nOrientationType;
if( ( nOrientationType & UIInterfaceOrientationMaskLandscapeLeft ) == UIInterfaceOrientationMaskLandscapeLeft ||
( nOrientationType & UIInterfaceOrientationMaskLandscapeRight ) == UIInterfaceOrientationMaskLandscapeRight )
{
m_pResolution->x = MAX( kRect.size.width , kRect.size.height );
m_pResolution->y = MIN( kRect.size.width , kRect.size.height );
}
//竖屏
else if( ( nOrientationType & UIInterfaceOrientationMaskPortrait ) == UIInterfaceOrientationMaskPortrait ||
( nOrientationType & UIInterfaceOrientationMaskPortraitUpsideDown ) == UIInterfaceOrientationMaskPortraitUpsideDown )
{
m_pResolution->x = MIN( kRect.size.width , kRect.size.height );
m_pResolution->y = MAX( kRect.size.width , kRect.size.height );
}
[self initNetworkListener];
int nNetworkState = [self checkNetworkState];
[self onGLReady:m_pResolution->x*m_fRetinaValue height:m_pResolution->y*m_fRetinaValue downloadThreadNum:nDownloadThreadNum];
m_nGLViewOffset = 0;
m_pGLKView.multipleTouchEnabled = true;
m_pEditBoxDelegate = [[LayaEditBoxDelegate alloc]init];
[m_pEditBoxDelegate setRetinaValue:m_fRetinaValue];
m_pEditBox = [[LayaEditBox alloc]initWithParentView:m_pGLKView EditBoxDelegate:m_pEditBoxDelegate ScreenRatio:m_fRetinaValue ];
m_pMp3Player = [[JCMp3Player alloc] init];
[self initExternalWebview];
// 注册监听键盘弹出的事件
[[NSNotificationCenter defaultCenter] addObserver:m_pEditBoxDelegate
selector:@selector(keyboardWasShown:)
name:UIKeyboardWillShowNotification
object:nil];
// 注册监听键盘弹出完成的事件
[[NSNotificationCenter defaultCenter] addObserver:m_pEditBoxDelegate
selector:@selector(keyboardWasShownEnd:)
name:UIKeyboardDidShowNotification
object:nil];
// 注册屏幕方向改变的事件
[[NSNotificationCenter defaultCenter] addObserver:m_pEditBoxDelegate
selector:@selector(orientChange:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientChange:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
/*[[NSNotificationCenter defaultCenter] addObserver:m_pEditBoxDelegate
selector:@selector(changeValue:)
name:@"changeValue" object:nil];*/
//[m_pEditBox->m_pEditBox addTarget:m_pEditBoxDelegate action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
if ([[[UIDevice currentDevice] systemVersion] intValue] > 5) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:UIApplicationDidBecomeActiveNotification object:nil];
}
else {
//AudioSessionInitialize(NULL, NULL, AudioEngineInterruptionListenerCallback, NULL);
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
// initialize the default values of LayaVideoPlayer
[LayaVideoPlayer setCurParentView: pGLView withRetianValue:m_fRetinaValue];
}
void AudioEngineInterruptionListenerCallback(void* user_data, UInt32 interruption_state)
{
ALCcontext *context = JCAudioManager::GetInstance()->m_pWavPlayer->m_pContext;
if (kAudioSessionBeginInterruption == interruption_state)
{
alcMakeContextCurrent(nullptr);
}
else if (kAudioSessionEndInterruption == interruption_state)
{
OSStatus result = AudioSessionSetActive(true);
if (result) NSLog(@"Error setting audio session active! %d\n", result);
alcMakeContextCurrent(context);
}
}
-(void)handleInterruption:(NSNotification*)notification
{
static bool resumeOnBecomingActive = false;
ALCcontext *context = JCAudioManager::GetInstance()->m_pWavPlayer->m_pContext;
if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) {
NSInteger reason = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] integerValue];
if (reason == AVAudioSessionInterruptionTypeBegan) {
alcMakeContextCurrent(NULL);
}
if (reason == AVAudioSessionInterruptionTypeEnded) {
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
NSError *error = nil;
[[AVAudioSession sharedInstance] setActive:YES error:&error];
alcMakeContextCurrent(context);
laya::JCScriptRuntime::s_JSRT->restoreAudio();
} else {
resumeOnBecomingActive = true;
}
}
}
if ([notification.name isEqualToString:UIApplicationDidBecomeActiveNotification] && resumeOnBecomingActive) {
resumeOnBecomingActive = false;
NSError *error = nil;
BOOL success = [[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryAmbient
error: &error];
if (!success) {
printf("set audio session failed.\n");
return;
}
[[AVAudioSession sharedInstance] setActive:YES error:&error];
alcMakeContextCurrent(context);
laya::JCScriptRuntime::s_JSRT->restoreAudio();
}
}
-(void)renderFrame
{
if( laya::JCConch::s_pConchRender)
laya::JCConch::s_pConchRender->renderFrame(0,false);
}
-(void)onVsync:(double)vsyncTmMs{
if(laya::JCScriptRuntime::s_JSRT){
laya::JCScriptRuntime::s_JSRT->onVSyncEvent(vsyncTmMs);
}
}
-(void) initExternalWebview
{
m_pWebView = [[LayaWebView alloc] init];
[m_pGLKView addSubview:m_pWebView->m_pWebView];
}
-(void) initNetworkListener
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:LayakReachabilityChangedNotification object:nil];
m_pNetworkListener=[LayaReachability reachabilityForInternetConnection];
[m_pNetworkListener startNotifier];
}
//------------------------------------------------------------------------------
-(NSString*) getRootCachePath
{
NSString* sAppDirctory = NSHomeDirectory();
NSString* sDownloadRootPath = [ NSString stringWithFormat: @"%@/Library/Caches/", sAppDirctory ];
return sDownloadRootPath;
}
//------------------------------------------------------------------------------
-(NSString*) getResourcePath
{
return [[NSBundle mainBundle] resourcePath];
}
//------------------------------------------------------------------------------
-(void)destory
{
if( m_pConchEngine != NULL )
{
m_bStopEngine = true;
m_pConchEngine->onAppDestory();
delete m_pConchEngine;
m_pConchEngine = NULL;
}
}
- (void)dealloc
{
if( m_pConchEngine != NULL )
{
delete m_pConchEngine;
m_pConchEngine = NULL;
}
[[NSNotificationCenter defaultCenter] removeObserver:m_pEditBoxDelegate name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:m_pEditBoxDelegate name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:m_pEditBoxDelegate name:UIDeviceOrientationDidChangeNotification object:nil];
//移除网络监控
[m_pNetworkListener stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionInterruptionNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
}
//------------------------------------------------------------------------------
- (void)didReceiveMemoryWarning
{
if(laya::JCScriptRuntime::s_JSRT){
laya::JCScriptRuntime::s_JSRT->jsGC();
laya::JCScriptRuntime::s_JSRT->jsGC();
}
}
//------------------------------------------------------------------------------
-(void) onGLReady:(int)p_nWidth height:(int)p_nHeight downloadThreadNum:(int)nDownloadThreadNum
{
if( m_bEngineInited == false )
{
NSLog(@"=============onGLReady width=%d,height=%d",p_nWidth,p_nHeight );
g_nInnerWidth = p_nWidth;
g_nInnerHeight = p_nHeight;
gRedistPath = [m_nsRootCachePath cStringUsingEncoding:NSUTF8StringEncoding];
const char* sResourcePath = [m_nsRootResourcePath cStringUsingEncoding:NSUTF8StringEncoding];
laya::JCIosFileSource* pRedistFileResource = new laya::JCIosFileSource();
gResourcePath = sResourcePath;
gResourcePath += "/";
gAssetRootPath= gResourcePath+"/cache/";
pRedistFileResource->Init( gResourcePath.c_str() );
laya::JCConch::s_pAssetsFiles = pRedistFileResource;
m_pConchEngine = new laya::JCConch(nDownloadThreadNum,laya::JS_DEBUG_MODE_OFF,0);
m_pConchEngine->onAppStart();
laya::JCConch::s_pConchRender->onGLReady();
m_bEngineInited = true;
}
}
//-------------------------------------------------------------------------------
- (int) AddTouchToArray:(UITouch*)p_pTouch
{
if( m_nTouchCount < 10 )
{
for( int i = 0; i < 10 ;i++ )
{
if( m_vTouch[i] == NULL )
{
m_vTouch[i] = p_pTouch;
m_nTouchCount++;
return i;
}
}
}
return -1;
}
//-------------------------------------------------------------------------------
- (int) RemoveTouchToArray:(UITouch*)p_pTouch
{
if( m_nTouchCount > 0 )
{
for( int i = 0; i < 10 ;i++ )
{
if( m_vTouch[i] == p_pTouch )
{
m_vTouch[i] = NULL;
m_nTouchCount--;
return i;
}
}
for( int i = 0; i < 10 ;i++ )
{
m_vTouch[i] = NULL;
}
m_nTouchCount=0;
}
return -1;
}
//-------------------------------------------------------------------------------
- (int) FindTouchToArray:(UITouch*)p_pTouch
{
if( m_nTouchCount > 0 )
{
for( int i = 0; i < 10 ;i++ )
{
if( m_vTouch[i] == p_pTouch )
{
return i;
}
}
}
return -1;
}
//-------------------------------------------------------------------------------
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet* allTouches = [event allTouches];
int nCount = (int)[allTouches count];
//如果<=0 就发送down
if( m_nTouchCount <= 0 )
{
//第一个手指
IOSTouch kIOSTouch;
kIOSTouch.m_nType = TOUCH_BEGAIN;
//不是第一个手指
IOSTouch kIOSTouchPD;
kIOSTouchPD.m_nType = ACTION_POINTER_DOWN;
int nNum = 0;
for( int i = 0 ; i < nCount ;i++ )
{
UITouch* pSysTouch = [[allTouches allObjects] objectAtIndex:i];
CGPoint kTouchLocation = [pSysTouch locationInView:[pSysTouch view]];
int nID = [self AddTouchToArray:pSysTouch];
if( nID != -1 )
{
//第一个手指是发送 TOUCH_BEGAIN
if( i == 0 )
{
kIOSTouch.m_nID[0] = nID;
kIOSTouch.m_nX[0] = kTouchLocation.x;
kIOSTouch.m_nY[0] = kTouchLocation.y;
}
//剩下的发送 POINTER_DOWN
else
{
if( nNum >= TOUCH_EVENT_SIZE )
{
NSLog(@"can't support touch num > %d",TOUCH_EVENT_SIZE);
}
kIOSTouchPD.m_nID[nNum] = nID;
kIOSTouchPD.m_nX[nNum] = kTouchLocation.x;
kIOSTouchPD.m_nY[nNum] = kTouchLocation.y;
nNum++;
}
}
}
//发送 TOUCH_BEGAIN
kIOSTouch.m_nCount = 1;
[self sendTouchEvent:kIOSTouch ratio:m_fRetinaValue offset:m_nGLViewOffset];
//发送 POINTER_DOWN
if( nNum > 0 )
{
kIOSTouchPD.m_nCount = nNum;
[self sendTouchEvent:kIOSTouch ratio:m_fRetinaValue offset:m_nGLViewOffset];
}
}
else
{
IOSTouch kIOSTouch;
kIOSTouch.m_nType = ACTION_POINTER_DOWN;
int nNum = 0;
for( int i = 0 ; i < nCount ;i++ )
{
UITouch* pSysTouch = [[allTouches allObjects] objectAtIndex:i];
if( [self FindTouchToArray:pSysTouch ] == -1 )
{
CGPoint kTouchLocation = [pSysTouch locationInView:[pSysTouch view]];
int nID = [self AddTouchToArray:pSysTouch];
if( nID != -1 )
{
if( nNum >= TOUCH_EVENT_SIZE )
{
NSLog(@"can't support touch num > %d",TOUCH_EVENT_SIZE);
}
kIOSTouch.m_nID[nNum] = nID;
kIOSTouch.m_nX[nNum] = kTouchLocation.x;
kIOSTouch.m_nY[nNum] = kTouchLocation.y;
nNum++;
}
}
}
kIOSTouch.m_nCount = nNum;
[self sendTouchEvent:kIOSTouch ratio:m_fRetinaValue offset:m_nGLViewOffset];
}
}
//-------------------------------------------------------------------------------
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet* allTouches = [event allTouches];
int nCount = (int)[allTouches count];
IOSTouch kIosTouch;
kIosTouch.m_nCount = nCount;
kIosTouch.m_nType = TOUCHE_MOVED;
for( int i = 0 ; i < nCount ;i++ )
{
UITouch* pSysTouch = [[allTouches allObjects] objectAtIndex:i];
CGPoint kTouchLocation = [pSysTouch locationInView:[pSysTouch view]];
kIosTouch.m_nID[i] = [self FindTouchToArray:pSysTouch];
kIosTouch.m_nX[i] = kTouchLocation.x;
kIosTouch.m_nY[i] = kTouchLocation.y;
}
[self sendTouchEvent:kIosTouch ratio:m_fRetinaValue offset:m_nGLViewOffset];
}
-(void) sendTouchEvent:(IOSTouch&) p_kTouch ratio:(float)p_fRatio offset:(int)p_nViewOffset
{
if(m_bIgnoreCurEvent)
{
return;
}
m_pTouchFilter->onTouchEvent( p_kTouch, p_fRatio,p_nViewOffset );
}
//-------------------------------------------------------------------------------
- (void)HandleTouchEnd:(NSSet*)allTouches state:(int)p_nState
{
int nCount = (int)[allTouches count];
int nNum = 0;//要发送 pointer_up 的总数
IOSTouch kIOSTouch;
kIOSTouch.m_nType = ACTION_POINTER_UP;
IOSTouch kLastTouch;//要发送的end
kLastTouch.m_nType = TOUCHE_END;
kLastTouch.m_nCount = 1;
for( int i = 0 ; i < nCount ;i++ )
{
UITouch* pSysTouch = [[allTouches allObjects] objectAtIndex:i];
if( p_nState == -1 || pSysTouch.phase == p_nState )
{
CGPoint kTouchLocation = [pSysTouch locationInView:[pSysTouch view]];
int nID = [self RemoveTouchToArray:pSysTouch];
if( nID != -1 )
{
if( m_nTouchCount <= 0 )
{
kLastTouch.m_nID[0] = nID;
kLastTouch.m_nX[0] = kTouchLocation.x;
kLastTouch.m_nY[0] = kTouchLocation.y;
break;
}
else
{
kIOSTouch.m_nID[nNum] = nID;
kIOSTouch.m_nX[nNum] = kTouchLocation.x;
kIOSTouch.m_nY[nNum] = kTouchLocation.y;
nNum++;
}
}
else
{
NSLog(@"Can't find this touch pointer!!");
}
}
}
if(nNum>0)
{
kIOSTouch.m_nCount = nNum;
[self sendTouchEvent:kIOSTouch ratio:m_fRetinaValue offset:m_nGLViewOffset];
}
//发送最后一个
if( m_nTouchCount <= 0 )
{
[self sendTouchEvent:kLastTouch ratio:m_fRetinaValue offset:m_nGLViewOffset];
}
}
//-------------------------------------------------------------------------------
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet* allTouches = [event allTouches];
[self HandleTouchEnd:allTouches state:3];
}
//-------------------------------------------------------------------------------
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet* allTouches = [event allTouches];
[self HandleTouchEnd:allTouches state:-1];
}
//-------------------------------------------------------------------------------
-(void) runJsLoop
{
laya::JSThreadInterface* pJSThread = laya::JCScriptRuntime::s_JSRT->m_pScriptThread;
pJSThread->run(NULL,NULL);
if(m_bStopEngine)
{
dispatch_async(dispatch_get_main_queue(), ^{
[self reset];
});
[m_pNSTimer invalidate];
CFRunLoopStop( [[NSRunLoop currentRunLoop] getCFRunLoop] );
}
}
-(void)runFunc:(NSTimer*)timer;
{
FuncObj* pFunObj = [[timer userInfo] objectForKey:@"fun"];
if( !m_bStopEngine && pFunObj && pFunObj->m_Fuction )
{
pFunObj->m_Fuction();
}
[timer invalidate];
timer=nil;
}
//-------------------------------------------------------------------------------
- (void)networkStateChange
{
int nState = [self checkNetworkState];
laya::JCScriptRuntime::s_JSRT->onNetworkChanged(nState);
}
-(int)checkNetworkState
{
// 1.检测手机是否能上网络(WIFI\3G\2.5G\4G)
LayaReachability *conn = [LayaReachability reachabilityForInternetConnection];
if ([conn currentReachabilityStatus] == NotReachable)
{
NSLog(@">>>>>>>checkNetworkState 没有网络");
return laya::NET_NO;
}
else
{
NSLog(@">>>>>>>checkNetworkState 有网络");
return laya::NET_YES;
}
}
//-------------------------------------------------------------------------------
-(void) setScreenOrientation:(int)p_nType
{
switch(p_nType)
{
case 0://landscape 16
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskLandscapeRight;
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
case 1://portrait 2
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskPortrait;
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
case 8://reverse_landscape 8
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskLandscapeLeft;
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
case 9://reverse_portrait 4
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskPortraitUpsideDown;
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationPortraitUpsideDown];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
case 4://sensor all
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskAll;
}
break;
case 10://full sensor all
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskAll;
}
break;
case 2://user full
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskAll;
}
break;
case 6://sensor_landscape 16+8
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
switch([UIApplication sharedApplication].statusBarOrientation)
{
case UIInterfaceOrientationLandscapeRight:
{
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
case UIInterfaceOrientationLandscapeLeft:
{
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
default:
{
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
}
}
}
break;
case 7://reverse_portrait 2+4
{
[conchConfig GetInstance]->m_nOrientationType = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
if (!UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
{
switch([UIApplication sharedApplication].statusBarOrientation)
{
case UIInterfaceOrientationMaskPortrait:
{
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
case UIInterfaceOrientationMaskPortraitUpsideDown:
{
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationMaskPortraitUpsideDown];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
default:
{
NSNumber *value=[NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
break;
}
}
}
break;
default://behind nosensor
break;
}
[self updateResolution];
}
-(void)updateResolution
{
CGRect kRect = [UIScreen mainScreen].bounds;
int nOrientation=[UIDevice currentDevice].orientation;
//竖屏
if( nOrientation == UIInterfaceOrientationPortrait ||
nOrientation == UIInterfaceOrientationPortraitUpsideDown )
{
m_pResolution->x = MIN( kRect.size.width , kRect.size.height );
m_pResolution->y = MAX( kRect.size.width , kRect.size.height );
}
//横屏
else if( nOrientation == UIInterfaceOrientationLandscapeLeft ||
nOrientation == UIInterfaceOrientationLandscapeRight )
{
m_pResolution->x = MAX( kRect.size.width , kRect.size.height );
m_pResolution->y = MIN( kRect.size.width , kRect.size.height );
}
}
-(void)orientChange:(NSNotification *)aNotification
{
int nOrientation=[UIDevice currentDevice].orientation;
if (!UIDeviceOrientationIsValidInterfaceOrientation((UIDeviceOrientation)nOrientation))
{
return;
}
if( m_nCurrentOrientation == nOrientation )
{
return;
}
if ( ( [conchConfig GetInstance]->m_nOrientationType & nOrientation ) != nOrientation )
{
return;
}
int nOldOrientation = m_nCurrentOrientation;
m_nCurrentOrientation = nOrientation;
switch(nOrientation)
{
case UIDeviceOrientationPortrait: // Device oriented vertically, home button on the bottom
case UIDeviceOrientationPortraitUpsideDown: // Device oriented vertically, home button on the top
{
if(UIInterfaceOrientationIsLandscape((UIInterfaceOrientation)nOldOrientation))
{
int w = MIN(g_nInnerWidth,g_nInnerHeight);
int h = MAX(g_nInnerWidth,g_nInnerHeight);
g_nInnerWidth = w;
g_nInnerHeight = h;
g_bGLCanvasSizeChanged = true;
[self updateResolution];
}
}
break;
case UIDeviceOrientationLandscapeLeft: // Device oriented horizontally, home button on the right
case UIDeviceOrientationLandscapeRight: // Device oriented horizontally, home button on the left
{
if(UIInterfaceOrientationIsPortrait((UIInterfaceOrientation)nOldOrientation))
{
int w = MAX(g_nInnerWidth,g_nInnerHeight);
int h = MIN(g_nInnerWidth,g_nInnerHeight);
g_nInnerWidth = w;
g_nInnerHeight = h;
g_bGLCanvasSizeChanged = true;
[self updateResolution];
}
}
break;
case UIDeviceOrientationFaceUp: // Device oriented flat, face up
case UIDeviceOrientationFaceDown: // Device oriented flat, face down
{
}
break;
};
}
-(void)reset
{
if(m_pLayaAlert)
{
[m_pLayaAlert reset];
}
if (m_pReflection){
[m_pReflection clearReflectionObjects];
}
}
-(void)callbackToJSWithClass:(Class)cls methodName:(NSString*)name ret:(NSObject*)retObj
{
[m_pReflection callbackToJSWithClass:cls methodName:name ret:retObj];
}
-(void)callbackToJSWithClassName:(NSString*)cls methodName:(NSString*)name ret:(NSObject*)retObj
{
[m_pReflection callbackToJSWithClassName:cls methodName:name ret:retObj];
}
-(void)callbackToJSWithObject:(id)obj methodName:(NSString*)name ret:(NSObject*)retObj
{
[m_pReflection callbackToJSWithObject:obj methodName:name ret:retObj];
}
- (void)enterBackground:(NSNotification *)notification {
CToObjectCOnBlur();
[[LayaDeviceSensor GetInstance] stop];
}
- (void)enterForeground:(NSNotification *)notification {
CToObjectCOnFocus();
[[LayaDeviceSensor GetInstance] start];
}
- (void)willResignActive:(NSNotification *)notification {
//CToObjectCOnBlur();
}
-(void)runJS:(NSString*)script{
const char* pScript = [script UTF8String];
if (pScript){
auto pFunction = std::bind(&CToObjectCRunJS,std::string(pScript));
if (JCScriptRuntime::s_JSRT && JCScriptRuntime::s_JSRT->m_pPoster){
JCScriptRuntime::s_JSRT->m_pPoster->postToJS(pFunction);
}
}
}
-(void)setFileDataHandler:(HandleFileData)func
{
laya::setFileDataHandler(func);
}
@end