Como tener una version Debug y PROD de forma simultánea (Android)

Android

Cuando desarrollamos una app Android, nos puede interesar tener diferentes versiones de desarrollo, como por ejemplo, versiones con diferentes funcionalidades, o que la versión de PROD ataque una api diferente a la de DEV. Otro caso también, la de compilar nuestra versión PRO o Free de una aplicación.

Si esto lo intentamos sin ninguna configuración, cuando, por ejemplo, tenemos la versión de producción y queremos seguir desarrollando, nos va a avisar que ya existe una aplicación en el dispositivo y nos dará la opción de sobrescribirla.

Pues con Gradle, tenemos la solución, definiendo Flavors y Build types. Los Flavors de Gradle sirve para definir diferentes caracteristicas de una aplicación, como el siguiente ejemplo:

Como ves, hemos definido un flavor para la versión free, donde la ID de la aplicación será “com.dimaslz.appname” donde el nombre de la version será “v0.0.1 free” y terminado en “.pro” y version “v0.0.1 pro” para la versión de pago (premium) de nuestra app.

Esto es algo muy básico, pero podemos configurar otras caracteristicas como:

  • minSdkVersion
  • targetSdkVersion
  • versionCode
  • versionName
  • package name (sobresscribe el valor del manifiesto)
  • release signing info (keystore, key alias, passwords,…).
  • BuildConfig: Ability to provide custom Java code.
  • NDK ABI filter (Not implemented yet)
  • test info
    • package name for test app (optional, default is <base>.test)
    • InstrumentationTestRunner class (optional)
  • Additionally, Product Flavor can provide their own source code, resources and manifest.

Opciones extraídas de: http://tools.android.com/tech-docs/new-build-system/build-system-concepts (También referencia para consultar sobre Flavors)

Y ahora, supongamos que para cuando estamos desarrollando, queremos que nuestra app, sea independiente de la versión en producción, por lo que en los buildTypes, deberíamos añadir nuestra compilación cuando estemos en modo debug:

Como puedes ver, en este caso tenemos definido que cuando estemos en modo debug, a la app se le añadirá un sufijo “.debug”, por lo que el appID será “com.dimaslz.appname.debug”.

Esto, funcionaría por defecto, pero por ejemplo, si queremos compilar la versión “premium” en modo debug, deberemos ir a la ventana buildVariants  y elegimos la opción “premiumDebug”, esto nos compilará y ejecutará una aplicación con el appID “com.dimaslz.appname.pro.debug”.

Build Variant Android Studio

Es bastante intuitivo, asociaréis enseguida la variante. Tenéis mas información aquí: https://developer.android.com/tools/building/configuring-gradle.html 

Con todo esto, podremos definir resources que sean visibles para cada tipo de build. Por ejemplo, queremos que la versión de Debug, nos aparezca el título “AppName-Debug”, pues creamos un resource llamado “debug.xml” donde sobre-escribimos el nombre de nuestra string “app_name” y le ponemos el texto que gustemos.

Un ejemplo visual:

Ejemplo string version PremiumEjemplo string version FREE

Y como intento acostumbrar, os dejo el ejemplo practico en un repo de Github para que probéis algo muy básico. Hay bastante documentación al respecto y la distribución de recursos ya depende de ti y de la magnitud del proyecto.

Repositorio Github: https://github.com/dimaslz/DemoAndroidThings

tags: , , ,

Chuck Norris Approved Pull Request

Chrome, Extensión, Pet projects

A veces entre tontería y tontería en el trabajo, surgen cosas tan absurdas que son hasta entretenidas para aprender. Hoy hablo de una extensión que he hecho para Chrome, la cual consiste en poner el sello de Chuck Norris Approved cuando aceptas en Pull Request.

