use of android.content.SyncAdapterType in project android_frameworks_base by DirtyUnicorns.
the class SyncManager method whiteListExistingSyncAdaptersIfNeeded.
private void whiteListExistingSyncAdaptersIfNeeded() {
if (!mSyncStorageEngine.shouldGrantSyncAdaptersAccountAccess()) {
return;
}
List<UserInfo> users = mUserManager.getUsers(true);
final int userCount = users.size();
for (int i = 0; i < userCount; i++) {
UserHandle userHandle = users.get(i).getUserHandle();
final int userId = userHandle.getIdentifier();
for (RegisteredServicesCache.ServiceInfo<SyncAdapterType> service : mSyncAdapters.getAllServices(userId)) {
String packageName = service.componentName.getPackageName();
for (Account account : mAccountManager.getAccountsByTypeAsUser(service.type.accountType, userHandle)) {
if (!canAccessAccount(account, packageName, userId)) {
mAccountManager.updateAppPermission(account, AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE, service.uid, true);
}
}
}
}
}
use of android.content.SyncAdapterType in project android_frameworks_base by DirtyUnicorns.
the class SyncManager method dumpSyncState.
protected void dumpSyncState(PrintWriter pw) {
pw.print("data connected: ");
pw.println(mDataConnectionIsConnected);
pw.print("auto sync: ");
List<UserInfo> users = getAllUsers();
if (users != null) {
for (UserInfo user : users) {
pw.print("u" + user.id + "=" + mSyncStorageEngine.getMasterSyncAutomatically(user.id) + " ");
}
pw.println();
}
pw.print("memory low: ");
pw.println(mStorageIsLow);
pw.print("device idle: ");
pw.println(mDeviceIsIdle);
pw.print("reported active: ");
pw.println(mReportedSyncActive);
final AccountAndUser[] accounts = AccountManagerService.getSingleton().getAllAccounts();
pw.print("accounts: ");
if (accounts != INITIAL_ACCOUNTS_ARRAY) {
pw.println(accounts.length);
} else {
pw.println("not known yet");
}
final long now = SystemClock.elapsedRealtime();
pw.print("now: ");
pw.print(now);
pw.println(" (" + formatTime(System.currentTimeMillis()) + ")");
pw.println(" (HH:MM:SS)");
pw.print("uptime: ");
pw.print(DateUtils.formatElapsedTime(now / 1000));
pw.println(" (HH:MM:SS)");
pw.print("time spent syncing: ");
pw.print(DateUtils.formatElapsedTime(mSyncHandler.mSyncTimeTracker.timeSpentSyncing() / 1000));
pw.print(" (HH:MM:SS), sync ");
pw.print(mSyncHandler.mSyncTimeTracker.mLastWasSyncing ? "" : "not ");
pw.println("in progress");
pw.println();
pw.println("Active Syncs: " + mActiveSyncContexts.size());
final PackageManager pm = mContext.getPackageManager();
for (SyncManager.ActiveSyncContext activeSyncContext : mActiveSyncContexts) {
final long durationInSeconds = (now - activeSyncContext.mStartTime) / 1000;
pw.print(" ");
pw.print(DateUtils.formatElapsedTime(durationInSeconds));
pw.print(" - ");
pw.print(activeSyncContext.mSyncOperation.dump(pm, false));
pw.println();
}
// Join the installed sync adapter with the accounts list and emit for everything.
pw.println();
pw.println("Sync Status");
for (AccountAndUser account : accounts) {
pw.printf("Account %s u%d %s\n", account.account.name, account.userId, account.account.type);
pw.println("=======================================================================");
final PrintTable table = new PrintTable(12);
table.set(0, 0, // 0
"Authority", // 1
"Syncable", // 2
"Enabled", // 3
"Delay", // 4
"Loc", // 5
"Poll", // 6
"Per", // 7
"Serv", // 8
"User", // 9
"Tot", // 10
"Time", // 11
"Last Sync");
final List<RegisteredServicesCache.ServiceInfo<SyncAdapterType>> sorted = Lists.newArrayList();
sorted.addAll(mSyncAdapters.getAllServices(account.userId));
Collections.sort(sorted, new Comparator<RegisteredServicesCache.ServiceInfo<SyncAdapterType>>() {
@Override
public int compare(RegisteredServicesCache.ServiceInfo<SyncAdapterType> lhs, RegisteredServicesCache.ServiceInfo<SyncAdapterType> rhs) {
return lhs.type.authority.compareTo(rhs.type.authority);
}
});
for (RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterType : sorted) {
if (!syncAdapterType.type.accountType.equals(account.account.type)) {
continue;
}
int row = table.getNumRows();
Pair<AuthorityInfo, SyncStatusInfo> syncAuthoritySyncStatus = mSyncStorageEngine.getCopyOfAuthorityWithSyncStatus(new SyncStorageEngine.EndPoint(account.account, syncAdapterType.type.authority, account.userId));
SyncStorageEngine.AuthorityInfo settings = syncAuthoritySyncStatus.first;
SyncStatusInfo status = syncAuthoritySyncStatus.second;
String authority = settings.target.provider;
if (authority.length() > 50) {
authority = authority.substring(authority.length() - 50);
}
table.set(row, 0, authority, settings.syncable, settings.enabled);
table.set(row, 4, status.numSourceLocal, status.numSourcePoll, status.numSourcePeriodic, status.numSourceServer, status.numSourceUser, status.numSyncs, DateUtils.formatElapsedTime(status.totalElapsedTime / 1000));
int row1 = row;
if (settings.delayUntil > now) {
table.set(row1++, 12, "D: " + (settings.delayUntil - now) / 1000);
if (settings.backoffTime > now) {
table.set(row1++, 12, "B: " + (settings.backoffTime - now) / 1000);
table.set(row1++, 12, settings.backoffDelay / 1000);
}
}
if (status.lastSuccessTime != 0) {
table.set(row1++, 11, SyncStorageEngine.SOURCES[status.lastSuccessSource] + " " + "SUCCESS");
table.set(row1++, 11, formatTime(status.lastSuccessTime));
}
if (status.lastFailureTime != 0) {
table.set(row1++, 11, SyncStorageEngine.SOURCES[status.lastFailureSource] + " " + "FAILURE");
table.set(row1++, 11, formatTime(status.lastFailureTime));
//noinspection UnusedAssignment
table.set(row1++, 11, status.lastFailureMesg);
}
}
table.writeTo(pw);
}
}
use of android.content.SyncAdapterType in project android_frameworks_base by DirtyUnicorns.
the class SyncManager method computeSyncable.
public int computeSyncable(Account account, int userId, String authority, boolean checkAccountAccess) {
final int status = getIsSyncable(account, userId, authority);
if (status == AuthorityInfo.NOT_SYNCABLE) {
return AuthorityInfo.NOT_SYNCABLE;
}
final SyncAdapterType type = SyncAdapterType.newKey(authority, account.type);
final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo = mSyncAdapters.getServiceInfo(type, userId);
if (syncAdapterInfo == null) {
return AuthorityInfo.NOT_SYNCABLE;
}
final int owningUid = syncAdapterInfo.uid;
final String owningPackage = syncAdapterInfo.componentName.getPackageName();
try {
if (ActivityManagerNative.getDefault().getAppStartMode(owningUid, owningPackage) == ActivityManager.APP_START_MODE_DISABLED) {
Slog.w(TAG, "Not scheduling job " + syncAdapterInfo.uid + ":" + syncAdapterInfo.componentName + " -- package not allowed to start");
return AuthorityInfo.NOT_SYNCABLE;
}
} catch (RemoteException e) {
/* ignore - local call */
}
if (checkAccountAccess && !canAccessAccount(account, owningPackage, owningUid)) {
Log.w(TAG, "Access to " + account + " denied for package " + owningPackage + " in UID " + syncAdapterInfo.uid);
return AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS;
}
return status;
}
use of android.content.SyncAdapterType in project android_frameworks_base by DirtyUnicorns.
the class SyncManager method getSyncAdapterTypes.
public SyncAdapterType[] getSyncAdapterTypes(int userId) {
final Collection<RegisteredServicesCache.ServiceInfo<SyncAdapterType>> serviceInfos;
serviceInfos = mSyncAdapters.getAllServices(userId);
SyncAdapterType[] types = new SyncAdapterType[serviceInfos.size()];
int i = 0;
for (RegisteredServicesCache.ServiceInfo<SyncAdapterType> serviceInfo : serviceInfos) {
types[i] = serviceInfo.type;
++i;
}
return types;
}
use of android.content.SyncAdapterType in project android_frameworks_base by DirtyUnicorns.
the class AccountSyncSettingsBackupHelper method serializeAccountSyncSettingsToJSON.
/**
* Fetch and serialize Account and authority information as a JSON Array.
*/
private JSONObject serializeAccountSyncSettingsToJSON() throws JSONException {
Account[] accounts = mAccountManager.getAccounts();
SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(mContext.getUserId());
// Create a map of Account types to authorities. Later this will make it easier for us to
// generate our JSON.
HashMap<String, List<String>> accountTypeToAuthorities = new HashMap<String, List<String>>();
for (SyncAdapterType syncAdapter : syncAdapters) {
// Skip adapters that aren’t visible to the user.
if (!syncAdapter.isUserVisible()) {
continue;
}
if (!accountTypeToAuthorities.containsKey(syncAdapter.accountType)) {
accountTypeToAuthorities.put(syncAdapter.accountType, new ArrayList<String>());
}
accountTypeToAuthorities.get(syncAdapter.accountType).add(syncAdapter.authority);
}
// Generate JSON.
JSONObject backupJSON = new JSONObject();
backupJSON.put(KEY_VERSION, JSON_FORMAT_VERSION);
backupJSON.put(KEY_MASTER_SYNC_ENABLED, ContentResolver.getMasterSyncAutomatically());
JSONArray accountJSONArray = new JSONArray();
for (Account account : accounts) {
List<String> authorities = accountTypeToAuthorities.get(account.type);
// settings for us to restore.
if (authorities == null || authorities.isEmpty()) {
continue;
}
JSONObject accountJSON = new JSONObject();
accountJSON.put(KEY_ACCOUNT_NAME, account.name);
accountJSON.put(KEY_ACCOUNT_TYPE, account.type);
// Add authorities for this Account type and check whether or not sync is enabled.
JSONArray authoritiesJSONArray = new JSONArray();
for (String authority : authorities) {
int syncState = ContentResolver.getIsSyncable(account, authority);
boolean syncEnabled = ContentResolver.getSyncAutomatically(account, authority);
JSONObject authorityJSON = new JSONObject();
authorityJSON.put(KEY_AUTHORITY_NAME, authority);
authorityJSON.put(KEY_AUTHORITY_SYNC_STATE, syncState);
authorityJSON.put(KEY_AUTHORITY_SYNC_ENABLED, syncEnabled);
authoritiesJSONArray.put(authorityJSON);
}
accountJSON.put(KEY_ACCOUNT_AUTHORITIES, authoritiesJSONArray);
accountJSONArray.put(accountJSON);
}
backupJSON.put(KEY_ACCOUNTS, accountJSONArray);
return backupJSON;
}
Aggregations