use of android.content.SyncAdapterType in project android_packages_apps_Settings by LineageOS.
the class AccountSyncSettings method updateAccountSwitches.
private void updateAccountSwitches() {
mInvisibleAdapters.clear();
SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(mUserHandle.getIdentifier());
ArrayList<SyncAdapterType> authorities = new ArrayList<>();
for (int i = 0, n = syncAdapters.length; i < n; i++) {
final SyncAdapterType sa = syncAdapters[i];
// Only keep track of sync adapters for this account
if (!sa.accountType.equals(mAccount.type))
continue;
if (sa.isUserVisible()) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "updateAccountSwitches: added authority " + sa.authority + " to accountType " + sa.accountType);
}
authorities.add(sa);
} else {
// keep track of invisible sync adapters, so sync now forces
// them to sync as well.
mInvisibleAdapters.add(sa);
}
}
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "looking for sync adapters that match account " + mAccount);
}
cacheRemoveAllPrefs(getPreferenceScreen());
for (int j = 0, m = authorities.size(); j < m; j++) {
final SyncAdapterType syncAdapter = authorities.get(j);
// We could check services here....
int syncState = ContentResolver.getIsSyncableAsUser(mAccount, syncAdapter.authority, mUserHandle.getIdentifier());
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, " found authority " + syncAdapter.authority + " " + syncState);
}
if (syncState > 0) {
final int uid;
try {
uid = getContext().getPackageManager().getPackageUidAsUser(syncAdapter.getPackageName(), mUserHandle.getIdentifier());
addSyncStateSwitch(mAccount, syncAdapter.authority, syncAdapter.getPackageName(), uid);
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "No uid for package" + syncAdapter.getPackageName(), e);
}
}
}
removeCachedPrefs(getPreferenceScreen());
}
use of android.content.SyncAdapterType in project android_packages_apps_Settings by LineageOS.
the class ChooseAccountActivity method getAuthoritiesForAccountType.
public ArrayList<String> getAuthoritiesForAccountType(String type) {
if (mAccountTypeToAuthorities == null) {
mAccountTypeToAuthorities = Maps.newHashMap();
SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(mUserHandle.getIdentifier());
for (int i = 0, n = syncAdapters.length; i < n; i++) {
final SyncAdapterType sa = syncAdapters[i];
ArrayList<String> authorities = mAccountTypeToAuthorities.get(sa.accountType);
if (authorities == null) {
authorities = new ArrayList<String>();
mAccountTypeToAuthorities.put(sa.accountType, authorities);
}
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.d(TAG, "added authority " + sa.authority + " to accountType " + sa.accountType);
}
authorities.add(sa.authority);
}
}
return mAccountTypeToAuthorities.get(type);
}
use of android.content.SyncAdapterType in project android_packages_apps_Settings by LineageOS.
the class AccountSyncPreferenceControllerTest method updateSummary_syncDisabled_shouldNotCount.
@Test
public void updateSummary_syncDisabled_shouldNotCount() {
SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* authority */
"type1", /* accountType */
true, /* userVisible */
true);
SyncAdapterType[] syncAdapters = { syncAdapterType };
ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
ShadowContentResolver.setSyncAutomatically("authority", false);
ShadowContentResolver.setMasterSyncAutomatically(3, true);
mController.updateSummary(mPreference);
assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.account_sync_summary_all_off));
}
use of android.content.SyncAdapterType in project android_packages_apps_Settings by LineageOS.
the class AccountSyncPreferenceControllerTest method updateSummary_multipleSyncAdapters_shouldSetSummary.
@Test
public void updateSummary_multipleSyncAdapters_shouldSetSummary() {
SyncAdapterType syncAdapterType1 = new SyncAdapterType("authority1", /* authority */
"type1", /* accountType */
true, /* userVisible */
true);
SyncAdapterType syncAdapterType2 = new SyncAdapterType("authority2", /* authority */
"type1", /* accountType */
true, /* userVisible */
true);
SyncAdapterType syncAdapterType3 = new SyncAdapterType("authority3", /* authority */
"type1", /* accountType */
true, /* userVisible */
true);
SyncAdapterType syncAdapterType4 = new SyncAdapterType("authority4", /* authority */
"type1", /* accountType */
true, /* userVisible */
true);
SyncAdapterType[] syncAdapters = { syncAdapterType1, syncAdapterType2, syncAdapterType3, syncAdapterType4 };
ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
ShadowContentResolver.setSyncAutomatically("authority4", false);
mController.updateSummary(mPreference);
assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.account_sync_summary_some_on, 3, 4));
}
use of android.content.SyncAdapterType in project android_packages_apps_Dialer by LineageOS.
the class AccountTypeManagerImpl method loadAccountsInBackground.
/**
* Loads account list and corresponding account types (potentially with data sets). Always called
* on a background thread.
*/
protected void loadAccountsInBackground() {
if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
Log.d(Constants.PERFORMANCE_TAG, "AccountTypeManager.loadAccountsInBackground start");
}
TimingLogger timings = new TimingLogger(TAG, "loadAccountsInBackground");
final long startTime = SystemClock.currentThreadTimeMillis();
final long startTimeWall = SystemClock.elapsedRealtime();
// Account types, keyed off the account type and data set concatenation.
final Map<AccountTypeWithDataSet, AccountType> accountTypesByTypeAndDataSet = new ArrayMap<>();
// The same AccountTypes, but keyed off {@link RawContacts#ACCOUNT_TYPE}. Since there can
// be multiple account types (with different data sets) for the same type of account, each
// type string may have multiple AccountType entries.
final Map<String, List<AccountType>> accountTypesByType = new ArrayMap<>();
final List<AccountWithDataSet> allAccounts = new ArrayList<>();
final List<AccountWithDataSet> contactWritableAccounts = new ArrayList<>();
final List<AccountWithDataSet> groupWritableAccounts = new ArrayList<>();
final Set<String> extensionPackages = new HashSet<>();
final AccountManager am = mAccountManager;
final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
final AuthenticatorDescription[] auths = am.getAuthenticatorTypes();
// First process sync adapters to find any that provide contact data.
for (SyncAdapterType sync : syncs) {
if (!ContactsContract.AUTHORITY.equals(sync.authority)) {
// Skip sync adapters that don't provide contact data.
continue;
}
// Look for the formatting details provided by each sync
// adapter, using the authenticator to find general resources.
final String type = sync.accountType;
final AuthenticatorDescription auth = findAuthenticator(auths, type);
if (auth == null) {
Log.w(TAG, "No authenticator found for type=" + type + ", ignoring it.");
continue;
}
AccountType accountType;
if (GoogleAccountType.ACCOUNT_TYPE.equals(type)) {
accountType = new GoogleAccountType(mContext, auth.packageName);
} else if (ExchangeAccountType.isExchangeType(type)) {
accountType = new ExchangeAccountType(mContext, auth.packageName, type);
} else if (SamsungAccountType.isSamsungAccountType(mContext, type, auth.packageName)) {
accountType = new SamsungAccountType(mContext, auth.packageName, type);
} else {
Log.d(TAG, "Registering external account type=" + type + ", packageName=" + auth.packageName);
accountType = new ExternalAccountType(mContext, auth.packageName, false);
}
if (!accountType.isInitialized()) {
if (accountType.isEmbedded()) {
throw new IllegalStateException("Problem initializing embedded type " + accountType.getClass().getCanonicalName());
} else {
// Skip external account types that couldn't be initialized.
continue;
}
}
accountType.accountType = auth.type;
accountType.titleRes = auth.labelId;
accountType.iconRes = auth.iconId;
addAccountType(accountType, accountTypesByTypeAndDataSet, accountTypesByType);
// Check to see if the account type knows of any other non-sync-adapter packages
// that may provide other data sets of contact data.
extensionPackages.addAll(accountType.getExtensionPackageNames());
}
// If any extension packages were specified, process them as well.
if (!extensionPackages.isEmpty()) {
Log.d(TAG, "Registering " + extensionPackages.size() + " extension packages");
for (String extensionPackage : extensionPackages) {
ExternalAccountType accountType = new ExternalAccountType(mContext, extensionPackage, true);
if (!accountType.isInitialized()) {
// Skip external account types that couldn't be initialized.
continue;
}
if (!accountType.hasContactsMetadata()) {
Log.w(TAG, "Skipping extension package " + extensionPackage + " because" + " it doesn't have the CONTACTS_STRUCTURE metadata");
continue;
}
if (TextUtils.isEmpty(accountType.accountType)) {
Log.w(TAG, "Skipping extension package " + extensionPackage + " because" + " the CONTACTS_STRUCTURE metadata doesn't have the accountType" + " attribute");
continue;
}
Log.d(TAG, "Registering extension package account type=" + accountType.accountType + ", dataSet=" + accountType.dataSet + ", packageName=" + extensionPackage);
addAccountType(accountType, accountTypesByTypeAndDataSet, accountTypesByType);
}
}
timings.addSplit("Loaded account types");
// Map in accounts to associate the account names with each account type entry.
Account[] accounts = mAccountManager.getAccounts();
for (Account account : accounts) {
boolean syncable = ContentResolver.getIsSyncable(account, ContactsContract.AUTHORITY) > 0;
if (syncable) {
List<AccountType> accountTypes = accountTypesByType.get(account.type);
if (accountTypes != null) {
// authenticated by this account.
for (AccountType accountType : accountTypes) {
AccountWithDataSet accountWithDataSet = new AccountWithDataSet(account.name, account.type, accountType.dataSet);
allAccounts.add(accountWithDataSet);
if (accountType.areContactsWritable()) {
contactWritableAccounts.add(accountWithDataSet);
}
if (accountType.isGroupMembershipEditable()) {
groupWritableAccounts.add(accountWithDataSet);
}
}
}
}
}
Collections.sort(allAccounts, ACCOUNT_COMPARATOR);
Collections.sort(contactWritableAccounts, ACCOUNT_COMPARATOR);
Collections.sort(groupWritableAccounts, ACCOUNT_COMPARATOR);
timings.addSplit("Loaded accounts");
synchronized (this) {
mAccountTypesWithDataSets = accountTypesByTypeAndDataSet;
mAccounts = allAccounts;
mContactWritableAccounts = contactWritableAccounts;
mGroupWritableAccounts = groupWritableAccounts;
mInvitableAccountTypes = findAllInvitableAccountTypes(mContext, allAccounts, accountTypesByTypeAndDataSet);
}
timings.dumpToLog();
final long endTimeWall = SystemClock.elapsedRealtime();
final long endTime = SystemClock.currentThreadTimeMillis();
Log.i(TAG, "Loaded meta-data for " + mAccountTypesWithDataSets.size() + " account types, " + mAccounts.size() + " accounts in " + (endTimeWall - startTimeWall) + "ms(wall) " + (endTime - startTime) + "ms(cpu)");
if (mInitializationLatch != null) {
mInitializationLatch.countDown();
mInitializationLatch = null;
}
if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
Log.d(Constants.PERFORMANCE_TAG, "AccountTypeManager.loadAccountsInBackground finish");
}
// Check filter validity since filter may become obsolete after account update. It must be
// done from UI thread.
mMainThreadHandler.post(mCheckFilterValidityRunnable);
}
Aggregations