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