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.AlertDialog; 203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.PendingIntent; 213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Context; 223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.DialogInterface; 233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Intent; 243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.pm.ApplicationInfo; 253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.pm.PackageManager; 263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.IUsbManager; 273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.UsbAccessory; 28de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.hardware.usb.UsbDevice; 293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.UsbManager; 303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.Bundle; 313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.IBinder; 323a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.RemoteException; 333a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.ServiceManager; 34fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.os.UserHandle; 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 Lockwoodimport com.android.systemui.R; 453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodpublic class UsbPermissionActivity extends AlertActivity 473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { 483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private static final String TAG = "UsbPermissionActivity"; 503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 51bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private CheckBox mAlwaysUse; 523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private TextView mClearDefaultHint; 533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private UsbDevice mDevice; 543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private UsbAccessory mAccessory; 553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private PendingIntent mPendingIntent; 563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private String mPackageName; 573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private int mUid; 583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private boolean mPermissionGranted; 59d591357524091254483849e37697255cc8fce2adMike Lockwood private UsbDisconnectedReceiver mDisconnectedReceiver; 603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood @Override 623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onCreate(Bundle icicle) { 633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood super.onCreate(icicle); 643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Intent intent = getIntent(); 663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT); 69fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mUid = intent.getIntExtra(Intent.EXTRA_UID, -1); 703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPackageName = intent.getStringExtra("package"); 713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood PackageManager packageManager = getPackageManager(); 733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ApplicationInfo aInfo; 743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood aInfo = packageManager.getApplicationInfo(mPackageName, 0); 763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (PackageManager.NameNotFoundException e) { 773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "unable to look up package name", e); 783a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood finish(); 793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return; 803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood String appName = aInfo.loadLabel(packageManager).toString(); 823a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood final AlertController.AlertParams ap = mAlertParams; 843a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mIcon = aInfo.loadIcon(packageManager); 853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mTitle = appName; 863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mDevice == null) { 873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName); 88d591357524091254483849e37697255cc8fce2adMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); 893a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } else { 903a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mMessage = getString(R.string.usb_device_permission_prompt, appName); 91d591357524091254483849e37697255cc8fce2adMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); 923a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 93ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mPositiveButtonText = getString(android.R.string.ok); 94ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mNegativeButtonText = getString(android.R.string.cancel); 953a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mPositiveButtonListener = this; 963a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mNegativeButtonListener = this; 973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood // add "always use" checkbox 993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood LayoutInflater inflater = (LayoutInflater)getSystemService( 1003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Context.LAYOUT_INFLATER_SERVICE); 1013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); 102bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); 103ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood if (mDevice == null) { 104ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_accessory); 105ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } else { 106ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_device); 107ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } 108bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse.setOnCheckedChangeListener(this); 1093a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint = (TextView)ap.mView.findViewById( 1103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood com.android.internal.R.id.clearDefaultHint); 1113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 1123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood setupAlert(); 1143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood @Override 1183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onDestroy() { 1193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 1203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood IUsbManager service = IUsbManager.Stub.asInterface(b); 1213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood // send response via pending intent 1233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Intent intent = new Intent(); 1243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 1253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mDevice != null) { 1263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); 1273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mPermissionGranted) { 1283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood service.grantDevicePermission(mDevice, mUid); 129bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mAlwaysUse.isChecked()) { 130fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getUserId(mUid); 131fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setDevicePackage(mDevice, mPackageName, userId); 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()) { 140fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getUserId(mUid); 141fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setAccessoryPackage(mAccessory, mPackageName, userId); 1423a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1433a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted); 1463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPendingIntent.send(this, 0, intent); 1473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (PendingIntent.CanceledException e) { 1483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.w(TAG, "PendingIntent was cancelled"); 1493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 1503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "IUsbService connection failed", e); 1513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 153d591357524091254483849e37697255cc8fce2adMike Lockwood if (mDisconnectedReceiver != null) { 154d591357524091254483849e37697255cc8fce2adMike Lockwood unregisterReceiver(mDisconnectedReceiver); 155d591357524091254483849e37697255cc8fce2adMike Lockwood } 1563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood super.onDestroy(); 1573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onClick(DialogInterface dialog, int which) { 1603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (which == AlertDialog.BUTTON_POSITIVE) { 1613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPermissionGranted = true; 1623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood finish(); 1643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mClearDefaultHint == null) return; 1683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if(isChecked) { 1703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.VISIBLE); 1713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } else { 1723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 1733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood} 176