/**
* Copyright (c) 2011 Martin M Reed
*
* 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 net.hardisonbrewing.signingserver.ui;
import java.util.Hashtable;
import java.util.Vector;
import net.hardisonbrewing.signingserver.SigservBBMApplication;
import net.hardisonbrewing.signingserver.model.JAD;
import net.hardisonbrewing.signingserver.model.SigningAuthority;
import net.hardisonbrewing.signingserver.service.Files;
import net.hardisonbrewing.signingserver.service.icon.IconService;
import net.hardisonbrewing.signingserver.service.icon.Icons;
import net.hardisonbrewing.signingserver.service.narst.NarstService;
import net.hardisonbrewing.signingserver.service.store.bbm.BBMApplicationStore;
import net.hardisonbrewing.signingserver.service.store.narst.CSKStore;
import net.hardisonbrewing.signingserver.service.store.narst.DBStore;
import net.hardisonbrewing.signingserver.service.store.sig.SigStatusChangeListener;
import net.hardisonbrewing.signingserver.service.store.sig.SigStatusChangeListenerStore;
import net.hardisonbrewing.signingserver.service.store.sig.SigStatusStore;
import net.hardisonbrewing.signingserver.widget.SubMenuPlatform;
import net.rim.device.api.system.Display;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.XYDimension;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.NullField;
import net.rim.device.api.ui.container.MainScreen;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HomeScreen extends MainScreen {
private static final Logger log = LoggerFactory.getLogger( HomeScreen.class );
private EncodedImage encodedImage;
private SigStatusChangeListener sigStatusChangeListener;
public HomeScreen() {
sigStatusChangeListener = new MyStatusChangeListener();
SigStatusChangeListenerStore.put( sigStatusChangeListener );
Hashtable status = SigStatusStore.get();
updateBackground( status );
add( new NullField( FOCUSABLE ) );
}
public boolean onClose() {
UiApplication.getUiApplication().requestBackground();
return false;
}
protected void paint( Graphics graphics ) {
super.paint( graphics );
graphics.setBackgroundColor( Color.BLACK );
graphics.clear();
int imageWidth = encodedImage.getScaledWidth();
int imageHeight = encodedImage.getScaledHeight();
int imageX = (int) ( ( getWidth() - imageWidth ) * 0.50 );
int imageY = (int) ( ( getHeight() - imageHeight ) * 0.50 );
graphics.drawImage( imageX, imageY, imageWidth, imageHeight, encodedImage, 0, 0, 0 );
}
private MenuItem[] makeNarstSubMenu() {
Vector menuItems = new Vector();
boolean hasCSK = CSKStore.get() != null;
boolean hasDB = DBStore.get() != null;
String loadCSKLabel = hasCSK ? "Switch Keys (CSK)" : "Load Keys (CSK)";
menuItems.addElement( new MenuItem( loadCSKLabel, 0, 0 ) {
public void run() {
NarstService.loadCSKFile();
}
} );
if ( hasCSK ) {
menuItems.addElement( new MenuItem( "Reset Keys (CSK)", 0, 0 ) {
public void run() {
CSKStore.put( null );
}
} );
}
String loadDBLabel = hasDB ? "Switch Authorities (DB)" : "Load Authorities (DB)";
menuItems.addElement( new MenuItem( loadDBLabel, 0, 0 ) {
public void run() {
NarstService.loadDBFile();
}
} );
if ( hasDB ) {
menuItems.addElement( new MenuItem( "Reset Authorities (DB)", 0, 0 ) {
public void run() {
DBStore.put( null );
}
} );
}
menuItems.addElement( new MenuItem( "Sign JAD", 0, 0 ) {
public void run() {
SigningAuthority[] signingAuthorities = getSigningAuthorities();
JAD jad;
try {
jad = NarstService.requestJADFile();
}
catch (Exception e) {
log.error( "Exception loading JAD file", e );
Dialog.inform( Files.LOAD_FILE_FAIL );
return;
}
UiApplication.getUiApplication().pushScreen( new CodSigningScreen( jad, signingAuthorities ) );
}
} );
menuItems.addElement( new MenuItem( "Sign COD", 0, 0 ) {
public void run() {
SigningAuthority[] signingAuthorities = getSigningAuthorities();
JAD jad;
try {
jad = NarstService.requestCodFilePath();
}
catch (Exception e) {
log.error( "Exception loading COD files", e );
Dialog.inform( Files.LOAD_FILE_FAIL );
return;
}
UiApplication.getUiApplication().pushScreen( new CodSigningScreen( jad, signingAuthorities ) );
}
} );
MenuItem[] _menuItems = new MenuItem[menuItems.size()];
menuItems.copyInto( _menuItems );
return _menuItems;
}
private SigningAuthority[] getSigningAuthorities() {
SigningAuthority[] signingAuthorities = DBStore.get();
while (signingAuthorities == null) {
String message = "This feature requires you to load a signing authorities file. The file is typically named with the extension DB. Would you like to load it now?";
int result = Dialog.ask( Dialog.D_YES_NO, message, Dialog.YES );
if ( result != Dialog.YES ) {
return null;
}
signingAuthorities = NarstService.loadDBFile();
}
return signingAuthorities;
}
protected void makeMenu( Menu menu, int instance ) {
super.makeMenu( menu, instance );
MenuItem[] narstSubMenu = makeNarstSubMenu();
SubMenuPlatform.addSubMenu( menu, narstSubMenu, "Narst", 0, 0 );
SigservBBMApplication bbmApplication = BBMApplicationStore.get();
if ( bbmApplication.isSupported() ) {
boolean bbmRegistered = bbmApplication.isRegistered();
if ( !bbmRegistered ) {
menu.add( new MenuItem( "BBM Connect", 0, 0 ) {
public void run() {
SigservBBMApplication bbmApplication = BBMApplicationStore.get();
bbmApplication.register();
}
} );
}
menu.add( new MenuItem( "Tell A Friend", 0, 0 ) {
public void run() {
SigservBBMApplication bbmApplication = BBMApplicationStore.get();
if ( bbmApplication.isRegistered( true ) ) {
bbmApplication.sendDownloadInvitation();
}
}
} );
}
}
private void updateBackground( Hashtable status ) {
String color;
if ( status == null || status.isEmpty() ) {
color = Icons.COLOR_UNKNOWN;
}
else if ( !SigStatusStore.isSuccess( status ) ) {
color = Icons.COLOR_FAILURE;
}
else {
color = Icons.COLOR_SUCCESS;
}
int size = Math.min( Display.getWidth(), Display.getHeight() );
XYDimension image = new XYDimension( size, size );
XYEdges padding = new XYEdges( 50, 50, 50, 50 );
encodedImage = IconService.getImage( Icons.LOGO_URL, image, padding, color );
}
private final class MyStatusChangeListener implements SigStatusChangeListener {
public void onStatusChange( Hashtable status ) {
updateBackground( status );
invalidate();
}
}
}