dev 49

45
Customizing BrowserField2 Advanced Components Marcilio Mendonca DEV49 September 29, 2010

Upload: abhinav-saxena

Post on 28-Nov-2014

570 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Dev 49

Customizing BrowserField2 Advanced Components

Marcilio Mendonca

DEV49

September 29, 2010

Page 2: Dev 49

Session Surveys

• Remember to complete your breakout session evaluation in one of two ways:

– On your BlackBerry® smartphone – use the DEVCON 2010 mobile guide, from Pyxis

– Login to My Scheduler at one of the Cyber Zone locations or on your PC

Page 3: Dev 49

Why should Icare about

BrowserField2?

I seem to be happy with

BrowserField1 ...

What’s the Point?

Page 4: Dev 49

Source Code Snippet from a Real BrowserField1 Application

// Dealing with Low Level ComponentsrenderingSession = RenderingSession.getNewInstance();renderingSession.getRenderingOptions().setProperty(...)...browserContent = renderingSession.getBrowserContent(…)browserContent.finishLoading();

// Managing ThreadsPrimaryResourceFetchThread thread = new PrimaryResourceFetchThread();...// Managing Resource ConnectivityHttpConnection connection = Utilities.makeConnection(url, head, null);...// Managing HTTP Cookies_cookieManager.storeCookies(cookie, urlHost);...// Managing Page HistorygetHistoryPosition(BrowserContent browserField);...// Others: handling HTTP redirects, errors, UI issues

Page 5: Dev 49

Source Code Snippet from a Real BrowserField1 Application

// Dealing with Low Level ComponentsrenderingSession = RenderingSession.getNewInstance();renderingSession.getRenderingOptions().setProperty(...)...browserContent = renderingSession.getBrowserContent(…)browserContent.finishLoading();

// Managing ThreadsPrimaryResourceFetchThread thread = new PrimaryResourceFetchThread();...// Managing Resource ConnectivityHttpConnection connection = Utilities.makeConnection(url, head, null);...// Managing HTTP Cookies_cookieManager.storeCookies(cookie, urlHost);...// Managing Page HistorygetHistoryPosition(BrowserContent browserField);...// Others: handling HTTP redirects, errors, UI issues

Low Productivity!

- 1,279 lines of code- Too much focus on low-level “stuff”

Page 6: Dev 49

BrowserField1 Application Rewritten as a BrowserField2 Application

...Screen screen = new MainScreen();

// Manage the Specifics of Your BrowserFieldBrowserFieldConfig config = new BrowserFieldConfig();

// Create the BrowserFieldBrowserField browserField = new BrowserField(config);

// Request Web Content and Show it on the Screenscreen.add(browserField);Application.getApplication().pushScreen(screen);browserField.requestContent(“http://www.blackberry.com”);...

Page 7: Dev 49

BrowserField1 Application Rewritten as a BrowserField2 Application

...Screen screen = new MainScreen();

// Manage the Specifics of Your BrowserFieldBrowserFieldConfig config = new BrowserFieldConfig();

// Create the BrowserFieldBrowserField browserField = new BrowserField(config);

// Request Web Content and Show it on the Screenscreen.add(browserField);Application.getApplication().pushScreen(screen);browserField.requestContent(“http://www.blackberry.com”);...

HIGH Productivity!

- 30 lines of code- Focus on what matters: Your business!

Page 8: Dev 49

BrowserField2I can easily customize it!

BrowserField1

Make Up Your Mind!

Page 9: Dev 49

Agenda

1. Quick Overview of BrowserField2 API

2. Our Demo: BF2CUSTOM

3. Customizing BrowserField2 Advanced Components– BrowserFieldController

– BrowserFieldConnectionManager

– BrowserFieldErrorHandler

– BrowserField Debug API

4. BrowserField2 in BlackBerry OS 6.0

5. Summary

Page 10: Dev 49

Goal of This Presentation

To illustrate how advanced BrowserField2 components can be

customized to suit a variety of reported BF2 developer’s needs

Page 11: Dev 49

Quick Overview of BrowserField2

BrowserField 1 API- RenderingApplication- RenderingSession- BrowserContent

BrowserField 2 API

• The BrowserField 2 API (a.k.a. BF2) is a Public API release along with BlackBerry OS 5.0 that allows a developer to embed Web content into a BlackBerry Java application

• Advantages of BF2 over BF1: high productivity, strong integration with the Javascriptengine, built-in functionality (e.g., connectivity, cookie management, navigation history)

