Wednesday, April 6, 2011

Custom Blackberry TextBox which acts like iPhone TextBox showing the last typed character for a while.

Often we mistype characters in Blackberry while typing passwords. Here is a custom textbox which shows the last typed character for a while and then converts it into an asterisks.


/*
* CustomTextBox.java
*
* © ,
* Confidential and proprietary.
*/

package PasswordField;

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.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.EditField;
import java.util.Timer;
import java.util.TimerTask;

public class CustomTextBox extends Manager
{
StringBuffer sb = new StringBuffer();
StringBuffer display_sb = new StringBuffer();
EditField ef = new EditField();
Timer t ;//= new Timer();
/**
* Default margins
*/
private final static int DEFAULT_LEFT_MARGIN = 20;
private final static int DEFAULT_RIGHT_MARGIN = 20;
private final static int DEFAULT_TOP_MARGIN = 5;
private final static int DEFAULT_BOTTOM_MARGIN = 5;
/**
* Default paddings
*/
private final static int DEFAULT_LEFT_PADDING = 10;
private final static int DEFAULT_RIGHT_PADDING = 10;
private final static int DEFAULT_TOP_PADDING = 5;
private final static int DEFAULT_BOTTOM_PADDING = 5;
/**
* Margins around the text box
*/
private int topMargin = DEFAULT_TOP_MARGIN;
private int bottomMargin = DEFAULT_BOTTOM_MARGIN;
private int leftMargin = DEFAULT_LEFT_MARGIN;
private int rightMargin = DEFAULT_RIGHT_MARGIN;
/**
* Padding around the text box
*/
private int topPadding = DEFAULT_TOP_PADDING;
private int bottomPadding = DEFAULT_BOTTOM_PADDING;
private int leftPadding = DEFAULT_LEFT_PADDING;
private int rightPadding = DEFAULT_RIGHT_PADDING;
/**
* Amount of empty space horizontally around the text box
*/
private int totalHorizontalEmptySpace = leftMargin + leftPadding
+ rightPadding + rightMargin;
/**
* Amount of empty space vertically around the text box
*/
private int totalVerticalEmptySpace = topMargin + topPadding
+ bottomPadding + bottomMargin;
/**
* Minimum height of the text box required to display the text entered
*/
private int minHeight = getFont().getHeight() + totalVerticalEmptySpace;
/**
* Width of the text box
*/
private int width = Display.getWidth();
/**
* Height of the text box
*/
private int height = minHeight;
/**
* Background image for the text box
*/
private EncodedImage backgroundImage;
/**
* Bitmap version of the backgroundImage.
* Needed to reduce the calculation overhead incurred by
* scaling of the given image
* and derivation of Bitmap from the
* EncodedImage every time it is needed.
*/
private Bitmap bitmapBackgroundImage;
/**
* The core element of this text box
*/
private EditField editField;
//private BasicEditField editField;
//private String entireText;
public CustomTextBox()
{
// Let the super class initialize the core
super(0);
// An edit field is the sole field of this manager.
editField = new EditField();
//editField = new CustomEditField();
add(editField);
}
public CustomTextBox(EncodedImage backgroundImage)
{
this();
setBackgroundImage(backgroundImage);
}
public void setSize(int width, int height)
{
boolean isChanged = false;
if (width > 0 // Ignore invalid width
&& this.width != width)
{
this.width = width;
isChanged = true;
}
// Ignore the specified height if it is less
// than the minimum height required to display the text.
if (height > minHeight && height != this.height)
{
this.height = height;
isChanged = true;
}
// If width/height has been changed and background image
// is available, adapt it to the new dimension
if (isChanged == true && backgroundImage != null)
{
bitmapBackgroundImage = getScaledBitmapImage(backgroundImage,
this.width - (leftMargin+rightMargin),
this.height - (topMargin+bottomMargin));
}
}
public void setWidth(int width)
{
if (width > 0 && width != this.width)
{
this.width = width;
// If background image is available, adapt it to the new width
if (backgroundImage != null)
{
bitmapBackgroundImage = getScaledBitmapImage(backgroundImage,
this.width - (leftMargin+rightMargin),
this.height - (topMargin+bottomMargin));
}
}
}
public void setHeight(int height)
{
// Ignore the specified height if it is
// less than the minimum height required to display the text.
if (height > minHeight)
{
this.height = height;
// If background image is available, adapt it to the new width
if (backgroundImage != null)
{
bitmapBackgroundImage = getScaledBitmapImage(backgroundImage,
this.width - (leftMargin+rightMargin),
this.height - (topMargin+bottomMargin));
}
}
}
public void setBackgroundImage(EncodedImage backgroundImage)
{
this.backgroundImage = backgroundImage;
// Consider the height of background image in
// calculating the height of the text box.
// setHeight() does not ensure that specified
// height will be in effect, of course, for valid reasons.
// So derivation of Bitmap image in the setHeight() method is not sure.
setHeight(backgroundImage.getHeight() + topMargin + bottomMargin);
if (bitmapBackgroundImage == null)
{
bitmapBackgroundImage = getScaledBitmapImage(backgroundImage,
this.width - (leftMargin+rightMargin),
this.height - (topMargin+bottomMargin));
}
}
/**
* Generate and return a Bitmap Image scaled according
* to the specified width and height.
*
* @param image EncodedImage object
* @param width Intended width of the returned Bitmap object
* @param height Intended height of the returned Bitmap object
* @return Bitmap object
*/
private Bitmap getScaledBitmapImage(EncodedImage image, int width, int height)
{
// Handle null image
if (image == null)
{
return null;
}
int currentWidthFixed32 = Fixed32.toFP(image.getWidth());
int currentHeightFixed32 = Fixed32.toFP(image.getHeight());
int requiredWidthFixed32 = Fixed32.toFP(width);
int requiredHeightFixed32 = Fixed32.toFP(height);
int scaleXFixed32 = Fixed32.div(currentWidthFixed32, requiredWidthFixed32);
int scaleYFixed32 = Fixed32.div(currentHeightFixed32, requiredHeightFixed32);
image = image.scaleImage32(scaleXFixed32, scaleYFixed32);
return image.getBitmap();
}
protected void sublayout(int width, int height)
{
// We have one and only child - the edit field.
// Place it at the appropriate place.
Field field = getField(0);
layoutChild(field, this.width - totalHorizontalEmptySpace,
this.height - totalVerticalEmptySpace);
setPositionChild(field, leftMargin+leftPadding, topMargin+topPadding);
setExtent(this.width, this.height);
}
public void setTopMargin(int topMargin)
{
this.topMargin = topMargin;
}
public void setBottomMargin(int bottomMargin)
{
this.bottomMargin = bottomMargin;
}
protected void paint(Graphics graphics)
{
// Draw background image if available, otherwise draw a rectangle
if (bitmapBackgroundImage == null)
{
//graphics.drawRect(leftMargin, topMargin,
//width - (leftMargin+rightMargin),
//height - (topMargin+bottomMargin));
graphics.setColor(Color.BLACK);
graphics.drawRoundRect(leftMargin-1, topMargin-1,
width - (leftMargin+rightMargin) + 2 ,
height - (topMargin+bottomMargin) + 2, 5, 5);
graphics.setColor(Color.WHITE);
graphics.fillRoundRect(leftMargin, topMargin,
width - (leftMargin+rightMargin),
height - (topMargin+bottomMargin), 5, 5);
graphics.setColor(Color.BLACK);
}
else
{
graphics.drawBitmap(leftMargin, topMargin,
width - (leftMargin+rightMargin),
height - (topMargin+bottomMargin),
bitmapBackgroundImage, 0, 0);
}
// Determine the rightward text that can fit into the visible edit field
ef = (EditField)getField(0);
String entireText = ef.getText();
boolean longText = false;
String textToDraw = "";
Font font = getFont();
int availableWidth = width - totalHorizontalEmptySpace;
if (font.getAdvance(entireText) <= availableWidth)
{
textToDraw = entireText;
}
else
{
int endIndex = entireText.length();
for (int beginIndex = 1; beginIndex < endIndex; beginIndex++)
{
textToDraw = entireText.substring(beginIndex);
if (font.getAdvance(textToDraw) <= availableWidth)
{
longText = true;
break;
}
}
}
if (longText == true)
{
// Force the edit field display only the truncated text
ef.setText(textToDraw);
// Now let the components draw themselves
super.paint(graphics);
// Return the text field its original text
ef.setText(entireText);
}
else
{
super.paint(graphics);
System.out.println("--"+ ef.getText());
System.out.println(sb.toString());
//int length = ef.getText().length();
//final String displayString = getDisplayString(length);
t = new Timer();
TimerTask tt = new TimerTask() {
public void run() {
//Set value of the field that displays the timer value here
ef.setText(display_sb.toString());
t.cancel();
}
};
t.schedule(tt,1000);//scheduleAtFixedRate(tt, 1000, 1000);*/
}
}
public int getPreferredWidth()
{
return width;
}
public int getPreferredHeight()
{
return height;
}
protected boolean keyChar(char ch, int status, int time)
{
if (ch == Characters.ENTER)
{
return true;
}
else if(ch == Characters.BACKSPACE){
if(display_sb.length()>0){
display_sb.deleteCharAt(display_sb.length()-1);
}
return true;
} else
{
System.out.println(ch);
sb.append(ch);
display_sb.append("*");
return super.keyChar(ch, status, time);
}
}
public String getText()
{
return ((EditField)getField(0)).getText();
}
public void setText(final String text)
{
((EditField)getField(0)).setText(text);
System.out.println("Set text "+text);
}
}

