SendBug.java revision d4cd3249e37e5689fc4a8c2858351ec9bebb467c
18c658e058446ad69fb056b2160340d708582b9eeGuang Zhu/* 28c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * Copyright (C) 2011 The Android Open Source Project 38c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * 48c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 58c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * you may not use this file except in compliance with the License. 68c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * You may obtain a copy of the License at 78c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * 88c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * http://www.apache.org/licenses/LICENSE-2.0 98c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * 108c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * Unless required by applicable law or agreed to in writing, software 118c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 128c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * See the License for the specific language governing permissions and 148c658e058446ad69fb056b2160340d708582b9eeGuang Zhu * limitations under the License. 158c658e058446ad69fb056b2160340d708582b9eeGuang Zhu */ 168c658e058446ad69fb056b2160340d708582b9eeGuang Zhupackage com.android.commands.sendbug; 178c658e058446ad69fb056b2160340d708582b9eeGuang Zhu 188c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.accounts.Account; 198c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.accounts.IAccountManager; 208c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.app.ActivityManagerNative; 218c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.app.IActivityManager; 228c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.content.Context; 238c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.content.Intent; 24d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhuimport android.content.pm.IPackageManager; 25d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhuimport android.content.pm.ResolveInfo; 268c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.net.Uri; 278c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.os.RemoteException; 288c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.os.ServiceManager; 298c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport android.os.SystemProperties; 308c658e058446ad69fb056b2160340d708582b9eeGuang Zhu 318c658e058446ad69fb056b2160340d708582b9eeGuang Zhuimport java.io.File; 32d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhuimport java.util.List; 338c658e058446ad69fb056b2160340d708582b9eeGuang Zhu 348c658e058446ad69fb056b2160340d708582b9eeGuang Zhupublic class SendBug { 358c658e058446ad69fb056b2160340d708582b9eeGuang Zhu 368c658e058446ad69fb056b2160340d708582b9eeGuang Zhu private static final String GOOGLE_ACCOUNT_TYPE = "com.google"; 378c658e058446ad69fb056b2160340d708582b9eeGuang Zhu private static final String EMAIL_ACCOUNT_TYPE = "com.android.email"; 38d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu private static final String SEND_BUG_INTENT_ACTION = "android.testing.SEND_BUG"; 398c658e058446ad69fb056b2160340d708582b9eeGuang Zhu 408c658e058446ad69fb056b2160340d708582b9eeGuang Zhu public static void main(String[] args) { 418c658e058446ad69fb056b2160340d708582b9eeGuang Zhu if (args.length >= 1) { 428c658e058446ad69fb056b2160340d708582b9eeGuang Zhu new SendBug().run(args[0]); 438c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 448c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 458c658e058446ad69fb056b2160340d708582b9eeGuang Zhu 468c658e058446ad69fb056b2160340d708582b9eeGuang Zhu private void run(String bugreportPath) { 478c658e058446ad69fb056b2160340d708582b9eeGuang Zhu File bugreport = new File(bugreportPath); 488c658e058446ad69fb056b2160340d708582b9eeGuang Zhu if (bugreport.exists()) { 49d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu Uri bugreportUri = Uri.fromFile(bugreport); 50d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu Intent intent = tryBugReporter(bugreportUri); 51d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu if (intent == null) { 52d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent = getSendMailIntent(bugreportUri); 538c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 548c658e058446ad69fb056b2160340d708582b9eeGuang Zhu IActivityManager mAm = ActivityManagerNative.getDefault(); 558c658e058446ad69fb056b2160340d708582b9eeGuang Zhu try { 568c658e058446ad69fb056b2160340d708582b9eeGuang Zhu mAm.startActivity(null, intent, intent.getType(), null, 0, null, null, 0, false, 5743350373779c519e0fda89f9c5c899af1a42e8d1Dianne Hackborn false, null, null, false); 588c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } catch (RemoteException e) { 598c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 608c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 618c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 628c658e058446ad69fb056b2160340d708582b9eeGuang Zhu 63d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu private Intent tryBugReporter(Uri bugreportUri) { 64d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu Intent intent = new Intent(SEND_BUG_INTENT_ACTION); 65d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.setData(bugreportUri); 66d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu IPackageManager mPm = IPackageManager.Stub.asInterface( 67d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu ServiceManager.getService("package")); 68d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu if (mPm != null) { 69d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu List<ResolveInfo> results = null; 70d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu try { 71d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu results = mPm.queryIntentActivities(intent, null, 0); 72d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } catch (RemoteException e) { 73d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu return null; 74d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } 75d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu if (results != null && results.size() > 0) { 76d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu ResolveInfo info = results.get(0); 77d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 78d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.setClassName(info.activityInfo.applicationInfo.packageName, 79d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu info.activityInfo.name); 80d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu return intent; 81d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } else { 82d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu return null; 83d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } 84d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } 85d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu return null; 86d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } 87d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu 88d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu private Intent getSendMailIntent(Uri bugreportUri) { 89d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu Account sendToAccount = findSendToAccount(); 90d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu Intent intent = new Intent(Intent.ACTION_SEND); 91d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 92d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.setType("application/octet-stream"); 93d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.putExtra("subject", bugreportUri.getLastPathSegment()); 94d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu StringBuilder sb = new StringBuilder(); 95d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu sb.append(SystemProperties.get("ro.build.description")); 96d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu sb.append("\n(Sent from BugMailer)"); 97d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.putExtra("body", sb.toString()); 98d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.putExtra(Intent.EXTRA_STREAM, bugreportUri); 99d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu if (sendToAccount != null) { 100d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu intent.putExtra("to", sendToAccount.name); 101d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } 102d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu return intent; 103d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu } 104d4cd3249e37e5689fc4a8c2858351ec9bebb467cGuang Zhu 1058c658e058446ad69fb056b2160340d708582b9eeGuang Zhu private Account findSendToAccount() { 1068c658e058446ad69fb056b2160340d708582b9eeGuang Zhu IAccountManager accountManager = IAccountManager.Stub.asInterface(ServiceManager 1078c658e058446ad69fb056b2160340d708582b9eeGuang Zhu .getService(Context.ACCOUNT_SERVICE)); 1088c658e058446ad69fb056b2160340d708582b9eeGuang Zhu Account[] accounts = null; 1098c658e058446ad69fb056b2160340d708582b9eeGuang Zhu Account foundAccount = null; 1108c658e058446ad69fb056b2160340d708582b9eeGuang Zhu try { 1118c658e058446ad69fb056b2160340d708582b9eeGuang Zhu accounts = accountManager.getAccounts(null); 1128c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } catch (RemoteException e) { 1138c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 1148c658e058446ad69fb056b2160340d708582b9eeGuang Zhu if (accounts != null) { 1158c658e058446ad69fb056b2160340d708582b9eeGuang Zhu for (Account account : accounts) { 1168c658e058446ad69fb056b2160340d708582b9eeGuang Zhu if (GOOGLE_ACCOUNT_TYPE.equals(account.type)) { 1178c658e058446ad69fb056b2160340d708582b9eeGuang Zhu // return first gmail account found 1188c658e058446ad69fb056b2160340d708582b9eeGuang Zhu return account; 1198c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } else if (EMAIL_ACCOUNT_TYPE.equals(account.type)) { 1208c658e058446ad69fb056b2160340d708582b9eeGuang Zhu // keep regular email account for now in case there are gmail accounts 1218c658e058446ad69fb056b2160340d708582b9eeGuang Zhu // found later 1228c658e058446ad69fb056b2160340d708582b9eeGuang Zhu foundAccount = account; 1238c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 1248c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 1258c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 1268c658e058446ad69fb056b2160340d708582b9eeGuang Zhu return foundAccount; 1278c658e058446ad69fb056b2160340d708582b9eeGuang Zhu } 1288c658e058446ad69fb056b2160340d708582b9eeGuang Zhu} 129