Friday 15 July 2011

Testing a BlackBerry device application

BerrySync is a project which involve into BlackBerry and Firefox Sync by using JAVA ME. For testing a BlackBerry application, RIM suggest:

  • Testing applications on a BlackBerry Smartphone Simulator
  • Testing applications on a BlackBerry device
  • Testing applications using the compiled .cod files



 Testing a BlackBerry device application (1) 
                                        -- Testing applications on a BlackBerry Smartphone Simulator

 After you develop and compile your application, you can test it on the BlackBerry® device. The most common first step is to set the BlackBerry® Java® Development Environment to use a BlackBerry® Smartphone Simulator. The BlackBerry Smartphone Simulator runs the same Java code as the BlackBerry devices, so the BlackBerry Smartphone Simulator provides an accurate environment for testing how applications will function on a BlackBerry device. The BlackBerry JDE includes current versions of the BlackBerry Smartphone Simulator. To download additional versions of the BlackBerry Smartphone Simulator, visit http://www.blackberry.com/developers/index.shtml.

http://www.cs.toronto.edu/~delara/courses/csc309/guide/rim/core.pdf  )


There is the instruction of "Setting up your machine" which made by my teammate Carlin Woshkulak Desautels.

Description

  1. Download BB Eclipse IDE:
  2. Download Simulators:
  3. Install Everything
  4. Install the BB 5.0 JRE
  5. Set up debug environments
  6. If the Project fails to package
    • Add the directory of jar.exe to the system build path
    • C:\Program Files (x86)\Java\jdk1.6.0_25\bin

  • In steps 1-4, the downloads require a blackberry developer account
  • In step 6, your systems java JDK must be 32-bit that is an example path of java 1.6.25
  •  In step 5, I will suggest to "Duplicate" a existing one, and then "Edit" it.

After setting up the machine, you can select your "BlackBerry Project", then click "Run on BlackBerry Simulator" or "Debug on BlackBerry Simulator". The result will shows on console. 


The BlackBerry Plug-in also has "Debug Perspective" available. The button locate on the top right corner.



Testing a BlackBerry device application (2) 
           --Testing applications on a BlackBerry device

After you test your application on the BlackBerry® Smartphone Simulator, you can install your application on a BlackBerry device. If your application uses signed APIs, you might need code signing keys. After you install the application on the BlackBerry device, you can open the application and test its functionality and performance.
For debugging purposes, you can attach your device to the BlackBerry® Integrated Development Environment and use the debugging tool to step through your application code. The BlackBerry IDE can be useful if you are trying to identify a network or Bluetooth® issue, or other issues that are difficult to simulate.



Register to use protected BlackBerry APIs

  1. Visit www.blackberry.com/JDEKeys and complete the registration form.
  2. Save the .csi file that Research In Motion sends to you. The .csi file contains a list of signatures and your registration information. If the BlackBerry® Signing Authority Tool administrator does not provide you with the .csi file or the Registration PIN and you are an ISV partner, contact your ISV Technical Partnership Manager. If you are not an ISV partner, send an email message to jde@rim.com.
  3. Double-click the .csi file to start the BlackBerry Signing Authority Tool .
  4. If a dialog box appears that states that a private key cannot be found, follow the instructions to create a new key pair file.
  5. In the Registration PIN field, type the PIN that RIM provided.
  6. In the Private Key Password field, type a password of at least eight characters. The private key password protects your private key. If you lose this password, you must register again with RIM. If this password is stolen, contact RIM immediately.
  7. Click Register.
  8. Click Exit.



Install signing key:
  • After completing the registration from, RIM will send 3 .csi files which separated in 3 e-mails with the instruction.
  • Follow the instruction to install the signing key.

Install BlackBerry desktop software:

Load on BlackBerry device:
  • In Package Explorer View, Right-click your "BlackBerry Project" > Click BlackBerry > Sign with Signature Tool
  • In Package Explorer View, Right-click your "BlackBerry Project" > Click BlackBerry > Load Project(s) on Device

Debug on BlackBerry device:
  • In BlackBerry Plug-in, BlackBerry > Debug As > BlackBerry Device

