UsbDebuggingActivity.java revision 29a4b7277eeadcf7ebdfae73da1e9acf0d371903
14e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby/*
24e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * Copyright (C) 2012 The Android Open Source Project
34e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby *
44e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License");
54e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * you may not use this file except in compliance with the License.
64e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * You may obtain a copy of the License at
74e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby *
84e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby *      http://www.apache.org/licenses/LICENSE-2.0
94e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby *
104e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * Unless required by applicable law or agreed to in writing, software
114e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS,
124e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * See the License for the specific language governing permissions and
144e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby * limitations under the License.
154e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby */
164e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
174e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobypackage com.android.systemui.usb;
184e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
194e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.app.Activity;
204e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.app.AlertDialog;
214e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.content.BroadcastReceiver;
224e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.content.Context;
234e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.content.DialogInterface;
244e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.content.Intent;
254e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.content.IntentFilter;
264e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.graphics.Typeface;
274e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.hardware.usb.IUsbManager;
284e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.hardware.usb.UsbDevice;
294e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.hardware.usb.UsbManager;
304e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.os.Bundle;
314e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.os.IBinder;
324e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.os.ServiceManager;
3329a4b7277eeadcf7ebdfae73da1e9acf0d371903Benoit Gobyimport android.os.SystemProperties;
344e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.util.Log;
354e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.view.LayoutInflater;
364e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.view.View;
374e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.widget.CheckBox;
384e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.widget.LinearLayout;
394e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport android.widget.TextView;
404e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
414e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport com.android.internal.app.AlertActivity;
424e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport com.android.internal.app.AlertController;
434e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
444e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobyimport com.android.systemui.R;
454e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
464e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Gobypublic class UsbDebuggingActivity extends AlertActivity
474e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby                                  implements DialogInterface.OnClickListener {
484e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    private static final String TAG = "UsbDebuggingActivity";
494e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
504e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    private CheckBox mAlwaysAllow;
514e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    private UsbDisconnectedReceiver mDisconnectedReceiver;
524e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    private String mKey;
534e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
544e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    @Override
554e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    public void onCreate(Bundle icicle) {
564e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        super.onCreate(icicle);
574e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
5829a4b7277eeadcf7ebdfae73da1e9acf0d371903Benoit Goby        if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0) {
5929a4b7277eeadcf7ebdfae73da1e9acf0d371903Benoit Goby            mDisconnectedReceiver = new UsbDisconnectedReceiver(this);
6029a4b7277eeadcf7ebdfae73da1e9acf0d371903Benoit Goby        }
6129a4b7277eeadcf7ebdfae73da1e9acf0d371903Benoit Goby
624e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        Intent intent = getIntent();
634e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        String fingerprints = intent.getStringExtra("fingerprints");
644e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        mKey = intent.getStringExtra("key");
654e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
664e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        if (fingerprints == null || mKey == null) {
674e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            finish();
684e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            return;
694e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        }
704e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
714e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        final AlertController.AlertParams ap = mAlertParams;
724e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mTitle = getString(R.string.usb_debugging_title);
734e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mIconId = com.android.internal.R.drawable.ic_dialog_usb;
744e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mMessage = getString(R.string.usb_debugging_message, fingerprints);
754e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mPositiveButtonText = getString(android.R.string.ok);
764e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mNegativeButtonText = getString(android.R.string.cancel);
774e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mPositiveButtonListener = this;
784e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mNegativeButtonListener = this;
794e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
804e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        // add "always allow" checkbox
814e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        LayoutInflater inflater = LayoutInflater.from(ap.mContext);
824e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        View checkbox = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null);
834e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        mAlwaysAllow = (CheckBox)checkbox.findViewById(com.android.internal.R.id.alwaysUse);
844e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        mAlwaysAllow.setText(getString(R.string.usb_debugging_always));
854e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        ap.mView = checkbox;
864e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
874e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        setupAlert();
884e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    }
894e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
904e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    private class UsbDisconnectedReceiver extends BroadcastReceiver {
914e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        private final Activity mActivity;
924e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        public UsbDisconnectedReceiver(Activity activity) {
934e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            mActivity = activity;
944e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        }
954e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
964e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        @Override
974e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        public void onReceive(Context content, Intent intent) {
984e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            String action = intent.getAction();
994e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            if (!UsbManager.ACTION_USB_STATE.equals(action)) {
1004e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby                return;
1014e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            }
1024e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
1034e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            if (!connected) {
1044e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby                mActivity.finish();
1054e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            }
1064e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        }
1074e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    }
1084e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
1094e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    @Override
1104e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    public void onStart() {
1114e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        super.onStart();
1124e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
1134e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        registerReceiver(mDisconnectedReceiver, filter);
1144e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    }
1154e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
1164e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    @Override
1174e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    protected void onStop() {
1184e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        if (mDisconnectedReceiver != null) {
1194e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            unregisterReceiver(mDisconnectedReceiver);
1204e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        }
1214e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        super.onStop();
1224e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    }
1234e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby
1244e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    @Override
1254e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    public void onClick(DialogInterface dialog, int which) {
1264e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        boolean allow = (which == AlertDialog.BUTTON_POSITIVE);
1274e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        boolean alwaysAllow = allow && mAlwaysAllow.isChecked();
1284e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        try {
1294e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            IBinder b = ServiceManager.getService(USB_SERVICE);
1304e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            IUsbManager service = IUsbManager.Stub.asInterface(b);
1314e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            if (allow) {
1324e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby                service.allowUsbDebugging(alwaysAllow, mKey);
1334e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            } else {
1344e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby                service.denyUsbDebugging();
1354e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            }
1364e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        } catch (Exception e) {
1374e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby            Log.e(TAG, "Unable to notify Usb service", e);
1384e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        }
1394e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby        finish();
1404e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby    }
1414e68bd420b6cfdbeadb5e69aa6448665b2da762bBenoit Goby}
142