martes, 1 de febrero de 2011

TUTORIAL: Desarrollo de aplicaciones para bada (XV)

El servidor bada
El servicio Social network

Los usuarios de móviles se conectan entre sí todo el tiempo, actualizan y comparten su estado, etc., intercambiando mensajes. Vamos a explicar en detalle el servicio social, que nos permitirá gestionar  contactos, perfiles y privacidad. 
En un post anterior ya vimos como utilizar el servicio de localización. Supongamos ahora que queremos compartir nuestra ubicación actual con otro usuario de bada, ¿cómo podemos hacerlo?


Paso 1: Hacer "buscable" el perfil del usuario A 

En este caso de uso se utilizan dos clases: PrivacyManager y MyListener. Empecemos con la clase PrivacyManager del lado del usuario A, que permite al usuario enviar un evento relacionado con el  control de privacidad al servidor bada, como el PEL (profile exposure level, nivel de exposición del perfil). El fragmento de código siguiente muestra como utilizar la clase PrivacyManager para hacer "buscable" el perfil del usuario A, y la forma de asignar el objeto listener a esta clase:

MyListener* pMyListener = new MyListener(); pMyListener->Consturct(); 

pMyPrivacyManager = new PrivacyManager(); pMyPrivacyManager->Construct(*pMyListener);
//Register/assign the listener to PrivacyManager 

RequestId reqId; pMyPrivacyManager->SetProfileExposureLevel(PROFILE_SEARCHABLE,
reqId);

Otra clase del lado del usuario A es MyListener, que es la clase fundamental para controlar el evento asíncrono enviado por el servidor bada. El fragmento de código siguiente muestra como implementar la clase MyListener:

// implementation of MyListener class 
class MyListener : 
public IPrivacyManagerListener { }; 

void 
MyListener::OnProfileExplosureLevelUpdated(RequestsId reqId, 
 result r, const String &errorCode, const String &errorMsg) 
   //Tu implementacion 
}

Como puedes ver, la clase MyListener implementa la interfaz IPrivacyManagerListener. En ella se definen los métodos virtuales cuyos nombres empiezan por "On". Es responsabilidad del programador implementarlos. Los métodos "On" básicamente notifican al usuario cuando se reciben los resultados desde el servidor bada. A partir de ahora, el perfil del usuario A es "buscable", y por tanto otros usuarios de bada pueden buscarlo y enviarle una solicitud de amistad. 


Paso 2: Envío de solicitud de amistad del Usuario B al Usuario A 

Ahora vamos a centrarnos en el lado del usuario B. El usuario B es la persona que intenta encontrar el perfil de su colega (usuario A) para luego enviarle una solicitud de amistad.
En el lado del usuario B tenemos dos clases llamadas ProfileService y BuddyService. ProfileService accede a los perfiles del servidor bada y envía diferentes tipos de solicitud al servidor. BuddyService envía la solicitud de amistad al servidor bada.
La clase MyListener del usuario B tiene que implementar dos métodos virtuales llamados OnProfileResultsReceivedN(), que se encarga de los resultados devueltos por el servidor, y OnBuddyRequestSent(), que se invoca cuando se recibe una respuesta de la solicitud de amistad desde el servidor. Veamos como implementar la clase en este caso:

// implementacion de la clase MyListener
class MyListener : 
   public IProfileServiceListener,
   public IBuddyServiceListener 
{}; 
void 
MyListener::OnProfileSearchResultsReceivedN(RequestsId reqId,
 IList *pRequestList, int PageNo, int countPerPage, 
 int totalPageCount, int totalCount, result r, 
 const String &errorCode, const String &errorMsg) 
   //Tu implementacion

//invocado cuando el servidor envia respuesta
void 
MyListener::OnBuddyRequestSent(RequestId reqId, result r, 
 const String &errorCode, const String &errorMsg) 
   //Tu implementacion
} 


Paso 3: Responder a la solicitud de amistad enviada por el Usuario B 
El usuario A debe seguir una serie de pasos cuando recibe la petición del usuario B desde el servidor bada. Un usuario puede rechazar, ignorar o aceptar una solicitud procedente de otro usuario.
Esta vez, el listener del usuario A debe implementar una interfaz más llamada IBuddyServiceListener. IBuddyServiceListener permite a los usuarios recibir resultados de servicios de tipo social desde el servidor bada. El fragmento de código siguiente muestra los métodos virtuales que la clase MyListener debe implementar:

