/** ACTIVITY OVERRIDEN METHODS * */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LOG.Log(Module.GUI, "onCreate"); if (getIntent() != null && getIntent().getExtras() != null) { extras = getIntent().getExtras(); LOG.LogDebug(Module.GUI, "[K] notification Extra:" + extras.getString("item_id")); } // GUI initialization code getWindow().requestFeature(Window.FEATURE_NO_TITLE); getWindow() .setFlags( WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); /*disableThumbnails = checkUnityProperty("Unity_DisableThumbnails"); blockRooted = checkUnityProperty("Appverse_BlockRooted"); blockROMModified = checkUnityProperty("Appverse_BlockROMModified");*/ // security reasons; don't allow screen shots while this window is displayed /* not valid for builds under level 14 */ // TODO DISABLETHUMBNAILS_1 // @@DISABLETHUMBNAILS_1@@ // Initialize Webview component and provide specific settings this.initialiazeWebViewSettings(); // create the application logger LogManager.setDelegate(new AndroidLoggerDelegate()); // initialize the service locator activityManager = initialiazeActivityManager(); // save the context for further access AndroidServiceLocator.setContext(this, activityManager); // killing previous background processes from the same package activityManager.killBackgroundProcesses(); AndroidServiceLocator serviceLocator = (AndroidServiceLocator) AndroidServiceLocator.GetInstance(); serviceLocator.RegisterService( this.getAssets(), AndroidServiceLocator.SERVICE_ANDROID_ASSET_MANAGER); serviceLocator.RegisterService( activityManager, AndroidServiceLocator.SERVICE_ANDROID_ACTIVITY_MANAGER); // registering Appverse modules (if any) this.registerModulesServices(); // initialize config data files for app delegates serviceLocator.initConfigDataForServices(); if (Build.VERSION.SDK_INT >= 17) { // Only used for JELLY_BEAN_MR1 or higher /** * INJECT SCRIPT MESSAGE HANDLER (new in Appverse 5) ** */ /** * From Android documentation: * * <p>This method can be used to allow JavaScript to control the host application. This is a * powerful feature, but also presents a security risk for apps targeting JELLY_BEAN or * earlier. Apps that target a version later than JELLY_BEAN are still vulnerable if the app * runs on a device running Android earlier than 4.2. The most secure way to use this method * is to target JELLY_BEAN_MR1 and to ensure the method is called only when running on Android * 4.2 or later. With these older versions, JavaScript could use reflection to access an * injected object's public fields. Use of this method in a WebView containing untrusted * content could allow an attacker to manipulate the host application in unintended ways, * executing Java code with the permissions of the host application. Use extreme care when * using this method in a WebView which could contain untrusted content. * * <p>JavaScript interacts with Java object on a private, background thread of this WebView. * Care is therefore required to maintain thread safety. The Java object's fields are not * accessible. For applications targeted to API level LOLLIPOP and above, methods of injected * Java objects are enumerable from JavaScript. */ this.addJavascriptIntefaceToWebView(serviceLocator, "appverseJSBridge"); } if (performSecurityChecks(serviceLocator)) { LOG.Log(Module.GUI, "Security checks passed... initializing Appverse..."); startServer(); /* THIS COULD NOT BE CHECKED ON API LEVEL < 11; NO suchmethodexception * boolean hwAccelerated = appView.isHardwareAccelerated(); * if(hwAccelerated) * LOG.Log(Module.GUI,"Application View is HARDWARE ACCELERATED"); else * LOG.Log(Module.GUI,"Application View is NOT hardware accelerated"); */ final IntentFilter actionFilter = new IntentFilter(); actionFilter.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); // actionFilter.addAction("android.intent.action.SERVICE_STATE"); registerReceiver(this.initialiazeNetworkReceiver(), actionFilter); ConnectivityManager conMan = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = conMan.getActiveNetworkInfo(); com.gft.unity.core.net.NetworkType type = NetworkType.Unknown; if (networkInfo != null) { boolean isWiFi = networkInfo.getType() == ConnectivityManager.TYPE_WIFI; boolean isMobile = networkInfo.getType() == ConnectivityManager.TYPE_MOBILE; boolean isConnected = networkInfo.isConnected(); if (isWiFi) { if (isConnected) { LOG.Log(Module.GUI, "Wi-Fi - CONNECTED (" + networkInfo.getType() + ")"); type = NetworkType.Wifi; } else { LOG.Log(Module.GUI, "Wi-Fi - DISCONNECTED (" + networkInfo.getType() + ")"); } } else if (isMobile) { if (isConnected) { LOG.Log(Module.GUI, "Mobile - CONNECTED (" + networkInfo.getType() + ")"); type = NetworkType.Carrier_3G; } else { LOG.Log(Module.GUI, "Mobile - DISCONNECTED (" + networkInfo.getType() + ")"); } } else { if (isConnected) { LOG.Log( Module.GUI, networkInfo.getTypeName() + " - CONNECTED (" + networkInfo.getType() + ")"); } else { LOG.Log( Module.GUI, networkInfo.getTypeName() + " - DISCONNECTED (" + networkInfo.getType() + ")"); } } } else { LOG.Log(Module.GUI, "DISCONNECTED"); } final int typeOrdinal = type.ordinal(); final Activity currentContext = this; new Thread( new Runnable() { public void run() { currentContext.runOnUiThread( new Runnable() { public void run() { InitializeAppverseContext(typeOrdinal); String networkStatusListener = "javascript:try{if(Appverse&&Appverse.Net){Appverse.Net.NetworkStatus = " + typeOrdinal + ";Appverse.Net.onConnectivityChange(Appverse.Net.NetworkStatus);}else{console.log('Appverse is not defined');}}catch(e){console.log('Error setting network status (please check onConnectivityChange method): '+e);}"; queueJSStatementsForWebviewClient(networkStatusListener); loadMainURLIntoWebview(); } }); } }) .start(); } holdSplashScreenOnStartup = checkUnityProperty("Unity_HoldSplashScreenOnStartup"); this.showSplashScreen(); LocalNotificationReceiver.initialize(this.activityManager, this); // notify app delegates about the onCreate event ((AndroidServiceLocator) AndroidServiceLocator.GetInstance()) .sendApplicationEvent(AndroidApplicationEvent.onCreate); }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LOG.Log(Module.GUI, "onCreate"); // GUI initialization code getWindow().requestFeature(Window.FEATURE_NO_TITLE); getWindow() .setFlags( WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); disableThumbnails = checkUnityProperty("Unity_DisableThumbnails"); // security reasons; don't allow screen shots while this window is displayed /* not valid for builds under level 14 */ if (disableThumbnails && Build.VERSION.SDK_INT >= 14) { getWindow() .setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); } appView = new WebView(this); appView.enablePlatformNotifications(); setGlobalProxy(); appView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); appView.setId(APPVIEW_ID); appView.setWebViewClient(new UnityWebViewClient()); appView.getSettings().setJavaScriptEnabled(true); appView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); appView.getSettings().setAllowFileAccess(true); appView.getSettings().setSupportZoom(false); appView.getSettings().setAppCacheEnabled(false); appView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); appView.getSettings().setAppCacheMaxSize(0); appView.getSettings().setSavePassword(false); appView.getSettings().setSaveFormData(false); appView.getSettings().setDefaultTextEncodingName("UTF-8"); appView.getSettings().setGeolocationEnabled(true); appView.getSettings().setLightTouchEnabled(true); appView.getSettings().setRenderPriority(RenderPriority.HIGH); appView.getSettings().setDomStorageEnabled(true); // [MOBPLAT-129] enable HTML5 local storage appView.setVerticalScrollBarEnabled(false); // Required settings to enable HTML5 database storage appView.getSettings().setDatabaseEnabled(true); String databasePath = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath(); appView.getSettings().setDatabasePath(databasePath); webChromeClient = new WebChromeClient() { // Required settings to enable HTML5 database storage @Override public void onExceededDatabaseQuota( String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { quotaUpdater.updateQuota(estimatedSize * 2); }; @Override public void onReachedMaxAppCacheSize( long spaceNeeded, long totalUsedQuota, android.webkit.WebStorage.QuotaUpdater quotaUpdater) { quotaUpdater.updateQuota(0); }; @Override public boolean onConsoleMessage(ConsoleMessage cm) { LOG.Log( Module.GUI, cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId()); return true; } }; appView.setWebChromeClient(webChromeClient); // create the application logger LogManager.setDelegate(new AndroidLoggerDelegate()); // save the context for further access AndroidServiceLocator.setContext(this); // initialize the service locator activityManager = new AndroidActivityManager(this, appView); // killing previous background processes from the same package activityManager.killBackgroundProcesses(); AndroidServiceLocator serviceLocator = (AndroidServiceLocator) AndroidServiceLocator.GetInstance(); serviceLocator.RegisterService( this.getAssets(), AndroidServiceLocator.SERVICE_ANDROID_ASSET_MANAGER); serviceLocator.RegisterService( activityManager, AndroidServiceLocator.SERVICE_ANDROID_ACTIVITY_MANAGER); startServer(); /* THIS COULD NOT BE CHECKED ON API LEVEL < 11; NO suchmethodexception boolean hwAccelerated = appView.isHardwareAccelerated(); if(hwAccelerated) LOG.Log(Module.GUI,"Application View is HARDWARE ACCELERATED"); else LOG.Log(Module.GUI,"Application View is NOT hardware accelerated"); */ final IntentFilter actionFilter = new IntentFilter(); actionFilter.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); // actionFilter.addAction("android.intent.action.SERVICE_STATE"); registerReceiver(new AndroidNetworkReceiver(appView), actionFilter); final Activity currentContext = this; new Thread( new Runnable() { public void run() { currentContext.runOnUiThread( new Runnable() { public void run() { appView.loadUrl(WEBVIEW_MAIN_URL); } }); } }) .start(); holdSplashScreenOnStartup = checkUnityProperty("Unity_HoldSplashScreenOnStartup"); hasSplash = activityManager.showSplashScreen(appView); RemoteNotificationIntentService.loadNotificationOptions(getResources(), appView, this); LocalNotificationReceiver.initialize(appView, this); }