Friday 8 July 2011

BlackBerry Network Communication

There are 3 ways to make a network connection in BlackBerry.











Code Examples:

V6.0
 Reference:  http://docs.blackberry.com/en/developers/deliverables/21129/BlackBerry_Java_SDK-Development_Guide--1327377-1108115628-001-6.0-US.pdf


import net.rim.device.api.io.URI;
import net.rim.device.api.io.messaging.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.system.Application;
import java.io.*;
public class NetworkSample extends UiApplication
{
public static void main(String[] args)
{
NetworkSample app = new NetworkSample();
app.enterEventDispatcher();
}
public NetworkSample()
{
pushScreen(new NonBlockingSenderSample());
}
}
class NonBlockingSenderSample extends MainScreen
implements FieldChangeListener
{
ButtonField _btnNonBlock = new ButtonField(Field.FIELD_HCENTER);
private static UiApplication _app = UiApplication.getUiApplication();
public NonBlockingSenderSample()
{
_btnNonBlock.setChangeListener(this);
_btnNonBlock.setLabel("Fetch page");
add(_btnNonBlock);
}

public void fieldChanged(Field button, int unused)
{
if(button == _btnNonBlock)
{
NonBlockingSenderDestination destination = null;
try
{
//URI uri = URI.create("http://www.blackberry.com");
URI uri = URI.create("https://auth.services.mozilla.com/user/1.0/nprm3itjzzndm2bh2tmtmzbanfkw4mwh/node/weave"); 
 
NBSDMsgListener responseListener = new NBSDMsgListener();
destination = (NonBlockingSenderDestination)
DestinationFactory.getSenderDestination
("CommAPISample", uri);
if (destination == null)
{
destination =
DestinationFactory.createNonBlockingSenderDestination
(new Context("CommAPISample"), uri, responseListener);
}
// Send message to retrieve the response
destination.send();
}
catch(Exception e)
{
// process the error
}
}
}
}
class NBSDMsgListener implements MessageListener
{
public void onMessage(Destination dest, Message msg)
{
String payload = null;
if (msg instanceof ByteMessage)
{
ByteMessage reply = (ByteMessage) msg;
payload = (String) reply.getStringPayload();
} else if(msg instanceof StreamMessage)
{
StreamMessage reply = (StreamMessage) msg;
InputStream is = reply.getStreamPayload();
byte[] data = null;
try {
data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
} catch (IOException e) {
}
if(data != null)
{
payload = new String(data);
}
}
if(payload!=null)
{
synchronized(Application.getEventLock())
{
UiApplication.getUiApplication().pushScreen

(new HTTPOutputScreen(payload));
}
}
}
public void onMessageCancelled(Destination arg0, int arg1)
{
// process message cancelled notification
}
public void onMessageFailed(Destination arg0, MessageFailureException arg1)
{
// process message failed notification
}
}
class HTTPOutputScreen extends MainScreen
{
RichTextField _rtfOutput = new RichTextField();
public HTTPOutputScreen(String message)
{
_rtfOutput.setText("Retrieving data. Please wait...");
add(_rtfOutput);
showContents(message);
}
// After the data has been retrieved, display it
public void showContents(final String result) {
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
_rtfOutput.setText(result);
}
});
}
}

v5.0
Reference:  http://docs.blackberry.com/en/developers/deliverables/21129/BlackBerry_Java_SDK-Development_Guide--1327377-1108115628-001-6.0-US.pdf

Notes: 
Comment out: creating network transport list part.
Reason: 1) In this part, TcpCellularOptions.isDefaultAPNSet() belongs to jre 6.0 API

              2) There is a default list available.