// implementacion de la clase MyListener
class MyListener :
    public IProfileServiceListener,
    public IBuddyServiceListener 
{};

void 
MyListener::OnReceivedBuddyRequestsReceivedN(RequestsId reqId,
  IList *pRequestList, int PageNo, int countPerPage, 
  int  totalPageCount, int totalCount, result r, 
  const String &errorCode, const String &errorMsg)
   //Tu implementacion

void 
MyListener::OnBuddyResponseSent(RequestsId reqId, result r, 
 const String &errorCode, const String &errorMsg) 
  //Tu implementacion
}

La función OnReceivedBuddyRequestsReceivedN() se invoca cuando el usuario A ha recibido alguna solicitud de amistad de algún usuario desde el servidor. Y la función OnBuddyResponseSent()  se invoca cuando el usuario A envía la respuesta a una solicitud de amistad en particular.
Ahora el usuario A tendrá una clase más llamada BuddyService. La clase BuddyService la define el framework de bada. Se encarga de interacciones del usuario tales como GetReceivedBuddyRequests() y RespondToBuddyRequest(). El fragmento de código siguiente muestra como utilizar esta clase:


BuddyService* pMyBuddyService;
pMyBuddyService = new BuddyService(); 
pMyBuddyService->Construct(*pMyListener); 

pMyBuddyService->GetReceivedBuddyRequests(reqId, 1, 20); 
pMyBuddyService->RespondToBuddyRequest(*pRequest, RESPONSE_ACCEPT, reqId);

El usuario A también puede consultar los detalles de una solicitud mediante el método ProfileService::GetProfile(), pasando como parámetro el identificador de usuario.


Paso 4: Compartir información de ubicación 

Hasta ahora hemos aprendido como establecer el nivel de exposición de perfil (PEL), como enviar una solicitud de amistad, y como controlar el evento asíncrono de los servidores utilizando listeners, como cuando se reciben los resultados de una solicitud de amistad o de una solicitud de búsqueda de perfil. El último paso es compartir la información de ubicación.

El servidor bada permite a los usuarios compartir sus datos personales. El usuario puede configurar la información personal que quiere compartir, por ejemplo, información sobre su ubicación mediante PrivacyManager. En nuestro caso, desde el lado del usuario A, se tiene que implementar el siguiente código:

//Dar permiso para que los amigos opuedan saber tu ubicacion
myPrivacyManager->SetUserInfoPrivacy(INFO_LOCATION, ACCESS_BUDDY,reqId);

//Crear e iniciar el proveedor de ubicacion
pLocationProvider->RequestLocationUpdates();

//Informar de la ubicacion al servidor bada
RemoteLocationProvider::StartLocationReport(); 

El usuario A, para obtener su ubicación, debe utilizar una nueva clase llamada LocationProvider. Ésta actualizará constantemente los datos de ubicación del receptor GPS. A continuación, el usuario A tiene que indicar los datos de su ubicación al servidor bada mediante el uso de otra clase llamada RemoteLocationProvider.

NOTA: en bada hay dos tipos de información de ubicación. Uno de ellos es la información de ubicación local, que indica la ubicación actual del dispositivo. Otra es la información de la ubicación remota que se almacena en el servidor bada, y que es un registro de múltiples ubicaciones locales.

Una vez que el usuario A da permiso para que su información de ubicación se pueda compartir y empieza a informar de su ubicación al servidor bada, el usuario B puede solicitar recibir las actualizaciones de ubicación del usuario A, porque ya son amigos. la implementación del lado del usuario B quedaría así:


//Añadir Usuario A a lista de objetivos
ArrayList targetInfoList;
TargetInfo targetInfo(userAId);
TargetInforList.Add(targetInfo);

//Solicitar ultima lista de ubicaciones conocida
pRemoteLocationProvider = new RemoteLocationProvider(); 
pRemoteLocationProvider->RequestLastKnownLocationList(…,targetInfoList, …);

Ten en cuenta que hay varias instancias de MyListener y de RemoteLocationProvider, que indican que tanto el usuario A como el usuario B tienen sus propias instancias de estas dos clases. 


Vía: Introduction to bada - A developer's guide

No hay comentarios:

Publicar un comentario