package app.screen; import impl.rim.com.twitterapime.xauth.ui.BrowserContentManagerOAuthDialogWrapper; import com.twitterapime.rest.Credential; import com.twitterapime.rest.TweetER; import com.twitterapime.rest.UserAccountManager; import com.twitterapime.search.Tweet; import com.twitterapime.xauth.Token; import com.twitterapime.xauth.ui.OAuthDialogListener; import com.twitterapime.xauth.ui.OAuthDialogWrapper; import net.rim.device.api.browser.field.BrowserContentManager; import net.rim.device.api.browser.field.RenderingOptions; import net.rim.device.api.ui.UiApplication; import net.rim.device.api.ui.component.ButtonField; import net.rim.device.api.ui.component.Dialog; import net.rim.device.api.ui.component.EditField; import net.rim.device.api.ui.component.LabelField; import net.rim.device.api.ui.container.MainScreen; public class TwitterScreen extends MainScreen { // ** Información de tu aplicación en Twitter private final String CONSUMER_KEY = "TU_CONSUMER_KEY"; private final String CONSUMER_SECRET = "TU_CONSUMER_SECRET"; // ** Colocar el callback autorizado en tu aplicación Twitter // ** si no colocas nada, Twitter te pedirá validar con un PIN private final String CALLBACK_URL = "URL_CALLBACK_AUTORIZADO_DESDE_TWITTER"; // ** Label simplemente a modo de log private LabelField labelLog; // ** Componente de la API que hace el trabajo private OAuthDialogWrapper pageWrapper = null; // ** Inner class que nos levanta la página de Twitter ShowAuthBrowser showAuthBrowserScreen; /** * Constructor */ public TwitterScreen() { // ** Definimos un título para nuestra ventana setTitle("Twitter API ME - OAuth"); // ** Iniciamos una única vez nuestro browser // ** (lo llamaremos 2 veces) showAuthBrowserScreen = new ShowAuthBrowser(); // 1ra vez que invocamos al browser para firmarse add ( new ButtonField( "Firmarse" ) { protected boolean navigationUnclick(int status, int time) { // ** pedimos firmar sin código PIN showAuthBrowserScreen.doAuth( null ); // ** mostramos la pantalla del browser UiApplication.getUiApplication().pushScreen( showAuthBrowserScreen); return true; } }); if ( CALLBACK_URL.trim().equals("") ) { // ** edit field para ingresar el PIN que nos provee Twitter final EditField editPin = new EditField("Ingresa PIN Twitter: ", "" ); add( editPin ); // 2da vez que invocamos al browser para firmarse add( new ButtonField( "Validar PIN" ) { protected boolean navigationUnclick(int status, int time) { if ( editPin.getText() != null && !editPin.getText().trim().equals("") ) { // ** pedimos firmar, ahora con un código PIN showAuthBrowserScreen.doAuth( editPin.getText() ); // ** mostramos nuevamente la pantalla del browser UiApplication.getUiApplication().pushScreen( showAuthBrowserScreen ); return true; } return true; } }); } } /** * Inner class para mostrar el browser con Twitter * @author Walter A. Rodriguez * */ class ShowAuthBrowser extends MainScreen implements OAuthDialogListener { // ** Browser de la API que nos levanta la página de Twitter BrowserContentManager browserMngr = new BrowserContentManager(0); RenderingOptions rendOptions = null; /** * Constructor */ public ShowAuthBrowser() { // ** definimos algunos valores básicos de renderizado del browser rendOptions = browserMngr.getRenderingSession().getRenderingOptions(); rendOptions.setProperty( RenderingOptions.CORE_OPTIONS_GUID, RenderingOptions.SHOW_IMAGES_IN_HTML, false); // ** escribimos un log en pantalla labelLog = new LabelField( "Cargando Twitter..." ); add( labelLog ); // ** agregamos por primera vez el browser en pantalla add(browserMngr); // ** creamos el objeto que navegará en Twitter pageWrapper = new BrowserContentManagerOAuthDialogWrapper(browserMngr); // ** y le definimos los valores claves pageWrapper.setConsumerKey(CONSUMER_KEY); pageWrapper.setConsumerSecret(CONSUMER_SECRET); pageWrapper.setCallbackUrl(CALLBACK_URL); pageWrapper.setOAuthListener(this); } /** * Método que realiza el login (con y sin PIN) * @param pin */ public void doAuth( String pin ) { try { if ( pin == null ) { // ** si no viene PIN, hacemos el primer login pageWrapper.login(); } else { // ** si viene un PIN, borramos el browser anterior // ** y cargamos uno nuevo this.deleteAll(); add(browserMngr); // ** volvemos a loguearnos con PIN pageWrapper.login( pin ); } } catch ( Exception e ) { // ** los errores en el proceso aparecen por aquí final String message = "Error loggin Twitter: " + e.getMessage(); System.out.println( message ); PowerDialog.displayMessage( message ); } } /** * Si el login fue correcto... */ public void onAccessDenied(String response ) { System.out.println("Access denied! -> " + response ); updateScreenLog( "Acceso denegado! -> " + response ); } /** * Autorización satisfactoria */ public void onAuthorize(Token token) { // ** obtenemos el Token desde Twitter final Token myToken = token; UiApplication.getUiApplication().invokeLater( new Runnable() { public void run() { // ** ya podemos borrar todo en pantalla deleteAll(); String tweetTest = "Test: " + System.currentTimeMillis(); // ** hacemos un tweet de prueba doTweet( tweetTest, myToken ); PowerDialog.displayMessage( "Estas autorizado! - " + "Se ha enviado el siguiente Tweet de prueba " + "a tu cuenta: " + tweetTest ); // ** cerramos esta ventana close(); } }); } /** * La autentificación falla */ public void onFail(String arg0, String arg1) { System.out.println("Error autentificando usuario! -> " + arg0 + ", " + arg1); updateScreenLog("Error autentificando usuario! -> " + arg0 + ", " + arg1); } } /** * Actualiza el mensaje en pantalla * * @param message Texto a mostrar en pantalla a modo de log. */ private void updateScreenLog( final String message ) { UiApplication.getUiApplication().invokeLater( new Runnable() { public void run() { labelLog.setText( message ); } }); } /** * Método que realiza un tweet de prueba * * @param message * @param token */ public void doTweet( String message, Token token ) { // ** creamos un objeto de credenciales Credential c = new Credential(CONSUMER_KEY, CONSUMER_SECRET, token); // ** creamos un objeto de administración de cuenta de usuario UserAccountManager uam = UserAccountManager.getInstance(c); try { if (uam.verifyCredential()) { TweetER.getInstance(uam).post(new Tweet( message )); System.out.println("Tweet posteado!"); updateScreenLog("Tweet posteado!"); } } catch (Exception e) { System.out.println("Error by posting tweet."); updateScreenLog("Error by posting tweet."); } } /** * Una clase auxiliar para mostrar un diálogo en pantalla * * @author Walter A. Rodriguez * */ static class PowerDialog { public static void displayMessage( final String message ) { UiApplication.getUiApplication().invokeLater( new Runnable() { public void run() { Dialog.alert( message ); } }); } } }