/* * ActivityIndicatorScreen.java * * Copyright � 1998-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. * * Note: For the sake of simplicity, this sample application may not leverage * resource bundles and resource strings. However, it is STRONGLY recommended * that application developers make use of the localization features available * within the BlackBerry development platform to ensure a seamless application * experience across a variety of languages and geographies. For more information * on localizing your application, please refer to the BlackBerry Java Development * Environment Development Guide associated with this release. */ package com.rim.samples.device.ui.progressindicatordemo; import net.rim.device.api.command.Command; import net.rim.device.api.command.CommandHandler; import net.rim.device.api.command.ReadOnlyCommandMetadata; import net.rim.device.api.system.Bitmap; import net.rim.device.api.system.Characters; import net.rim.device.api.ui.Color; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.FieldChangeListener; import net.rim.device.api.ui.MenuItem; import net.rim.device.api.ui.Screen; import net.rim.device.api.ui.UiApplication; import net.rim.device.api.ui.XYEdges; import net.rim.device.api.ui.component.ButtonField; import net.rim.device.api.ui.component.LabelField; import net.rim.device.api.ui.component.SeparatorField; import net.rim.device.api.ui.component.progressindicator.ActivityIndicatorView; import net.rim.device.api.ui.container.HorizontalFieldManager; import net.rim.device.api.ui.container.MainScreen; import net.rim.device.api.ui.container.PopupScreen; import net.rim.device.api.ui.decor.Background; import net.rim.device.api.ui.decor.BackgroundFactory; import net.rim.device.api.ui.decor.Border; import net.rim.device.api.ui.decor.BorderFactory; import net.rim.device.api.util.StringProvider; /** * A screen displaying a number of activity indicators */ public class ActivityIndicatorScreen extends MainScreen { private final ActivityIndicatorView[] _views; /** * Creates a new ActivityIndicatorScreen object */ public ActivityIndicatorScreen() { setTitle("Activity Indicator Screen"); _views = new ActivityIndicatorView[7]; Bitmap bitmap; // Reuse this reference // Add an ActivityIndicatorView featuring a rounded red border bitmap = Bitmap.getBitmapResource("spinner.png"); final XYEdges edges = new XYEdges(2, 2, 2, 2); final Border border = BorderFactory.createRoundedBorder(edges, Color.CRIMSON, Border.STYLE_SOLID); _views[0] = ActivityIndicatorFactory.createActivityIndicator(0, bitmap, 5, 0, "with border", Field.FIELD_HCENTER); _views[0].setBorder(border); add(_views[0]); add(new SeparatorField()); // Add an ActivityIndicatorView with label and animation centered in a // horizontal layout bitmap = Bitmap.getBitmapResource("spinner.png"); _views[1] = ActivityIndicatorFactory.createActivityIndicator( new HorizontalFieldManager(), Field.FIELD_HCENTER, bitmap, 5, 0, "horizontal centered layout", Field.FIELD_HCENTER); add(_views[1]); add(new SeparatorField()); // Add a centered ActivityIndicatorView between two focusable fields add(new LabelField("focusable field", Field.FOCUSABLE)); bitmap = Bitmap.getBitmapResource("spinner2.png"); _views[2] = ActivityIndicatorFactory.createActivityIndicator( Field.FIELD_HCENTER, bitmap, 6, Field.FIELD_HCENTER, "centered between focusable fields", Field.FIELD_HCENTER); add(_views[2]); add(new LabelField("focusable field", Field.FOCUSABLE)); add(new SeparatorField()); // Add a right justified ActivityIndicatorView bitmap = Bitmap.getBitmapResource("spinner.png"); _views[3] = ActivityIndicatorFactory.createActivityIndicator( Field.USE_ALL_WIDTH, bitmap, 5, Field.FIELD_RIGHT, "right justified layout", Field.FIELD_VCENTER); add(_views[3]); add(new SeparatorField()); Background background; // Reuse this reference // Add an ActivityIndicatorView featuring a solid black background bitmap = Bitmap.getBitmapResource("orchid.png"); background = BackgroundFactory.createSolidBackground(Color.BLACK); _views[4] = ActivityIndicatorFactory.createActivityIndicator(0, bitmap, 6, 0); _views[4].setBackground(background); add(_views[4]); add(new LabelField("solid background")); add(new SeparatorField()); // Add an ActivityIndicatorView to another ActivityIndicatorView bitmap = Bitmap.getBitmapResource("progress.png"); background = BackgroundFactory.createSolidBackground(Color.DARKGRAY); _views[5] = ActivityIndicatorFactory.createActivityIndicator(0, bitmap, 12, 0, "view added to another", 0); _views[5].setBackground(background); bitmap = Bitmap.getBitmapResource("spinner.png"); _views[6] = ActivityIndicatorFactory.createActivityIndicator(0, bitmap, 5, 0); _views[5].add(_views[6]); add(_views[5]); final MenuItem cancelItem = new MenuItem(new StringProvider("Cancel spinners "), 0x230020, 0); cancelItem.setCommand(new Command(new CommandHandler() { /** * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata, * Object) */ public void execute(final ReadOnlyCommandMetadata metadata, final Object context) { for (int i = _views.length - 1; i >= 0; --i) { _views[i].getModel().cancel(); } } })); final MenuItem resetItem = new MenuItem(new StringProvider("Reset spinners "), 0x230030, 0); resetItem.setCommand(new Command(new CommandHandler() { /** * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata, * Object) */ public void execute(final ReadOnlyCommandMetadata metadata, final Object context) { for (int i = _views.length - 1; i >= 0; --i) { _views[i].getModel().reset(); } } })); final MenuItem resumeItem = new MenuItem(new StringProvider("Resume spinners "), 0x230040, 0); resumeItem.setCommand(new Command(new CommandHandler() { /** * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata, * Object) */ public void execute(final ReadOnlyCommandMetadata metadata, final Object context) { for (int i = _views.length - 1; i >= 0; --i) { _views[i].getModel().resume(); } } })); final MenuItem delayedStop = new MenuItem(new StringProvider("Delayed start"), 0x230050, 0); delayedStop.setCommand(new Command(new CommandHandler() { /** * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata, * Object) */ public void execute(final ReadOnlyCommandMetadata metadata, final Object context) { for (int i = _views.length - 1; i >= 0; --i) { final DelayedStart ds = new DelayedStart(_views[i]); ds.start(); } } })); final MenuItem delayedStart = new MenuItem(new StringProvider("Delayed stop"), 0x230060, 0); delayedStart.setCommand(new Command(new CommandHandler() { /** * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata, * Object) */ public void execute(final ReadOnlyCommandMetadata metadata, final Object context) { for (int i = _views.length - 1; i >= 0; --i) { final DelayedStop ds = new DelayedStop(_views[i]); ds.start(); } } })); final MenuItem showPopupItem = new MenuItem(new StringProvider("Show Popup"), 0x230010, 0); showPopupItem.setCommand(new Command(new CommandHandler() { /** * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata, * Object) */ public void execute(final ReadOnlyCommandMetadata metadata, final Object context) { Bitmap bitmap = Bitmap.getBitmapResource("orchid2.png"); final ActivityIndicatorView view = ActivityIndicatorFactory.createActivityIndicator(0, bitmap, 6, Field.FIELD_HCENTER); bitmap = Bitmap.getBitmapResource("progress2.png"); final ActivityIndicatorView view2 = ActivityIndicatorFactory.createActivityIndicator( new HorizontalFieldManager(), Field.FIELD_HCENTER, bitmap, 6, 0, "horizontal", Field.FIELD_HCENTER); final ActivityPopupScreen activityPopupScreen = new ActivityPopupScreen(view); activityPopupScreen.add(view2); UiApplication.getUiApplication() .pushScreen(activityPopupScreen); } })); // Add menu items addMenuItem(showPopupItem); addMenuItem(cancelItem); addMenuItem(resetItem); addMenuItem(resumeItem); addMenuItem(delayedStart); addMenuItem(delayedStop); } /** * Thread class which stops an ActivityIndicatorView animation after an * arbitrary delay. */ private static class DelayedStop extends Thread { private final ActivityIndicatorView _view; /** * Creates a new DelayedStop object * * @param view * The ActivityIndicatorView to stop */ public DelayedStop(final ActivityIndicatorView view) { _view = view; } /** * @see Runnable#run() */ public void run() { try { Thread.sleep(3000); } catch (final InterruptedException e) { } _view.getModel().cancel(); } } /** * Thread class which starts an ActivityIndicatorView animation after an * arbitrary delay. */ private static class DelayedStart extends Thread { private final ActivityIndicatorView _view; /** * Creates a new DelayedStart object * * @param view * The ActivityIndicatorView to start */ public DelayedStart(final ActivityIndicatorView view) { _view = view; } /** * @see Runnable#run() */ public void run() { try { Thread.sleep(2000); } catch (final InterruptedException e) { } _view.getModel().reset(); } } /** * A popup screen class demonstrating the displaying of activity indicators * on a modal screen. */ private static class ActivityPopupScreen extends PopupScreen implements FieldChangeListener { private final ActivityIndicatorView _view; private final ButtonField _buttonFieldStopStart; private final ButtonField _buttonFieldClose; private boolean _topSpinning; /** * Creates a new ProgressPopupScreen object * * @param view * The ActivityIndicatorView to display on this screen */ public ActivityPopupScreen(final ActivityIndicatorView view) { super(view); setChangeListener(this); _view = view; _topSpinning = true; _buttonFieldStopStart = new ButtonField("Stop Top Spinner", Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK); _buttonFieldStopStart.setChangeListener(this); _view.add(_buttonFieldStopStart); _buttonFieldClose = new ButtonField("Close Popup", Field.FIELD_HCENTER | ButtonField.CONSUME_CLICK); _buttonFieldClose.setChangeListener(this); _view.add(_buttonFieldClose); } /** * @see FieldChangeListener#fieldChanged(Field, int) */ public void fieldChanged(final Field field, final int context) { if (field == _buttonFieldStopStart) { if (_topSpinning) { _view.getModel().cancel(); _buttonFieldStopStart.setLabel("Restart Top Spinner"); _topSpinning = false; } else { _view.getModel().reset(); _buttonFieldStopStart.setLabel("Stop Top Spinner"); _topSpinning = true; } } else if (field == _buttonFieldClose) { close(); } } /** * @see Screen#keyChar(char, int, int) */ protected boolean keyChar(final char ch, final int status, final int time) { if (ch == Characters.ESCAPE) { close(); return true; } return super.keyChar(ch, status, time); } } }