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