1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings;
18
19import com.android.providers.subscribedfeeds.R;
20
21import android.accounts.AccountManager;
22import android.accounts.AuthenticatorException;
23import android.accounts.AccountManagerFuture;
24import android.accounts.OperationCanceledException;
25import android.accounts.AccountManagerCallback;
26import android.graphics.drawable.Drawable;
27import android.os.Bundle;
28import android.preference.Preference;
29import android.preference.PreferenceGroup;
30import android.preference.PreferenceScreen;
31import android.util.Log;
32
33import java.io.IOException;
34import java.util.ArrayList;
35
36public class AddAccountSettings extends AccountPreferenceBase {
37    private static final String TAG = "AccountSettings";
38    private static final boolean LDEBUG = Log.isLoggable(TAG, Log.DEBUG);
39    private String[] mAuthorities;
40    private PreferenceGroup mAddAccountGroup;
41    private ArrayList<ProviderEntry> mProviderList = new ArrayList<ProviderEntry>();;
42
43    private static class ProviderEntry {
44        private final CharSequence name;
45        private final String type;
46        ProviderEntry(CharSequence providerName, String accountType) {
47            name = providerName;
48            type = accountType;
49        }
50    }
51
52    @Override
53    public void onCreate(Bundle icicle) {
54        super.onCreate(icicle);
55
56        setContentView(R.layout.add_account_screen);
57        addPreferencesFromResource(R.xml.add_account_settings);
58        mAuthorities = getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY);
59        mAddAccountGroup = getPreferenceScreen();
60        updateAuthDescriptions();
61    }
62
63    @Override
64    protected void onAuthDescriptionsUpdated() {
65        // Create list of providers to show on preference screen
66        for (int i = 0; i < mAuthDescs.length; i++) {
67            String accountType = mAuthDescs[i].type;
68            CharSequence providerName = getLabelForType(accountType);
69
70            // Skip preferences for authorities not specified. If no authorities specified,
71            // then include them all.
72            ArrayList<String> accountAuths = getAuthoritiesForAccountType(accountType);
73            boolean addAccountPref = true;
74            if (mAuthorities != null && mAuthorities.length > 0 && accountAuths != null) {
75                addAccountPref = false;
76                for (int k = 0; k < mAuthorities.length; k++) {
77                    if (accountAuths.contains(mAuthorities[k])) {
78                        addAccountPref = true;
79                        break;
80                    }
81                }
82            }
83            if (addAccountPref) {
84                mProviderList.add(new ProviderEntry(providerName, accountType));
85            } else {
86                if (LDEBUG) Log.v(TAG, "Skipped pref " + providerName + ": has no authority we need");
87            }
88        }
89
90        if (mProviderList.size() == 1) {
91            // If there's only one provider that matches, just run it.
92            addAccount(mProviderList.get(0).type);
93            finish();
94        } else if (mProviderList.size() > 0) {
95            mAddAccountGroup.removeAll();
96            for (ProviderEntry pref : mProviderList) {
97                Drawable drawable = getDrawableForType(pref.type);
98                ProviderPreference p = new ProviderPreference(this, pref.type, drawable, pref.name);
99                mAddAccountGroup.addPreference(p);
100            }
101        } else {
102            String auths = new String();
103            for (String a : mAuthorities) auths += a + " ";
104            Log.w(TAG, "No providers found for authorities: " + auths);
105        }
106    }
107
108    private AccountManagerCallback<Bundle> mCallback = new AccountManagerCallback<Bundle>() {
109        public void run(AccountManagerFuture<Bundle> future) {
110            boolean accountAdded = false;
111            try {
112                Bundle bundle = future.getResult();
113                bundle.keySet();
114                accountAdded = true;
115                if (LDEBUG) Log.d(TAG, "account added: " + bundle);
116            } catch (OperationCanceledException e) {
117                if (LDEBUG) Log.d(TAG, "addAccount was canceled");
118            } catch (IOException e) {
119                if (LDEBUG) Log.d(TAG, "addAccount failed: " + e);
120            } catch (AuthenticatorException e) {
121                if (LDEBUG) Log.d(TAG, "addAccount failed: " + e);
122            } finally {
123                finish();
124            }
125        }
126    };
127
128    @Override
129    public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
130        if (preference instanceof ProviderPreference) {
131            ProviderPreference pref = (ProviderPreference) preference;
132            if (LDEBUG) Log.v(TAG, "Attempting to add account of type " + pref.getAccountType());
133            addAccount(pref.getAccountType());
134        }
135        return true;
136    }
137
138    private void addAccount(String accountType) {
139        AccountManager.get(this).addAccount(
140                accountType,
141                null, /* authTokenType */
142                null, /* requiredFeatures */
143                null, /* addAccountOptions */
144                this,
145                mCallback,
146                null /* handler */);
147    }
148}
149