Archive for septiembre, 2011

Habilitar la opción de mover una App Android a la tarjeta SD

Posted on septiembre 22nd, 2011 in Desarrollo Android | 139 Comments »

Esta opción es interesante y, cada vez más, hay más gente que pide que se incluya en las aplicaciones.

Aunque la opción fue añadida en la versión 2.2, es posible incluirla en versiones previas de la SDK. Incluso una App hecha con la SDK 1.5 puede incluir esta función, aunque eso sí, la opción de mover a la SD sólo estará disponible en aquellos móviles con versión 2.2 o posterior.

Vamos con los pasos a seguir:

1. Modificar el Manifest

Edita el fichero AndroidManifest.xml file de la aplicación y añade el atributo “android:installLocation” en la etiqueta :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.yourapp"
      android:versionName="1.0.1" android:versionCode="3"
      android:installLocation="auto">

En este caso ponemos “auto”, lo que dará al usuario la opción de instalar la App en la memoria del móvil o en la SD. Otros valores son “internalOnly”, que es la opción por defecto si no se añade esta configuración, y “preferExternal”, que instalará la aplicación en la SD primero, si hay espacio para ello.

2. Actualizar el Build Target.

Como ya he mencionado, esto funciona en versiones anteriores a la 2.2, con lo que dejaremos la propiedad “minSdkVersion” tal cual la tenemos. Sin embargo, el “Build target” si debemos modificarlo a la versión 8 (SDK 2.2). En caso contrario, recibiríamos el siguiente error:

error: No resource identifier found for attribute ‘installLocation’ in package ‘android’


3. Cargar la App en el simulador con SDK 2.2

Esto es todo. Si vamos al móvil o simulador, en la administración de aplicaciones, veremos que tenemos disponible el botón de mover al SD.

Acceder a valores del portal desde un portlet

Posted on septiembre 20th, 2011 in Liferay | 171 Comments »

Estos días, estoy trabajando en un portlet que, por diversas razones, necesita saber en qué página aparece del portal. Aunque parezca una estupidez, he pasado bastante tiempo mirando cómo obtener esta información, ya que parece, esto no está contemplado por el estandar de construcción de Portlet.

Finalmente, he logrado la respuesta para Liferay y, de nuevo, era mucho más simple de lo que parecía, por eso lo de estúpido. De todos modos, ahí va, por si alguien se puede evitar perder tiempo con algo como esto.

En el request tenemos un atributo que contiene el objeto ThemeDisplay. Este lo podemos obtener de la siguiente manera:

ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute (
     com.liferay.portal.kernel.util.WebKeys.THEME_DISPLAY);


Si lo usamos dentro de un jsp, no es necesario obtenerlo, ya que Liferay lo hace por nosotros, con lo que sólo tendremos que acceder al objeto themeDisplay:

<%
    long currentGroup = themeDisplay.getParentGroupId();
    long currentLayout = themeDisplay.getLayout().getLayoutId();
%>


Variables personalizadas en Velocity

Posted on septiembre 15th, 2011 in Liferay | 131 Comments »

A veces nos encontramos creando o modificando un Theme de Liferay y necesitamos usar nuestras propias variables que, por supuesto, no vienen definidas en Liferay.

Para ello, debemos usar un hook. En él, crearemos una clase que extenderá com.liferay.portal.kernel.events.Action y en la que sobreescribiremos el método run(). Será en este donde añadamos nuestras variables.

public void run(final HttpServletRequest req,
        final HttpServletResponse res) throws ActionException {

    Map<Object, Object> vmVariables = new HashMap<Object, Object>();
    vmVariables.put("mimensaje", "este mensaje podría ser recuperado en el theme");
    req.setAttribute(WebKeys.VM_VARIABLES, vmVariables);
}

Una vez tenemos la clase, sólo tenemos que declararla en el fichero portal.properties del hook:

servlet.service.events.pre=com.ejemplo.CustomVelocityVariablesAction

Con esto, desplegamos y ya podemos usarla en nuestros themes.

Enviar email con Telnet

Posted on septiembre 6th, 2011 in Linux | 218 Comments »

Cuando quiero probar un servidor de correo, me gusta hacerlo via Telnet, pero no suelo recordar los pasos y siempre busco en Google, así que aquí los dejo para futuras referencias (las líneas que comienzan con un número son la respuesta del servidor):

$ telnet [nombre servidor] [puerto]
220 [mensaje de bienvenida]
HELO [nombre de dominio]
250 [nombre de servidor]
MAIL FROM:[direcci&oacute;n del remitente]
250 [confirmaci&oacute;n de que la direcci&oacute;n es correcta]
RCPT TO:[direcci&oacute;n del destinatario]
250 [confirmaci&oacute;n de que la direcci&oacute;n es correcta]
DATA
354 End data with <CR><LF>.<CR><LF>
[Cuerpo del mensaje]<CR><LF>.<CR><LF>
250 [confirmaci&oacute;n de recepci&oacute;n correcta]
QUIT
221 [Mensaje de despedida]

Liferay pop up con Alloy

Posted on septiembre 1st, 2011 in Liferay | No Comments »

En versiones anteriores de Liferay se usaba Liferay.Popup para hacer popups usando jQuery. Ahora, con la nueva versión, deberemos usar Alloy UI.

Mostrar contenido html en un popup:

<aui:script>
function callPopup(){
    AUI().ready('aui-dialog', 'aui-overlay-manager', 'dd-constrain', function(A) {
        var dialog = new A.Dialog({
            title: 'DISPLAY CONTENT',
            centered: true,
            modal: true,
            width: 500,
            height: 400,
            bodyContent: "This is testing content inside the popup"
        }).render();
    });
}
</aui:script>

Pasar una URL al Popup:

<aui:script>
Liferay.provide(window,'<portlet:namespace />callPopup',
    function(url1) {
        var A = AUI();
        var data = {};
        var dialog = new A.Dialog(
            {
                centered: true,
                destroyOnClose: true,
                modal: true,
                title: Liferay.Language.get('Display-Content'),
                width: 600
            }
        ).render();
        dialog.plug(
            A.Plugin.IO,
            {
                data: data,
                uri: url1
            }
        );
    },
    ['aui-dialog', 'aui-io']
);
</aui:script>