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