1718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana/* 2718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Copyright (C) 2009 The Android Open Source Project 3718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * 4718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License"); 5718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * you may not use this file except in compliance with the License. 6718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * You may obtain a copy of the License at 7718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * 8718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * http://www.apache.org/licenses/LICENSE-2.0 9718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * 10718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Unless required by applicable law or agreed to in writing, software 11718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS, 12718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * See the License for the specific language governing permissions and 14718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * limitations under the License. 15718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana */ 16718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 17718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintanapackage android.content; 18718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 19718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintanaimport android.content.pm.RegisteredServicesCache; 205ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport android.content.pm.XmlSerializerAndParser; 2120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.res.Resources; 22718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintanaimport android.content.res.TypedArray; 23718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintanaimport android.util.AttributeSet; 245ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport org.xmlpull.v1.XmlPullParser; 255ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport org.xmlpull.v1.XmlSerializer; 265ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport org.xmlpull.v1.XmlPullParserException; 275ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana 285ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport java.io.IOException; 29718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 30718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana/** 31718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * A cache of services that export the {@link android.content.ISyncAdapter} interface. 32718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * @hide 33718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana */ 347a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkeypublic class SyncAdaptersCache extends RegisteredServicesCache<SyncAdapterType> { 35718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana private static final String TAG = "Account"; 36718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 37718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana private static final String SERVICE_INTERFACE = "android.content.SyncAdapter"; 38718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana private static final String SERVICE_META_DATA = "android.content.SyncAdapter"; 39718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana private static final String ATTRIBUTES_NAME = "sync-adapter"; 405ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana private static final MySerializer sSerializer = new MySerializer(); 41718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 427a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey public SyncAdaptersCache(Context context) { 435ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana super(context, SERVICE_INTERFACE, SERVICE_META_DATA, ATTRIBUTES_NAME, sSerializer); 44718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 45718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana 4620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn public SyncAdapterType parseServiceAttributes(Resources res, 4720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn String packageName, AttributeSet attrs) { 4820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 49718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana com.android.internal.R.styleable.SyncAdapter); 50718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana try { 51718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana final String authority = 52718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana sa.getString(com.android.internal.R.styleable.SyncAdapter_contentAuthority); 53718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana final String accountType = 54718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana sa.getString(com.android.internal.R.styleable.SyncAdapter_accountType); 55718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana if (authority == null || accountType == null) { 56718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana return null; 57718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 584a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana final boolean userVisible = 594a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana sa.getBoolean(com.android.internal.R.styleable.SyncAdapter_userVisible, true); 60e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana final boolean supportsUploading = 61e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana sa.getBoolean(com.android.internal.R.styleable.SyncAdapter_supportsUploading, 62e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana true); 630c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana final boolean isAlwaysSyncable = 640c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana sa.getBoolean(com.android.internal.R.styleable.SyncAdapter_isAlwaysSyncable, 650c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana false); 660c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana final boolean allowParallelSyncs = 670c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana sa.getBoolean(com.android.internal.R.styleable.SyncAdapter_allowParallelSyncs, 680c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana false); 69e6d60ecdf668499f003a81274f18cb57075eb65bFred Quintana final String settingsActivity = 70e6d60ecdf668499f003a81274f18cb57075eb65bFred Quintana sa.getString(com.android.internal.R.styleable 71e6d60ecdf668499f003a81274f18cb57075eb65bFred Quintana .SyncAdapter_settingsActivity); 720c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana return new SyncAdapterType(authority, accountType, userVisible, supportsUploading, 73e6d60ecdf668499f003a81274f18cb57075eb65bFred Quintana isAlwaysSyncable, allowParallelSyncs, settingsActivity); 74718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } finally { 75718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana sa.recycle(); 76718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 77718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana } 785ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana 795ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana static class MySerializer implements XmlSerializerAndParser<SyncAdapterType> { 805ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana public void writeAsXml(SyncAdapterType item, XmlSerializer out) throws IOException { 815ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana out.attribute(null, "authority", item.authority); 825ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana out.attribute(null, "accountType", item.accountType); 835ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana } 840c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana 855ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana public SyncAdapterType createFromXml(XmlPullParser parser) 865ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana throws IOException, XmlPullParserException { 875ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana final String authority = parser.getAttributeValue(null, "authority"); 885ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana final String accountType = parser.getAttributeValue(null, "accountType"); 895ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana return SyncAdapterType.newKey(authority, accountType); 905ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana } 915ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana } 920c4d04ac2e8aa62560d8d767fa1c87e5361b0b08Fred Quintana} 93