1bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood/* 2bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * Copyright (C) 2011 The Android Open Source Project 3bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * 4bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * you may not use this file except in compliance with the License. 6bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * You may obtain a copy of the License at 7bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * 8bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * 10bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * Unless required by applicable law or agreed to in writing, software 11bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * See the License for the specific language governing permissions and 14bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood * limitations under the License. 15bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood */ 16bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 17bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodpackage com.android.systemui.usb; 18bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 19bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.app.AlertDialog; 20bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.ComponentName; 21bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.Context; 22bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.DialogInterface; 23bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.Intent; 24bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.pm.PackageManager; 25bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.pm.ResolveInfo; 26bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.hardware.usb.IUsbManager; 27bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.hardware.usb.UsbAccessory; 28fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.hardware.usb.UsbDevice; 29bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.hardware.usb.UsbManager; 30bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.os.Bundle; 31bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.os.IBinder; 32bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.os.ServiceManager; 33fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.os.UserHandle; 34bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.util.Log; 35bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.view.LayoutInflater; 36bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.view.View; 37bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.widget.CheckBox; 38bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.widget.CompoundButton; 39bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.widget.TextView; 40bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 41bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport com.android.internal.app.AlertActivity; 42bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport com.android.internal.app.AlertController; 43bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport com.android.systemui.R; 44bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 45bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodpublic class UsbConfirmActivity extends AlertActivity 46bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { 47bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 48bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private static final String TAG = "UsbConfirmActivity"; 49bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 50bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private CheckBox mAlwaysUse; 51bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private TextView mClearDefaultHint; 52bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private UsbDevice mDevice; 53bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private UsbAccessory mAccessory; 54bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private ResolveInfo mResolveInfo; 55bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private boolean mPermissionGranted; 56bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private UsbDisconnectedReceiver mDisconnectedReceiver; 57bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 58bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood @Override 59bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood public void onCreate(Bundle icicle) { 60bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood super.onCreate(icicle); 61bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 62fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey Intent intent = getIntent(); 63fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 64bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 65fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mResolveInfo = (ResolveInfo) intent.getParcelableExtra("rinfo"); 66bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 67bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood PackageManager packageManager = getPackageManager(); 68bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood String appName = mResolveInfo.loadLabel(packageManager).toString(); 69bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 70bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood final AlertController.AlertParams ap = mAlertParams; 71bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mIcon = mResolveInfo.loadIcon(packageManager); 72bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mTitle = appName; 73bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mDevice == null) { 74bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mMessage = getString(R.string.usb_accessory_confirm_prompt, appName); 75bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); 76bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 77bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mMessage = getString(R.string.usb_device_confirm_prompt, appName); 78bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); 79bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 80ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mPositiveButtonText = getString(android.R.string.ok); 81ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mNegativeButtonText = getString(android.R.string.cancel); 82bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mPositiveButtonListener = this; 83bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mNegativeButtonListener = this; 84bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 85bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // add "always use" checkbox 86bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood LayoutInflater inflater = (LayoutInflater)getSystemService( 87bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood Context.LAYOUT_INFLATER_SERVICE); 88bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); 89bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); 90ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood if (mDevice == null) { 91ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_accessory); 92ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } else { 93ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_device); 94ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } 95bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse.setOnCheckedChangeListener(this); 96bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint = (TextView)ap.mView.findViewById( 97bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood com.android.internal.R.id.clearDefaultHint); 98bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 99bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 100bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood setupAlert(); 101bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 102bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 103bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 1048f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood @Override 1058f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood protected void onDestroy() { 1068f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood if (mDisconnectedReceiver != null) { 1078f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood unregisterReceiver(mDisconnectedReceiver); 1088f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood } 1098f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood super.onDestroy(); 1108f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood } 1118f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood 112bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood public void onClick(DialogInterface dialog, int which) { 113bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (which == AlertDialog.BUTTON_POSITIVE) { 114bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood try { 115bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 116bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood IUsbManager service = IUsbManager.Stub.asInterface(b); 117fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int uid = mResolveInfo.activityInfo.applicationInfo.uid; 118fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey final int userId = UserHandle.myUserId(); 119bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood boolean alwaysUse = mAlwaysUse.isChecked(); 120bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood Intent intent = null; 121bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 122bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mDevice != null) { 123bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent = new Intent(UsbManager.ACTION_USB_DEVICE_ATTACHED); 124bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); 125bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 126bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // grant permission for the device 127bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.grantDevicePermission(mDevice, uid); 128bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // set or clear default setting 129bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (alwaysUse) { 130fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setDevicePackage( 131fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mDevice, mResolveInfo.activityInfo.packageName, userId); 132bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 133fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setDevicePackage(mDevice, null, userId); 134bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 135bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else if (mAccessory != null) { 136bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent = new Intent(UsbManager.ACTION_USB_ACCESSORY_ATTACHED); 137bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); 138bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 139bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // grant permission for the accessory 140bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.grantAccessoryPermission(mAccessory, uid); 141bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // set or clear default setting 142bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (alwaysUse) { 143fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setAccessoryPackage( 144fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey mAccessory, mResolveInfo.activityInfo.packageName, userId); 145bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 146fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey service.setAccessoryPackage(mAccessory, null, userId); 147bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 148bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 149bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 150bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 151bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.setComponent( 152bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood new ComponentName(mResolveInfo.activityInfo.packageName, 153bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mResolveInfo.activityInfo.name)); 154fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey startActivityAsUser(intent, new UserHandle(userId)); 155bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } catch (Exception e) { 156bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood Log.e(TAG, "Unable to start activity", e); 157bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 158bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 159bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood finish(); 160bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 161bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 162bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 163bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mClearDefaultHint == null) return; 164bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 165bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if(isChecked) { 166bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint.setVisibility(View.VISIBLE); 167bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 168bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 169bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 170bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 171bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood} 172