package com.github.andlyticsproject.sync;
import java.util.Date;
import java.util.List;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.IntentService;
import android.content.ContentResolver;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.github.andlyticsproject.DeveloperAccountManager;
import com.github.andlyticsproject.model.DeveloperAccount;
public class SyncDeveloperAccountsService extends IntentService {
private static final String TAG = SyncDeveloperAccountsService.class.getSimpleName();
private DeveloperAccountManager developerAccountManager;
public SyncDeveloperAccountsService() {
super("SyncDeveloperAccountsService");
}
@Override
protected void onHandleIntent(Intent intent) {
developerAccountManager = DeveloperAccountManager.getInstance(this);
Account[] googleAccounts = AccountManager.get(this).getAccountsByType(
AutosyncHandler.ACCOUNT_TYPE_GOOGLE);
Log.d(TAG, "Synchornizing Andlytics developer accounts and Google accounts...");
addNewGoogleAccounts(googleAccounts);
removeStaleGoogleAccounts(googleAccounts);
syncData();
}
private void removeStaleGoogleAccounts(Account[] googleAccounts) {
int removed = 0;
List<DeveloperAccount> developerAccounts = developerAccountManager.getAllDeveloperAccounts();
for (DeveloperAccount account : developerAccounts) {
Account googleAccount = findMatchingAccount(account, googleAccounts);
if (googleAccount == null) {
Log.d(TAG, "Removing " + account);
developerAccountManager.deleteDeveloperAccount(account);
removed++;
}
}
Log.d(TAG, String.format("Removed %d stale Google accounts.", removed));
}
private void addNewGoogleAccounts(Account[] googleAccounts) {
// add new accounts as hidden
int added = 0;
List<DeveloperAccount> developerAccounts = developerAccountManager.getAllDeveloperAccounts();
for (Account googleAccount : googleAccounts) {
DeveloperAccount account = DeveloperAccount.createHidden(googleAccount.name);
if (!developerAccounts.contains(account)) {
Log.d(TAG, "Adding " + account);
developerAccountManager.addDeveloperAccount(account);
added++;
}
}
Log.d(TAG, String.format("Added %d new Google accounts.", added));
}
@SuppressWarnings("deprecation")
private void syncData() {
List<DeveloperAccount> accounts = developerAccountManager.getActiveDeveloperAccounts();
for (DeveloperAccount developerAccount : accounts) {
Account googleAccount = new Account(developerAccount.getName(),
AutosyncHandler.ACCOUNT_TYPE_GOOGLE);
boolean syncAutomatically = ContentResolver.getSyncAutomatically(googleAccount,
AutosyncHandler.ACCOUNT_AUTHORITY);
if (syncAutomatically && developerAccount.isVisible()) {
Bundle extras = new Bundle();
Log.d(TAG, "requesting sync for " + developerAccount + " now! :: "
+ new Date(System.currentTimeMillis()).toGMTString());
ContentResolver.requestSync(googleAccount, AutosyncHandler.ACCOUNT_AUTHORITY, extras);
} else {
Log.d(TAG, "auto sync disabled for account :: " + developerAccount);
}
}
}
private Account findMatchingAccount(DeveloperAccount account, Account[] googleAccounts) {
for (Account googleAccount : googleAccounts) {
if (googleAccount.name.equals(account.getName())) {
return googleAccount;
}
}
return null;
}
}