diff options
Diffstat (limited to 'core/java/android/accounts/GrantCredentialsPermissionActivity.java')
-rw-r--r-- | core/java/android/accounts/GrantCredentialsPermissionActivity.java | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java new file mode 100644 index 0000000..e3ed2e9 --- /dev/null +++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.accounts; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.TextView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.view.View; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import com.android.internal.R; + +/** + * @hide + */ +public class GrantCredentialsPermissionActivity extends Activity implements View.OnClickListener { + public static final String EXTRAS_ACCOUNT = "account"; + public static final String EXTRAS_AUTH_TOKEN_LABEL = "authTokenLabel"; + public static final String EXTRAS_AUTH_TOKEN_TYPE = "authTokenType"; + public static final String EXTRAS_RESPONSE = "response"; + public static final String EXTRAS_ACCOUNT_TYPE_LABEL = "accountTypeLabel"; + public static final String EXTRAS_PACKAGES = "application"; + public static final String EXTRAS_REQUESTING_UID = "uid"; + private Account mAccount; + private String mAuthTokenType; + private int mUid; + private Bundle mResultBundle = null; + + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setContentView(R.layout.grant_credentials_permission); + mAccount = getIntent().getExtras().getParcelable(EXTRAS_ACCOUNT); + mAuthTokenType = getIntent().getExtras().getString(EXTRAS_AUTH_TOKEN_TYPE); + mUid = getIntent().getExtras().getInt(EXTRAS_REQUESTING_UID); + final String accountTypeLabel = + getIntent().getExtras().getString(EXTRAS_ACCOUNT_TYPE_LABEL); + final String[] packages = getIntent().getExtras().getStringArray(EXTRAS_PACKAGES); + + findViewById(R.id.allow).setOnClickListener(this); + findViewById(R.id.deny).setOnClickListener(this); + + TextView messageView = (TextView) getWindow().findViewById(R.id.message); + String authTokenLabel = getIntent().getExtras().getString(EXTRAS_AUTH_TOKEN_LABEL); + if (authTokenLabel.length() == 0) { + CharSequence grantCredentialsPermissionFormat = getResources().getText( + R.string.grant_credentials_permission_message_desc); + messageView.setText(String.format(grantCredentialsPermissionFormat.toString(), + mAccount.name, accountTypeLabel)); + } else { + CharSequence grantCredentialsPermissionFormat = getResources().getText( + R.string.grant_credentials_permission_message_with_authtokenlabel_desc); + messageView.setText(String.format(grantCredentialsPermissionFormat.toString(), + authTokenLabel, mAccount.name, accountTypeLabel)); + } + + String[] packageLabels = new String[packages.length]; + final PackageManager pm = getPackageManager(); + for (int i = 0; i < packages.length; i++) { + try { + packageLabels[i] = + pm.getApplicationLabel(pm.getApplicationInfo(packages[i], 0)).toString(); + } catch (PackageManager.NameNotFoundException e) { + packageLabels[i] = packages[i]; + } + } + ((ListView) findViewById(R.id.packages_list)).setAdapter( + new PackagesArrayAdapter(this, packageLabels)); + } + + public void onClick(View v) { + switch (v.getId()) { + case R.id.allow: + AccountManagerService.getSingleton().grantAppPermission(mAccount, mAuthTokenType, + mUid); + Intent result = new Intent(); + result.putExtra("retry", true); + setResult(RESULT_OK, result); + setAccountAuthenticatorResult(result.getExtras()); + break; + + case R.id.deny: + AccountManagerService.getSingleton().revokeAppPermission(mAccount, mAuthTokenType, + mUid); + setResult(RESULT_CANCELED); + break; + } + finish(); + } + + public final void setAccountAuthenticatorResult(Bundle result) { + mResultBundle = result; + } + + /** + * Sends the result or a Constants.ERROR_CODE_CANCELED error if a result isn't present. + */ + public void finish() { + Intent intent = getIntent(); + AccountAuthenticatorResponse accountAuthenticatorResponse = + intent.getParcelableExtra(EXTRAS_RESPONSE); + if (accountAuthenticatorResponse != null) { + // send the result bundle back if set, otherwise send an error. + if (mResultBundle != null) { + accountAuthenticatorResponse.onResult(mResultBundle); + } else { + accountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled"); + } + } + super.finish(); + } + + private static class PackagesArrayAdapter extends ArrayAdapter<String> { + protected LayoutInflater mInflater; + private static final int mResource = R.layout.simple_list_item_1; + + public PackagesArrayAdapter(Context context, String[] items) { + super(context, mResource, items); + mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + static class ViewHolder { + TextView label; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + // A ViewHolder keeps references to children views to avoid unneccessary calls + // to findViewById() on each row. + ViewHolder holder; + + // When convertView is not null, we can reuse it directly, there is no need + // to reinflate it. We only inflate a new View when the convertView supplied + // by ListView is null. + if (convertView == null) { + convertView = mInflater.inflate(mResource, null); + + // Creates a ViewHolder and store references to the two children views + // we want to bind data to. + holder = new ViewHolder(); + holder.label = (TextView) convertView.findViewById(R.id.text1); + + convertView.setTag(holder); + } else { + // Get the ViewHolder back to get fast access to the TextView + // and the ImageView. + holder = (ViewHolder) convertView.getTag(); + } + + holder.label.setText(getItem(position)); + + return convertView; + } + } +} |