Page 12: Dev 49
Page 13: Dev 49
Page 14: Dev 49

BF2CUSTOM – OUR DEMOA BrowserField2 application that illustrates how to

customize BF2 advanced components

Page 15: Dev 49

BF2CUSTOM

Page 16: Dev 49

BF2CUSTOM – App Entry Point

// BF2 customization applicationpublic class BF2Custom extends UiApplication{

/*** Application Entry point*/ public static void main(String[] args) {

BF2Custom theApp = new BF2Custom(); theApp.enterEventDispatcher();

}

/*** Creates a new BF2Custon object*/public BF2Custom() {

// Push a screen onto the UI stack for rendering.pushScreen(new BF2CustomScreen());

} }

Page 17: Dev 49

BF2CUSTOM – BF2CustomScreen

// BF2 customization application screenfinal class BF2CustomScreen extends MainScreen {

BrowserField _browserField;

public BF2CustomScreen() {// Create the BrowserField_browserField = createBrowserField();

// Our Customizations will go here...

}

public void createBrowserField(){BrowserFieldConfig config = new BrowserFieldConfig();config.setProperty(...);return new BrowserField(config);

}// a couple of inner classes for customization go here

}

Page 18: Dev 49

What’s Being Covered?

BF2CUSTOM DEMO

BrowserFieldController- Overview- Extending the Default Controller- Creating a New Resource Handler

BrowserFieldConnectionManager- Overview - Specifying a New ConnectionFactory

BrowserFieldErrorHandler- Overview- Customizing Error Handling Display

BrowserFieldDebugger- Overview- On-Device Debugger Sample- Desktop Debugger Sample

Page 19: Dev 49

BrowserFieldControllerHandling navigation and resource requests

Page 20: Dev 49

BrowserFieldControllerHandling Navigation and Resource Requests

BrowserFieldController

BrowserField

Your BF2 Application

requestContent(“www.blackberry.com”)

handleNavigationRequest()

<<default implementation>>

ProtocolController

Navigation Request = Page Request (e.g., html)Resource Request = Page Resource Request (e.g., image, css, js)

YourBrowserFieldControler

either one

Page 21: Dev 49

ProtocolControllerExtending the Default Controller

• Requirement: BF2CUSTOM must enforce that only domains authorized by the user can be accessed• Solution: Extend ProtocolController and check if domain is accessible; if not, ask user to authorize or decline access

User has Authorized

Page 22: Dev 49

ProtocolControllerExtending the Default Controller

class MyProtocolController extends ProtocolController {

// Navigation Requestspublic void handleNavigationRequest(BrowserFieldRequest request) { boolean accessGrantedByUser = true;String domain = URI.create(request.getURL()).getHost();if ( !trustedDomains.contains(domain) && userHasAuthorizedAccess(domain) ){

trustedDomains.addElement(domain); } else { accessGrantedByUser = false; }if ( accessGrantedByUser ) {

super.handleNavigationRequest(request);}

}// Resource Requestspublic InputConnection handleResourceRequest(BrowserFieldRequest request) {...

}}// Attach new controller to the BrowserFieldProtocolController myController = new MyProtocolController(browserField);browserField.getConfig().setProperty(

BrowserFieldConfig.CONTROLLER, myController);

Page 23: Dev 49

ProtocolControllerUsing Handlers to Address Different Protocols

BrowserFieldController

<<default implementation>>

ProtocolController

TransportResourceHandler

DeviceResourceHandler

ModuleResourceHandler

http, https

file, data

local

your protocol

YourHandler- handleNavigation()- handleResource()

BrowserFieldNavigationRequestHandler

BrowserFieldResourceRequestHandler

BrowserFieldResourceHandler- handleNavigation()- handleResource()

Page 24: Dev 49

ProtocolControllerCreating a New Request Handler

• Requirement: BF2CUSTOM must handle the “shared:///” protocol to load resources from a “shared space”

• Solution: Create a New Navigation/Resource Request Handler

<html><head><title>BF2Custom</title></head><body><img src=“http://www.rim.com/img1.jpg”/><img src=“shared:///img2.jpg”/><a href=“shared:///bf2custom_index.html”>Click here</a>

</body></html>

Page 25: Dev 49

ProtocolControllerCreating a New Request Handler

