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