1d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana/*
2d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Copyright (C) 2009 The Android Open Source Project
3d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana *
4d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License");
5d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * you may not use this file except in compliance with the License.
6d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * You may obtain a copy of the License at
7d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana *
8d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana *      http://www.apache.org/licenses/LICENSE-2.0
9d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana *
10d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * Unless required by applicable law or agreed to in writing, software
11d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS,
12d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * See the License for the specific language governing permissions and
14d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * limitations under the License.
15d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */
16d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanapackage android.accounts;
17d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
18d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.app.Activity;
19d9640ec712806508877868d08aafaa2d715ff441Fred Quintanaimport android.content.pm.RegisteredServicesCache;
20d9640ec712806508877868d08aafaa2d715ff441Fred Quintanaimport android.content.res.Resources;
21d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.os.Bundle;
22d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.widget.TextView;
23c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintanaimport android.widget.LinearLayout;
24d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.view.View;
25d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.view.LayoutInflater;
26d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.content.Context;
27d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.content.Intent;
28d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport android.content.pm.PackageManager;
29c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintanaimport android.text.TextUtils;
30d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanaimport com.android.internal.R;
31d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
32d9640ec712806508877868d08aafaa2d715ff441Fred Quintanaimport java.io.IOException;
33d9640ec712806508877868d08aafaa2d715ff441Fred Quintanaimport java.net.Authenticator;
34d9640ec712806508877868d08aafaa2d715ff441Fred Quintana
35d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana/**
36d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana * @hide
37d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana */
38d4a1d2e14297a3387fdb5761090961e714370492Fred Quintanapublic class GrantCredentialsPermissionActivity extends Activity implements View.OnClickListener {
39d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public static final String EXTRAS_ACCOUNT = "account";
40d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public static final String EXTRAS_AUTH_TOKEN_LABEL = "authTokenLabel";
41d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public static final String EXTRAS_AUTH_TOKEN_TYPE = "authTokenType";
42d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public static final String EXTRAS_RESPONSE = "response";
43d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public static final String EXTRAS_ACCOUNT_TYPE_LABEL = "accountTypeLabel";
44d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public static final String EXTRAS_PACKAGES = "application";
45d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public static final String EXTRAS_REQUESTING_UID = "uid";
46d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    private Account mAccount;
47d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    private String mAuthTokenType;
48d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    private int mUid;
49d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    private Bundle mResultBundle = null;
50c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana    protected LayoutInflater mInflater;
51d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
52d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    protected void onCreate(Bundle savedInstanceState) {
53d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        super.onCreate(savedInstanceState);
54c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        setContentView(R.layout.grant_credentials_permission);
55c91466f56a777ab44a9a025e9d51f576e21dcce9Adam Powell        setTitle(R.string.grant_permissions_header_text);
56d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
57c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
58d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
59c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        final Bundle extras = getIntent().getExtras();
6046703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom        if (extras == null) {
6146703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            // we were somehow started with bad parameters. abort the activity.
6246703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            setResult(Activity.RESULT_CANCELED);
6346703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            finish();
6446703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            return;
6546703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom        }
665f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache
675f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        // Grant 'account'/'type' to mUID
68c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        mAccount = extras.getParcelable(EXTRAS_ACCOUNT);
69c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        mAuthTokenType = extras.getString(EXTRAS_AUTH_TOKEN_TYPE);
705f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        mUid = extras.getInt(EXTRAS_REQUESTING_UID);
715f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        final PackageManager pm = getPackageManager();
725f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        final String[] packages = pm.getPackagesForUid(mUid);
73382601fc8babccee0d0b953ecd9bef745d126996Fred Quintana
745f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        if (mAccount == null || mAuthTokenType == null || packages == null) {
75382601fc8babccee0d0b953ecd9bef745d126996Fred Quintana            // we were somehow started with bad parameters. abort the activity.
76382601fc8babccee0d0b953ecd9bef745d126996Fred Quintana            setResult(Activity.RESULT_CANCELED);
77382601fc8babccee0d0b953ecd9bef745d126996Fred Quintana            finish();
78382601fc8babccee0d0b953ecd9bef745d126996Fred Quintana            return;
79382601fc8babccee0d0b953ecd9bef745d126996Fred Quintana        }
80382601fc8babccee0d0b953ecd9bef745d126996Fred Quintana
8146703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom        String accountTypeLabel;
8246703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom        try {
83d9640ec712806508877868d08aafaa2d715ff441Fred Quintana            accountTypeLabel = getAccountLabel(mAccount);
8446703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom        } catch (IllegalArgumentException e) {
8546703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            // label or resource was missing. abort the activity.
8646703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            setResult(Activity.RESULT_CANCELED);
8746703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            finish();
8846703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom            return;
8946703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom        }
905f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache
915f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        final TextView authTokenTypeView = (TextView) findViewById(R.id.authtoken_type);
925f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        authTokenTypeView.setVisibility(View.GONE);
935f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache
94d9640ec712806508877868d08aafaa2d715ff441Fred Quintana        final AccountManagerCallback<String> callback = new AccountManagerCallback<String>() {
95d9640ec712806508877868d08aafaa2d715ff441Fred Quintana            public void run(AccountManagerFuture<String> future) {
96d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                try {
97d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                    final String authTokenLabel = future.getResult();
98d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                    if (!TextUtils.isEmpty(authTokenLabel)) {
99d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                        runOnUiThread(new Runnable() {
100d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                            public void run() {
101d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                                if (!isFinishing()) {
102d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                                    authTokenTypeView.setText(authTokenLabel);
103d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                                    authTokenTypeView.setVisibility(View.VISIBLE);
104d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                                }
1055f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache                            }
106d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                        });
107d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                    }
108d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                } catch (OperationCanceledException e) {
109d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                } catch (IOException e) {
110d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                } catch (AuthenticatorException e) {
1115f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache                }
1125f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache            }
1135f383ad9695a62d6c1aeb97c8e550d7fffe26244Costin Manolache        };
114d9640ec712806508877868d08aafaa2d715ff441Fred Quintana        AccountManager.get(this).getAuthTokenLabel(mAccount.type, mAuthTokenType, callback, null);
115c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana
116c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        findViewById(R.id.allow_button).setOnClickListener(this);
117c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        findViewById(R.id.deny_button).setOnClickListener(this);
118c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana
119c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        LinearLayout packagesListView = (LinearLayout) findViewById(R.id.packages_list);
120d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
121c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        for (String pkg : packages) {
122c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana            String packageLabel;
123d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana            try {
124c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana                packageLabel = pm.getApplicationLabel(pm.getApplicationInfo(pkg, 0)).toString();
125d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana            } catch (PackageManager.NameNotFoundException e) {
126c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana                packageLabel = pkg;
127d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana            }
128c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana            packagesListView.addView(newPackageView(packageLabel));
129c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        }
130c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana
131c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        ((TextView) findViewById(R.id.account_name)).setText(mAccount.name);
132c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        ((TextView) findViewById(R.id.account_type)).setText(accountTypeLabel);
133c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana    }
134c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana
135d9640ec712806508877868d08aafaa2d715ff441Fred Quintana    private String getAccountLabel(Account account) {
136d9640ec712806508877868d08aafaa2d715ff441Fred Quintana        final AuthenticatorDescription[] authenticatorTypes =
137d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                AccountManager.get(this).getAuthenticatorTypes();
138d9640ec712806508877868d08aafaa2d715ff441Fred Quintana        for (int i = 0, N = authenticatorTypes.length; i < N; i++) {
139d9640ec712806508877868d08aafaa2d715ff441Fred Quintana            final AuthenticatorDescription desc = authenticatorTypes[i];
140d9640ec712806508877868d08aafaa2d715ff441Fred Quintana            if (desc.type.equals(account.type)) {
141d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                try {
142d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                    return createPackageContext(desc.packageName, 0).getString(desc.labelId);
143d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                } catch (PackageManager.NameNotFoundException e) {
144d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                    return account.type;
145d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                } catch (Resources.NotFoundException e) {
146d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                    return account.type;
147d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                }
148d9640ec712806508877868d08aafaa2d715ff441Fred Quintana            }
149d9640ec712806508877868d08aafaa2d715ff441Fred Quintana        }
150d9640ec712806508877868d08aafaa2d715ff441Fred Quintana        return account.type;
151d9640ec712806508877868d08aafaa2d715ff441Fred Quintana    }
152d9640ec712806508877868d08aafaa2d715ff441Fred Quintana
153c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana    private View newPackageView(String packageLabel) {
154c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        View view = mInflater.inflate(R.layout.permissions_package_list_item, null);
155c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        ((TextView) view.findViewById(R.id.package_label)).setText(packageLabel);
156c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        return view;
157d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    }
158d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
159d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public void onClick(View v) {
160d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        switch (v.getId()) {
161c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana            case R.id.allow_button:
162d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                AccountManager.get(this).updateAppPermission(mAccount, mAuthTokenType, mUid, true);
163d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana                Intent result = new Intent();
164d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana                result.putExtra("retry", true);
165d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana                setResult(RESULT_OK, result);
166d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana                setAccountAuthenticatorResult(result.getExtras());
167d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana                break;
168d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
169c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana            case R.id.deny_button:
170d9640ec712806508877868d08aafaa2d715ff441Fred Quintana                AccountManager.get(this).updateAppPermission(mAccount, mAuthTokenType, mUid, false);
171d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana                setResult(RESULT_CANCELED);
172d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana                break;
173d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        }
174d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        finish();
175d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    }
176d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
177d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public final void setAccountAuthenticatorResult(Bundle result) {
178d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        mResultBundle = result;
179d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    }
180d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana
181d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    /**
182c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana     * Sends the result or a {@link AccountManager#ERROR_CODE_CANCELED} error if a
183c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana     * result isn't present.
184d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana     */
185d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    public void finish() {
186d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        Intent intent = getIntent();
187c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        AccountAuthenticatorResponse response = intent.getParcelableExtra(EXTRAS_RESPONSE);
188c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana        if (response != null) {
189d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana            // send the result bundle back if set, otherwise send an error.
190d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana            if (mResultBundle != null) {
191c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana                response.onResult(mResultBundle);
192d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana            } else {
193c4989b1b75848acbeaf53850fbcfbf2f8812e325Fred Quintana                response.onError(AccountManager.ERROR_CODE_CANCELED, "canceled");
194d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana            }
195d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        }
196d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana        super.finish();
197d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana    }
198d4a1d2e14297a3387fdb5761090961e714370492Fred Quintana}
199