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; 35fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.os.UserHandle; 363a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.util.Log; 373a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.view.LayoutInflater; 383a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.view.View; 393a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.widget.CheckBox; 403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.widget.CompoundButton; 413a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.widget.TextView; 423a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 433a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport com.android.internal.app.AlertActivity; 443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport com.android.internal.app.AlertController; 453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport com.android.systemui.R; 473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodpublic class UsbPermissionActivity extends AlertActivity 493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { 503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private static final String TAG = "UsbPermissionActivity"; 523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 53bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private CheckBox mAlwaysUse; 543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private TextView mClearDefaultHint; 553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private UsbDevice mDevice; 563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private UsbAccessory mAccessory; 573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private PendingIntent mPendingIntent; 583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private String mPackageName; 593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private int mUid; 603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood private boolean mPermissionGranted; 61d591357524091254483849e37697255cc8fce2adMike Lockwood private UsbDisconnectedReceiver mDisconnectedReceiver; 623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood @Override 643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onCreate(Bundle icicle) { 653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood super.onCreate(icicle); 663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Intent intent = getIntent(); 683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT); 71fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mUid = intent.getIntExtra(Intent.EXTRA_UID, -1); 723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPackageName = intent.getStringExtra("package"); 733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood PackageManager packageManager = getPackageManager(); 753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ApplicationInfo aInfo; 763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood aInfo = packageManager.getApplicationInfo(mPackageName, 0); 783a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (PackageManager.NameNotFoundException e) { 793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "unable to look up package name", e); 803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood finish(); 813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood return; 823a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood String appName = aInfo.loadLabel(packageManager).toString(); 843a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood final AlertController.AlertParams ap = mAlertParams; 863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mIcon = aInfo.loadIcon(packageManager); 873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mTitle = appName; 883a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mDevice == null) { 893a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName); 90d591357524091254483849e37697255cc8fce2adMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); 913a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } else { 923a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mMessage = getString(R.string.usb_device_permission_prompt, appName); 93d591357524091254483849e37697255cc8fce2adMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); 943a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 95ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mPositiveButtonText = getString(android.R.string.ok); 96ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mNegativeButtonText = getString(android.R.string.cancel); 973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mPositiveButtonListener = this; 983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mNegativeButtonListener = this; 993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood // add "always use" checkbox 1013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood LayoutInflater inflater = (LayoutInflater)getSystemService( 1023a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Context.LAYOUT_INFLATER_SERVICE); 1033a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); 104bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); 105ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood if (mDevice == null) { 106ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_accessory); 107ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } else { 108ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_device); 109ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } 110bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse.setOnCheckedChangeListener(this); 1113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint = (TextView)ap.mView.findViewById( 1123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood com.android.internal.R.id.clearDefaultHint); 1133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 1143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood setupAlert(); 1163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood @Override 1203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onDestroy() { 1213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 1223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood IUsbManager service = IUsbManager.Stub.asInterface(b); 1233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood // send response via pending intent 1253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Intent intent = new Intent(); 1263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood try { 1273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mDevice != null) { 1283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); 1293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mPermissionGranted) { 1303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood service.grantDevicePermission(mDevice, mUid); 131bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mAlwaysUse.isChecked()) { 132fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getUserId(mUid); 133fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setDevicePackage(mDevice, mPackageName, userId); 1343a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1353a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1363a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1373a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mAccessory != null) { 1383a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); 1393a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mPermissionGranted) { 1403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood service.grantAccessoryPermission(mAccessory, mUid); 141bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mAlwaysUse.isChecked()) { 142fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.getUserId(mUid); 143fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setAccessoryPackage(mAccessory, mPackageName, userId); 1443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted); 1483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPendingIntent.send(this, 0, intent); 1493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (PendingIntent.CanceledException e) { 1503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.w(TAG, "PendingIntent was cancelled"); 1513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } catch (RemoteException e) { 1523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood Log.e(TAG, "IUsbService connection failed", e); 1533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 155d591357524091254483849e37697255cc8fce2adMike Lockwood if (mDisconnectedReceiver != null) { 156d591357524091254483849e37697255cc8fce2adMike Lockwood unregisterReceiver(mDisconnectedReceiver); 157d591357524091254483849e37697255cc8fce2adMike Lockwood } 1583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood super.onDestroy(); 1593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onClick(DialogInterface dialog, int which) { 1623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (which == AlertDialog.BUTTON_POSITIVE) { 1633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mPermissionGranted = true; 1643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood finish(); 1663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if (mClearDefaultHint == null) return; 1703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood 1713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood if(isChecked) { 1723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.VISIBLE); 1733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } else { 1743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 1753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood } 1773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood} 178