1603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana/*
2603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * Copyright (C) 2009 The Android Open Source Project
3603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana *
4603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * Licensed under the Apache License, Version 2.0 (the "License");
5603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * you may not use this file except in compliance with the License.
6603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * You may obtain a copy of the License at
7603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana *
8603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana *      http://www.apache.org/licenses/LICENSE-2.0
9603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana *
10603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * Unless required by applicable law or agreed to in writing, software
11603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * distributed under the License is distributed on an "AS IS" BASIS,
12603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * See the License for the specific language governing permissions and
14603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * limitations under the License.
15603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana */
16603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana
177a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkeypackage com.android.server.accounts;
18603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana
197a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkeyimport android.accounts.AccountManager;
207a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkeyimport android.accounts.AuthenticatorDescription;
217a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkeyimport android.accounts.IAccountAuthenticator;
226ab72d74b86e5f4ec3c3909366fd46c225a66bd7Jeff Sharkeyimport android.content.Context;
23603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintanaimport android.content.pm.PackageManager;
24718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintanaimport android.content.pm.RegisteredServicesCache;
255ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport android.content.pm.XmlSerializerAndParser;
2620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackbornimport android.content.res.Resources;
27a698f4276968d078b1b9e2f3738c4f559a3307b2Fred Quintanaimport android.content.res.TypedArray;
28c298a8518a8fd73a303132c7db241f10eb46c5b6Fred Quintanaimport android.text.TextUtils;
296ab72d74b86e5f4ec3c3909366fd46c225a66bd7Jeff Sharkeyimport android.util.AttributeSet;
306ab72d74b86e5f4ec3c3909366fd46c225a66bd7Jeff Sharkey
315ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport org.xmlpull.v1.XmlPullParser;
325ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport org.xmlpull.v1.XmlPullParserException;
336ab72d74b86e5f4ec3c3909366fd46c225a66bd7Jeff Sharkeyimport org.xmlpull.v1.XmlSerializer;
345ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana
355ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintanaimport java.io.IOException;
36603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana
37603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana/**
38603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * A cache of services that export the {@link IAccountAuthenticator} interface. This cache
39603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * is built by interrogating the {@link PackageManager} and is updated as packages are added,
40603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana * removed and changed. The authenticators are referred to by their account type and
41718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * are made available via the {@link RegisteredServicesCache#getServiceInfo} method.
42718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * @hide
43603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana */
449788976b1465ce982b5ae7c741345edd0ecd9322Fred Quintana/* package private */ class AccountAuthenticatorCache
45a40c6304deb860f10a51ce950ac1abc21a23d08bCostin Manolache        extends RegisteredServicesCache<AuthenticatorDescription>
4656285a60e83138bb4b4f2d3bdec91b2f3ca11aa2Fred Quintana        implements IAccountAuthenticatorCache {
47603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    private static final String TAG = "Account";
485ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana    private static final MySerializer sSerializer = new MySerializer();
49603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana
50603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    public AccountAuthenticatorCache(Context context) {
51f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana        super(context, AccountManager.ACTION_AUTHENTICATOR_INTENT,
525ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana                AccountManager.AUTHENTICATOR_META_DATA_NAME,
535ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana                AccountManager.AUTHENTICATOR_ATTRIBUTES_NAME, sSerializer);
54603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    }
55603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana
5620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn    public AuthenticatorDescription parseServiceAttributes(Resources res,
5720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            String packageName, AttributeSet attrs) {
5820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        TypedArray sa = res.obtainAttributes(attrs,
59718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana                com.android.internal.R.styleable.AccountAuthenticator);
60603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        try {
619788976b1465ce982b5ae7c741345edd0ecd9322Fred Quintana            final String accountType =
629788976b1465ce982b5ae7c741345edd0ecd9322Fred Quintana                    sa.getString(com.android.internal.R.styleable.AccountAuthenticator_accountType);
639788976b1465ce982b5ae7c741345edd0ecd9322Fred Quintana            final int labelId = sa.getResourceId(
649788976b1465ce982b5ae7c741345edd0ecd9322Fred Quintana                    com.android.internal.R.styleable.AccountAuthenticator_label, 0);
659788976b1465ce982b5ae7c741345edd0ecd9322Fred Quintana            final int iconId = sa.getResourceId(
669788976b1465ce982b5ae7c741345edd0ecd9322Fred Quintana                    com.android.internal.R.styleable.AccountAuthenticator_icon, 0);
6770e1ad7d99c95967e3c0257bddc7b4ec6c403372Jim Miller            final int smallIconId = sa.getResourceId(
6870e1ad7d99c95967e3c0257bddc7b4ec6c403372Jim Miller                    com.android.internal.R.styleable.AccountAuthenticator_smallIcon, 0);
6970e1ad7d99c95967e3c0257bddc7b4ec6c403372Jim Miller            final int prefId = sa.getResourceId(
7070e1ad7d99c95967e3c0257bddc7b4ec6c403372Jim Miller                    com.android.internal.R.styleable.AccountAuthenticator_accountPreferences, 0);
71a40c6304deb860f10a51ce950ac1abc21a23d08bCostin Manolache            final boolean customTokens = sa.getBoolean(
72a40c6304deb860f10a51ce950ac1abc21a23d08bCostin Manolache                    com.android.internal.R.styleable.AccountAuthenticator_customTokens, false);
73c298a8518a8fd73a303132c7db241f10eb46c5b6Fred Quintana            if (TextUtils.isEmpty(accountType)) {
74c298a8518a8fd73a303132c7db241f10eb46c5b6Fred Quintana                return null;
75c298a8518a8fd73a303132c7db241f10eb46c5b6Fred Quintana            }
76a40c6304deb860f10a51ce950ac1abc21a23d08bCostin Manolache            return new AuthenticatorDescription(accountType, packageName, labelId, iconId,
77a40c6304deb860f10a51ce950ac1abc21a23d08bCostin Manolache                    smallIconId, prefId, customTokens);
78603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        } finally {
79718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana            sa.recycle();
80603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana        }
81603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana    }
825ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana
835ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana    private static class MySerializer implements XmlSerializerAndParser<AuthenticatorDescription> {
845ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana        public void writeAsXml(AuthenticatorDescription item, XmlSerializer out)
855ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana                throws IOException {
865ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana            out.attribute(null, "type", item.type);
875ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana        }
885ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana
895ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana        public AuthenticatorDescription createFromXml(XmlPullParser parser)
905ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana                throws IOException, XmlPullParserException {
915ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana            return AuthenticatorDescription.newKey(parser.getAttributeValue(null, "type"));
925ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana        }
935ebbb4a6b3e16f711735ae0615b9a9ea64faad38Fred Quintana    }
94603073430bbcb1bd29db7afb9b14e2732ad589fbFred Quintana}
95