Friday, February 25, 2011

Blackberry device , RIM NOC, BES and SAP

Blackberry Enterprise Server and the Network Operation Center of RIM

Here I have given little information about the Blackberry device, Blackberry Enterprise server and the Network Operation Center of Research In Motion.

We know that a blackberry device when configured with the intranet network of an organization can receive emails being pushed from the intranet mail server. The push option of the blackberry will notify you whenever a new mail comes in the blackberry or a meeting request comes is one of the important features of this device. The under given paragraph explains how the whole the Blackberry device the Back end Blackberry Enterprise server and the Network Operation Center of RIM works together.

Every enterprise which has a Blackberry infrastructure has a Blackberry Enterprise Server (BES). The BES is a server which can talk to the Micros soft Exchange Server or lotus Domino of the enterprise to retrieve the mails. Once a mail comes in the mail exchange server of a enterprise the mail is retrieved by the BES server and then sent it to the NOC of RIM. The NOC is the data center where all the mails or data transfer between the BES and the Blackberry device passes through. There are two NOC of RIM one is in Canada and the other one in US. From the NOC the emails will be transferred to the appropriate devices. One of the main advantages for using the NOC is the security advantage; all the traffic between the BES is encrypted using triple DES as it travels through the NOC. And because all the traffic goes through the NOC before being routed to the BES, the BES accepts incoming transactions from only one location that is the NOC thus receiving only trusted data. Some other smart phones accept incoming transactions from the internet which makes it exposed to receive untrusted data.

