AsesoriApp

En esta sección se atenderán las dudas relacionadas con sistemas de gestión de la calidad, procedimientos, buenas prácticas, normas y todo lo relacionado con aseguramiento de la calidad

Moderator: julianmartinez16

User avatar
alejoobh
Posts: 21
Joined: Tue Jan 19, 2016 6:26 am

Re: AsesoriApp

Post by alejoobh » Thu Apr 07, 2016 3:01 am

El equipo de 2 personas trabajó 6 sprints a una velocidad de 29.67
Por sprint en promedio se maneja una velocidad de 29.67

User avatar
alejoobh
Posts: 21
Joined: Tue Jan 19, 2016 6:26 am

Re: AsesoriApp

Post by alejoobh » Tue May 31, 2016 8:22 am

Sprint 27 abril - 7 mayo

Qué se hizo

Se implementaron muchos cambios.

-Se añadió la funcionalidad de listar los grupos del usuario:
-lobby.html: pag html que lista los grupos para el usuario
-groups.js: javascript con las consultas AJAX pertinentes para mostrar la información
-groups.css estilos para la página.
-Del lado del servidor se añadieron los controladores necesarios para la obtención de los datos.

Image

Burndown chart

Image

Dificultades

En este punto nos dimos cuenta que el Entities nos mapeó mal la base de datos, ignorando por completo una tabla.
El problema se extendió mucho tiempo porque estuvimos buscando cómo incluir la tabla, lo cuál fue imposible.
Pero luego de un extenso debug, nos dimos cuenta que se podía obtener, modificar y añadir datos a esta tabla mediante las relaciones de Clases del Entities.

User avatar
alejoobh
Posts: 21
Joined: Tue Jan 19, 2016 6:26 am

Re: AsesoriApp

Post by alejoobh » Tue May 31, 2016 8:30 am

Sprint 7 Mayo - 12 mayo

Qué se hizo

Se implementó la pantalla para Docentes de Crear grupos:
Ingresando: Nombre de grupo, Descripción del grupo y el código del grupo.
Controladores del lado del servidor.

Se implementaron constantes del lado del cliente.

Burndown chart

Image

Dificultades

El código de invitación del grupo nos genera dudas al respecto, si la forma de un estudiante para matricularse a un grupo es teniendo el código de invitación, y únicamente este, tiene que ser ÚNICO, lo cual al darle la opción al docente de crear este código es un problema.
En el próximo sprint se solucionará y cuando se cree el grupo, el docente no escogerá el código sino que generaremos uno ÚNICO.

User avatar
alejoobh
Posts: 21
Joined: Tue Jan 19, 2016 6:26 am

Re: AsesoriApp

Post by alejoobh » Tue May 31, 2016 9:36 am

Sprint 17 de mayo - 27 de Mayo

Debido a los tiempos muertos del desarrollo de la aplicación, se hizo un sprint completando las demás funcionalidades de la aplicación.

Qué se hizo

-Visor de perfiles
-Visor de mi perfil
-Edición de perfil
-Visor de grupos
-Unirse a grupo para estudiantes
-Visor de asesorías
-Solicitud de asesorías por parte del estudiante
-Aceptación de asesorías por parte del estudiante.

Fueron muchas funcionalidades añadidas, las cuales se pueden ver en los archivos del repositorio y los commit.

Al final del proyecto no se pudo completar la funcionalidad del Chat para cada grupo, debido a falta de tiempo.

Burndown chart

Image

Dificultades

Hubieron diversas dificultades en las funciones nativas de cordova, y el diseño fue un poco complejo para las imagenes de perfil, el tratamiento de las imagenes, fue: En la BD se guarda un array de bytes de la imagen, en el lado del cliente, se recibe un base 64 de la imagen, el cuál luego es convertido a array de bytes para la inserción en la BD, para el lado del cliente se envía desde el servidor el base 64 de la imagen.

0Procedemos a explicar varios problemas con sus debidas soluciones, para que cualquiera que trabaje en una app con cordova pueda llegar a estas soluciones

Cámara

Trabajar con funciones nativas de cordova, comparado con desarrollo nativo en android al cual estamos acostumbrados, es mucho más fácil; cordova tiene muchas funcionalidades difíciles ya programadas por defecto, como el ángulo de la cámara, el ángulo de la foto tomada, etc.

El primer problema fue que no abría la cámara cuando se le ordenaba.
Esto pasaba por permisos y lo sabíamos, En Android por ejemplo, para poder usar una funcionalidad, se tiene que definir en el AndroidManifest.xml, ejemplo:

<uses-permission android:name="android.permission.CAMERA" />

A pesar de haber añadido ya esta funcionalidad en el manifest, no funcionaba en la aplicación; la solución después de mucho intentar, era comprender por completo el uso del config.xml del cordova, con el cual NO se tiene que tocar para nada el AndroidManifest.xml

El uso de esta plantilla ayudó MUCHÍSIMO para solucionar problemas como la orientación, la cámara, el storage...

https://github.com/phonegap/phonegap-st ... config.xml

si se extraen de esta las funcionalidades necesarias para su aplicación, funcionará correctamente...

