/* * Copyright 2010-2011 Research In Motion Limited. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package blackberry.web.widget.bf; import javax.microedition.io.InputConnection; import net.rim.device.api.browser.field2.BrowserField; import net.rim.device.api.browser.field2.BrowserFieldErrorHandler; import net.rim.device.api.browser.field2.BrowserFieldRequest; import net.rim.device.api.io.transport.TransportInfo; import net.rim.device.api.system.Application; import net.rim.device.api.system.ApplicationManager; import net.rim.device.api.system.EventLogger; import net.rim.device.api.web.WidgetConfig; import blackberry.web.widget.Widget; import blackberry.web.widget.exception.MediaHandledException; import blackberry.web.widget.impl.WidgetConfigImpl; import blackberry.web.widget.impl.WidgetError; import blackberry.web.widget.impl.WidgetException; /** * Custom error handler class for WebWorks. */ public class BrowserFieldCustomErrorHandler extends BrowserFieldErrorHandler { private WidgetConfig _config; /* Constructor */ BrowserFieldCustomErrorHandler( BrowserField browserField, WidgetConfig widgetConfig ) { super( browserField ); _config = widgetConfig; } /* Override */public void displayContentError( String url, InputConnection connection, Throwable t ) { if( url == null ) { invokeError( t, null ); } else { invokeError( t, url ); } } /* Override */public void requestContentError( BrowserFieldRequest request, Throwable t ) { invokeError( t, request.getURL() ); } /* Override */public void navigationRequestError( BrowserFieldRequest request, Throwable t ) { // Do not display an error message if our custom exception is found. if( t instanceof MediaHandledException ) { return; } invokeError( t, request.getURL() ); } private void invokeError( Throwable t, String url ) { WidgetConfigImpl cfg = (WidgetConfigImpl) _config; if( cfg.getForegroundSource().length() == 0 && cfg.getBackgroundSource() != null || ApplicationManager.getApplicationManager().inStartup() ) { EventLogger.logEvent( Widget.WIDGET_GUID, t.getMessage().getBytes() ); return; } WidgetError we = null; try { canConnect( url ); we = new WidgetError( t, url ); } catch( Exception e ) { we = new WidgetError( e, url ); } Application.getApplication().invokeAndWait( we ); } /** * This method checks for some more specific errors than BF2 - radio off, out of coverage which allows for a better detailed * message. * * @param url * The URL that was being retrieved when the error occured. */ private void canConnect( String url ) throws Exception { // Null urls not checked. if( url == null ) { return; } // If this is a 'local' resource, then no need to check radio/data coverage. url = url.trim().toLowerCase(); if( url.startsWith( "file:" ) || url.startsWith( "cod:" ) || url.startsWith( "local:" ) ) { return; } // Use network API to determine availability. boolean isAvailable = false; int[] transports = ( (WidgetConfigImpl) _config ).getPreferredTransports(); if( transports == null ) { transports = BrowserFieldScreen.PREFERRED_TRANSPORTS; } int numTransports = transports.length; int transport; for( int i = 0; i < numTransports; i++ ) { transport = transports[ i ]; if( TransportInfo.isTransportTypeAvailable( transport ) ) { isAvailable = true; break; } } if( !isAvailable ) { throw new WidgetException( WidgetException.ERROR_NETWORK_NOT_AVAILABLE, url ); } // Use network API to determine coverage. boolean hasCoverage = false; for( int i = 0; i < numTransports; i++ ) { transport = transports[ i ]; if( TransportInfo.hasSufficientCoverage( transport ) ) { hasCoverage = true; break; } } if( !hasCoverage ) { throw new WidgetException( WidgetException.ERROR_INSUFFICIENT_COVERAGE, url ); } } }