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.Activity; 20bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.app.AlertDialog; 21bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.ComponentName; 22bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.Context; 23bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.DialogInterface; 24bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.Intent; 25bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.pm.ApplicationInfo; 26bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.pm.PackageManager; 27bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.content.pm.ResolveInfo; 28bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.hardware.usb.IUsbManager; 29bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.hardware.usb.UsbDevice; 30bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.hardware.usb.UsbAccessory; 31bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.hardware.usb.UsbManager; 32bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.os.Bundle; 33bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.os.IBinder; 34bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.os.RemoteException; 35bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.os.ServiceManager; 36bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.util.Log; 37bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.view.LayoutInflater; 38bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.view.View; 39bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.widget.CheckBox; 40bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.widget.CompoundButton; 41bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport android.widget.TextView; 42bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 43bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport com.android.internal.app.AlertActivity; 44bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport com.android.internal.app.AlertController; 45bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 46bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodimport com.android.systemui.R; 47bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 48bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwoodpublic class UsbConfirmActivity extends AlertActivity 49bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { 50bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 51bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private static final String TAG = "UsbConfirmActivity"; 52bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 53bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private CheckBox mAlwaysUse; 54bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private TextView mClearDefaultHint; 55bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private UsbDevice mDevice; 56bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private UsbAccessory mAccessory; 57bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private ResolveInfo mResolveInfo; 58bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private boolean mPermissionGranted; 59bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood private UsbDisconnectedReceiver mDisconnectedReceiver; 60bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 61bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood @Override 62bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood public void onCreate(Bundle icicle) { 63bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood super.onCreate(icicle); 64bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 65bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood Intent intent = getIntent(); 66bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 67bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 68bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mResolveInfo = (ResolveInfo)intent.getParcelableExtra("rinfo"); 69bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 70bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood PackageManager packageManager = getPackageManager(); 71bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood String appName = mResolveInfo.loadLabel(packageManager).toString(); 72bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 73bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood final AlertController.AlertParams ap = mAlertParams; 74bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mIcon = mResolveInfo.loadIcon(packageManager); 75bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mTitle = appName; 76bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mDevice == null) { 77bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mMessage = getString(R.string.usb_accessory_confirm_prompt, appName); 78bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); 79bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 80bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mMessage = getString(R.string.usb_device_confirm_prompt, appName); 81bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); 82bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 83ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mPositiveButtonText = getString(android.R.string.ok); 84ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood ap.mNegativeButtonText = getString(android.R.string.cancel); 85bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mPositiveButtonListener = this; 86bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mNegativeButtonListener = this; 87bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 88bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // add "always use" checkbox 89bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood LayoutInflater inflater = (LayoutInflater)getSystemService( 90bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood Context.LAYOUT_INFLATER_SERVICE); 91bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); 92bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); 93ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood if (mDevice == null) { 94ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_accessory); 95ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } else { 96ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood mAlwaysUse.setText(R.string.always_use_device); 97ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood } 98bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mAlwaysUse.setOnCheckedChangeListener(this); 99bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint = (TextView)ap.mView.findViewById( 100bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood com.android.internal.R.id.clearDefaultHint); 101bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 102bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 103bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood setupAlert(); 104bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 105bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 106bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 1078f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood @Override 1088f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood protected void onDestroy() { 1098f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood if (mDisconnectedReceiver != null) { 1108f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood unregisterReceiver(mDisconnectedReceiver); 1118f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood } 1128f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood super.onDestroy(); 1138f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood } 1148f6dce44e34504b891b53ff8ea524268b9095a8dMike Lockwood 115bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood public void onClick(DialogInterface dialog, int which) { 116bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (which == AlertDialog.BUTTON_POSITIVE) { 117bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood try { 118bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 119bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood IUsbManager service = IUsbManager.Stub.asInterface(b); 120bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood int uid = mResolveInfo.activityInfo.applicationInfo.uid; 121bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood boolean alwaysUse = mAlwaysUse.isChecked(); 122bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood Intent intent = null; 123bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 124bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mDevice != null) { 125bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent = new Intent(UsbManager.ACTION_USB_DEVICE_ATTACHED); 126bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); 127bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 128bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // grant permission for the device 129bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.grantDevicePermission(mDevice, uid); 130bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // set or clear default setting 131bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (alwaysUse) { 132bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.setDevicePackage(mDevice, mResolveInfo.activityInfo.packageName); 133bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 134bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.setDevicePackage(mDevice, null); 135bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 136bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else if (mAccessory != null) { 137bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent = new Intent(UsbManager.ACTION_USB_ACCESSORY_ATTACHED); 138bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); 139bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 140bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // grant permission for the accessory 141bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.grantAccessoryPermission(mAccessory, uid); 142bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood // set or clear default setting 143bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (alwaysUse) { 144bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.setAccessoryPackage(mAccessory, 145bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mResolveInfo.activityInfo.packageName); 146bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 147bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood service.setAccessoryPackage(mAccessory, null); 148bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 149bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 150bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 151bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 152bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood intent.setComponent( 153bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood new ComponentName(mResolveInfo.activityInfo.packageName, 154bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mResolveInfo.activityInfo.name)); 155bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood startActivity(intent); 156bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } catch (Exception e) { 157bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood Log.e(TAG, "Unable to start activity", e); 158bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 159bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 160bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood finish(); 161bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 162bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 163bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 164bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (mClearDefaultHint == null) return; 165bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood 166bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if(isChecked) { 167bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint.setVisibility(View.VISIBLE); 168bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } else { 169bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood mClearDefaultHint.setVisibility(View.GONE); 170bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 171bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood } 172bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood} 173