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;
2540c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.ComponentName;
2640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.IIntentReceiver;
2740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.Intent;
287d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.pm.ActivityInfo;
2940c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.PackageManager;
3040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.ResolveInfo;
317d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.pm.ServiceInfo;
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;
4140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.Slog;
4240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
4340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/**
4440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * BROADCASTS
4540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
4640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * We keep two broadcast queues and associated bookkeeping, one for those at
4740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * foreground priority, and one for normal (background-priority) broadcasts.
4840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */
4940c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornpublic class BroadcastQueue {
5040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final String TAG = "BroadcastQueue";
5140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final String TAG_MU = ActivityManagerService.TAG_MU;
5240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_BROADCAST = ActivityManagerService.DEBUG_BROADCAST;
5340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_BROADCAST_LIGHT = ActivityManagerService.DEBUG_BROADCAST_LIGHT;
5440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU;
5540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
5640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int MAX_BROADCAST_HISTORY = 25;
57c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn    static final int MAX_BROADCAST_SUMMARY_HISTORY = 100;
5840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
5940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final ActivityManagerService mService;
6040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
6240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Recognizable moniker for this queue
6340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
6440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final String mQueueName;
6540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
6740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Timeout period for this queue's broadcasts
6840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
6940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final long mTimeoutPeriod;
7040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
7140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
7240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Lists of all active broadcasts that are to be executed immediately
7340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * (without waiting for another broadcast to finish).  Currently this only
7440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * contains broadcasts to registered receivers, to avoid spinning up
7540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * a bunch of processes to execute IntentReceiver components.  Background-
7640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * and foreground-priority broadcasts are queued separately.
7740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
7840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final ArrayList<BroadcastRecord> mParallelBroadcasts
7940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            = new ArrayList<BroadcastRecord>();
8040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
8140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * List of all active broadcasts that are to be executed one at a time.
8240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * The object at the top of the list is the currently activity broadcasts;
8340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * those after it are waiting for the top to finish.  As with parallel
8440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * broadcasts, separate background- and foreground-priority queues are
8540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * maintained.
8640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
8740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final ArrayList<BroadcastRecord> mOrderedBroadcasts
8840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            = new ArrayList<BroadcastRecord>();
8940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
9040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
9140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Historical data of past broadcasts, for debugging.
9240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
9340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final BroadcastRecord[] mBroadcastHistory
9440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            = new BroadcastRecord[MAX_BROADCAST_HISTORY];
9540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
9640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
97c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn     * Summary of historical data of past broadcasts, for debugging.
98c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn     */
99c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn    final Intent[] mBroadcastSummaryHistory
100c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            = new Intent[MAX_BROADCAST_SUMMARY_HISTORY];
101c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn
102c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn    /**
10340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Set when we current have a BROADCAST_INTENT_MSG in flight.
10440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
10540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    boolean mBroadcastsScheduled = false;
10640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
10740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
10840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * True if we have a pending unexpired BROADCAST_TIMEOUT_MSG posted to our handler.
10940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
11040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    boolean mPendingBroadcastTimeoutMessage;
11140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
11240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
11340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Intent broadcasts that we have tried to start, but are
11440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * waiting for the application's process to be created.  We only
11540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * need one per scheduling class (instead of a list) because we always
11640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * process broadcasts one at a time, so no others can be started while
11740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * waiting for this one.
11840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
11940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    BroadcastRecord mPendingBroadcast = null;
12040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
12140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
12240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * The receiver index that is pending, to restart the broadcast if needed.
12340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
12440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    int mPendingBroadcastRecvIndex;
12540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
12640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG;
12740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1;
12840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
12940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final Handler mHandler = new Handler() {
13040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        //public Handler() {
13140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        //    if (localLOGV) Slog.v(TAG, "Handler started!");
13240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        //}
13340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
13440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public void handleMessage(Message msg) {
13540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            switch (msg.what) {
13640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                case BROADCAST_INTENT_MSG: {
13740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(
13840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            TAG, "Received BROADCAST_INTENT_MSG");
13940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    processNextBroadcast(true);
14040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } break;
14140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                case BROADCAST_TIMEOUT_MSG: {
14240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    synchronized (mService) {
14340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        broadcastTimeoutLocked(true);
14440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
14540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } break;
14640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
14740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
14840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    };
14940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
15040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final class AppNotResponding implements Runnable {
15140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        private final ProcessRecord mApp;
15240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        private final String mAnnotation;
15340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
15440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public AppNotResponding(ProcessRecord app, String annotation) {
15540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mApp = app;
15640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mAnnotation = annotation;
15740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
15840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
15940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        @Override
16040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public void run() {
1615fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            mService.appNotResponding(mApp, null, null, false, mAnnotation);
16240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
16340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
16440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
16540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod) {
16640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mService = service;
16740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mQueueName = name;
16840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mTimeoutPeriod = timeoutPeriod;
16940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
17040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
17140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean isPendingBroadcastProcessLocked(int pid) {
17240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid;
17340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
17440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
17540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
17640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mParallelBroadcasts.add(r);
17740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
17840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
17940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
18040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mOrderedBroadcasts.add(r);
18140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
18240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
18340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) {
18440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
18540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
18640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
18740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "***** DROPPING PARALLEL ["
18840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mQueueName + "]: " + r.intent);
18940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mParallelBroadcasts.set(i, r);
19040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return true;
19140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
19240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
19340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return false;
19440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
19540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
19640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) {
19740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        for (int i=mOrderedBroadcasts.size()-1; i>0; i--) {
19840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
19940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
20040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "***** DROPPING ORDERED ["
20140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "]: " + r.intent);
20240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mOrderedBroadcasts.set(i, r);
20340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return true;
20440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
20540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
20640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return false;
20740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
20840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
20940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void processCurBroadcastLocked(BroadcastRecord r,
21040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ProcessRecord app) throws RemoteException {
21140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (DEBUG_BROADCAST)  Slog.v(TAG,
21240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                "Process cur broadcast " + r + " for app " + app);
21340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app.thread == null) {
21440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            throw new RemoteException();
21540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
21640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiver = app.thread.asBinder();
21740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curApp = app;
21840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        app.curReceiver = r;
219b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        mService.updateLruProcessLocked(app, true);
22040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
22140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Tell the application to launch this receiver.
22240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.intent.setComponent(r.curComponent);
22340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
22440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean started = false;
22540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        try {
22640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG,
22740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Delivering to component " + r.curComponent
22840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + ": " + r);
22940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
23040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,
23140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),
23220e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId);
23340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST)  Slog.v(TAG,
23440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Process cur broadcast " + r + " DELIVERED for app " + app);
23540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            started = true;
23640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } finally {
23740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!started) {
23840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
23940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Process cur broadcast " + r + ": NOT STARTED!");
24040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = null;
24140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curApp = null;
24240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                app.curReceiver = null;
24340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
24440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
24540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
24640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
24740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean sendPendingBroadcastsLocked(ProcessRecord app) {
24840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean didSomething = false;
24940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        final BroadcastRecord br = mPendingBroadcast;
25040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (br != null && br.curApp.pid == app.pid) {
25140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
25240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mPendingBroadcast = null;
25340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                processCurBroadcastLocked(br, app);
25440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                didSomething = true;
25540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (Exception e) {
25640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Exception in new application when starting receiver "
25740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + br.curComponent.flattenToShortString(), e);
25840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                logBroadcastReceiverDiscardLocked(br);
25940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                finishReceiverLocked(br, br.resultCode, br.resultData,
26040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        br.resultExtras, br.resultAbort, true);
26140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
2627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                // We need to reset the state if we failed to start the receiver.
26340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                br.state = BroadcastRecord.IDLE;
26440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                throw new RuntimeException(e.getMessage());
26540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
26640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
26740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return didSomething;
26840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
26940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
27040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void skipPendingBroadcastLocked(int pid) {
27140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        final BroadcastRecord br = mPendingBroadcast;
27240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (br != null && br.curApp.pid == pid) {
27340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            br.state = BroadcastRecord.IDLE;
27440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            br.nextReceiver = mPendingBroadcastRecvIndex;
27540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = null;
27640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            scheduleBroadcastsLocked();
27740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
27840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
27940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
28040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void skipCurrentReceiverLocked(ProcessRecord app) {
28140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean reschedule = false;
28240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        BroadcastRecord r = app.curReceiver;
28340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r != null) {
28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // The current broadcast is waiting for this app's receiver
28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // to be finished.  Looks like that's not going to happen, so
28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // let the broadcast continue.
28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            logBroadcastReceiverDiscardLocked(r);
28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            finishReceiverLocked(r, r.resultCode, r.resultData,
28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.resultExtras, r.resultAbort, true);
29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            reschedule = true;
29140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
29240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
29340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r = mPendingBroadcast;
29440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r != null && r.curApp == app) {
29540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST) Slog.v(TAG,
29640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "[" + mQueueName + "] skip & discard pending app " + r);
29740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            logBroadcastReceiverDiscardLocked(r);
29840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            finishReceiverLocked(r, r.resultCode, r.resultData,
29940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.resultExtras, r.resultAbort, true);
30040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            reschedule = true;
30140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
30240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (reschedule) {
30340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            scheduleBroadcastsLocked();
30440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
30540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
30640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
30740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void scheduleBroadcastsLocked() {
30840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts ["
30940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mQueueName + "]: current="
31040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mBroadcastsScheduled);
31140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
31240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mBroadcastsScheduled) {
31340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
31440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
31540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this));
31640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mBroadcastsScheduled = true;
31740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
31840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
31940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
32040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mOrderedBroadcasts.size() > 0) {
32140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            final BroadcastRecord r = mOrderedBroadcasts.get(0);
32240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r != null && r.receiver == receiver) {
32340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return r;
32440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
32540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
32640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return null;
32740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
32840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
32940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
33040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            String resultData, Bundle resultExtras, boolean resultAbort,
33140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean explicit) {
33240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        int state = r.state;
33340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.state = BroadcastRecord.IDLE;
33440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (state == BroadcastRecord.IDLE) {
33540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (explicit) {
33640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
33740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
33840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
33940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiver = null;
34040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.intent.setComponent(null);
34140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.curApp != null) {
34240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curApp.curReceiver = null;
34340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
34440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.curFilter != null) {
34540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curFilter.receiverList.curBroadcast = null;
34640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
34740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curFilter = null;
34840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curApp = null;
34940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curComponent = null;
35040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curReceiver = null;
35140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mPendingBroadcast = null;
35240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
35340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultCode = resultCode;
35440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultData = resultData;
35540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultExtras = resultExtras;
35640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultAbort = resultAbort;
35740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
35840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // We will process the next receiver right now if this is finishing
35940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // an app receiver (which is always asynchronous) or after we have
36040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // come back from calling a receiver.
36140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return state == BroadcastRecord.APP_RECEIVE
36240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                || state == BroadcastRecord.CALL_DONE_RECEIVE;
36340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
36440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
36540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver,
36640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Intent intent, int resultCode, String data, Bundle extras,
36720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
36840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Send the intent to the receiver asynchronously using one-way binder calls.
36940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app != null && app.thread != null) {
37040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If we have an app thread, do the call through that so it is
37140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // correctly ordered with other one-way calls.
37240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
37320e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    data, extras, ordered, sticky, sendingUser);
37440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
37520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            receiver.performReceive(intent, resultCode, data, extras, ordered,
37620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    sticky, sendingUser);
37740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
37840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
37940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
38040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void deliverToRegisteredReceiverLocked(BroadcastRecord r,
38140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastFilter filter, boolean ordered) {
38240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean skip = false;
3838bf06edac2088ad100e67dcb00a46d3f0f95c126Amith Yamasani        if (filter.requiredPermission != null) {
38440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(filter.requiredPermission,
38540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.callingPid, r.callingUid, -1, true);
38640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
38740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Permission Denial: broadcasting "
38840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent.toString()
38940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " from " + r.callerPackage + " (pid="
39040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.callingPid + ", uid=" + r.callingUid + ")"
39140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " requires " + filter.requiredPermission
39240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " due to registered receiver " + filter);
39340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
39440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
39540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
396b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        if (!skip && r.requiredPermission != null) {
39740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(r.requiredPermission,
39840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.pid, filter.receiverList.uid, -1, true);
39940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
40040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Permission Denial: receiving "
40140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent.toString()
40240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " to " + filter.receiverList.app
40340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " (pid=" + filter.receiverList.pid
40440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + ", uid=" + filter.receiverList.uid + ")"
40540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " requires " + r.requiredPermission
40640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " due to sender " + r.callerPackage
40740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " (uid " + r.callingUid + ")");
40840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
40940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
41040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
41140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
41240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (!skip) {
41340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If this is not being sent as an ordered broadcast, then we
41440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // don't want to touch the fields that keep track of the current
41540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // state of ordered broadcasts.
41640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (ordered) {
41740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = filter.receiverList.receiver.asBinder();
41840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curFilter = filter;
41940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                filter.receiverList.curBroadcast = r;
42040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.CALL_IN_RECEIVE;
42140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (filter.receiverList.app != null) {
42240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // Bump hosting application to no longer be in background
42340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // scheduling class.  Note that we can't do that if there
42440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // isn't an app...  but we can only be in that case for
42540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // things that directly call the IActivityManager API, which
42640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // are already core system stuff so don't matter for this.
42740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.curApp = filter.receiverList.app;
42840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.app.curReceiver = r;
42940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mService.updateOomAdjLocked();
43040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
43140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
43240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
43340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) {
43440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    int seq = r.intent.getIntExtra("seq", -1);
43540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.i(TAG, "Delivering to " + filter
43640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " (seq=" + seq + "): " + r);
43740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
43840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
43920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    new Intent(r.intent), r.resultCode, r.resultData,
44020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    r.resultExtras, r.ordered, r.initialSticky, r.userId);
44140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (ordered) {
44240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.state = BroadcastRecord.CALL_DONE_RECEIVE;
44340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
44440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (RemoteException e) {
44540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Failure sending broadcast " + r.intent, e);
44640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (ordered) {
44740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.receiver = null;
44840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.curFilter = null;
44940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.curBroadcast = null;
45040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (filter.receiverList.app != null) {
45140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        filter.receiverList.app.curReceiver = null;
45240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
45340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
45440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
45540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
45640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
45740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
45840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void processNextBroadcast(boolean fromMsg) {
45940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        synchronized(mService) {
46040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastRecord r;
46140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
46240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast ["
46340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mQueueName + "]: "
46440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mParallelBroadcasts.size() + " broadcasts, "
46540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mOrderedBroadcasts.size() + " ordered broadcasts");
46640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
46740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mService.updateCpuStats();
46840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
46940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (fromMsg) {
47040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mBroadcastsScheduled = false;
47140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
47240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
47340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // First, deliver any non-serialized broadcasts right away.
47440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            while (mParallelBroadcasts.size() > 0) {
47540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r = mParallelBroadcasts.remove(0);
47640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchTime = SystemClock.uptimeMillis();
47740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchClockTime = System.currentTimeMillis();
47840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                final int N = r.receivers.size();
47940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast ["
48040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
48140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                for (int i=0; i<N; i++) {
48240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Object target = r.receivers.get(i);
48340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST)  Slog.v(TAG,
48440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            "Delivering non-ordered on [" + mQueueName + "] to registered "
48540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + target + ": " + r);
48640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false);
48740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
48840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                addBroadcastToHistoryLocked(r);
48940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast ["
49040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
49140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
49240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
49340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Now take care of the next serialized one...
49440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
49540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If we are waiting for a process to come up to handle the next
49640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // broadcast, then do nothing at this point.  Just in case, we
49740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // check that the process we're waiting for still exists.
49840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (mPendingBroadcast != null) {
49940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) {
50040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.v(TAG, "processNextBroadcast ["
50140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]: waiting for "
50240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mPendingBroadcast.curApp);
50340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
50440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
50540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                boolean isDead;
50640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                synchronized (mService.mPidsSelfLocked) {
50740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    isDead = (mService.mPidsSelfLocked.get(
50840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            mPendingBroadcast.curApp.pid) == null);
50940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
51040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!isDead) {
51140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // It's still alive, so keep waiting
51240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
51340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
51440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "pending app  ["
51540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]" + mPendingBroadcast.curApp
51640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " died before responding to broadcast");
51740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.state = BroadcastRecord.IDLE;
51840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex;
51940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast = null;
52040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
52140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
52240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
52340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean looped = false;
52440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
52540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            do {
52640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mOrderedBroadcasts.size() == 0) {
52740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // No more broadcasts pending, so all done!
52840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mService.scheduleAppGcsLocked();
52940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (looped) {
53040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // If we had finished the last ordered broadcast, then
53140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // make sure all processes have correct oom and sched
53240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // adjustments.
53340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        mService.updateOomAdjLocked();
53440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
53540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
53640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
53740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r = mOrderedBroadcasts.get(0);
53840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                boolean forceReceive = false;
53940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
54040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Ensure that even if something goes awry with the timeout
54140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // detection, we catch "hung" broadcasts here, discard them,
54240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // and continue to make progress.
54340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                //
54440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // This is only done if the system is ready so that PRE_BOOT_COMPLETED
54540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // receivers don't get executed with timeouts. They're intended for
54640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // one time heavy lifting after system upgrades and can take
54740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // significant amounts of time.
54840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                int numReceivers = (r.receivers != null) ? r.receivers.size() : 0;
54940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mService.mProcessesReady && r.dispatchTime > 0) {
55040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    long now = SystemClock.uptimeMillis();
55140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if ((numReceivers > 0) &&
55240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {
55340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        Slog.w(TAG, "Hung broadcast ["
55440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + mQueueName + "] discarded after timeout failure:"
55540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " now=" + now
55640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " dispatchTime=" + r.dispatchTime
55740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " startTime=" + r.receiverTime
55840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " intent=" + r.intent
55940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " numReceivers=" + numReceivers
56040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " nextReceiver=" + r.nextReceiver
56140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " state=" + r.state);
56240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        broadcastTimeoutLocked(false); // forcibly finish this broadcast
56340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        forceReceive = true;
56440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.state = BroadcastRecord.IDLE;
56540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
56640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
56740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
56840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.state != BroadcastRecord.IDLE) {
56940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.d(TAG,
57040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            "processNextBroadcast("
57140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + ") called when not idle (state="
57240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.state + ")");
57340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
57440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
57540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
57640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.receivers == null || r.nextReceiver >= numReceivers
57740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        || r.resultAbort || forceReceive) {
57840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // No more receivers for this broadcast!  Send the final
57940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // result if requested...
58040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (r.resultTo != null) {
58140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        try {
58240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            if (DEBUG_BROADCAST) {
58340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                int seq = r.intent.getIntExtra("seq", -1);
58440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                Slog.i(TAG, "Finishing broadcast ["
58540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                        + mQueueName + "] " + r.intent.getAction()
58640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                        + " seq=" + seq + " app=" + r.callerApp);
58740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            }
58840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            performReceiveLocked(r.callerApp, r.resultTo,
58940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                new Intent(r.intent), r.resultCode,
59020e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                                r.resultData, r.resultExtras, false, false, r.userId);
59140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            // Set this to null so that the reference
59240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            // (local and remote) isnt kept in the mBroadcastHistory.
59340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            r.resultTo = null;
59440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        } catch (RemoteException e) {
59540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            Slog.w(TAG, "Failure ["
59640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    + mQueueName + "] sending broadcast result of "
59740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    + r.intent, e);
59840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        }
59940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
60040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
60140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG");
60240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    cancelBroadcastTimeoutLocked();
60340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
60440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast "
60540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r);
60640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
60740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // ... and on to the next...
60840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    addBroadcastToHistoryLocked(r);
60940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mOrderedBroadcasts.remove(0);
61040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r = null;
61140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    looped = true;
61240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
61340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
61440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } while (r == null);
61540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
61640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Get the next receiver...
61740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int recIdx = r.nextReceiver++;
61840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
61940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Keep track of when this receiver started, and make sure there
62040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // is a timeout message pending to kill it if need be.
62140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.receiverTime = SystemClock.uptimeMillis();
62240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (recIdx == 0) {
62340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchTime = r.receiverTime;
62440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchClockTime = System.currentTimeMillis();
62540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast ["
62640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
62740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
62840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (! mPendingBroadcastTimeoutMessage) {
62940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                long timeoutTime = r.receiverTime + mTimeoutPeriod;
63040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
63140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Submitting BROADCAST_TIMEOUT_MSG ["
63240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] for " + r + " at " + timeoutTime);
63340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
63440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
63540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
63640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Object nextReceiver = r.receivers.get(recIdx);
63740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (nextReceiver instanceof BroadcastFilter) {
63840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Simple case: this is a registered receiver who gets
63940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // a direct call.
64040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastFilter filter = (BroadcastFilter)nextReceiver;
64140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
64240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Delivering ordered ["
64340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] to registered "
64440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + filter + ": " + r);
64540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                deliverToRegisteredReceiverLocked(r, filter, r.ordered);
64640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.receiver == null || !r.ordered) {
64740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // The receiver has already finished, so schedule to
64840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // process the next one.
64940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(TAG, "Quick finishing ["
65040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]: ordered="
65140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.ordered + " receiver=" + r.receiver);
65240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.state = BroadcastRecord.IDLE;
65340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    scheduleBroadcastsLocked();
65440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
65540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
65640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
65740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
65840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Hard case: need to instantiate the receiver, possibly
65940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // starting its application process to host it.
66040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
66140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ResolveInfo info =
66240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                (ResolveInfo)nextReceiver;
6637d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ComponentName component = new ComponentName(
6647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    info.activityInfo.applicationInfo.packageName,
6657d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    info.activityInfo.name);
66640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
66740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean skip = false;
66840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(info.activityInfo.permission,
66940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.callingPid, r.callingUid, info.activityInfo.applicationInfo.uid,
67040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.exported);
67140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
67240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!info.activityInfo.exported) {
67340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: broadcasting "
67440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent.toString()
67540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " from " + r.callerPackage + " (pid=" + r.callingPid
67640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + ", uid=" + r.callingUid + ")"
67740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " is not exported from uid " + info.activityInfo.applicationInfo.uid
6787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " due to receiver " + component.flattenToShortString());
67940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
68040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: broadcasting "
68140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent.toString()
68240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " from " + r.callerPackage + " (pid=" + r.callingPid
68340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + ", uid=" + r.callingUid + ")"
68440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " requires " + info.activityInfo.permission
6857d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " due to receiver " + component.flattenToShortString());
68640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
68740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
68840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
68940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
69040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.requiredPermission != null) {
69140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                try {
69240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    perm = AppGlobals.getPackageManager().
69340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            checkPermission(r.requiredPermission,
69440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    info.activityInfo.applicationInfo.packageName);
69540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } catch (RemoteException e) {
69640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    perm = PackageManager.PERMISSION_DENIED;
69740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
69840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (perm != PackageManager.PERMISSION_GRANTED) {
69940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: receiving "
70040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent + " to "
7017d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + component.flattenToShortString()
70240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " requires " + r.requiredPermission
70340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " due to sender " + r.callerPackage
70440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " (uid " + r.callingUid + ")");
70540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    skip = true;
70640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
70740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
7087d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            boolean isSingleton = false;
7097d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            try {
7107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                isSingleton = mService.isSingleton(info.activityInfo.processName,
7117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.applicationInfo,
7127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.name, info.activityInfo.flags);
7137d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            } catch (SecurityException e) {
7147d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Slog.w(TAG, e.getMessage());
7157d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                skip = true;
7167d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
7177d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if ((info.activityInfo.flags&ActivityInfo.FLAG_SINGLE_USER) != 0) {
7187d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (ActivityManager.checkUidPermission(
7197d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        android.Manifest.permission.INTERACT_ACROSS_USERS,
7207d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.applicationInfo.uid)
7217d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                                != PackageManager.PERMISSION_GRANTED) {
7227d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    Slog.w(TAG, "Permission Denial: Receiver " + component.flattenToShortString()
7237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " requests FLAG_SINGLE_USER, but app does not hold "
7247d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + android.Manifest.permission.INTERACT_ACROSS_USERS);
7257d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    skip = true;
7267d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
7277d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
72840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.curApp != null && r.curApp.crashing) {
72940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // If the target process is crashing, just skip it.
73040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
73140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Skipping deliver ordered ["
73240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r + " to " + r.curApp
73340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + ": process crashing");
73440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
73540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
73640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
73740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (skip) {
73840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
73940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Skipping delivery of ordered ["
74040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r + " for whatever reason");
74140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = null;
74240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curFilter = null;
74340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.IDLE;
74440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
74540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
74640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
74740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
74840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.state = BroadcastRecord.APP_RECEIVE;
74940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            String targetProcess = info.activityInfo.processName;
7507d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            r.curComponent = component;
7517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if (r.callingUid != Process.SYSTEM_UID && isSingleton) {
7527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                info.activityInfo = mService.getActivityInfoForUser(info.activityInfo, 0);
75340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
75440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curReceiver = info.activityInfo;
755f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            if (DEBUG_MU && r.callingUid > UserHandle.PER_USER_RANGE) {
75640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, "
75740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = "
75840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.uid);
75940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
76040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
76140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Broadcast is being executed, its package can't be stopped.
76240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
76340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                AppGlobals.getPackageManager().setPackageStoppedState(
764f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                        r.curComponent.getPackageName(), false, UserHandle.getUserId(r.callingUid));
76540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (RemoteException e) {
76640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (IllegalArgumentException e) {
76740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Failed trying to unstop package "
76840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.curComponent.getPackageName() + ": " + e);
76940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
77040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
77140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Is this receiver's application already running?
77240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ProcessRecord app = mService.getProcessRecordLocked(targetProcess,
77340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.applicationInfo.uid);
77440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (app != null && app.thread != null) {
77540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                try {
77640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    app.addPackage(info.activityInfo.packageName);
77740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    processCurBroadcastLocked(r, app);
77840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
77940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } catch (RemoteException e) {
78040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Exception when sending broadcast to "
78140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                          + r.curComponent, e);
78240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
78340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
78440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // If a dead object exception was thrown -- fall through to
78540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // restart the application.
78640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
78740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
78840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Not running -- get it started, to be executed when the app comes up.
78940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST)  Slog.v(TAG,
79040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Need to start app ["
79140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mQueueName + "] " + targetProcess + " for broadcast " + r);
79240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if ((r.curApp=mService.startProcessLocked(targetProcess,
79340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.applicationInfo, true,
79440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
79540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "broadcast", r.curComponent,
79640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false))
79740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            == null) {
79840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Ah, this recipient is unavailable.  Finish it if necessary,
79940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // and mark the broadcast record as ready for the next.
80040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Unable to launch app "
80140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.packageName + "/"
80240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.uid + " for broadcast "
80340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent + ": process is bad");
80440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                logBroadcastReceiverDiscardLocked(r);
80540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                finishReceiverLocked(r, r.resultCode, r.resultData,
80640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.resultExtras, r.resultAbort, true);
80740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
80840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.IDLE;
80940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
81040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
81140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
81240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = r;
81340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastRecvIndex = recIdx;
81440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
81540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
81640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
81740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void setBroadcastTimeoutLocked(long timeoutTime) {
81840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (! mPendingBroadcastTimeoutMessage) {
81940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
82040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.sendMessageAtTime(msg, timeoutTime);
82140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = true;
82240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
82340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
82440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
82540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void cancelBroadcastTimeoutLocked() {
82640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mPendingBroadcastTimeoutMessage) {
82740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this);
82840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = false;
82940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
83040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
83140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
83240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void broadcastTimeoutLocked(boolean fromMsg) {
83340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (fromMsg) {
83440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = false;
83540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
83640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
83740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mOrderedBroadcasts.size() == 0) {
83840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
83940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
84040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
84140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        long now = SystemClock.uptimeMillis();
84240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        BroadcastRecord r = mOrderedBroadcasts.get(0);
84340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (fromMsg) {
84440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (mService.mDidDexOpt) {
84540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Delay timeouts until dexopt finishes.
84640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mService.mDidDexOpt = false;
84740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                long timeoutTime = SystemClock.uptimeMillis() + mTimeoutPeriod;
84840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
84940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
85040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
85140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!mService.mProcessesReady) {
85240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Only process broadcast timeouts if the system is ready. That way
85340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended
85440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // to do heavy lifting for system up.
85540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
85640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
85740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
85840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            long timeoutTime = r.receiverTime + mTimeoutPeriod;
85940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (timeoutTime > now) {
86040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // We can observe premature timeouts because we do not cancel and reset the
86140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // broadcast timeout message after each receiver finishes.  Instead, we set up
86240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // an initial timeout then kick it down the road a little further as needed
86340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // when it expires.
86440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
86540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Premature timeout ["
86640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
86740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + timeoutTime);
86840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
86940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
87040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
87140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
87240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
87340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver
87440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + ", started " + (now - r.receiverTime) + "ms ago");
87540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiverTime = now;
87640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.anrCount++;
87740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
87840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Current receiver has passed its expiration date.
87940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.nextReceiver <= 0) {
88040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Slog.w(TAG, "Timeout on receiver with nextReceiver <= 0");
88140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
88240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
88340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
88440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        ProcessRecord app = null;
88540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        String anrMessage = null;
88640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
88740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        Object curReceiver = r.receivers.get(r.nextReceiver-1);
88840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        Slog.w(TAG, "Receiver during timeout: " + curReceiver);
88940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        logBroadcastReceiverDiscardLocked(r);
89040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (curReceiver instanceof BroadcastFilter) {
89140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastFilter bf = (BroadcastFilter)curReceiver;
89240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (bf.receiverList.pid != 0
89340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    && bf.receiverList.pid != ActivityManagerService.MY_PID) {
89440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                synchronized (mService.mPidsSelfLocked) {
89540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    app = mService.mPidsSelfLocked.get(
89640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            bf.receiverList.pid);
89740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
89840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
89940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
90040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app = r.curApp;
90140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
90240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
90340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app != null) {
90440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            anrMessage = "Broadcast of " + r.intent.toString();
90540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
90640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
90740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mPendingBroadcast == r) {
90840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = null;
90940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
91040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
91140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Move on to the next receiver.
91240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        finishReceiverLocked(r, r.resultCode, r.resultData,
91340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.resultExtras, r.resultAbort, true);
91440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        scheduleBroadcastsLocked();
91540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
91640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (anrMessage != null) {
91740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Post the ANR to the handler since we do not want to process ANRs while
91840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // potentially holding our lock.
91940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.post(new AppNotResponding(app, anrMessage));
92040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
92140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
92240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
92340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void addBroadcastToHistoryLocked(BroadcastRecord r) {
92440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.callingUid < 0) {
92540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // This was from a registerReceiver() call; ignore it.
92640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
92740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
92840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        System.arraycopy(mBroadcastHistory, 0, mBroadcastHistory, 1,
92940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                MAX_BROADCAST_HISTORY-1);
93040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.finishTime = SystemClock.uptimeMillis();
93140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mBroadcastHistory[0] = r;
932c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        System.arraycopy(mBroadcastSummaryHistory, 0, mBroadcastSummaryHistory, 1,
933c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                MAX_BROADCAST_SUMMARY_HISTORY-1);
934c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        mBroadcastSummaryHistory[0] = r.intent;
93540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
93640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
93740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void logBroadcastReceiverDiscardLocked(BroadcastRecord r) {
93840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.nextReceiver > 0) {
93940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Object curReceiver = r.receivers.get(r.nextReceiver-1);
94040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (curReceiver instanceof BroadcastFilter) {
94140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastFilter bf = (BroadcastFilter) curReceiver;
94240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER,
943b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        bf.owningUserId, System.identityHashCode(r),
94440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.intent.getAction(),
94540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.nextReceiver - 1,
94640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        System.identityHashCode(bf));
94740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } else {
948b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                ResolveInfo ri = (ResolveInfo)curReceiver;
94940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
950b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        UserHandle.getUserId(ri.activityInfo.applicationInfo.uid),
951b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        System.identityHashCode(r), r.intent.getAction(),
952b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        r.nextReceiver - 1, ri.toString());
95340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
95440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
95540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Slog.w(TAG, "Discarding broadcast before first receiver is invoked: "
95640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + r);
95740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
958b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                    -1, System.identityHashCode(r),
95940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.intent.getAction(),
96040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.nextReceiver,
96140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "NONE");
96240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
96340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
96440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
96540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
96640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int opti, boolean dumpAll, String dumpPackage, boolean needSep) {
96740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
96840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                || mPendingBroadcast != null) {
96940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean printed = false;
97040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
97140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastRecord br = mParallelBroadcasts.get(i);
97240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
97340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
97440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
97540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!printed) {
97640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (needSep) {
97740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        pw.println();
97840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
9796cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                    needSep = true;
98040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    printed = true;
98140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  Active broadcasts [" + mQueueName + "]:");
98240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
9836cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.println("  Active Broadcast " + mQueueName + " #" + i + ":");
98440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                br.dump(pw, "    ");
98540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
98640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            printed = false;
98740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            needSep = true;
98840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) {
98940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastRecord br = mOrderedBroadcasts.get(i);
99040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
99140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
99240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
99340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!printed) {
99440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (needSep) {
99540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        pw.println();
99640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
99740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    needSep = true;
9986cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                    printed = true;
99940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  Active ordered broadcasts [" + mQueueName + "]:");
100040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
10016cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.println("  Active Ordered Broadcast " + mQueueName + " #" + i + ":");
100240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mOrderedBroadcasts.get(i).dump(pw, "    ");
100340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
100440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpPackage == null || (mPendingBroadcast != null
100540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    && dumpPackage.equals(mPendingBroadcast.callerPackage))) {
100640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (needSep) {
100740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println();
100840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
100940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                pw.println("  Pending broadcast [" + mQueueName + "]:");
101040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mPendingBroadcast != null) {
101140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.dump(pw, "    ");
101240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
101340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("    (null)");
101440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
101540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                needSep = true;
101640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
101740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
101840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1019c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        int i;
102040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean printed = false;
1021c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        for (i=0; i<MAX_BROADCAST_HISTORY; i++) {
102240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastRecord r = mBroadcastHistory[i];
102340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r == null) {
102440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                break;
102540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
102640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) {
102740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                continue;
102840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
102940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!printed) {
103040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (needSep) {
103140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println();
103240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
103340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                needSep = true;
103440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                pw.println("  Historical broadcasts [" + mQueueName + "]:");
103540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                printed = true;
103640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
103740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpAll) {
10386cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.print("  Historical Broadcast " + mQueueName + " #");
10396cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                        pw.print(i); pw.println(":");
104040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dump(pw, "    ");
104140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } else {
1042c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("  #"); pw.print(i); pw.print(": "); pw.println(r);
1043c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("    ");
1044c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.println(r.intent.toShortString(false, true, true, false));
1045c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Bundle bundle = r.intent.getExtras();
1046c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (bundle != null) {
1047c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.print("    extras: "); pw.println(bundle.toString());
1048c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1049c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            }
1050c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        }
1051c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn
1052c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        if (dumpPackage == null) {
1053c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            if (dumpAll) {
1054c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                i = 0;
1055c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                printed = false;
1056c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            }
1057c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            for (; i<MAX_BROADCAST_SUMMARY_HISTORY; i++) {
1058c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Intent intent = mBroadcastSummaryHistory[i];
1059c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (intent == null) {
1060c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    break;
1061c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1062c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (!printed) {
1063c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    if (needSep) {
1064c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                        pw.println();
1065c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    }
1066c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    needSep = true;
1067c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.println("  Historical broadcasts summary [" + mQueueName + "]:");
1068c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    printed = true;
1069c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1070c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (!dumpAll && i >= 50) {
107140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  ...");
107240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    break;
107340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
1074c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("  #"); pw.print(i); pw.print(": ");
1075c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.println(intent.toShortString(false, true, true, false));
1076c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Bundle bundle = intent.getExtras();
1077c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (bundle != null) {
1078c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.print("    extras: "); pw.println(bundle.toString());
1079c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
108040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
108140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
108240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
108340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return needSep;
108440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
108540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn}
1086