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