13326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana/*
23326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * Copyright (C) 2009 The Android Open Source Project
33326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana *
43326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License");
53326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * you may not use this file except in compliance with the License.
63326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * You may obtain a copy of the License at
73326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana *
83326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana *      http://www.apache.org/licenses/LICENSE-2.0
93326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana *
103326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * Unless required by applicable law or agreed to in writing, software
113326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS,
123326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * See the License for the specific language governing permissions and
143326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * limitations under the License.
153326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana */
163326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanapackage android.accounts;
173326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
18795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.app.Activity;
19795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.content.Context;
20795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.content.pm.PackageManager;
2146703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstromimport android.content.res.Resources;
22795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.graphics.drawable.Drawable;
233326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.os.Bundle;
243326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.os.Parcelable;
25795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.util.Log;
26795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.view.LayoutInflater;
27795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.view.View;
28795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.view.ViewGroup;
29795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.widget.AdapterView;
303326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.widget.ArrayAdapter;
31795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.widget.ImageView;
323326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.widget.ListView;
33795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.widget.TextView;
34795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport com.android.internal.R;
35795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
36795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport java.util.HashMap;
373326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
38f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana/**
39f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana * @hide
40f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana */
41795f135a08b6db7372935fa15874723307748fecFabrice Di Megliopublic class ChooseAccountActivity extends Activity {
42795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
433326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    private static final String TAG = "AccountManager";
44795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
453326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    private Parcelable[] mAccounts = null;
463326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    private AccountManagerResponse mAccountManagerResponse = null;
473326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    private Bundle mResult;
483326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
49795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    private HashMap<String, AuthenticatorDescription> mTypeToAuthDescription
50795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            = new HashMap<String, AuthenticatorDescription>();
51795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
523326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    @Override
533326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    public void onCreate(Bundle savedInstanceState) {
543326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        super.onCreate(savedInstanceState);
553326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
56262226137de1007a6373666b792ebed6eb4c03deFred Quintana        mAccounts = getIntent().getParcelableArrayExtra(AccountManager.KEY_ACCOUNTS);
57262226137de1007a6373666b792ebed6eb4c03deFred Quintana        mAccountManagerResponse =
58262226137de1007a6373666b792ebed6eb4c03deFred Quintana                getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE);
59262226137de1007a6373666b792ebed6eb4c03deFred Quintana
60262226137de1007a6373666b792ebed6eb4c03deFred Quintana        // KEY_ACCOUNTS is a required parameter
61262226137de1007a6373666b792ebed6eb4c03deFred Quintana        if (mAccounts == null) {
62262226137de1007a6373666b792ebed6eb4c03deFred Quintana            setResult(RESULT_CANCELED);
63262226137de1007a6373666b792ebed6eb4c03deFred Quintana            finish();
64262226137de1007a6373666b792ebed6eb4c03deFred Quintana            return;
653326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        }
663326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
67795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        getAuthDescriptions();
68795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
69795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        AccountInfo[] mAccountInfos = new AccountInfo[mAccounts.length];
703326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        for (int i = 0; i < mAccounts.length; i++) {
71795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            mAccountInfos[i] = new AccountInfo(((Account) mAccounts[i]).name,
72795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                    getDrawableForType(((Account) mAccounts[i]).type));
733326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        }
743326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
75795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        setContentView(R.layout.choose_account);
76795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
77795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        // Setup the list
78795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        ListView list = (ListView) findViewById(android.R.id.list);
79795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        // Use an existing ListAdapter that will map an array of strings to TextViews
80795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        list.setAdapter(new AccountArrayAdapter(this,
81795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                android.R.layout.simple_list_item_1, mAccountInfos));
82795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
83795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        list.setTextFilterEnabled(true);
84795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
85795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
86795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                onListItemClick((ListView)parent, v, position, id);
87795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            }
88795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        });
89795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    }
90795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
91795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    private void getAuthDescriptions() {
92795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        for(AuthenticatorDescription desc : AccountManager.get(this).getAuthenticatorTypes()) {
93795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            mTypeToAuthDescription.put(desc.type, desc);
94795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        }
95795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    }
96795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
97795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    private Drawable getDrawableForType(String accountType) {
98795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        Drawable icon = null;
99795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        if(mTypeToAuthDescription.containsKey(accountType)) {
100795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            try {
101795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
102795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                Context authContext = createPackageContext(desc.packageName, 0);
103795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                icon = authContext.getResources().getDrawable(desc.iconId);
104795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            } catch (PackageManager.NameNotFoundException e) {
105795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                // Nothing we can do much here, just log
106795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                if (Log.isLoggable(TAG, Log.WARN)) {
10746703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom                    Log.w(TAG, "No icon name for account type " + accountType);
10846703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom                }
10946703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            } catch (Resources.NotFoundException e) {
11046703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom                // Nothing we can do much here, just log
11146703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom                if (Log.isLoggable(TAG, Log.WARN)) {
11246703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom                    Log.w(TAG, "No icon resource for account type " + accountType);
113795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                }
114795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            }
115795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        }
116795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        return icon;
1173326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    }
1183326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
1193326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    protected void onListItemClick(ListView l, View v, int position, long id) {
1203326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        Account account = (Account) mAccounts[position];
1213326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        Log.d(TAG, "selected account " + account);
1223326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        Bundle bundle = new Bundle();
123f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana        bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
124f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana        bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
1253326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        mResult = bundle;
1263326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        finish();
1273326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    }
1283326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana
1293326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    public void finish() {
1303326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        if (mAccountManagerResponse != null) {
1313326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana            if (mResult != null) {
1323326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana                mAccountManagerResponse.onResult(mResult);
1333326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana            } else {
134f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana                mAccountManagerResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled");
1353326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana            }
1363326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        }
1373326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana        super.finish();
1383326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana    }
139795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
140795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    private static class AccountInfo {
141795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        final String name;
142795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        final Drawable drawable;
143795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
144795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        AccountInfo(String name, Drawable drawable) {
145795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            this.name = name;
146795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            this.drawable = drawable;
147795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        }
148795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    }
149795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
150795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    private static class ViewHolder {
151795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        ImageView icon;
152795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        TextView text;
153795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    }
154795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
155795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    private static class AccountArrayAdapter extends ArrayAdapter<AccountInfo> {
156795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        private LayoutInflater mLayoutInflater;
157795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        private AccountInfo[] mInfos;
158795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
159795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        public AccountArrayAdapter(Context context, int textViewResourceId, AccountInfo[] infos) {
160795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            super(context, textViewResourceId, infos);
161795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            mInfos = infos;
162795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            mLayoutInflater = (LayoutInflater) context.getSystemService(
163795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                    Context.LAYOUT_INFLATER_SERVICE);
164795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        }
165795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
166795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        @Override
167795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        public View getView(int position, View convertView, ViewGroup parent) {
168795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            ViewHolder holder;
169795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
170795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            if (convertView == null) {
171795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                convertView = mLayoutInflater.inflate(R.layout.choose_account_row, null);
172795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                holder = new ViewHolder();
173795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                holder.text = (TextView) convertView.findViewById(R.id.account_row_text);
174795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon);
175795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                convertView.setTag(holder);
176795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            } else {
177795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio                holder = (ViewHolder) convertView.getTag();
178795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            }
179795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
180795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            holder.text.setText(mInfos[position].name);
181795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            holder.icon.setImageDrawable(mInfos[position].drawable);
182795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio
183795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio            return convertView;
184795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio        }
185795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio    }
1863326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana}
187