UsbPermissionActivity.java revision ad5f83e91b6812a6dee4fea7646fa9061d9f9597
13a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood/* 23a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Copyright (C) 2011 The Android Open Source Project 33a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 43a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 53a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * you may not use this file except in compliance with the License. 63a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * You may obtain a copy of the License at 73a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 83a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 93a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * 103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * Unless required by applicable law or agreed to in writing, software 113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * See the License for the specific language governing permissions and 143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood * limitations under the License. 153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood */ 163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodpackage com.android.systemui.usb; 183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.Activity; 203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.AlertDialog; 213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.PendingIntent; 223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Context; 233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.DialogInterface; 243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Intent; 253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.pm.ApplicationInfo; 263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.pm.PackageManager; 273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.IUsbManager; 283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.UsbDevice; 293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.UsbAccessory; 303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.UsbManager; 313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.Bundle; 323a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.IBinder; 333a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.RemoteException; 343a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.ServiceManager; 353a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.util.Log; 363a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.view.LayoutInflater; 373a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.view.View; 383a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.widget.CheckBox; 393a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.widget.CompoundButton; 403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.widget.TextView; 413a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 423a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport com.android.internal.app.AlertActivity; 433a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport com.android.internal.app.AlertController; 443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport com.android.systemui.R; 463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodpublic class UsbPermissionActivity extends AlertActivity 483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { 493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private static final String TAG = "UsbPermissionActivity"; 513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 52bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private CheckBox mAlwaysUse; 533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private TextView mClearDefaultHint; 543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private UsbDevice mDevice; 553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private UsbAccessory mAccessory; 563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private PendingIntent mPendingIntent; 573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private String mPackageName; 583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private int mUid; 593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private boolean mPermissionGranted; 60d591357524091254483849e37697255cc8fce2adMike Lockwood private UsbDisconnectedReceiver mDisconnectedReceiver; 613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood @Override 633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onCreate(Bundle icicle) { 643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood super.onCreate(icicle); 653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Intent intent = getIntent(); 673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT); 703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mUid = intent.getIntExtra("uid", 0); 713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPackageName = intent.getStringExtra("package"); 723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood PackageManager packageManager = getPackageManager(); 743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ApplicationInfo aInfo; 753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood aInfo = packageManager.getApplicationInfo(mPackageName, 0); 773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (PackageManager.NameNotFoundException e) { 783a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "unable to look up package name", e); 793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood finish(); 803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return; 813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 823a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood String appName = aInfo.loadLabel(packageManager).toString(); 833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 843a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood final AlertController.AlertParams ap = mAlertParams; 853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mIcon = aInfo.loadIcon(packageManager); 863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mTitle = appName; 873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mDevice == null) { 883a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName); 89d591357524091254483849e37697255cc8fce2adMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); 903a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } else { 913a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mMessage = getString(R.string.usb_device_permission_prompt, appName); 92d591357524091254483849e37697255cc8fce2adMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); 933a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 94ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mPositiveButtonText = getString(android.R.string.ok); 95ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mNegativeButtonText = getString(android.R.string.cancel); 963a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mPositiveButtonListener = this; 973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mNegativeButtonListener = this; 983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood // add "always use" checkbox 1003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood LayoutInflater inflater = (LayoutInflater)getSystemService( 1013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Context.LAYOUT_INFLATER_SERVICE); 1023a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); 103bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); 104ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood if (mDevice == null) { 105ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_accessory); 106ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } else { 107ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_device); 108ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } 109bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse.setOnCheckedChangeListener(this); 1103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint = (TextView)ap.mView.findViewById( 1113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood com.android.internal.R.id.clearDefaultHint); 1123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 1133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood setupAlert(); 1153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood @Override 1193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onDestroy() { 1203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 1213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood IUsbManager service = IUsbManager.Stub.asInterface(b); 1223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood // send response via pending intent 1243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Intent intent = new Intent(); 1253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 1263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mDevice != null) { 1273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); 1283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mPermissionGranted) { 1293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood service.grantDevicePermission(mDevice, mUid); 130bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mAlwaysUse.isChecked()) { 1313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood service.setDevicePackage(mDevice, mPackageName); 1323a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1333a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1343a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1353a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mAccessory != null) { 1363a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); 1373a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mPermissionGranted) { 1383a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood service.grantAccessoryPermission(mAccessory, mUid); 139bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mAlwaysUse.isChecked()) { 1403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood service.setAccessoryPackage(mAccessory, mPackageName); 1413a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1423a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1433a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted); 1453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPendingIntent.send(this, 0, intent); 1463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (PendingIntent.CanceledException e) { 1473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.w(TAG, "PendingIntent was cancelled"); 1483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 1493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "IUsbService connection failed", e); 1503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 152d591357524091254483849e37697255cc8fce2adMike Lockwood if (mDisconnectedReceiver != null) { 153d591357524091254483849e37697255cc8fce2adMike Lockwood unregisterReceiver(mDisconnectedReceiver); 154d591357524091254483849e37697255cc8fce2adMike Lockwood } 1553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood super.onDestroy(); 1563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onClick(DialogInterface dialog, int which) { 1593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (which == AlertDialog.BUTTON_POSITIVE) { 1603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPermissionGranted = true; 1613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood finish(); 1633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mClearDefaultHint == null) return; 1673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if(isChecked) { 1693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.VISIBLE); 1703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } else { 1713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 1723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood} 175