Blackberry and SAP

Research In Motion (RIM) and SAP® are making SAP Customer Relationship Management (SAP CRM) available virtually anywhere, anytime.

Read the full information here:

http://uk.blackberry.com/solutions/needs/intelligence/sap.jsp

http://na.blackberry.com/eng/campaign/SAPcampaign/

Simple way of connecting a Blackberry application to SAP

Connecting Java Applications for Blackberry to SAP Application

The most common way to connect a Blackberry application to a SAP application is by using the standard HTTP protocol. As of now there is no API which is included by the RIM which allows the Blackberry application to directly talk to a SAP application. The work around to connect to a SAP application from a Blackberry application is to employ a back-end application which supports HTTP protocol. The flow of connection is as follows:

1. The Blackberry application sends data to the back-end application using HTTP POST

2. It can retrieve data HTTP GET

3. The Blackberry application can even synchronize data with the back-end application which handles the connection between itself and the SAP application.

The back-end application makes use of JCo to connect itself to the SAP application. Its a very good and a common way to pass all the data exchanged between the Blackberry application and the beck-end application in a form which can be parsed by both the applications. This will enable the back-end application to pass the data to and fro between the Blackberry application and the SAP application after parsing it in a form suitable by the SAP application.

Easy start steps for developing a Blackberry application.

1. Download the development tool and install it

You can download the JDE which is provided by RIM to develop Blackberry applications. The other option is the eclipse plug in which can also be used to develop Blackberry applications.

2. Open the JDE and create a new workspace.

3. Create a new project in this workspace.

4. Now you can add classes to this project and build the application by clicking the Build menu item in the menu bar.

5. Once the project is build the JDE creates some files in the build folder.

6. If the build is successful then you can run the application in the simulator by pressing the F5 key of your keyboard or by clicking the Build All and Run in the Build menu item in the menu bar.

7. By default a simulator is already selected by the JDE and opens the simulator.

8. On the simulator you can find many icons of different applications which are already available.

9. Search for your particular project name (usually a black icon) with the project name you have given will be available.

10. Clicking on this icon will run the application.

Configuring MDS for accessing network through the simulator

In order to access intranet or internet from the simulator of the Blackberry we need to run the Mobile Data Service (MDS). The MDS comes along with the JDE or we can download it separately. If you are inside a intranet then you need to set the proxy correctly in the MDS. To set the proxy settings follow the below steps:

1. Go to MDS folder

2. Next go to Config folder

3. You willfind a file called rimpublic.property

4. In # [HTTP HANDLER] change the proxies enabled to True and change the proxy host and the proxy port.