/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people.engine.groups;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import com.vodafone360.people.database.DatabaseHelper;
import com.vodafone360.people.database.tables.GroupsTable;
import com.vodafone360.people.datatypes.BaseDataType;
import com.vodafone360.people.datatypes.GroupItem;
import com.vodafone360.people.datatypes.ItemList;
import com.vodafone360.people.engine.BaseEngine;
import com.vodafone360.people.engine.IEngineEventCallback;
import com.vodafone360.people.engine.EngineManager.EngineId;
import com.vodafone360.people.service.ServiceStatus;
import com.vodafone360.people.service.ServiceUiRequest;
import com.vodafone360.people.service.agent.NetworkAgent;
import com.vodafone360.people.service.io.ResponseQueue.DecodedResponse;
import com.vodafone360.people.service.io.api.GroupPrivacy;
import com.vodafone360.people.utils.LogUtils;
public class GroupsEngine extends BaseEngine {
/**
* Max number of groups to fetch from server in one request.
*/
private static final int MAX_DOWN_PAGE_SIZE = 24;
/**
* Current page number being fetched.
*/
private int mPageNo;
/**
* Total number of groups fetched from server.
*/
private int mNoOfGroupsFetched;
/**
*
*/
private DatabaseHelper mDb;
public GroupsEngine(Context context, IEngineEventCallback eventCallback, DatabaseHelper db) {
super(eventCallback);
mEngineId = EngineId.GROUPS_ENGINE;
mDb = db;
}
@Override
public long getNextRunTime() {
// we only run if we have a request or a response in the queue
if (isUiRequestOutstanding() || isCommsResponseOutstanding()) {
return 0;
}
return -1;
}
@Override
public void onCreate() {
// nothing needed
}
@Override
public void onDestroy() {
// nothing needed
}
@Override
protected void onRequestComplete() {
// nothing needed
}
@Override
protected void onTimeoutEvent() {
}
@Override
protected void processCommsResponse(DecodedResponse resp) {
LogUtils.logD("DownloadGroups.processCommsResponse()");
ServiceStatus status = BaseEngine.getResponseStatus(BaseDataType.ITEM_LIST_DATA_TYPE, resp.mDataTypes);
if (status == ServiceStatus.SUCCESS) {
final List<GroupItem> tempGroupList = new ArrayList<GroupItem>();
for (int i = 0; i < resp.mDataTypes.size(); i++) {
ItemList itemList = (ItemList)resp.mDataTypes.get(i);
if (itemList.mType != ItemList.Type.group_privacy) {
completeUiRequest(ServiceStatus.ERROR_UNEXPECTED_RESPONSE);
return;
}
// TODO: why cloning the list?
for (int j = 0; j < itemList.mItemList.size(); j++) {
tempGroupList.add((GroupItem)itemList.mItemList.get(j));
}
}
LogUtils.logI("DownloadGroups.processCommsResponse() - No of groups "
+ tempGroupList.size());
if (mPageNo == 0) {
mDb.deleteAllGroups(); // clear old groups if we request the first groups page
}
status = GroupsTable.addGroupList(tempGroupList, mDb.getWritableDatabase());
if (ServiceStatus.SUCCESS != status) {
completeUiRequest(status);
return;
}
mNoOfGroupsFetched += tempGroupList.size();
if (tempGroupList.size() < MAX_DOWN_PAGE_SIZE) {
completeUiRequest(ServiceStatus.SUCCESS);
return;
}
mPageNo++;
requestNextGroupsPage();
return;
}
LogUtils.logE("DownloadGroups.processCommsResponse() - Error requesting Zyb groups, error = " + status);
completeUiRequest(status);
}
@Override
protected void processUiRequest(ServiceUiRequest requestId, Object data) {
// for now we only serve the get groups call. later we might need to
// differentiate between multiple ServiceUiRequests
switch (requestId) {
case GET_GROUPS:
requestFirstGroupsPage();
break;
}
}
@Override
public void run() {
if (isUiRequestOutstanding() && processUiQueue()) {
return;
}
if (isCommsResponseOutstanding() && processCommsInQueue()) {
return;
}
if (processTimeout()) {
return;
}
}
/**
*
* Adds a request to get groups from the backend that are associated with
* the server contacts.
*
*/
public void addUiGetGroupsRequest() {
LogUtils.logI("GroupsEngine.addUiGetGroupsRequest()");
addUiRequestToQueue(ServiceUiRequest.GET_GROUPS, null);
}
/**
* Requests the first group page.
*/
private void requestFirstGroupsPage() {
mPageNo = 0;
mNoOfGroupsFetched = 0;
requestNextGroupsPage();
}
/**
* Requests the next page of groups from the server.
*/
private void requestNextGroupsPage() {
if (NetworkAgent.getAgentState() != NetworkAgent.AgentState.CONNECTED) {
completeUiRequest(ServiceStatus.ERROR_COMMS);
return;
}
int reqId = GroupPrivacy.getGroups(this, mPageNo, MAX_DOWN_PAGE_SIZE);
setReqId(reqId);
}
}