class SharedResourcesHandler implements BrowserFieldNavigationRequestHandler, BrowserFieldResourceRequestHandler {

public void handleNavigation(BrowserFieldRequest request) {InputConnection connection = handleResource(request);if ( connection != null ) {

browserField.displayContent(connection, "shared:///");}

}

public InputConnection handleResource(BrowserFieldRequest request) { return getInputConnectionForSharedSpace(request);

}

public InputConnection getInputConnectionForSharedSpace(request) { ... // Helper method

}}

// Attach the handler to your controllerSharedResourcesHandler handler = new SharedResourcesHandler(browserField);myController.setNavigationRequestHandler("shared", handler);myController.setResourceRequestHandler("shared", handler);

Page 26: Dev 49

BrowserFieldControllerOther Possible Customization Scenarios

Cases where customizing the BrowserFieldController might be worth it:

• Controlling access to resources• Supporting new resource location protocols • Http basic authentication (401)• Caching• Logging & statistics

Page 27: Dev 49

BrowserFieldConnectionManagerConnecting to network resources

Page 28: Dev 49

BrowserFieldConnectionManagerConnecting to Resources via HTTP(S)

BrowserFieldConnectionManagerDefaultBrowserFieldConnectionManager

BrowserFieldControllerProtocolController/TransportResourceHandler 1. http://www.blackberry.com/bbtorch.png

2. makeRequest()

Internet

3. Connects to the resourcevia WIFI, BIS, MDS, cellular, …

4. InputConnection

Page 29: Dev 49

BrowserFieldConnectionManagerConnecting to Resources via HTTP(S)

BrowserFieldConnectionManager- InputConnection makeRequest(BrowserFieldRequest request)

<<default controller>>

ProtocolController

TransportResourceHandlerhttp, https

<<net.rim.device.api.io.transport>>

ConnectionFactory- setTimeLimit()- setAttemptsLimit()- setPreferredTransportTypes()- setDisallowedTransportTypes()

WIFI, MDS, BIS, TCP_CELLULAR, …

<<net.rim.device.api.io.transport>>

(Your)ConnectionFactory

BIS, WIFI,TCP_CELLULAR, MDS…

cookies, debugger

YourBrowserFieldConnectionManager- InputConnection makeRequest(BrowserFieldRequest request)

cookies, debugger

<<internal default implementation>>

DefaultBrowserFieldConnectionManager

Page 30: Dev 49

BrowserFieldConnectionManagerSpecifying Your Own ConnectionFactory

• Requirement: BF2CUSTOM needs to enforce a particular connection order, disallow certain types of connections and specify timeout values

• Solution: Create a ConnectionFactory and attach it to your BrowserField

// Create the factorypublic ConnectionFactory createCustomConnectionFactory() {

ConnectionFactory factory = new ConnectionFactory();// Set timeout parametersfactory.setAttemptsLimit(1);factory.setTimeLimit(5000);factory.setTimeoutSupported(true);// Specify the order of connectionsfactory.setPreferredTransportTypes( new int[] {

TransportInfo.TRANSPORT_TCP_WIFI, TransportInfo.TRANSPORT_BIS_B, TransportInfo.TRANSPORT_MDS, TransportInfo.TRANSPORT_WAP} );

// Disallow cellular connectionsfactory.setDisallowedTransportTypes( new int[]

{TransportInfo.TRANSPORT_TCP_CELLULAR} );}// Attach the factory to the BrowserFieldConnectionFactory factory = createCustomConnectionFactory();browserField.getConfig().setProperty(

BrowserFieldConfig.CONNECTION_FACTORY,factory);

Page 31: Dev 49

BrowserFieldErrorHandlerHandling BrowserField2 unexpected situations

Page 32: Dev 49

BrowserFieldErrorHandlerHandling BrowserField2 Unexpected Situations

BrowserFieldErrorHandler- displayContentError()- requestContentError()- resourceRequestError()- navigationRequestError()

Uses BrowserField to display errors

YourBrowserFieldErrorHandler- displayContentError()- requestContentError()- resourceRequestError()- navigationRequestError

(E.g., uses a Dialog to display errors)

BrowserField

Page 33: Dev 49

BrowserFieldErrorHandlerCustomizing BrowserField Error Handling

• Requirement: BF2CUSTOM needs to use a Dialog to notify users about BrowserField errors and to additionally save errors in a log file

• Solution: Extend BrowserFieldErrorHandler and attach it to your BrowserField

