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