/* * Copyright (C) 2010-2011 Dmitry Petuhov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.pvoid.apteryxaustralis.storage.osmp; import android.content.Context; import android.widget.ArrayAdapter; import android.widget.ListAdapter; import org.pvoid.apteryxaustralis.types.Account; import org.pvoid.apteryxaustralis.types.Group; import org.pvoid.apteryxaustralis.storage.IStorage; import org.pvoid.apteryxaustralis.types.ITerminal; import org.pvoid.apteryxaustralis.ui.TerminalsArrayAdapter; import java.util.*; public class OsmpStorage implements IStorage { private Storage _mStorage; private final Comparator<Terminal> _mComparatorById = new Comparator<Terminal>() { @Override public int compare(Terminal o1, Terminal o2) { return (int) (o1.id() - o2.id()); } }; public OsmpStorage(Context context) { _mStorage = new Storage(context.getApplicationContext()); } @Override public void getAccounts(List<Account> adapter) { _mStorage.getAccounts(adapter); } @Override public void deleteAccount(long id) { throw new RuntimeException("Not implemented!"); } @Override public int addAccount(Account account) { ArrayList<Group> groups = new ArrayList<Group>(); int result = OsmpRequest.checkAccount(account, groups); if(result==0) { _mStorage.addAccount(account.id,account.title,account.login,account.passwordHash,account.terminal); /////// Вытащим балансы OsmpRequest.getBalances(account,groups); _mStorage.saveAgents(account.id, groups); /////// Вытащим сразу терминалы ArrayList<Terminal> terminals = new ArrayList<Terminal>(); if(OsmpRequest.getTerminals(account,terminals)==0) _mStorage.saveTerminals(account.id,terminals); return RES_OK; } /////// if(result>0) return RES_ERR_CUSTOM_FIRST - result; /////// return result; } @Override public Account getAccount(long id) { return _mStorage.getAccount(id); } @Override public int updateAccount(Account account, Hashtable<Long,Integer> states) { ArrayList<Terminal> terminals = new ArrayList<Terminal>(); _mStorage.getTerminals(0,terminals); int result = refresh(account); if(result==IStorage.RES_OK) { Collections.sort(terminals,_mComparatorById); ArrayList<Terminal> updatedTerminals = new ArrayList<Terminal>(); _mStorage.getTerminals(0,updatedTerminals); for(Terminal updatedTerminal : updatedTerminals) { int index = Collections.binarySearch(terminals,updatedTerminal,_mComparatorById); if(index>-1) { Terminal terminal = terminals.get(index); if(updatedTerminal.State()!=Terminal.OSMP_STATE_OK && terminal.State()==Terminal.OSMP_STATE_OK) { int state = updatedTerminal.getState(); Integer groupState = states.get(terminal.agentId); if(groupState==null || groupState<state) states.put(terminal.agentId,state); if(result<state) result = state; } } } } return result; } @Override public void getGroups(long accountId, List<Group> groups) { _mStorage.getAgents(accountId, groups); } @Override public void getGroups(List<Group> groups) { _mStorage.getAgentsActive(groups); } @Override public void getTerminals(long accountId, Group group, TerminalsArrayAdapter terminals) { ArrayList<Terminal> terminalsList = new ArrayList<Terminal>(); _mStorage.getTerminals(group.id,terminalsList); int adapterIndex = 0; while(adapterIndex<terminals.getCount()) { //////// Ищем имеющийся в новых Terminal current = (Terminal)terminals.getItem(adapterIndex); boolean found = false; for(Terminal terminal : terminalsList) { if(terminal.id() == current.id()) { current.update(terminal); terminalsList.remove(terminal); found = true; break; } } //////// если нашли увеличим индекс, если нет удалим текущий if(found) ++adapterIndex; else terminals.remove(current); } //////// то что осталось в списке новое. добавим его. for(Terminal terminal : terminalsList) { terminals.add(terminal); } } @Override public ITerminal getTerminal(long id) { return _mStorage.getTerminal(id); } @Override public int refresh(Account account) { ArrayList<Group> groups = new ArrayList<Group>(); int result = OsmpRequest.checkAccount(account, groups); if(result==0) { /////// Вытащим балансы OsmpRequest.getBalances(account,groups); _mStorage.saveAgents(account.id, groups); /////// Вытащим сразу терминалы ArrayList<Terminal> terminals = new ArrayList<Terminal>(); if(OsmpRequest.getTerminals(account,terminals)==0) { _mStorage.saveTerminals(account.id,terminals); } return RES_OK; } /////// if(result>0) return RES_ERR_CUSTOM_FIRST - result; /////// return result; } @Override public boolean isEmpty() { return !_mStorage.hasAccounts(); } @Override public int errorMessage(int errorCode) { return ErrorCodes.Message(errorCode); } public int rebootTerminal(long terminalId, long agentId) { Account account = _mStorage.getAccountFromAgent(agentId); return OsmpRequest.rebootTerminal(account,terminalId); } public int switchOffTerminal(long terminalId, long agentId) { Account account = _mStorage.getAccountFromAgent(agentId); return OsmpRequest.switchOffTerminal(account,terminalId); } }