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