Todo se debe a que un compañero de trabajo (@joze_grx) comenzara con la tontería de que cada vez que aprobaba un Pull Request, hacía el comentario de “Chuck Norris Approved”. Pues nada, pasan los días, y después de leer el post de un amigo (@javi_moralesf) referente a como hacer una extensión de chrome (click aquí para ver artículo) y jamás haber hecho una, se me viene a la cabeza la idea de hacer una extensión, que, cada vez que aprobáramos un Pull Request, se nos marcara el sello de “Chuck Norris Approved”.

Pues me puse manos a la obra, y en un día del fin de semana, tuve una primera versión, la cual recibió muchas buenas críticas al comienzo de la semana de mis compañeros (@orestesca flipando) y como no, exigencias de que a parte de con Stash (plataforma que usamos en el trabajo), fuese compatible con Bitbucket y Github.

Pues nada, actualmente lo usamos en el trabajo, ya hay una versión funcional que podéis descargar de la Chrome Store por el nombre de “Chuck Norris Approve Pull Request”

Chuck Norris Approved Pull Requests Chuck Norris Approved Pull Requests

Enlace directo:
https://chrome.google.com/webstore/detail/nimjcccacnkhhimfaafchcbjdghapoen

A parte, también hay un repo de Github https://github.com/dimaslz/ChuckNorrisApprovedPullRequest con el cual podéis enviarme issues de cosas que os gustaría que implemente o colaborar si os apetece.

Aun hay muchas cosas que mejorar, como limpiar un poco el código, añadir features y demás, pero, ya funciona.

Decir que no afecta en nada al comportamiento normal del servicio de versionado, tan solo es una imagen.

tags: , , , , , ,

Gestionar strings en Android

Android, Desarrollo Móvil

Ultimamente publico sobre AngularJS, pero como full stack developer, soy incapaz soy incapaz de casarme con una tecnología, me gusta trastear y complementar mis skills en otros terrenos, y como siempre le estoy dando vueltas a ideas nuevas, en este caso vamos a hablar de algo sobre Android.

Desarrollando una app que ya publicaré, encontré una solución, ya que varías veces había pecado de ignorante, para gestionar textos dinámicos en nuestra app android.

La idea trata de crear un recurso en el string.xml, el cual reusar en diferentes casos, como por ejemplo, la siguiente string:
“Tengo un ejemplo” en singular y “Tengo 5 ejemplos” o “Tengo ejemplos” en plural. La duda es, como reusar esto y que solo altere el número?

En este primer caso, podemos resolver esto con el recurso “plurals” en el archivo string.xml

Y como vamos a continuación, para usarlo tenemos que hacer referencia al recurso “plurals” y pasarle el valor.

Pero en este caso, tenemos un problema si queremos añadir una tercera posibilidad como: “No tengo ejemplos”. En este caso sería si el valor es 0. Pues tenemos otra posibilidad, un poco mas rebuscada pero que nos puede venir bien para strings simples. A continuación planteamos los ejemplos:
“No tengo ejemplos”
“Tengo un ejemplo”
“Tengo 5 ejemplos”

El recurso string sería algo como lo siguiente:

Y su modo de empleo no es otra forma tal como la tradicional, pero usando MessageFormat para pasarle los parámetros definidos en la cadena “{0}”

Esto es al igual que en otros lenguages, podemos pasar valores a cadenas tal como:

Por si queréis ver el ejemplo en marcha, os dejo un repo donde podréis ver como está implementado. https://github.com/dimaslz/DemoAndroidThings

También podemos hacer un condicional “if” que en caso de 0 usamos un recurso y en caso de usar plurales usamos el recurso plurals.

Bueno, espero que os haya servido ;).

PD: Y me olvidaba. Si queréis mas información al respecto: http://developer.android.com/guide/topics/resources/string-resource.html

tags: , ,

Afortunado por sentir pasión por el trabajo

Trabajo

