UsbPermissionActivity.java revision ad5f83e91b6812a6dee4fea7646fa9061d9f9597
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;
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 Lockwood
453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport com.android.systemui.R;
463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodpublic class UsbPermissionActivity extends AlertActivity
483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener {
493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private static final String TAG = "UsbPermissionActivity";
513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
52bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood    private CheckBox mAlwaysUse;
533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private TextView mClearDefaultHint;
543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private UsbDevice mDevice;
553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private UsbAccessory mAccessory;
563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private PendingIntent mPendingIntent;
573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private String mPackageName;
583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private int mUid;
593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private boolean mPermissionGranted;
60d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbDisconnectedReceiver mDisconnectedReceiver;
613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    @Override
633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onCreate(Bundle icicle) {
643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        super.onCreate(icicle);
653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood       Intent intent = getIntent();
673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT);
703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mUid = intent.getIntExtra("uid", 0);
713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mPackageName = intent.getStringExtra("package");
723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        PackageManager packageManager = getPackageManager();
743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ApplicationInfo aInfo;
753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        try {
763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            aInfo = packageManager.getApplicationInfo(mPackageName, 0);
773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } catch (PackageManager.NameNotFoundException e) {
783a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            Log.e(TAG, "unable to look up package name", e);
793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            finish();
803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            return;
813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
823a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        String appName = aInfo.loadLabel(packageManager).toString();
833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
843a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        final AlertController.AlertParams ap = mAlertParams;
853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mIcon = aInfo.loadIcon(packageManager);
863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mTitle = appName;
873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if (mDevice == null) {
883a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName);
89d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
903a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } else {
913a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            ap.mMessage = getString(R.string.usb_device_permission_prompt, appName);
92d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);
933a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
94ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        ap.mPositiveButtonText = getString(android.R.string.ok);
95ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        ap.mNegativeButtonText = getString(android.R.string.cancel);
963a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mPositiveButtonListener = this;
973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mNegativeButtonListener = this;
983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        // add "always use" checkbox
1003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        LayoutInflater inflater = (LayoutInflater)getSystemService(
1013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                Context.LAYOUT_INFLATER_SERVICE);
1023a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null);
103bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood        mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse);
104ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        if (mDevice == null) {
105ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood            mAlwaysUse.setText(R.string.always_use_accessory);
106ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        } else {
107ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood            mAlwaysUse.setText(R.string.always_use_device);
108ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        }
109bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood        mAlwaysUse.setOnCheckedChangeListener(this);
1103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mClearDefaultHint = (TextView)ap.mView.findViewById(
1113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                                                    com.android.internal.R.id.clearDefaultHint);
1123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mClearDefaultHint.setVisibility(View.GONE);
1133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        setupAlert();
1153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    @Override
1193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onDestroy() {
1203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        IBinder b = ServiceManager.getService(USB_SERVICE);
1213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        IUsbManager service = IUsbManager.Stub.asInterface(b);
1223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        // send response via pending intent
1243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        Intent intent = new Intent();
1253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        try {
1263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            if (mDevice != null) {
1273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice);
1283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                if (mPermissionGranted) {
1293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    service.grantDevicePermission(mDevice, mUid);
130bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood                    if (mAlwaysUse.isChecked()) {
1313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                        service.setDevicePackage(mDevice, mPackageName);
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()) {
1403a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                        service.setAccessoryPackage(mAccessory, mPackageName);
1413a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    }
1423a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                }
1433a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            }
1443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted);
1453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mPendingIntent.send(this, 0, intent);
1463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } catch (PendingIntent.CanceledException e) {
1473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            Log.w(TAG, "PendingIntent was cancelled");
1483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } catch (RemoteException e) {
1493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            Log.e(TAG, "IUsbService connection failed", e);
1503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
1513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
152d591357524091254483849e37697255cc8fce2adMike Lockwood        if (mDisconnectedReceiver != null) {
153d591357524091254483849e37697255cc8fce2adMike Lockwood            unregisterReceiver(mDisconnectedReceiver);
154d591357524091254483849e37697255cc8fce2adMike Lockwood        }
1553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        super.onDestroy();
1563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onClick(DialogInterface dialog, int which) {
1593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if (which == AlertDialog.BUTTON_POSITIVE) {
1603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mPermissionGranted = true;
1613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
1623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        finish();
1633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if (mClearDefaultHint == null) return;
1673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if(isChecked) {
1693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mClearDefaultHint.setVisibility(View.VISIBLE);
1703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } else {
1713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mClearDefaultHint.setVisibility(View.GONE);
1723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
1733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood}
175