// Create the ErrorHandler classpublic class MyBrowserFieldErrorHandler extends BrowserFieldErrorHandler {public void displayContentError(String url, String errorMessage) {String error = "Error: (url=" + url + "): " + t.getMessage();Dialog.ask(Dialog.D_OK, error);logMessage(“BrowserFieldError: “ + error );

}public void displayContentError(String url, InputConnection connection, Throwable t) { displayContentError(url, t.getMessage());

}public void requestContentError(BrowserFieldRequest request, Throwable t){displayContentError(request.getURL(), t.getMessage());

}}// Attach the Error Handler to the BrowserFieldBrowserFieldErrorHandler eHandler = new MyBrowserFieldErrorHandler();browserField.getConfig().setProperty(BrowserFieldConfig.ERROR_HANDLER,eHandler);

Page 34: Dev 49

THE BrowserField2 DEBUG APIDebugging JavaScript in BrowserField2

Page 35: Dev 49

The BrowserField Debug APIDebugging BrowserField Scripts

BrowserFieldScript- getName()- getSourceLines()- setBreakpoint()- clearBreakpoint()

BrowserField

YourBrowserFieldDebugger- hitBreakpoint()- handleStep()- registerScript()- reportException()- notifyCompileError()- xmlHttpRequestRequest()BrowserFieldScriptObject

- getField()- enumerateFields()- getObjectClass()

BrowserFieldDebugContext- resume()- stepInto()- eval()- getFunctionName()- getLineNumber()

net.rim.device.api.browser.field2.debug

BrowserFieldDebugger

Page 36: Dev 49

The BrowserField Debug APIImplementing Your Own Debugger

public class MYBrowserFieldDebugger extends BrowserFieldDebugger {public void registerScript(BrowserFieldScript script) {

_scripts.add(script)}public void registerInlineScript(BrowserFieldScript script) {

_inlineScripts.add(script)}public void hitBreakpoint( BrowserFieldDebugContext context ) {

_currentContext = context;ScriptResource resource = findScriptResource( context );ScriptResourceScreen screen = new ScriptResourceScreen(resource);screen.setActive( context.getLineNumber() );screen.display( _contentScreen );

}public void stepOver() {

_currentContext.stepOver();}public Object eval(String expression) {

return _currentContext.eval(expression);}

}

// Attach the Debugger to the BrowserFieldbrowserField.setDebugger(new MyBrowserFieldDebugger());

Page 37: Dev 49

The BrowserField Debug APIOn-Device BrowserField Debugger Application

Page 38: Dev 49

The BrowserField Debug APIDesktop BrowserField Debugger Application

BrowserField

Page 39: Dev 49

BrowserField2 IN BLACKBERRY OS 6.0What’s new?

Page 40: Dev 49

BrowserField2 in BlackBerry OS 6.0What’s New?

• High-quality HTML rendering backed up by Webkit– 10x faster layout time, strong support for HTML5, 100% acid3

• Improved touch screen experience – pinch to zoom, text reflow

• State-of-the-Art Javascript Engine – 3.2x faster, more reliable

• The API’s interface did not change except for discontinuing the Debug API

Webkit

BlackBerryBrowser

BrowserFieldApplication

Page 41: Dev 49

Curious About Upcoming Debug Capabilities?

• Please refer to session DEV37 – Your Best Options for Web Development Tools

Page 42: Dev 49

Summary

1. Quick Overview of BrowserField2 API

2. Our Demo: BF2CUSTOM– Customizing advanced BF2 components

3. Customizing BrowserField2 Advanced Components– BrowserFieldController

– BrowserFieldConnectionManager

– BrowserFieldErrorHandler

– BrowserField Debug API

4. BrowserField2 in BlackBerry OS 6.0– High-quality HTML rendering, improved touch screen, state-of-the-

art Javascript Engine, same API but Debug API was discontinued

Page 43: Dev 49

Switch Now to BrowserField2and raise your

(and your team's) Productivity

to a new level!

Final Message

Page 44: Dev 49

For More Information

• Other sessions– DEV08: Creating Hybrid Applications – Building Web

Applications Using Java Components

– DEV37: Your Best Options for Web Development Tools

• BlackBerry DevZone website:– http://www.blackberry.com/developers

– Download BlackBerry development tools and simulators

– Developer Resource Center

– Web Community Forum

• Development community:– Developers Blog: http://devblog.blackberry.com

– Twitter: http://twitter.com/BlackBerryDev

Page 45: Dev 49

Thank You

Marcilio Mendonca

DEV49

September 29, 2010