package com.battlelancer.seriesguide.sync; import android.accounts.Account; import android.accounts.AccountManager; import android.annotation.TargetApi; import android.content.ContentResolver; import android.content.Context; import android.os.Build; import android.os.Bundle; import com.battlelancer.seriesguide.BuildConfig; import com.battlelancer.seriesguide.SgApp; import com.uwetrottmann.androidutils.AndroidUtils; import timber.log.Timber; public class AccountUtils { public static final int SYNC_FREQUENCY = 24 * 60 * 60; // 1 day (in seconds) private static final String ACCOUNT_NAME = "SeriesGuide Sync"; private static final String ACCOUNT_TYPE = BuildConfig.APPLICATION_ID; public static void createAccount(Context context) { Timber.d("Setting up account..."); // remove any existing accounts removeAccount(context); // try to create a new account AccountManager manager = AccountManager.get(context); Account account = new Account(ACCOUNT_NAME, ACCOUNT_TYPE); boolean isNewAccountAdded; try { isNewAccountAdded = manager != null && manager.addAccountExplicitly(account, null, null); } catch (SecurityException e) { Timber.e(e, "Setting up account...FAILED Account could not be added"); return; } if (isNewAccountAdded) { // Inform the system that this account supports sync ContentResolver.setIsSyncable(account, SgApp.CONTENT_AUTHORITY, 1); // Inform the system that this account is eligible for auto sync // when the network is up ContentResolver.setSyncAutomatically(account, SgApp.CONTENT_AUTHORITY, true); // Recommend a schedule for automatic synchronization. The system // may modify this based // on other scheduled syncs and network utilization. ContentResolver.addPeriodicSync(account, SgApp.CONTENT_AUTHORITY, new Bundle(), SYNC_FREQUENCY); } Timber.d("Setting up account...DONE"); } @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1) private static void removeAccount(Context context) { Timber.d("Removing existing accounts..."); AccountManager manager = AccountManager.get(context); Account[] accounts = manager.getAccountsByType(ACCOUNT_TYPE); for (Account account : accounts) { if (AndroidUtils.isLollipopMR1OrHigher()) { manager.removeAccount(account, null, null, null); } else { //noinspection deprecation manager.removeAccount(account, null, null); } } Timber.d("Removing existing accounts...DONE"); } public static boolean isAccountExists(Context context) { AccountManager manager = AccountManager.get(context); Account[] accounts = manager.getAccountsByType(ACCOUNT_TYPE); return accounts.length > 0; } public static Account getAccount(Context context) { AccountManager manager = AccountManager.get(context); Account[] accounts = manager.getAccountsByType(ACCOUNT_TYPE); // return first available account if (accounts.length > 0) { return accounts[0]; } return null; } }