Segundo problema... El tratamiento de la imagen resultado de la cámara

Hay dos maneras de tratar el resultado de la cámara según las opciones que se le den cuando se intenta abrirla.
Explico:
Este método crea las opciones con las cuales se abrirá la cámara...

function setOptions() {
var options = {
// Some common settings are 20, 50, and 100
quality: 50,
// In this app, dynamically set the picture source, Camera or photo gallery
encodingType: Camera.EncodingType.JPEG,
destinationType: Camera.DestinationType.DATA_URL,
targetWidth: 512,
targetHeight: 512,
allowEdit: false, //ESTA OPCION PERMITE EDITAR LA FOTO ANTES DE ENVIARLA AL PERFIL
correctOrientation: true //Corrects Android orientation quirks
}
return options;
}

La clave máxima está en el destinationType, si se define como DATA_URL, entregará la imagen en base 64 (Cosa que nos dimos cuenta muy tarde), la cual es la forma más fácil de enviar a servidores.
Si se define como FILE_URI devuelve la ruta completa de dónde está la imagen(cosa que hicimos primero), luego se tiene que leer desde el JS (cosa un poco compleja) y luego convertirla a base64 (Cosa que fue totalmente imposible ya que js nos limita mucho en este sentido)
Por qué nos encontramos con este problema? fue porque al enviar la imagen al servidor, siempre enviaba en negro, pero del tamaño correcto... Para darnos cuenta de que la conversión al base64 nunca funcionó, modificamos todo para que el resultado de la cámara fuera un PNG, y enviaba la imagen completamente vacía.

Con este método abríamos la cámara:

function openCamera(selection)
{
var srcType = Camera.PictureSourceType.CAMERA;
var options = setOptions();


navigator.camera.getPicture(function cameraSuccess(imageUri) {

$('#profileimg').attr('src', "data:image/jpeg;base64," +imageUri);
imagen = "data:image/jpeg;base64," +imageUri;


}, function cameraError(error) {
alert("Unable to obtain picture: " + error);

}, options);
}

Como se dan cuenta, la variable imagen, almacena el imageURI más los datos implícitos que debe tener una imagen base64, los cuales deben ser añadidos para que sea leída como imagen por los dispositivos, luego de "data:image/jpeg;base64," viene lo realmente importante, que son los datos de la imagen.

Este método abre una especie de diálogo de selección nativo

function editarFoto()
{
var options = {
title: 'Elige una opción',
buttonLabels: ['Tomar foto', 'Escoger desde galería'],
addCancelButtonWithLabel: 'Cancel',
androidEnableCancelButton : true,
winphoneEnableCancelButton : true,
};

window.plugins.actionsheet.show(options, function (_btnIndex) {
if (_btnIndex === 1) {
openCamera("camera-thmb");
} else if (_btnIndex === 2) {
openFilePicker("picker-thmb");
}
});

}

Se vería algo como:

Image

El mismo problema tuvimos que la cámara, al ser una función nativa, y no tenerla bien definida en el config.xml no abría...

Consejo importante...

function setOptionsGallery() {
var options = {
// Some common settings are 20, 50, and 100
quality: 50,
// In this app, dynamically set the picture source, Camera or photo gallery
encodingType: Camera.EncodingType.JPEG,
destinationType: Camera.DestinationType.DATA_URL,
targetWidth: 200,
targetHeight: 200,
sourceType : Camera.PictureSourceType.PHOTOLIBRARY,
allowEdit: false,
correctOrientation: true //Corrects Android orientation quirks
}
return options;
}

function openFilePicker(selection) {

var options = setOptionsGallery();

if (selection == "picker-thmb") {
options.targetHeight = 200;
options.targetWidth = 200;
}

navigator.camera.getPicture(function cameraSuccess(imageUri) {

$('#profileimg').attr('src', "data:image/jpeg;base64," +imageUri);
imagen = "data:image/jpeg;base64," +imageUri;

}, function cameraError(error) {
alert("Unable to obtain picture: " + error);

}, options);
}

En estos dos métodos se define cómo obtener una imagen desde la galería...

La clave está en setOptionsGallery el atributo de options sourceType : Camera.PictureSourceType.PHOTOLIBRARY
Si ven, no es muy diferente de abrir la cámara... pero el sourceType abre directamente la galería de fotos, esta es la clave FUNDAMENTAL porque para abrir la galería hay otras maneras, mucho más completas... esta es la más SENCILLA y ENTENDIBLE.

User avatar
alejoobh
Posts: 21
Joined: Tue Jan 19, 2016 6:26 am

Re: AsesoriApp

Post by alejoobh » Tue May 31, 2016 10:14 am

Link video explicativo:


Link de la App en la playstore:
Enviado a publicación, en pendiente.
Last edited by alejoobh on Tue May 31, 2016 11:29 am, edited 4 times in total.

User avatar
dyr.skr
Posts: 5
Joined: Tue Jan 19, 2016 10:30 pm

Re: AsesoriApp

Post by dyr.skr » Tue May 31, 2016 10:39 am

Documentación de revisión del checklist
https://docs.google.com/document/d/1Jan ... JKOmI/edit

Post Reply