¿Estamos contentos por trabajar desarrollando tecnología? Esto tan solo es una pequeña curiosidad que siempre tengo en mente. ¿Los programadores trabajamos en lo que nos gusta, o simplemente es un empleo con mucha demanda al cual podemos aspirar a un buen sueldo?. Me he encontrado con que mucha gente parece que está en esta profesión por obligación y no por pasión, aparentando que le encanta curiosear, pensar, crear, pero después se conformarían siendo jardineros de 8 a 15, que lo comprendo perfectamente pero no me encaja. Otros, tenían la pasión pero ya se les ha convertido en una rutina de la cual, a partir de cierta hora de la tarde, quieren desconectar y no mirar atrás, cosa que para mi es imposible.

Hay muchas opiniones al respecto, como por ejemplo, que uno ya está quemado y no le atrae como antes o el no estar cómodo haciendo lo que haces, que ya se han comido mucha mierda (en cualquier trabajo tienes que pasar por malos momentos, en eso consiste la evolución), a veces, lo mas común que suelo ver es que muchos llegan a estar muy acomodados en la llamada “zona de confort”. Charlando con amigos de este tema, creo que todo depende de la ambición, actitud y ganas de evolucionar, que también es comprensible que tenga su fin.

Cuando empecé profesionalmente hará mas de 3 años, no tenía claro cual iba a ser mis aspiraciones, pero a lo largo del tiempo, al adquirir experiencia, he descubierto que estoy donde quiero, donde me ha llevado la curiosidad y teniendo muy claro que tan solo es el principio, puesto que cada día mis objetivos crecen y cada día me entusiasma mas pensar en algo nuevo, no me veo separado de la tecnología, de volverme loco de pensar una solución a un problema.

Puedo decir que para mi la frase de “Hoy es Lunes” tenga un sentido tan positivo como “Vamos a seguir aprendiendo”, un viernes, el descanso de un ritmo de aprendizaje, pero la continuación de aprender en proyectos personales.

Por suerte o por desgracia, no es un ámbito en el cual podamos quitarnos el chip y dejar que pase el tiempo si queremos estar ahí, donde las oportunidades se presentan, creo que hoy día hay que poner bastante de nuestra parte, no solo para destacar, si no para ser productivos, crecer!.

Me siento afortunado por estar en un sector en el que el abanico de posibilidades para aprender es tan extenso, que si no encuentras tu inspiración, creo que estás en el sector equivocado.

tags: , , ,

Gestionando el localStorage desde AngularJS

AngularJS, Javascript, Web

Lo mas normal, que en nuestros proyectos, necesitemos tener de forma fácilmente accesible algunos datos como puede ser un token de seguridad o el nombre del usuario, roles, permisos, email, foto y demás datos que nos eviten peticiones innecesarias a la API para obtener una información estática.

De primeras, tenemos la posibilidad de usar el nativo localStorage.setItem(key, value)  y localStorage.getItem(key) . Pero según lo que se guarde, tenemos que hacer su conversión a string, y al hacer get su conversión a Objeto bla bla bla. Para evitarnos este trabajo, si queremos, nos lo podemos  picar nosotros mismos un plugin angular, ya que la lógica es bastante fácil, setters y getters con sus respectivas conversiones de tipos por detrás.

Pero ya hay una solución bastante sencilla y que podemos usar, como Angular Local Storage (https://github.com/grevory/angular-local-storage). Si veis el código es muy sencillo, pero ¿para que complicarnos rehaciendo la rueda? Lo he estado usando para unos proyectos y simplifica bastante el uso de localStorage a la par que te inicia un indice cuando comienza la aplicación.

Por lo que en vuestro local storage tendréis almacenada la información a partir del prefijo que hayáis definido y no tenéis que preocuparos de el en cada setter o getter. Otra cosa que comenta en su documentación, es que si no es soportado el localStorage en el navegador, automáticamente guarda la información en cookies.

No voy a poner ejemplos, ya que en su documentación de Github está muy bien explicado y no me gustaría ser redundante.

Angular Local Storage (https://github.com/grevory/angular-local-storage)

tags: , ,