BroadcastQueue.java revision 6285a32f74890b761579b4f67afde1b08763fd0a
140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/*
240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Copyright (C) 2012 The Android Open Source Project
340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * you may not use this file except in compliance with the License.
640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * You may obtain a copy of the License at
740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
1040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Unless required by applicable law or agreed to in writing, software
1140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * See the License for the specific language governing permissions and
1440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * limitations under the License.
1540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */
1640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornpackage com.android.server.am;
1840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1940c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.io.FileDescriptor;
2040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.io.PrintWriter;
2140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.util.ArrayList;
2240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.app.ActivityManager;
2440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.app.AppGlobals;
25f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackbornimport android.app.AppOpsManager;
2640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.ComponentName;
2740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.IIntentReceiver;
2840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.Intent;
297d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.pm.ActivityInfo;
3040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.PackageManager;
3140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.ResolveInfo;
3240c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Bundle;
3340c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Handler;
3440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.IBinder;
3540c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Message;
3640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Process;
3740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.RemoteException;
3840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.SystemClock;
39f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
4040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.EventLog;
416c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackbornimport android.util.Log;
4240c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.Slog;
4340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
4440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/**
4540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * BROADCASTS
4640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
4740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * We keep two broadcast queues and associated bookkeeping, one for those at
4840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * foreground priority, and one for normal (background-priority) broadcasts.
4940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */
50be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class BroadcastQueue {
5140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final String TAG = "BroadcastQueue";
5240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final String TAG_MU = ActivityManagerService.TAG_MU;
5340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_BROADCAST = ActivityManagerService.DEBUG_BROADCAST;
5440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_BROADCAST_LIGHT = ActivityManagerService.DEBUG_BROADCAST_LIGHT;
5540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU;
5640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
576285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    static final int MAX_BROADCAST_HISTORY = ActivityManager.isLowRamDeviceStatic() ? 10 : 25;
586285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    static final int MAX_BROADCAST_SUMMARY_HISTORY
596285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            = ActivityManager.isLowRamDeviceStatic() ? 25 : 100;
6040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final ActivityManagerService mService;
6240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
6440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Recognizable moniker for this queue
6540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
6640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final String mQueueName;
6740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
6940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Timeout period for this queue's broadcasts
7040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
7140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final long mTimeoutPeriod;
7240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
7340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
746285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn     * If true, we can delay broadcasts while waiting services to finish in the previous
756285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn     * receiver's process.
766285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn     */
776285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final boolean mDelayBehindServices;
786285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
796285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    /**
8040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Lists of all active broadcasts that are to be executed immediately
8140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * (without waiting for another broadcast to finish).  Currently this only
8240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * contains broadcasts to registered receivers, to avoid spinning up
8340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * a bunch of processes to execute IntentReceiver components.  Background-
8440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * and foreground-priority broadcasts are queued separately.
8540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
866285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<BroadcastRecord>();
876285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
8840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
8940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * List of all active broadcasts that are to be executed one at a time.
9040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * The object at the top of the list is the currently activity broadcasts;
9140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * those after it are waiting for the top to finish.  As with parallel
9240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * broadcasts, separate background- and foreground-priority queues are
9340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * maintained.
9440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
956285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<BroadcastRecord>();
9640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
9740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
9840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Historical data of past broadcasts, for debugging.
9940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
1006285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final BroadcastRecord[] mBroadcastHistory = new BroadcastRecord[MAX_BROADCAST_HISTORY];
10140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
10240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
103c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn     * Summary of historical data of past broadcasts, for debugging.
104c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn     */
1056285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final Intent[] mBroadcastSummaryHistory = new Intent[MAX_BROADCAST_SUMMARY_HISTORY];
106c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn
107c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn    /**
10840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Set when we current have a BROADCAST_INTENT_MSG in flight.
10940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
11040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    boolean mBroadcastsScheduled = false;
11140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
11240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
11340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * True if we have a pending unexpired BROADCAST_TIMEOUT_MSG posted to our handler.
11440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
11540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    boolean mPendingBroadcastTimeoutMessage;
11640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
11740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
11840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Intent broadcasts that we have tried to start, but are
11940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * waiting for the application's process to be created.  We only
12040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * need one per scheduling class (instead of a list) because we always
12140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * process broadcasts one at a time, so no others can be started while
12240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * waiting for this one.
12340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
12440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    BroadcastRecord mPendingBroadcast = null;
12540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
12640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
12740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * The receiver index that is pending, to restart the broadcast if needed.
12840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
12940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    int mPendingBroadcastRecvIndex;
13040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
13140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG;
13240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1;
13340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
13440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final Handler mHandler = new Handler() {
13540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public void handleMessage(Message msg) {
13640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            switch (msg.what) {
13740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                case BROADCAST_INTENT_MSG: {
13840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(
13940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            TAG, "Received BROADCAST_INTENT_MSG");
14040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    processNextBroadcast(true);
14140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } break;
14240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                case BROADCAST_TIMEOUT_MSG: {
14340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    synchronized (mService) {
14440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        broadcastTimeoutLocked(true);
14540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
14640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } break;
14740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
14840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
14940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    };
15040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
15140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final class AppNotResponding implements Runnable {
15240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        private final ProcessRecord mApp;
15340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        private final String mAnnotation;
15440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
15540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public AppNotResponding(ProcessRecord app, String annotation) {
15640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mApp = app;
15740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mAnnotation = annotation;
15840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
15940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
16040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        @Override
16140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public void run() {
1625fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            mService.appNotResponding(mApp, null, null, false, mAnnotation);
16340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
16440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
16540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1666285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod,
1676285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            boolean allowDelayBehindServices) {
16840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mService = service;
16940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mQueueName = name;
17040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mTimeoutPeriod = timeoutPeriod;
1716285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        mDelayBehindServices = allowDelayBehindServices;
17240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
17340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
17440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean isPendingBroadcastProcessLocked(int pid) {
17540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid;
17640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
17740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
17840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
17940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mParallelBroadcasts.add(r);
18040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
18140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
18240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
18340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mOrderedBroadcasts.add(r);
18440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
18540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
18640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) {
18740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
18840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
18940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
19040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "***** DROPPING PARALLEL ["
19140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mQueueName + "]: " + r.intent);
19240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mParallelBroadcasts.set(i, r);
19340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return true;
19440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
19540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
19640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return false;
19740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
19840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
19940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) {
20040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        for (int i=mOrderedBroadcasts.size()-1; i>0; i--) {
20140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
20240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
20340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "***** DROPPING ORDERED ["
20440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "]: " + r.intent);
20540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mOrderedBroadcasts.set(i, r);
20640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return true;
20740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
20840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
20940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return false;
21040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
21140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
21240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void processCurBroadcastLocked(BroadcastRecord r,
21340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ProcessRecord app) throws RemoteException {
21440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (DEBUG_BROADCAST)  Slog.v(TAG,
21540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                "Process cur broadcast " + r + " for app " + app);
21640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app.thread == null) {
21740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            throw new RemoteException();
21840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
21940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiver = app.thread.asBinder();
22040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curApp = app;
22140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        app.curReceiver = r;
222a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER);
223b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        mService.updateLruProcessLocked(app, true);
22440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
22540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Tell the application to launch this receiver.
22640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.intent.setComponent(r.curComponent);
22740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
22840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean started = false;
22940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        try {
23040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG,
23140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Delivering to component " + r.curComponent
23240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + ": " + r);
23340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
23440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,
23540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),
236a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId,
237a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    app.repProcState);
23840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST)  Slog.v(TAG,
23940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Process cur broadcast " + r + " DELIVERED for app " + app);
24040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            started = true;
24140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } finally {
24240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!started) {
24340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
24440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Process cur broadcast " + r + ": NOT STARTED!");
24540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = null;
24640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curApp = null;
24740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                app.curReceiver = null;
24840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
24940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
25040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
25140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
25240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean sendPendingBroadcastsLocked(ProcessRecord app) {
25340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean didSomething = false;
25440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        final BroadcastRecord br = mPendingBroadcast;
25540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (br != null && br.curApp.pid == app.pid) {
25640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
25740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mPendingBroadcast = null;
25840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                processCurBroadcastLocked(br, app);
25940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                didSomething = true;
26040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (Exception e) {
26140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Exception in new application when starting receiver "
26240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + br.curComponent.flattenToShortString(), e);
26340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                logBroadcastReceiverDiscardLocked(br);
26440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                finishReceiverLocked(br, br.resultCode, br.resultData,
2656285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                        br.resultExtras, br.resultAbort, false);
26640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
2677d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                // We need to reset the state if we failed to start the receiver.
26840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                br.state = BroadcastRecord.IDLE;
26940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                throw new RuntimeException(e.getMessage());
27040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
27140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
27240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return didSomething;
27340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
27440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
27540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void skipPendingBroadcastLocked(int pid) {
27640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        final BroadcastRecord br = mPendingBroadcast;
27740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (br != null && br.curApp.pid == pid) {
27840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            br.state = BroadcastRecord.IDLE;
27940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            br.nextReceiver = mPendingBroadcastRecvIndex;
28040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = null;
28140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            scheduleBroadcastsLocked();
28240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
28340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void skipCurrentReceiverLocked(ProcessRecord app) {
28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean reschedule = false;
28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        BroadcastRecord r = app.curReceiver;
28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r != null) {
28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // The current broadcast is waiting for this app's receiver
29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // to be finished.  Looks like that's not going to happen, so
29140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // let the broadcast continue.
29240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            logBroadcastReceiverDiscardLocked(r);
29340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            finishReceiverLocked(r, r.resultCode, r.resultData,
2946285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                    r.resultExtras, r.resultAbort, false);
29540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            reschedule = true;
29640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
29740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
29840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r = mPendingBroadcast;
29940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r != null && r.curApp == app) {
30040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST) Slog.v(TAG,
30140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "[" + mQueueName + "] skip & discard pending app " + r);
30240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            logBroadcastReceiverDiscardLocked(r);
30340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            finishReceiverLocked(r, r.resultCode, r.resultData,
3046285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                    r.resultExtras, r.resultAbort, false);
30540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            reschedule = true;
30640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
30740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (reschedule) {
30840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            scheduleBroadcastsLocked();
30940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
31040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
31140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
31240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void scheduleBroadcastsLocked() {
31340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts ["
31440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mQueueName + "]: current="
31540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mBroadcastsScheduled);
31640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
31740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mBroadcastsScheduled) {
31840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
31940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
32040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this));
32140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mBroadcastsScheduled = true;
32240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
32340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
32440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
32540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mOrderedBroadcasts.size() > 0) {
32640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            final BroadcastRecord r = mOrderedBroadcasts.get(0);
32740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r != null && r.receiver == receiver) {
32840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return r;
32940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
33040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
33140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return null;
33240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
33340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
33440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
3356285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
3366285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        final int state = r.state;
33740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.state = BroadcastRecord.IDLE;
33840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (state == BroadcastRecord.IDLE) {
3396285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
34040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
34140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiver = null;
34240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.intent.setComponent(null);
34340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.curApp != null) {
34440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curApp.curReceiver = null;
34540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
34640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.curFilter != null) {
34740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curFilter.receiverList.curBroadcast = null;
34840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
34940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curFilter = null;
35040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curReceiver = null;
3516285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        r.curApp = null;
35240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mPendingBroadcast = null;
35340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
35440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultCode = resultCode;
35540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultData = resultData;
35640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultExtras = resultExtras;
3576285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (resultAbort && (r.intent.getFlags()&Intent.FLAG_RECEIVER_NO_ABORT) == 0) {
3586285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            r.resultAbort = resultAbort;
3596285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        } else {
3606285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            r.resultAbort = false;
3616285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
3626285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
3636285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (waitForServices && r.curComponent != null && r.queue.mDelayBehindServices
3646285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                && r.queue.mOrderedBroadcasts.size() > 0
3656285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                && r.queue.mOrderedBroadcasts.get(0) == r) {
3666285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // In this case, we are ready to process the next receiver for the current broadcast,
3676285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // but are on a queue that would like to wait for services to finish before moving
3686285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // on.  If there are background services currently starting, then we will go into a
3696285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // special state where we hold off on continuing this broadcast until they are done.
3706285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            if (mService.mServices.hasBackgroundServices(r.userId)) {
3716285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                Slog.i(ActivityManagerService.TAG, "Delay finish: "
3726285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                        + r.curComponent.flattenToShortString());
3736285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                r.state = BroadcastRecord.WAITING_SERVICES;
3746285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                return false;
3756285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            }
3766285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
3776285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
3786285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        r.curComponent = null;
37940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
38040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // We will process the next receiver right now if this is finishing
38140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // an app receiver (which is always asynchronous) or after we have
38240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // come back from calling a receiver.
38340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return state == BroadcastRecord.APP_RECEIVE
38440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                || state == BroadcastRecord.CALL_DONE_RECEIVE;
38540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
38640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
3876285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    public void backgroundServicesFinishedLocked(int userId) {
3886285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (mOrderedBroadcasts.size() > 0) {
3896285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            BroadcastRecord br = mOrderedBroadcasts.get(0);
3906285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            if (br.userId == userId && br.state == BroadcastRecord.WAITING_SERVICES) {
3916285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                Slog.i(ActivityManagerService.TAG, "Resuming delayed broadcast");
3926285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                br.curComponent = null;
3936285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                br.state = BroadcastRecord.IDLE;
3946285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                processNextBroadcast(false);
3956285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            }
3966285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
3976285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    }
3986285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
39940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver,
40040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Intent intent, int resultCode, String data, Bundle extras,
40120e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
40240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Send the intent to the receiver asynchronously using one-way binder calls.
40340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app != null && app.thread != null) {
40440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If we have an app thread, do the call through that so it is
40540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // correctly ordered with other one-way calls.
40640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
407a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    data, extras, ordered, sticky, sendingUser, app.repProcState);
40840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
40920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            receiver.performReceive(intent, resultCode, data, extras, ordered,
41020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    sticky, sendingUser);
41140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
41240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
41340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
41440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void deliverToRegisteredReceiverLocked(BroadcastRecord r,
41540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastFilter filter, boolean ordered) {
41640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean skip = false;
4178bf06edac2088ad100e67dcb00a46d3f0f95c126Amith Yamasani        if (filter.requiredPermission != null) {
41840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(filter.requiredPermission,
41940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.callingPid, r.callingUid, -1, true);
42040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
42140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Permission Denial: broadcasting "
42240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent.toString()
42340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " from " + r.callerPackage + " (pid="
42440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.callingPid + ", uid=" + r.callingUid + ")"
42540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " requires " + filter.requiredPermission
42640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " due to registered receiver " + filter);
42740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
42840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
42940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
430b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        if (!skip && r.requiredPermission != null) {
43140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(r.requiredPermission,
43240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.pid, filter.receiverList.uid, -1, true);
43340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
43440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Permission Denial: receiving "
43540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent.toString()
43640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " to " + filter.receiverList.app
43740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " (pid=" + filter.receiverList.pid
43840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + ", uid=" + filter.receiverList.uid + ")"
43940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " requires " + r.requiredPermission
44040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " due to sender " + r.callerPackage
44140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " (uid " + r.callingUid + ")");
44240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
44340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
44440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
445f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        if (r.appOp != AppOpsManager.OP_NONE) {
4461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn            int mode = mService.mAppOpsService.noteOperation(r.appOp,
447f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    filter.receiverList.uid, filter.packageName);
448f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            if (mode != AppOpsManager.MODE_ALLOWED) {
449f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
450f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                        "App op " + r.appOp + " not allowed for broadcast to uid "
451f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                        + filter.receiverList.uid + " pkg " + filter.packageName);
452f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                skip = true;
453f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            }
454f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        }
45549660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        if (!skip) {
45649660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver            skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
45749660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                    r.callingPid, r.resolvedType, filter.receiverList.uid);
45849660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        }
45940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
46040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (!skip) {
46140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If this is not being sent as an ordered broadcast, then we
46240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // don't want to touch the fields that keep track of the current
46340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // state of ordered broadcasts.
46440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (ordered) {
46540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = filter.receiverList.receiver.asBinder();
46640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curFilter = filter;
46740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                filter.receiverList.curBroadcast = r;
46840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.CALL_IN_RECEIVE;
46940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (filter.receiverList.app != null) {
47040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // Bump hosting application to no longer be in background
47140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // scheduling class.  Note that we can't do that if there
47240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // isn't an app...  but we can only be in that case for
47340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // things that directly call the IActivityManager API, which
47440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // are already core system stuff so don't matter for this.
47540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.curApp = filter.receiverList.app;
47640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.app.curReceiver = r;
477a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    mService.updateOomAdjLocked(r.curApp, true);
47840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
47940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
48040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
48140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) {
48240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    int seq = r.intent.getIntExtra("seq", -1);
48340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.i(TAG, "Delivering to " + filter
48440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " (seq=" + seq + "): " + r);
48540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
48640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
48720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    new Intent(r.intent), r.resultCode, r.resultData,
48820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    r.resultExtras, r.ordered, r.initialSticky, r.userId);
48940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (ordered) {
49040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.state = BroadcastRecord.CALL_DONE_RECEIVE;
49140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
49240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (RemoteException e) {
49340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Failure sending broadcast " + r.intent, e);
49440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (ordered) {
49540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.receiver = null;
49640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.curFilter = null;
49740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.curBroadcast = null;
49840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (filter.receiverList.app != null) {
49940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        filter.receiverList.app.curReceiver = null;
50040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
50140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
50240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
50340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
50440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
50540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
50640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void processNextBroadcast(boolean fromMsg) {
50740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        synchronized(mService) {
50840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastRecord r;
50940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
51040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast ["
51140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mQueueName + "]: "
51240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mParallelBroadcasts.size() + " broadcasts, "
51340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mOrderedBroadcasts.size() + " ordered broadcasts");
51440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
51540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mService.updateCpuStats();
51640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
51740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (fromMsg) {
51840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mBroadcastsScheduled = false;
51940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
52040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
52140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // First, deliver any non-serialized broadcasts right away.
52240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            while (mParallelBroadcasts.size() > 0) {
52340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r = mParallelBroadcasts.remove(0);
52440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchTime = SystemClock.uptimeMillis();
52540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchClockTime = System.currentTimeMillis();
52640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                final int N = r.receivers.size();
52740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast ["
52840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
52940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                for (int i=0; i<N; i++) {
53040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Object target = r.receivers.get(i);
53140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST)  Slog.v(TAG,
53240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            "Delivering non-ordered on [" + mQueueName + "] to registered "
53340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + target + ": " + r);
53440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false);
53540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
53640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                addBroadcastToHistoryLocked(r);
53740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast ["
53840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
53940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
54040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
54140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Now take care of the next serialized one...
54240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
54340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If we are waiting for a process to come up to handle the next
54440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // broadcast, then do nothing at this point.  Just in case, we
54540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // check that the process we're waiting for still exists.
54640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (mPendingBroadcast != null) {
54740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) {
54840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.v(TAG, "processNextBroadcast ["
54940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]: waiting for "
55040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mPendingBroadcast.curApp);
55140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
55240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
55340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                boolean isDead;
55440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                synchronized (mService.mPidsSelfLocked) {
55540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    isDead = (mService.mPidsSelfLocked.get(
55640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            mPendingBroadcast.curApp.pid) == null);
55740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
55840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!isDead) {
55940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // It's still alive, so keep waiting
56040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
56140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
56240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "pending app  ["
56340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]" + mPendingBroadcast.curApp
56440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " died before responding to broadcast");
56540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.state = BroadcastRecord.IDLE;
56640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex;
56740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast = null;
56840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
56940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
57040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
57140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean looped = false;
57240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
57340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            do {
57440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mOrderedBroadcasts.size() == 0) {
57540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // No more broadcasts pending, so all done!
57640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mService.scheduleAppGcsLocked();
57740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (looped) {
57840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // If we had finished the last ordered broadcast, then
57940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // make sure all processes have correct oom and sched
58040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // adjustments.
58140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        mService.updateOomAdjLocked();
58240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
58340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
58440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
58540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r = mOrderedBroadcasts.get(0);
58640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                boolean forceReceive = false;
58740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
58840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Ensure that even if something goes awry with the timeout
58940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // detection, we catch "hung" broadcasts here, discard them,
59040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // and continue to make progress.
59140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                //
59240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // This is only done if the system is ready so that PRE_BOOT_COMPLETED
59340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // receivers don't get executed with timeouts. They're intended for
59440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // one time heavy lifting after system upgrades and can take
59540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // significant amounts of time.
59640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                int numReceivers = (r.receivers != null) ? r.receivers.size() : 0;
59740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mService.mProcessesReady && r.dispatchTime > 0) {
59840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    long now = SystemClock.uptimeMillis();
59940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if ((numReceivers > 0) &&
60040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {
60140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        Slog.w(TAG, "Hung broadcast ["
60240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + mQueueName + "] discarded after timeout failure:"
60340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " now=" + now
60440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " dispatchTime=" + r.dispatchTime
60540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " startTime=" + r.receiverTime
60640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " intent=" + r.intent
60740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " numReceivers=" + numReceivers
60840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " nextReceiver=" + r.nextReceiver
60940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " state=" + r.state);
61040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        broadcastTimeoutLocked(false); // forcibly finish this broadcast
61140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        forceReceive = true;
61240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.state = BroadcastRecord.IDLE;
61340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
61440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
61540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
61640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.state != BroadcastRecord.IDLE) {
61740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.d(TAG,
61840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            "processNextBroadcast("
61940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + ") called when not idle (state="
62040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.state + ")");
62140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
62240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
62340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
62440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.receivers == null || r.nextReceiver >= numReceivers
62540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        || r.resultAbort || forceReceive) {
62640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // No more receivers for this broadcast!  Send the final
62740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // result if requested...
62840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (r.resultTo != null) {
62940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        try {
63040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            if (DEBUG_BROADCAST) {
63140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                int seq = r.intent.getIntExtra("seq", -1);
63240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                Slog.i(TAG, "Finishing broadcast ["
63340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                        + mQueueName + "] " + r.intent.getAction()
63440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                        + " seq=" + seq + " app=" + r.callerApp);
63540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            }
63640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            performReceiveLocked(r.callerApp, r.resultTo,
63740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                new Intent(r.intent), r.resultCode,
63820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                                r.resultData, r.resultExtras, false, false, r.userId);
63940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            // Set this to null so that the reference
64040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            // (local and remote) isnt kept in the mBroadcastHistory.
64140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            r.resultTo = null;
64240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        } catch (RemoteException e) {
64340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            Slog.w(TAG, "Failure ["
64440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    + mQueueName + "] sending broadcast result of "
64540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    + r.intent, e);
64640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        }
64740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
64840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
64940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG");
65040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    cancelBroadcastTimeoutLocked();
65140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
65240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast "
65340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r);
65440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
65540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // ... and on to the next...
65640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    addBroadcastToHistoryLocked(r);
65740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mOrderedBroadcasts.remove(0);
65840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r = null;
65940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    looped = true;
66040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
66140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
66240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } while (r == null);
66340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
66440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Get the next receiver...
66540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int recIdx = r.nextReceiver++;
66640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
66740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Keep track of when this receiver started, and make sure there
66840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // is a timeout message pending to kill it if need be.
66940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.receiverTime = SystemClock.uptimeMillis();
67040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (recIdx == 0) {
67140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchTime = r.receiverTime;
67240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchClockTime = System.currentTimeMillis();
67340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast ["
67440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
67540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
67640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (! mPendingBroadcastTimeoutMessage) {
67740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                long timeoutTime = r.receiverTime + mTimeoutPeriod;
67840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
67940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Submitting BROADCAST_TIMEOUT_MSG ["
68040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] for " + r + " at " + timeoutTime);
68140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
68240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
68340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
68440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Object nextReceiver = r.receivers.get(recIdx);
68540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (nextReceiver instanceof BroadcastFilter) {
68640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Simple case: this is a registered receiver who gets
68740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // a direct call.
68840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastFilter filter = (BroadcastFilter)nextReceiver;
68940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
69040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Delivering ordered ["
69140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] to registered "
69240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + filter + ": " + r);
69340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                deliverToRegisteredReceiverLocked(r, filter, r.ordered);
69440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.receiver == null || !r.ordered) {
69540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // The receiver has already finished, so schedule to
69640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // process the next one.
69740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(TAG, "Quick finishing ["
69840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]: ordered="
69940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.ordered + " receiver=" + r.receiver);
70040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.state = BroadcastRecord.IDLE;
70140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    scheduleBroadcastsLocked();
70240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
70340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
70440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
70540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
70640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Hard case: need to instantiate the receiver, possibly
70740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // starting its application process to host it.
70840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
70940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ResolveInfo info =
71040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                (ResolveInfo)nextReceiver;
7117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ComponentName component = new ComponentName(
7127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    info.activityInfo.applicationInfo.packageName,
7137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    info.activityInfo.name);
71440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
71540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean skip = false;
71640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(info.activityInfo.permission,
71740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.callingPid, r.callingUid, info.activityInfo.applicationInfo.uid,
71840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.exported);
71940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
72040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!info.activityInfo.exported) {
72140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: broadcasting "
72240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent.toString()
72340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " from " + r.callerPackage + " (pid=" + r.callingPid
72440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + ", uid=" + r.callingUid + ")"
72540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " is not exported from uid " + info.activityInfo.applicationInfo.uid
7267d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " due to receiver " + component.flattenToShortString());
72740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
72840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: broadcasting "
72940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent.toString()
73040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " from " + r.callerPackage + " (pid=" + r.callingPid
73140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + ", uid=" + r.callingUid + ")"
73240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " requires " + info.activityInfo.permission
7337d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " due to receiver " + component.flattenToShortString());
73440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
73540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
73640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
73740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
73840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.requiredPermission != null) {
73940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                try {
74040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    perm = AppGlobals.getPackageManager().
74140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            checkPermission(r.requiredPermission,
74240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    info.activityInfo.applicationInfo.packageName);
74340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } catch (RemoteException e) {
74440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    perm = PackageManager.PERMISSION_DENIED;
74540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
74640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (perm != PackageManager.PERMISSION_GRANTED) {
74740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: receiving "
74840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent + " to "
7497d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + component.flattenToShortString()
75040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " requires " + r.requiredPermission
75140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " due to sender " + r.callerPackage
75240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " (uid " + r.callingUid + ")");
75340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    skip = true;
75440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
75540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
756f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            if (r.appOp != AppOpsManager.OP_NONE) {
7571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn                int mode = mService.mAppOpsService.noteOperation(r.appOp,
758f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                        info.activityInfo.applicationInfo.uid, info.activityInfo.packageName);
759f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                if (mode != AppOpsManager.MODE_ALLOWED) {
760f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    if (DEBUG_BROADCAST)  Slog.v(TAG,
761f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                            "App op " + r.appOp + " not allowed for broadcast to uid "
762f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                            + info.activityInfo.applicationInfo.uid + " pkg "
763f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                            + info.activityInfo.packageName);
764f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    skip = true;
765f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                }
766f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            }
76749660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver            if (!skip) {
76849660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
76949660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                        r.callingPid, r.resolvedType, info.activityInfo.applicationInfo.uid);
77049660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver            }
7717d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            boolean isSingleton = false;
7727d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            try {
7737d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                isSingleton = mService.isSingleton(info.activityInfo.processName,
7747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.applicationInfo,
7757d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.name, info.activityInfo.flags);
7767d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            } catch (SecurityException e) {
7777d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Slog.w(TAG, e.getMessage());
7787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                skip = true;
7797d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
7807d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if ((info.activityInfo.flags&ActivityInfo.FLAG_SINGLE_USER) != 0) {
7817d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (ActivityManager.checkUidPermission(
7827d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        android.Manifest.permission.INTERACT_ACROSS_USERS,
7837d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.applicationInfo.uid)
7847d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                                != PackageManager.PERMISSION_GRANTED) {
7857d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    Slog.w(TAG, "Permission Denial: Receiver " + component.flattenToShortString()
7867d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " requests FLAG_SINGLE_USER, but app does not hold "
7877d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + android.Manifest.permission.INTERACT_ACROSS_USERS);
7887d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    skip = true;
7897d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
7907d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
79140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.curApp != null && r.curApp.crashing) {
79240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // If the target process is crashing, just skip it.
79340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
79440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Skipping deliver ordered ["
79540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r + " to " + r.curApp
79640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + ": process crashing");
79740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
79840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
79940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
80040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (skip) {
80140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
80240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Skipping delivery of ordered ["
80340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r + " for whatever reason");
80440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = null;
80540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curFilter = null;
80640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.IDLE;
80740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
80840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
80940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
81040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
81140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.state = BroadcastRecord.APP_RECEIVE;
81240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            String targetProcess = info.activityInfo.processName;
8137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            r.curComponent = component;
8147d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if (r.callingUid != Process.SYSTEM_UID && isSingleton) {
8157d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                info.activityInfo = mService.getActivityInfoForUser(info.activityInfo, 0);
81640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
81740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curReceiver = info.activityInfo;
818f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            if (DEBUG_MU && r.callingUid > UserHandle.PER_USER_RANGE) {
81940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, "
82040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = "
82140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.uid);
82240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
82340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
82440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Broadcast is being executed, its package can't be stopped.
82540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
82640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                AppGlobals.getPackageManager().setPackageStoppedState(
827f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                        r.curComponent.getPackageName(), false, UserHandle.getUserId(r.callingUid));
82840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (RemoteException e) {
82940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (IllegalArgumentException e) {
83040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Failed trying to unstop package "
83140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.curComponent.getPackageName() + ": " + e);
83240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
83340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
83440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Is this receiver's application already running?
83540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ProcessRecord app = mService.getProcessRecordLocked(targetProcess,
83640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.applicationInfo.uid);
83740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (app != null && app.thread != null) {
83840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                try {
839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    app.addPackage(info.activityInfo.packageName, mService.mProcessStats);
84040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    processCurBroadcastLocked(r, app);
84140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
84240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } catch (RemoteException e) {
84340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Exception when sending broadcast to "
84440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                          + r.curComponent, e);
8456c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                } catch (RuntimeException e) {
8466c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    Log.wtf(TAG, "Failed sending broadcast to "
8476c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                            + r.curComponent + " with " + r.intent, e);
8486c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // If some unexpected exception happened, just skip
8496c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // this broadcast.  At this point we are not in the call
8506c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // from a client, so throwing an exception out from here
8516c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // will crash the entire system instead of just whoever
8526c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // sent the broadcast.
8536c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    logBroadcastReceiverDiscardLocked(r);
8546c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    finishReceiverLocked(r, r.resultCode, r.resultData,
8556285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                            r.resultExtras, r.resultAbort, false);
8566c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    scheduleBroadcastsLocked();
8576c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // We need to reset the state if we failed to start the receiver.
8586c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    r.state = BroadcastRecord.IDLE;
8596c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    return;
86040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
86140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
86240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // If a dead object exception was thrown -- fall through to
86340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // restart the application.
86440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
86540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
86640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Not running -- get it started, to be executed when the app comes up.
86740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST)  Slog.v(TAG,
86840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Need to start app ["
86940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mQueueName + "] " + targetProcess + " for broadcast " + r);
87040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if ((r.curApp=mService.startProcessLocked(targetProcess,
87140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.applicationInfo, true,
87240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
87340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "broadcast", r.curComponent,
87440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false))
87540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            == null) {
87640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Ah, this recipient is unavailable.  Finish it if necessary,
87740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // and mark the broadcast record as ready for the next.
87840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Unable to launch app "
87940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.packageName + "/"
88040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.uid + " for broadcast "
88140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent + ": process is bad");
88240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                logBroadcastReceiverDiscardLocked(r);
88340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                finishReceiverLocked(r, r.resultCode, r.resultData,
8846285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                        r.resultExtras, r.resultAbort, false);
88540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
88640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.IDLE;
88740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
88840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
88940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
89040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = r;
89140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastRecvIndex = recIdx;
89240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
89340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
89440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
89540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void setBroadcastTimeoutLocked(long timeoutTime) {
89640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (! mPendingBroadcastTimeoutMessage) {
89740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
89840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.sendMessageAtTime(msg, timeoutTime);
89940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = true;
90040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
90140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
90240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
90340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void cancelBroadcastTimeoutLocked() {
90440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mPendingBroadcastTimeoutMessage) {
90540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this);
90640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = false;
90740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
90840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
90940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
91040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void broadcastTimeoutLocked(boolean fromMsg) {
91140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (fromMsg) {
91240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = false;
91340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
91440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
91540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mOrderedBroadcasts.size() == 0) {
91640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
91740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
91840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
91940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        long now = SystemClock.uptimeMillis();
92040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        BroadcastRecord r = mOrderedBroadcasts.get(0);
92140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (fromMsg) {
92240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (mService.mDidDexOpt) {
92340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Delay timeouts until dexopt finishes.
92440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mService.mDidDexOpt = false;
92540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                long timeoutTime = SystemClock.uptimeMillis() + mTimeoutPeriod;
92640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
92740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
92840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
92940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!mService.mProcessesReady) {
93040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Only process broadcast timeouts if the system is ready. That way
93140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended
93240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // to do heavy lifting for system up.
93340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
93440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
93540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
93640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            long timeoutTime = r.receiverTime + mTimeoutPeriod;
93740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (timeoutTime > now) {
93840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // We can observe premature timeouts because we do not cancel and reset the
93940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // broadcast timeout message after each receiver finishes.  Instead, we set up
94040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // an initial timeout then kick it down the road a little further as needed
94140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // when it expires.
94240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
94340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Premature timeout ["
94440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
94540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + timeoutTime);
94640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
94740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
94840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
94940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
95040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
9516285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        BroadcastRecord br = mOrderedBroadcasts.get(0);
9526285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (br.state == BroadcastRecord.WAITING_SERVICES) {
9536285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // In this case the broadcast had already finished, but we had decided to wait
9546285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // for started services to finish as well before going on.  So if we have actually
9556285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // waited long enough time timeout the broadcast, let's give up on the whole thing
9566285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // and just move on to the next.
9576285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            Slog.i(ActivityManagerService.TAG, "Waited long enough for: " + (br.curComponent != null
9586285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                    ? br.curComponent.flattenToShortString() : "(null)"));
9596285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            br.curComponent = null;
9606285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            br.state = BroadcastRecord.IDLE;
9616285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            processNextBroadcast(false);
9626285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            return;
9636285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
9646285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
9656285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r. receiver
96640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + ", started " + (now - r.receiverTime) + "ms ago");
96740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiverTime = now;
96840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.anrCount++;
96940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
97040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Current receiver has passed its expiration date.
97140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.nextReceiver <= 0) {
97240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Slog.w(TAG, "Timeout on receiver with nextReceiver <= 0");
97340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
97440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
97540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
97640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        ProcessRecord app = null;
97740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        String anrMessage = null;
97840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
97940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        Object curReceiver = r.receivers.get(r.nextReceiver-1);
98040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        Slog.w(TAG, "Receiver during timeout: " + curReceiver);
98140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        logBroadcastReceiverDiscardLocked(r);
98240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (curReceiver instanceof BroadcastFilter) {
98340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastFilter bf = (BroadcastFilter)curReceiver;
98440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (bf.receiverList.pid != 0
98540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    && bf.receiverList.pid != ActivityManagerService.MY_PID) {
98640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                synchronized (mService.mPidsSelfLocked) {
98740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    app = mService.mPidsSelfLocked.get(
98840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            bf.receiverList.pid);
98940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
99040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
99140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
99240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app = r.curApp;
99340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
99440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
99540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app != null) {
99640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            anrMessage = "Broadcast of " + r.intent.toString();
99740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
99840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
99940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mPendingBroadcast == r) {
100040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = null;
100140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
100240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
100340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Move on to the next receiver.
100440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        finishReceiverLocked(r, r.resultCode, r.resultData,
10056285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                r.resultExtras, r.resultAbort, false);
100640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        scheduleBroadcastsLocked();
100740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
100840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (anrMessage != null) {
100940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Post the ANR to the handler since we do not want to process ANRs while
101040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // potentially holding our lock.
101140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.post(new AppNotResponding(app, anrMessage));
101240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
101340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
101440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
101540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void addBroadcastToHistoryLocked(BroadcastRecord r) {
101640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.callingUid < 0) {
101740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // This was from a registerReceiver() call; ignore it.
101840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
101940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
102040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        System.arraycopy(mBroadcastHistory, 0, mBroadcastHistory, 1,
102140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                MAX_BROADCAST_HISTORY-1);
102240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.finishTime = SystemClock.uptimeMillis();
102340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mBroadcastHistory[0] = r;
1024c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        System.arraycopy(mBroadcastSummaryHistory, 0, mBroadcastSummaryHistory, 1,
1025c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                MAX_BROADCAST_SUMMARY_HISTORY-1);
1026c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        mBroadcastSummaryHistory[0] = r.intent;
102740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
102840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
102940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void logBroadcastReceiverDiscardLocked(BroadcastRecord r) {
103040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.nextReceiver > 0) {
103140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Object curReceiver = r.receivers.get(r.nextReceiver-1);
103240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (curReceiver instanceof BroadcastFilter) {
103340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastFilter bf = (BroadcastFilter) curReceiver;
103440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER,
1035b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        bf.owningUserId, System.identityHashCode(r),
103640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.intent.getAction(),
103740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.nextReceiver - 1,
103840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        System.identityHashCode(bf));
103940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } else {
1040b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                ResolveInfo ri = (ResolveInfo)curReceiver;
104140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1042b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        UserHandle.getUserId(ri.activityInfo.applicationInfo.uid),
1043b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        System.identityHashCode(r), r.intent.getAction(),
1044b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        r.nextReceiver - 1, ri.toString());
104540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
104640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
104740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Slog.w(TAG, "Discarding broadcast before first receiver is invoked: "
104840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + r);
104940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1050b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                    -1, System.identityHashCode(r),
105140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.intent.getAction(),
105240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.nextReceiver,
105340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "NONE");
105440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
105540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
105640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
105740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
105840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int opti, boolean dumpAll, String dumpPackage, boolean needSep) {
105940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
106040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                || mPendingBroadcast != null) {
106140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean printed = false;
106240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
106340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastRecord br = mParallelBroadcasts.get(i);
106440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
106540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
106640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
106740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!printed) {
106840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (needSep) {
106940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        pw.println();
107040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
10716cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                    needSep = true;
107240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    printed = true;
107340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  Active broadcasts [" + mQueueName + "]:");
107440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
10756cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.println("  Active Broadcast " + mQueueName + " #" + i + ":");
107640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                br.dump(pw, "    ");
107740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
107840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            printed = false;
107940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            needSep = true;
108040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) {
108140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastRecord br = mOrderedBroadcasts.get(i);
108240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
108340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
108440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
108540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!printed) {
108640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (needSep) {
108740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        pw.println();
108840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
108940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    needSep = true;
10906cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                    printed = true;
109140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  Active ordered broadcasts [" + mQueueName + "]:");
109240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
10936cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.println("  Active Ordered Broadcast " + mQueueName + " #" + i + ":");
109440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mOrderedBroadcasts.get(i).dump(pw, "    ");
109540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
109640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpPackage == null || (mPendingBroadcast != null
109740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    && dumpPackage.equals(mPendingBroadcast.callerPackage))) {
109840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (needSep) {
109940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println();
110040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
110140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                pw.println("  Pending broadcast [" + mQueueName + "]:");
110240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mPendingBroadcast != null) {
110340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.dump(pw, "    ");
110440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
110540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("    (null)");
110640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
110740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                needSep = true;
110840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
110940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
111040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1111c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        int i;
111240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean printed = false;
1113c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        for (i=0; i<MAX_BROADCAST_HISTORY; i++) {
111440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastRecord r = mBroadcastHistory[i];
111540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r == null) {
111640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                break;
111740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
111840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) {
111940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                continue;
112040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
112140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!printed) {
112240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (needSep) {
112340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println();
112440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
112540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                needSep = true;
112640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                pw.println("  Historical broadcasts [" + mQueueName + "]:");
112740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                printed = true;
112840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
112940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpAll) {
11306cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.print("  Historical Broadcast " + mQueueName + " #");
11316cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                        pw.print(i); pw.println(":");
113240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dump(pw, "    ");
113340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } else {
1134c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("  #"); pw.print(i); pw.print(": "); pw.println(r);
1135c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("    ");
1136c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.println(r.intent.toShortString(false, true, true, false));
1137a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn                if (r.targetComp != null && r.targetComp != r.intent.getComponent()) {
1138a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn                    pw.print("    targetComp: "); pw.println(r.targetComp.toShortString());
1139a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn                }
1140c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Bundle bundle = r.intent.getExtras();
1141c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (bundle != null) {
1142c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.print("    extras: "); pw.println(bundle.toString());
1143c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1144c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            }
1145c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        }
1146c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn
1147c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        if (dumpPackage == null) {
1148c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            if (dumpAll) {
1149c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                i = 0;
1150c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                printed = false;
1151c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            }
1152c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            for (; i<MAX_BROADCAST_SUMMARY_HISTORY; i++) {
1153c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Intent intent = mBroadcastSummaryHistory[i];
1154c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (intent == null) {
1155c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    break;
1156c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1157c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (!printed) {
1158c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    if (needSep) {
1159c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                        pw.println();
1160c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    }
1161c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    needSep = true;
1162c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.println("  Historical broadcasts summary [" + mQueueName + "]:");
1163c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    printed = true;
1164c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1165c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (!dumpAll && i >= 50) {
116640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  ...");
116740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    break;
116840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
1169c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("  #"); pw.print(i); pw.print(": ");
1170c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.println(intent.toShortString(false, true, true, false));
1171c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Bundle bundle = intent.getExtras();
1172c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (bundle != null) {
1173c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.print("    extras: "); pw.println(bundle.toString());
1174c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
117540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
117640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
117740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
117840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return needSep;
117940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
118040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn}
1181