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.AlertDialog;
203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.app.PendingIntent;
213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Context;
223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.DialogInterface;
233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.Intent;
243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.pm.ApplicationInfo;
253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.content.pm.PackageManager;
263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.IUsbManager;
273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.UsbAccessory;
28de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.hardware.usb.UsbDevice;
293a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.hardware.usb.UsbManager;
303a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.Bundle;
313a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.IBinder;
323a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.RemoteException;
333a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodimport android.os.ServiceManager;
34fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkeyimport android.os.UserHandle;
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 Lockwoodimport com.android.systemui.R;
453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwoodpublic class UsbPermissionActivity extends AlertActivity
473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener {
483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private static final String TAG = "UsbPermissionActivity";
503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
51bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood    private CheckBox mAlwaysUse;
523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private TextView mClearDefaultHint;
533a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private UsbDevice mDevice;
543a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private UsbAccessory mAccessory;
553a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private PendingIntent mPendingIntent;
563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private String mPackageName;
573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private int mUid;
583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    private boolean mPermissionGranted;
59d591357524091254483849e37697255cc8fce2adMike Lockwood    private UsbDisconnectedReceiver mDisconnectedReceiver;
603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    @Override
623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onCreate(Bundle icicle) {
633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        super.onCreate(icicle);
643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood       Intent intent = getIntent();
663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT);
69fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey        mUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mPackageName = intent.getStringExtra("package");
713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        PackageManager packageManager = getPackageManager();
733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ApplicationInfo aInfo;
743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        try {
753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            aInfo = packageManager.getApplicationInfo(mPackageName, 0);
763a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } catch (PackageManager.NameNotFoundException e) {
773a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            Log.e(TAG, "unable to look up package name", e);
783a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            finish();
793a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            return;
803a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
813a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        String appName = aInfo.loadLabel(packageManager).toString();
823a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
833a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        final AlertController.AlertParams ap = mAlertParams;
843a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mIcon = aInfo.loadIcon(packageManager);
853a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mTitle = appName;
863a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if (mDevice == null) {
873a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName);
88d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
893a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } else {
903a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            ap.mMessage = getString(R.string.usb_device_permission_prompt, appName);
91d591357524091254483849e37697255cc8fce2adMike Lockwood            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);
923a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
93ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        ap.mPositiveButtonText = getString(android.R.string.ok);
94ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        ap.mNegativeButtonText = getString(android.R.string.cancel);
953a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mPositiveButtonListener = this;
963a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mNegativeButtonListener = this;
973a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
983a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        // add "always use" checkbox
993a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        LayoutInflater inflater = (LayoutInflater)getSystemService(
1003a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                Context.LAYOUT_INFLATER_SERVICE);
1013a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null);
102bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood        mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse);
103ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        if (mDevice == null) {
104ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood            mAlwaysUse.setText(R.string.always_use_accessory);
105ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        } else {
106ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood            mAlwaysUse.setText(R.string.always_use_device);
107ad5f83e91b6812a6dee4fea7646fa9061d9f9597Mike Lockwood        }
108bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood        mAlwaysUse.setOnCheckedChangeListener(this);
1093a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mClearDefaultHint = (TextView)ap.mView.findViewById(
1103a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                                                    com.android.internal.R.id.clearDefaultHint);
1113a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        mClearDefaultHint.setVisibility(View.GONE);
1123a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1133a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        setupAlert();
1143a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1153a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1163a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1173a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    @Override
1183a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onDestroy() {
1193a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        IBinder b = ServiceManager.getService(USB_SERVICE);
1203a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        IUsbManager service = IUsbManager.Stub.asInterface(b);
1213a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1223a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        // send response via pending intent
1233a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        Intent intent = new Intent();
1243a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        try {
1253a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            if (mDevice != null) {
1263a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice);
1273a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                if (mPermissionGranted) {
1283a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    service.grantDevicePermission(mDevice, mUid);
129bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood                    if (mAlwaysUse.isChecked()) {
130fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                        final int userId = UserHandle.getUserId(mUid);
131fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                        service.setDevicePackage(mDevice, mPackageName, userId);
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()) {
140fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                        final int userId = UserHandle.getUserId(mUid);
141fc3f24b4b60c10e0d3f41f70df37e11ea311cc2cJeff Sharkey                        service.setAccessoryPackage(mAccessory, mPackageName, userId);
1423a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                    }
1433a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood                }
1443a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            }
1453a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted);
1463a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mPendingIntent.send(this, 0, intent);
1473a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } catch (PendingIntent.CanceledException e) {
1483a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            Log.w(TAG, "PendingIntent was cancelled");
1493a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } catch (RemoteException e) {
1503a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            Log.e(TAG, "IUsbService connection failed", e);
1513a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
1523a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
153d591357524091254483849e37697255cc8fce2adMike Lockwood        if (mDisconnectedReceiver != null) {
154d591357524091254483849e37697255cc8fce2adMike Lockwood            unregisterReceiver(mDisconnectedReceiver);
155d591357524091254483849e37697255cc8fce2adMike Lockwood        }
1563a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        super.onDestroy();
1573a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1583a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1593a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onClick(DialogInterface dialog, int which) {
1603a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if (which == AlertDialog.BUTTON_POSITIVE) {
1613a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mPermissionGranted = true;
1623a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
1633a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        finish();
1643a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1653a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1663a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1673a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if (mClearDefaultHint == null) return;
1683a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood
1693a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        if(isChecked) {
1703a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mClearDefaultHint.setVisibility(View.VISIBLE);
1713a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        } else {
1723a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood            mClearDefaultHint.setVisibility(View.GONE);
1733a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood        }
1743a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood    }
1753a68b8338b431eb15d28e92f06452efbbda9493eMike Lockwood}
176