import net.rim.device.api.io.transport.*;
import net.rim.device.api.io.transport.options.*;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.util.Arrays;
import java.io.*;
import javax.microedition.io.*;
public class NetworkSample extends UiApplication
{
public static void main(String[] args)
{
NetworkSample app = new NetworkSample();
app.enterEventDispatcher();
}
public NetworkSample()
{
new HTTPConnectionSetup();
}
}
class HTTPConnectionSetup
{
ConnectionFactory _factory = new ConnectionFactory();
public HTTPConnectionSetup()
{
/*****************************************************************************
Comment out: creating network transport list 
 *****************************************************************************
// Create preference ordered list of transports
int[] _intTransports =
{ TransportInfo.TRANSPORT_TCP_WIFI,
TransportInfo.TRANSPORT_WAP2,
TransportInfo.TRANSPORT_TCP_CELLULAR
};
// Remove any transports that are not (currently) available
for(int i = 0; i < _intTransports.length ; i++)
{
int transport = _intTransports[i];
if(!TransportInfo.isTransportTypeAvailable(transport)
|| !TransportInfo.hasSufficientCoverage(transport))
{

Arrays.removeAt(_intTransports, i);
}
}
// Set options for TCP Cellular transport
TcpCellularOptions tcpOptions = new TcpCellularOptions();
if(!TcpCellularOptions.isDefaultAPNSet())
{
tcpOptions.setApn("My APN");
tcpOptions.setTunnelAuthUsername("user");
tcpOptions.setTunnelAuthPassword("password");
}
// Set ConnectionFactory options
if(_intTransports.length > 0)
{
_factory.setPreferredTransportTypes(_intTransports);
}
_factory.setTransportTypeOptions(TransportInfo.TRANSPORT_TCP_CELLULAR,
tcpOptions);
_factory.setAttemptsLimit(5);

*****************************************************************************/
 
 
// Open a connection on a new thread
Thread t = new Thread(new Runnable()
{
public void run()
{
//ConnectionDescriptor cd = _factory.getConnection("http://www.blackberry.com");
ConnectionDescriptor cd = _factory.getConnection("https://auth.services.mozilla.com/user/1.0/nprm3itjzzndm2bh2tmtmzbanfkw4mwh/node/weave");
// If connection was successful, fetch and show the content from
// the web server
if(cd != null)
{
Connection c = cd.getConnection();
displayContent(c);
}
}
});
t.start();
}
private void displayContent(final Connection conn)
{
// When the connection thread completes, show the data from the web server
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
UiApplication.getUiApplication().pushScreen(new HTTPOutputScreen(conn));
}
});
}
}
class HTTPOutputScreen extends MainScreen
{
RichTextField _rtfOutput = new RichTextField();
public HTTPOutputScreen(Connection conn)
{
// Create a container for the data, and put it on the screen
_rtfOutput.setText("Retrieving data. Please wait...");

add(_rtfOutput);
// Retrieve the data from the web server, using the connection, on a
// separate thread
ContentReaderThread t = new ContentReaderThread(conn);
t.start();
}
// After the data has been retrieved, display it
public void showContents(final String result)
{
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
_rtfOutput.setText(result);
}
});
}
private final class ContentReaderThread extends Thread
{
private Connection _connection;
ContentReaderThread(Connection conn)
{
_connection = conn;
}
public void run()
{
String result = "";
OutputStream os = null;
InputStream is = null;
try
{
// Send HTTP GET to the server
OutputConnection outputConn = (OutputConnection) _connection;
os = outputConn.openOutputStream();
String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n";
os.write(getCommand.getBytes());
os.flush();
// Get InputConnection and read the server's response
InputConnection inputConn = (InputConnection) _connection;
is = inputConn.openInputStream();
byte[] data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
result = new String(data);
// is.close();
}
catch(Exception e)
{
result = "ERROR fetching content: " + e.toString();
}
finally
{
// Close OutputStream
if(os != null)
{
try
{
os.close();

}
catch(IOException e)
{
}
}
// Close InputStream
if(is != null)
{
try
{
is.close();
}
catch(IOException e)
{
}
}
// Close Connection
try
{
_connection.close();
}
catch(IOException ioe)
{
}
}
// Show the response received from the web server, or an error message
showContents(result);
}
}
}


v4.0
Reference:  http://docs.blackberry.com/en/developers/deliverables/21129/BlackBerry_Java_SDK-Development_Guide--1327377-1108115628-001-6.0-US.pdf


 .........