1638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood/* 2638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * Copyright (C) 2011 The Android Open Source Project 3638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * 4638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * you may not use this file except in compliance with the License. 6638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * You may obtain a copy of the License at 7638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * 8638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * 10638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * See the License for the specific language governing permissions and 14638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood * limitations under the License. 15638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood */ 16638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 17638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodpackage com.android.systemui.usb; 18638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 19638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.app.Activity; 20638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.app.AlertDialog; 21638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.content.ComponentName; 22638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.content.Context; 23638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.content.DialogInterface; 24638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.content.Intent; 25638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.content.pm.ApplicationInfo; 26638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.content.pm.PackageManager; 27638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.content.pm.ResolveInfo; 28638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.hardware.usb.IUsbManager; 29638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.hardware.usb.UsbAccessory; 30638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.hardware.usb.UsbManager; 31638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.os.Bundle; 32638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.os.IBinder; 33638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.os.RemoteException; 34638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.os.ServiceManager; 35638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.util.Log; 36638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.view.LayoutInflater; 37638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.view.View; 38638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.widget.CheckBox; 39638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.widget.CompoundButton; 40638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport android.widget.TextView; 41638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 42638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport com.android.internal.app.AlertActivity; 43638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport com.android.internal.app.AlertController; 44638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 45638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodimport com.android.systemui.R; 46638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 47638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwoodpublic class UsbConfirmActivity extends AlertActivity 48638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { 49638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 50638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood private static final String TAG = "UsbConfirmActivity"; 51638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 52638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood private CheckBox mAlwaysUse; 53638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood private TextView mClearDefaultHint; 54638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood private UsbAccessory mAccessory; 55638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood private ResolveInfo mResolveInfo; 56638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood private boolean mPermissionGranted; 57638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood private UsbDisconnectedReceiver mDisconnectedReceiver; 58638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 59638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood @Override 60638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood public void onCreate(Bundle icicle) { 61638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood super.onCreate(icicle); 62638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 63638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood Intent intent = getIntent(); 64638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); 65638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); 66638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mResolveInfo = (ResolveInfo)intent.getParcelableExtra("rinfo"); 67638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 68638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood PackageManager packageManager = getPackageManager(); 69638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood String appName = mResolveInfo.loadLabel(packageManager).toString(); 70638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 71638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood final AlertController.AlertParams ap = mAlertParams; 72638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mIcon = mResolveInfo.loadIcon(packageManager); 73638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mTitle = appName; 74638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mMessage = getString(R.string.usb_accessory_confirm_prompt, appName); 75638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mPositiveButtonText = getString(android.R.string.ok); 76638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mNegativeButtonText = getString(android.R.string.cancel); 77638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mPositiveButtonListener = this; 78638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mNegativeButtonListener = this; 79638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 80638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood // add "always use" checkbox 81638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood LayoutInflater inflater = (LayoutInflater)getSystemService( 82638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood Context.LAYOUT_INFLATER_SERVICE); 83638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); 84638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); 85638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mAlwaysUse.setText(R.string.always_use_accessory); 86638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mAlwaysUse.setOnCheckedChangeListener(this); 87638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mClearDefaultHint = (TextView)ap.mView.findViewById( 88638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood com.android.internal.R.id.clearDefaultHint); 89638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mClearDefaultHint.setVisibility(View.GONE); 90638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 91638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood setupAlert(); 92638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 93638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 94638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 95638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood @Override 96638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood protected void onDestroy() { 97638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood if (mDisconnectedReceiver != null) { 98638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood unregisterReceiver(mDisconnectedReceiver); 99638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 100638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood super.onDestroy(); 101638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 102638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 103638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood public void onClick(DialogInterface dialog, int which) { 104638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood if (which == AlertDialog.BUTTON_POSITIVE) { 105638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood try { 106638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood IBinder b = ServiceManager.getService(USB_SERVICE); 107638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood IUsbManager service = IUsbManager.Stub.asInterface(b); 108638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood int uid = mResolveInfo.activityInfo.applicationInfo.uid; 109638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood boolean alwaysUse = mAlwaysUse.isChecked(); 110638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood Intent intent = new Intent(UsbManager.ACTION_USB_ACCESSORY_ATTACHED); 111638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); 112638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 113638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood intent.setComponent( 114638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood new ComponentName(mResolveInfo.activityInfo.packageName, 115638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mResolveInfo.activityInfo.name)); 116638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 117638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood // grant permission for the accessory 118638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood service.grantAccessoryPermission(mAccessory, uid); 119638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood // set or clear default setting 120638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood if (alwaysUse) { 121638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood service.setAccessoryPackage(mAccessory, 122638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mResolveInfo.activityInfo.packageName); 123638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } else { 124638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood service.setAccessoryPackage(mAccessory, null); 125638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 126638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood startActivity(intent); 127638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } catch (Exception e) { 128638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood Log.e(TAG, "Unable to start activity", e); 129638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 130638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 131638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood finish(); 132638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 133638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 134638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 135638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood if (mClearDefaultHint == null) return; 136638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood 137638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood if(isChecked) { 138638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mClearDefaultHint.setVisibility(View.VISIBLE); 139638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } else { 140638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood mClearDefaultHint.setVisibility(View.GONE); 141638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 142638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood } 143638d7cb3ee0bb3596b01dc19eca9456fa72a36e0Mike Lockwood} 144