/* * 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.loadingScreen; import net.rim.device.api.math.Fixed32; import net.rim.device.api.system.Bitmap; import net.rim.device.api.system.Characters; import net.rim.device.api.system.Display; import net.rim.device.api.system.EncodedImage; import net.rim.device.api.system.GIFEncodedImage; import net.rim.device.api.ui.Color; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.Graphics; import net.rim.device.api.ui.Manager; import net.rim.device.api.ui.component.BitmapField; import net.rim.device.api.ui.container.HorizontalFieldManager; import net.rim.device.api.ui.container.MainScreen; import net.rim.device.api.ui.decor.Background; import net.rim.device.api.ui.decor.BackgroundFactory; import blackberry.web.widget.impl.WidgetConfigImpl; public class LoadingScreen extends MainScreen { private HorizontalFieldManager _hfm; private BitmapField _foregroundImage; private WidgetConfigImpl _widgetConfigImpl; private PageManager _pageManager; public LoadingScreen( WidgetConfigImpl widgetConfigImpl, PageManager pageManager ) { super( Manager.NO_HORIZONTAL_SCROLL | Manager.NO_VERTICAL_SCROLL | Field.USE_ALL_HEIGHT ); _hfm = null; _widgetConfigImpl = widgetConfigImpl; _pageManager = pageManager; int bgColor = processColorString( _widgetConfigImpl.getLoadingScreenColor() ); if( _widgetConfigImpl.getBackgroundImage().length() != 0 ) { // Set background image EncodedImage backgroundImage = EncodedImage.getEncodedImageResource( _widgetConfigImpl.getBackgroundImage() ); if( backgroundImage != null ) { // Resize the image to the display size. int scaleX = Fixed32.div( Fixed32.toFP( backgroundImage.getWidth() ), Fixed32.toFP( Display.getWidth() ) ); int scaleY = Fixed32.div( Fixed32.toFP( backgroundImage.getHeight() ), Fixed32.toFP( Display.getHeight() ) ); EncodedImage scaledBgImage = backgroundImage.scaleImage32(scaleX, scaleY); // Using the scaled bg image draw onto the blank white bitmap. Bitmap bgImg = new Bitmap( scaledBgImage.getScaledWidth(), scaledBgImage.getScaledHeight() ); Graphics g = new Graphics( bgImg ); if( bgColor != -1 ) { g.setColor( bgColor ); } else { g.setColor( Color.WHITE ); } g.fillRect( 0, 0, scaledBgImage.getScaledWidth(), scaledBgImage.getScaledHeight() ); g.drawImage( 0, 0, scaledBgImage.getScaledWidth(), scaledBgImage.getScaledHeight(), scaledBgImage, 0, 0, 0 ); Background bg = BackgroundFactory.createBitmapBackground( bgImg, Background.POSITION_X_CENTER, Background.POSITION_Y_CENTER, Background.REPEAT_SCALE_TO_FIT ); this.setBackground( bg ); this.getMainManager().setBackground( bg ); } } else { // -1 denotes an invalid color if( bgColor != -1 ) { Background color = BackgroundFactory.createSolidBackground( bgColor ); this.setBackground( color ); this.getMainManager().setBackground( color ); } } if( _widgetConfigImpl.getForegroundImage().length() != 0 ) { EncodedImage foregroundImage = EncodedImage.getEncodedImageResource( _widgetConfigImpl.getForegroundImage() ); if( foregroundImage != null ) { _hfm = new HorizontalFieldManager( Manager.NO_HORIZONTAL_SCROLL | Manager.NO_VERTICAL_SCROLL | Field.NON_FOCUSABLE | Field.FIELD_HCENTER ); if( foregroundImage instanceof GIFEncodedImage ) { _foregroundImage = new AnimatedGIFField( (GIFEncodedImage) foregroundImage ); ( ( AnimatedGIFField) _foregroundImage ).startAnimation(); } else { _foregroundImage = new BitmapField( foregroundImage.getBitmap() ); } // Add the _foregroundImage field _hfm.add( _foregroundImage ); int topEmptySpace = ( Display.getHeight() - _hfm.getPreferredHeight() ) / 2; _hfm.setMargin( topEmptySpace, 0, 0, 0 ); add( _hfm ); } } } protected void sublayout( int width, int height ) { // Set _hfm vertically center of the screen by setting its top margin if( _hfm != null ) { int topEmptySpace = ( Display.getHeight() - _hfm.getPreferredHeight() ) / 2; _hfm.setMargin( topEmptySpace, 0, 0, 0 ); } super.sublayout( width, height ); } /* * Process a string in the format "#000000" and return the hex int value. -1 denotes an invalid color */ private int processColorString( String colorString ) { // Remove leading # if( colorString != null && colorString.startsWith( "#" ) && colorString.length() == 7 ) { colorString = colorString.substring( 1 ); // Attempt to convert string to hex try { return Integer.parseInt( colorString, 16 ); } catch( Exception e ) { return -1; } } else { // Failed to determine color return -1; } } public boolean onMenu( int instance ) { return false; } public boolean onClose() { return false; } /** * Handle the escape button if it was not previously handled */ protected boolean keyCharUnhandled( char key, int status, int time ) { // Only catch the 'back' button if( key == Characters.ESCAPE ) { if( _pageManager.isGoingBackSafe() ) { _pageManager.cancelNewPage(); } return false; } return super.keyCharUnhandled( key, status, time ); } }