blob: 12b2b9ccf1480c8d8e6c93c6ebda1ad5bb259aec [file] [log] [blame]
Fred Quintanad4a1d2e2009-07-16 16:36:38 -07001/*
2 * Copyright (C) 2009 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 */
16package android.accounts;
17
18import android.app.Activity;
Fred Quintanad9640ec2012-05-23 12:37:00 -070019import android.content.res.Resources;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070020import android.os.Bundle;
21import android.widget.TextView;
Fred Quintanac4989b12009-10-13 14:02:10 -070022import android.widget.LinearLayout;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070023import android.view.View;
24import android.view.LayoutInflater;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070025import android.content.Context;
26import android.content.Intent;
27import android.content.pm.PackageManager;
Fred Quintanac4989b12009-10-13 14:02:10 -070028import android.text.TextUtils;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070029import com.android.internal.R;
30
Fred Quintanad9640ec2012-05-23 12:37:00 -070031import java.io.IOException;
Fred Quintanad9640ec2012-05-23 12:37:00 -070032
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070033/**
34 * @hide
35 */
36public class GrantCredentialsPermissionActivity extends Activity implements View.OnClickListener {
37 public static final String EXTRAS_ACCOUNT = "account";
38 public static final String EXTRAS_AUTH_TOKEN_LABEL = "authTokenLabel";
39 public static final String EXTRAS_AUTH_TOKEN_TYPE = "authTokenType";
40 public static final String EXTRAS_RESPONSE = "response";
41 public static final String EXTRAS_ACCOUNT_TYPE_LABEL = "accountTypeLabel";
42 public static final String EXTRAS_PACKAGES = "application";
43 public static final String EXTRAS_REQUESTING_UID = "uid";
44 private Account mAccount;
45 private String mAuthTokenType;
46 private int mUid;
47 private Bundle mResultBundle = null;
Fred Quintanac4989b12009-10-13 14:02:10 -070048 protected LayoutInflater mInflater;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070049
50 protected void onCreate(Bundle savedInstanceState) {
51 super.onCreate(savedInstanceState);
Fred Quintanac4989b12009-10-13 14:02:10 -070052 setContentView(R.layout.grant_credentials_permission);
Adam Powellc91466f2011-01-22 14:34:13 -080053 setTitle(R.string.grant_permissions_header_text);
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070054
Fred Quintanac4989b12009-10-13 14:02:10 -070055 mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Fred Quintanad4a1d2e2009-07-16 16:36:38 -070056
Fred Quintanac4989b12009-10-13 14:02:10 -070057 final Bundle extras = getIntent().getExtras();
Brian Carlstrom46703b02011-04-06 15:41:29 -070058 if (extras == null) {
59 // we were somehow started with bad parameters. abort the activity.
60 setResult(Activity.RESULT_CANCELED);
61 finish();
62 return;
63 }
Costin Manolache5f383ad92010-12-02 16:44:46 -080064
65 // Grant 'account'/'type' to mUID
Fred Quintanac4989b12009-10-13 14:02:10 -070066 mAccount = extras.getParcelable(EXTRAS_ACCOUNT);
67 mAuthTokenType = extras.getString(EXTRAS_AUTH_TOKEN_TYPE);
Costin Manolache5f383ad92010-12-02 16:44:46 -080068 mUid = extras.getInt(EXTRAS_REQUESTING_UID);
69 final PackageManager pm = getPackageManager();
70 final String[] packages = pm.getPackagesForUid(mUid);
Fred Quintana382601f2010-03-25 12:25:10 -070071
Costin Manolache5f383ad92010-12-02 16:44:46 -080072 if (mAccount == null || mAuthTokenType == null || packages == null) {
Fred Quintana382601f2010-03-25 12:25:10 -070073 // we were somehow started with bad parameters. abort the activity.
74 setResult(Activity.RESULT_CANCELED);
75 finish();
76 return;
77 }
78
Brian Carlstrom46703b02011-04-06 15:41:29 -070079 String accountTypeLabel;
80 try {
Fred Quintanad9640ec2012-05-23 12:37:00 -070081 accountTypeLabel = getAccountLabel(mAccount);
Brian Carlstrom46703b02011-04-06 15:41:29 -070082 } catch (IllegalArgumentException e) {
83 // label or resource was missing. abort the activity.
84 setResult(Activity.RESULT_CANCELED);
85 finish();
86 return;
87 }
Costin Manolache5f383ad92010-12-02 16:44:46 -080088
89 final TextView authTokenTypeView = (TextView) findViewById(R.id.authtoken_type);
90 authTokenTypeView.setVisibility(View.GONE);
91
Fred Quintanad9640ec2012-05-23 12:37:00 -070092 final AccountManagerCallback<String> callback = new AccountManagerCallback<String>() {
93 public void run(AccountManagerFuture<String> future) {
94 try {
95 final String authTokenLabel = future.getResult();
96 if (!TextUtils.isEmpty(authTokenLabel)) {
97 runOnUiThread(new Runnable() {
98 public void run() {
99 if (!isFinishing()) {
100 authTokenTypeView.setText(authTokenLabel);
101 authTokenTypeView.setVisibility(View.VISIBLE);
102 }
Costin Manolache5f383ad92010-12-02 16:44:46 -0800103 }
Fred Quintanad9640ec2012-05-23 12:37:00 -0700104 });
105 }
106 } catch (OperationCanceledException e) {
107 } catch (IOException e) {
108 } catch (AuthenticatorException e) {
Costin Manolache5f383ad92010-12-02 16:44:46 -0800109 }
110 }
Costin Manolache5f383ad92010-12-02 16:44:46 -0800111 };
Fred Quintanad9640ec2012-05-23 12:37:00 -0700112 AccountManager.get(this).getAuthTokenLabel(mAccount.type, mAuthTokenType, callback, null);
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700113
Fred Quintanac4989b12009-10-13 14:02:10 -0700114 findViewById(R.id.allow_button).setOnClickListener(this);
115 findViewById(R.id.deny_button).setOnClickListener(this);
116
117 LinearLayout packagesListView = (LinearLayout) findViewById(R.id.packages_list);
118
Fred Quintanac4989b12009-10-13 14:02:10 -0700119 for (String pkg : packages) {
120 String packageLabel;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700121 try {
Fred Quintanac4989b12009-10-13 14:02:10 -0700122 packageLabel = pm.getApplicationLabel(pm.getApplicationInfo(pkg, 0)).toString();
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700123 } catch (PackageManager.NameNotFoundException e) {
Fred Quintanac4989b12009-10-13 14:02:10 -0700124 packageLabel = pkg;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700125 }
Fred Quintanac4989b12009-10-13 14:02:10 -0700126 packagesListView.addView(newPackageView(packageLabel));
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700127 }
Fred Quintanac4989b12009-10-13 14:02:10 -0700128
129 ((TextView) findViewById(R.id.account_name)).setText(mAccount.name);
130 ((TextView) findViewById(R.id.account_type)).setText(accountTypeLabel);
Fred Quintanac4989b12009-10-13 14:02:10 -0700131 }
132
Fred Quintanad9640ec2012-05-23 12:37:00 -0700133 private String getAccountLabel(Account account) {
134 final AuthenticatorDescription[] authenticatorTypes =
135 AccountManager.get(this).getAuthenticatorTypes();
136 for (int i = 0, N = authenticatorTypes.length; i < N; i++) {
137 final AuthenticatorDescription desc = authenticatorTypes[i];
138 if (desc.type.equals(account.type)) {
139 try {
140 return createPackageContext(desc.packageName, 0).getString(desc.labelId);
141 } catch (PackageManager.NameNotFoundException e) {
142 return account.type;
143 } catch (Resources.NotFoundException e) {
144 return account.type;
145 }
146 }
147 }
148 return account.type;
149 }
150
Fred Quintanac4989b12009-10-13 14:02:10 -0700151 private View newPackageView(String packageLabel) {
152 View view = mInflater.inflate(R.layout.permissions_package_list_item, null);
153 ((TextView) view.findViewById(R.id.package_label)).setText(packageLabel);
154 return view;
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700155 }
156
157 public void onClick(View v) {
158 switch (v.getId()) {
Fred Quintanac4989b12009-10-13 14:02:10 -0700159 case R.id.allow_button:
Fred Quintanad9640ec2012-05-23 12:37:00 -0700160 AccountManager.get(this).updateAppPermission(mAccount, mAuthTokenType, mUid, true);
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700161 Intent result = new Intent();
162 result.putExtra("retry", true);
163 setResult(RESULT_OK, result);
164 setAccountAuthenticatorResult(result.getExtras());
165 break;
166
Fred Quintanac4989b12009-10-13 14:02:10 -0700167 case R.id.deny_button:
Fred Quintanad9640ec2012-05-23 12:37:00 -0700168 AccountManager.get(this).updateAppPermission(mAccount, mAuthTokenType, mUid, false);
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700169 setResult(RESULT_CANCELED);
170 break;
171 }
172 finish();
173 }
174
175 public final void setAccountAuthenticatorResult(Bundle result) {
176 mResultBundle = result;
177 }
178
179 /**
Fred Quintanac4989b12009-10-13 14:02:10 -0700180 * Sends the result or a {@link AccountManager#ERROR_CODE_CANCELED} error if a
181 * result isn't present.
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700182 */
183 public void finish() {
184 Intent intent = getIntent();
Fred Quintanac4989b12009-10-13 14:02:10 -0700185 AccountAuthenticatorResponse response = intent.getParcelableExtra(EXTRAS_RESPONSE);
186 if (response != null) {
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700187 // send the result bundle back if set, otherwise send an error.
188 if (mResultBundle != null) {
Fred Quintanac4989b12009-10-13 14:02:10 -0700189 response.onResult(mResultBundle);
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700190 } else {
Fred Quintanac4989b12009-10-13 14:02:10 -0700191 response.onError(AccountManager.ERROR_CODE_CANCELED, "canceled");
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700192 }
193 }
194 super.finish();
195 }
Fred Quintanad4a1d2e2009-07-16 16:36:38 -0700196}