package com.arretadogames.pilot.accounts;
import java.util.Iterator;
import android.util.Log;
import com.arretadogames.pilot.database.GameDatabase;
import com.arretadogames.pilot.googlesync.SyncManager;
import com.arretadogames.pilot.util.Logger;
import com.google.android.gms.appstate.AppState;
import com.google.android.gms.appstate.AppStateBuffer;
import com.google.android.gms.appstate.AppStateClient;
import com.google.android.gms.appstate.OnStateListLoadedListener;
public class AccountManager implements OnStateListLoadedListener {
private SyncManager syncManager;
private static Account defaultUser;
private Account account1;
private Account account2;
private AccountManager() {
syncManager = SyncManager.get();
defaultUser = GameDatabase.getInstance().getDefaultUser();
account1 = defaultUser;
account2 = new Account();
}
public Account getAccount1() {
return account1;
}
public Account getAccount2() {
return account2;
}
public void refreshAccounts() {
if (syncManager.getAppStateClient().isConnected()) {
System.out.println("Requesting List States");
// App State Client supports only one player, so we suppose it is player one
// account1 = null; // Avoid wrong info
syncManager.getAppStateClient().listStates(this);
}
}
public void saveDatabase() {
if (account1 != null) {
account1.saveDatabase();
}
if (account2 != null) {
account2.saveDatabase();
}
}
public void saveState() {
if (SyncManager.get().isSignedIn()) {
if (account1 != null) {
account1.saveState();
}
if (account2 != null) {
// account2.saveState(); Currently it is only supported one account
}
}
}
@Override
public void onStateListLoaded(int statusCode, AppStateBuffer buffer) {
if (statusCode == AppStateClient.STATUS_OK) {
System.out.println("List States OK");
Iterator<AppState> it = buffer.iterator();
if (!it.hasNext()) {
Logger.v("User has no previous state... creating default account");
String accName = SyncManager.get().getPlusClient().getAccountName();
account1 = new Account(accName, accName);
account1.setName(SyncManager.get().getPlusClient().getCurrentPerson().getName().getGivenName());
System.out.println("Acc Name: " + accName);
System.out.println("Name: " + account1.getName());
return;
}
while (it.hasNext()) {
AppState state = it.next();
if (state.getKey() == 0 && state.getLocalData() != null) {
Account loadedAccount;
if (state.hasConflict()) {
// Load both accounts
byte[] bytes = state.getLocalData();
Account acc = new Account(
syncManager.getPlusClient().getAccountName(),
syncManager.getPlusClient().getAccountName());
acc.updateFrom(bytes);
byte[] bytesConflicted = state.getConflictData();
Account accConflicted = new Account(
syncManager.getPlusClient().getAccountName(),
syncManager.getPlusClient().getAccountName());
accConflicted.updateFrom(bytesConflicted);
// Now, merge them
loadedAccount = Account.mergeAccounts(acc, accConflicted);
loadedAccount.setName(SyncManager.get().getPlusClient().getCurrentPerson().getName().getGivenName());
System.out.println("Loaded");
} else {
// Data is fine! Just load...
Logger.v("Trying to load version: " + state.getLocalVersion());
byte[] bytes = state.getLocalData();
loadedAccount = new Account(
syncManager.getPlusClient().getAccountName(),
syncManager.getPlusClient().getAccountName());
loadedAccount.setName(SyncManager.get().getPlusClient().getCurrentPerson().getName().getGivenName());
loadedAccount.updateFrom(bytes);
}
account1 = loadedAccount;
} else {
Logger.v("Another Key came up: " + state.getKey());
Logger.v("with version: " + state.getLocalVersion());
}
}
} else {
// Something wrong..
Log.e("AccountManager", "State List Loaded failed with error code: " + statusCode);
}
}
private static AccountManager accountManager = null;
public static AccountManager get() {
if (accountManager == null)
accountManager = new AccountManager();
return accountManager;
}
public void clearArrount1() {
account1 = defaultUser;
// account1 = new Account();
// account1.setAccountId(Account.PLAYER_1_DEFAULT_ACCOUNT_NAME);
// account1.setAccountName(Account.PLAYER_1_DEFAULT_ACCOUNT_NAME);
}
}