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