/* * PersistentStoreDemo.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.blackberrybalancedemo; import java.util.Vector; import net.rim.device.api.system.MultiServicePlatformConstants; import net.rim.device.api.system.MultiServicePlatformManager; import net.rim.device.api.system.PersistentObject; import net.rim.device.api.system.PersistentStore; import net.rim.device.api.system.ServiceMode; import net.rim.device.api.ui.Screen; import net.rim.device.api.ui.UiApplication; import net.rim.device.api.ui.component.Dialog; /** * A sample application to demonstrate the BlackBerry Balance service. This * project is a simple GUI memo application in which memos are created and saved * in persistent store. Memos encapsulate a service mode property which is set * when the multi service framework suggests a relevant service mode for this * application to operate in. The application registers a * MultiServicePlatformListener with the framework so as to be notified when * controlled data should be wiped from the device. */ public final class BlackBerryBalanceDemo extends UiApplication { private static Vector _memos; private static PersistentObject _store; private static BlackBerryBalanceDemoScreen _screen; // com.rim.samples.device.blackberrybalancedemo = 0x58202aef09586a38L static final long BLACKBERRY_BALANCE_DEMO_ID = 0x58202aef09586a38L; /** * Entry point for application * * @param args * Command-line arguments (not used) */ public static void main(final String[] args) { final BlackBerryBalanceDemo app = new BlackBerryBalanceDemo(); app.enterEventDispatcher(); } /** * Creates a new PersistentStoreDemo object */ public BlackBerryBalanceDemo() { MultiServicePlatformManager.addListener(new MultiServiceListener(), MultiServicePlatformConstants.LOW_PRIORITY); // Retrieve the persistent object for this application _store = PersistentStore.getPersistentObject(BLACKBERRY_BALANCE_DEMO_ID); // Synchronize on the PersistentObject so that no other object can // acquire the lock before we finish our commit operation. synchronized (_store) { // If the PersistentObject is empty, initialize it if (_store.getContents() == null) { _store.setContents(new Vector()); } } // Retrieve the saved Memo objects from the persistent store _memos = (Vector) _store.getContents(); // Push the main screen onto the display stack _screen = new BlackBerryBalanceDemoScreen(_memos); pushScreen(_screen); } /** * Saves new or updated memo * * @param memo * The memo to be saved * @param index * The memo's position in the collection. A value of -1 * represents a new meeting. */ public void saveMemo(final Memo memo, final int index) { if (index >= 0) { _screen.getModel().removeRowAt(index); _screen.getModel().insertRowAt(index, memo); } else { _screen.getModel().addRow(memo); } } /** * Returns collection of Memo objects * * @return A vector of Memo objects */ public Vector getMemos() { return _memos; } /** * Commits the updated vector of Memo objects to the persistent store. */ public void persist() { // Synchronize on the PersistentObject so that no other object can // acquire the lock before the commit operation is finished. synchronized (_store) { _store.setContents(_memos); PersistentObject.commit(_store); } } /** * @see net.rim.device.api.system.Application#suggestServiceMode(ServiceMode) */ public boolean suggestServiceMode(final ServiceMode serviceMode) { // This particular application is only concerned with protecting data // that is flagged as corporate. Other implementations may want to // make a further distinction between personal/undecided data. if (!MultiServicePlatformManager.isCorporateServiceUid(serviceMode .getServiceUid())) { final Screen activeScreen = getActiveScreen(); if (activeScreen instanceof MemoScreen) { return activeScreen.suggestServiceMode(serviceMode); } } return super.suggestServiceMode(serviceMode); } /** * @see net.rim.device.api.system.Application#getServiceMode() */ public ServiceMode getServiceMode() { final Screen activeScreen = getActiveScreen(); if (activeScreen instanceof MemoScreen) { return activeScreen.getServiceMode(); } return super.getServiceMode(); } /** * Called by the MultiServiceListener class when this application needs to * discard any controlled data. For testing purposes this method could be * called explicitly by the application. For a real world testing scenario * the running Blackberry device would be activated against a BES server and * a command to delete organization data would be issued by the BES * administrator. */ public void onWipe(final String serviceUid, final long dataType) { final int size = _memos.size(); for (int i = size - 1; i >= 0; --i) { final Memo memo = (Memo) _memos.elementAt(i); if (serviceUid.equals(memo.getMode())) { _screen.getModel().removeRowAt(i); } } final Screen activeScreen = getActiveScreen(); if (activeScreen instanceof MemoScreen) { final Memo activeMemo = ((MemoScreen) activeScreen).getMemo(); final int index = ((MemoScreen) activeScreen).getMemoIndex(); if (index == -1 || !activeMemo.getMode().equals(serviceUid)) { // New memo with no wipable data, OK to save it. activeScreen.onClose(); } else { final Dialog dialog = new Dialog( Dialog.D_OK, "Application has been instructed to wipe corporate data." + " This memo will be deleted and this screen closed.", 0, null, 0); dialog.doModal(); this.popScreen(activeScreen); } } persist(); MultiServicePlatformManager.removeListener(new MultiServiceListener()); } }