140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/*
240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Copyright (C) 2012 The Android Open Source Project
340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * you may not use this file except in compliance with the License.
640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * You may obtain a copy of the License at
740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
1040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * Unless required by applicable law or agreed to in writing, software
1140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * See the License for the specific language governing permissions and
1440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * limitations under the License.
1540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */
1640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornpackage com.android.server.am;
1840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1940c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.io.FileDescriptor;
2040c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.io.PrintWriter;
2140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport java.util.ArrayList;
2240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.app.ActivityManager;
2440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.app.AppGlobals;
25f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackbornimport android.app.AppOpsManager;
2640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.ComponentName;
2740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.IIntentReceiver;
2840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.Intent;
297d19e0242faac8017033dabb872cdf1542fa184cDianne Hackbornimport android.content.pm.ActivityInfo;
30ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tateimport android.content.pm.PackageInfo;
3140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.PackageManager;
3240c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.content.pm.ResolveInfo;
3340c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Bundle;
3440c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Handler;
3540c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.IBinder;
3640c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Message;
3740c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.Process;
3840c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.RemoteException;
3940c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.os.SystemClock;
40f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
4140c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.EventLog;
426c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackbornimport android.util.Log;
4340c8db5a28e9abae2033facce1354e3677911fccDianne Hackbornimport android.util.Slog;
4440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
4540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn/**
4640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * BROADCASTS
4740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn *
4840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * We keep two broadcast queues and associated bookkeeping, one for those at
4940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn * foreground priority, and one for normal (background-priority) broadcasts.
5040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn */
51be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class BroadcastQueue {
5240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final String TAG = "BroadcastQueue";
5340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final String TAG_MU = ActivityManagerService.TAG_MU;
5440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_BROADCAST = ActivityManagerService.DEBUG_BROADCAST;
5540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_BROADCAST_LIGHT = ActivityManagerService.DEBUG_BROADCAST_LIGHT;
5640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final boolean DEBUG_MU = ActivityManagerService.DEBUG_MU;
5740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
584c51de493308eab0ffd17529f8a1aab29dbba68aDianne Hackborn    static final int MAX_BROADCAST_HISTORY = ActivityManager.isLowRamDeviceStatic() ? 10 : 50;
596285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    static final int MAX_BROADCAST_SUMMARY_HISTORY
604c51de493308eab0ffd17529f8a1aab29dbba68aDianne Hackborn            = ActivityManager.isLowRamDeviceStatic() ? 25 : 300;
6140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final ActivityManagerService mService;
6340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
6540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Recognizable moniker for this queue
6640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
6740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final String mQueueName;
6840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
6940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
7040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Timeout period for this queue's broadcasts
7140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
7240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final long mTimeoutPeriod;
7340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
7440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
756285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn     * If true, we can delay broadcasts while waiting services to finish in the previous
766285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn     * receiver's process.
776285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn     */
786285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final boolean mDelayBehindServices;
796285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
806285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    /**
8140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Lists of all active broadcasts that are to be executed immediately
8240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * (without waiting for another broadcast to finish).  Currently this only
8340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * contains broadcasts to registered receivers, to avoid spinning up
8440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * a bunch of processes to execute IntentReceiver components.  Background-
8540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * and foreground-priority broadcasts are queued separately.
8640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
876285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<BroadcastRecord>();
886285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
8940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
9040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * List of all active broadcasts that are to be executed one at a time.
9140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * The object at the top of the list is the currently activity broadcasts;
9240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * those after it are waiting for the top to finish.  As with parallel
9340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * broadcasts, separate background- and foreground-priority queues are
9440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * maintained.
9540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
966285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<BroadcastRecord>();
9740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
9840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
9940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Historical data of past broadcasts, for debugging.
10040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
1016285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final BroadcastRecord[] mBroadcastHistory = new BroadcastRecord[MAX_BROADCAST_HISTORY];
10240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
10340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
104c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn     * Summary of historical data of past broadcasts, for debugging.
105c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn     */
1066285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    final Intent[] mBroadcastSummaryHistory = new Intent[MAX_BROADCAST_SUMMARY_HISTORY];
107c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn
108c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn    /**
10940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Set when we current have a BROADCAST_INTENT_MSG in flight.
11040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
11140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    boolean mBroadcastsScheduled = false;
11240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
11340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
11440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * True if we have a pending unexpired BROADCAST_TIMEOUT_MSG posted to our handler.
11540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
11640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    boolean mPendingBroadcastTimeoutMessage;
11740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
11840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
11940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * Intent broadcasts that we have tried to start, but are
12040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * waiting for the application's process to be created.  We only
12140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * need one per scheduling class (instead of a list) because we always
12240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * process broadcasts one at a time, so no others can be started while
12340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * waiting for this one.
12440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
12540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    BroadcastRecord mPendingBroadcast = null;
12640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
12740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    /**
12840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     * The receiver index that is pending, to restart the broadcast if needed.
12940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn     */
13040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    int mPendingBroadcastRecvIndex;
13140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
13240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG;
13340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1;
13440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
13540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final Handler mHandler = new Handler() {
13640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public void handleMessage(Message msg) {
13740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            switch (msg.what) {
13840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                case BROADCAST_INTENT_MSG: {
13940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(
14040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            TAG, "Received BROADCAST_INTENT_MSG");
14140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    processNextBroadcast(true);
14240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } break;
14340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                case BROADCAST_TIMEOUT_MSG: {
14440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    synchronized (mService) {
14540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        broadcastTimeoutLocked(true);
14640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
14740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } break;
14840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
14940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
15040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    };
15140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
15240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final class AppNotResponding implements Runnable {
15340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        private final ProcessRecord mApp;
15440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        private final String mAnnotation;
15540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
15640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public AppNotResponding(ProcessRecord app, String annotation) {
15740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mApp = app;
15840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mAnnotation = annotation;
15940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
16040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
16140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        @Override
16240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        public void run() {
1635fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            mService.appNotResponding(mApp, null, null, false, mAnnotation);
16440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
16540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
16640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1676285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod,
1686285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            boolean allowDelayBehindServices) {
16940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mService = service;
17040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mQueueName = name;
17140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mTimeoutPeriod = timeoutPeriod;
1726285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        mDelayBehindServices = allowDelayBehindServices;
17340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
17440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
17540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean isPendingBroadcastProcessLocked(int pid) {
17640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid;
17740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
17840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
17940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
18040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mParallelBroadcasts.add(r);
18140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
18240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
18340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void enqueueOrderedBroadcastLocked(BroadcastRecord r) {
18440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mOrderedBroadcasts.add(r);
18540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
18640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
18740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) {
18840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
18940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
19040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
19140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "***** DROPPING PARALLEL ["
19240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mQueueName + "]: " + r.intent);
19340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mParallelBroadcasts.set(i, r);
19440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return true;
19540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
19640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
19740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return false;
19840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
19940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
20040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) {
20140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        for (int i=mOrderedBroadcasts.size()-1; i>0; i--) {
20240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
20340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
20440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "***** DROPPING ORDERED ["
20540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "]: " + r.intent);
20640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mOrderedBroadcasts.set(i, r);
20740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return true;
20840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
20940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
21040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return false;
21140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
21240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
21340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void processCurBroadcastLocked(BroadcastRecord r,
21440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ProcessRecord app) throws RemoteException {
21540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (DEBUG_BROADCAST)  Slog.v(TAG,
21640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                "Process cur broadcast " + r + " for app " + app);
21740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app.thread == null) {
21840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            throw new RemoteException();
21940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
22040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiver = app.thread.asBinder();
22140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curApp = app;
22240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        app.curReceiver = r;
223a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_RECEIVER);
224db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateLruProcessLocked(app, false, null);
225db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateOomAdjLocked();
22640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
22740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Tell the application to launch this receiver.
22840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.intent.setComponent(r.curComponent);
22940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
23040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean started = false;
23140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        try {
23240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG,
23340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Delivering to component " + r.curComponent
23440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + ": " + r);
23540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
23640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,
23740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),
238a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId,
239a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    app.repProcState);
24040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST)  Slog.v(TAG,
24140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Process cur broadcast " + r + " DELIVERED for app " + app);
24240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            started = true;
24340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } finally {
24440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!started) {
24540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
24640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Process cur broadcast " + r + ": NOT STARTED!");
24740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = null;
24840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curApp = null;
24940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                app.curReceiver = null;
25040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
25140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
25240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
25340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
25440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean sendPendingBroadcastsLocked(ProcessRecord app) {
25540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean didSomething = false;
25640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        final BroadcastRecord br = mPendingBroadcast;
25740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (br != null && br.curApp.pid == app.pid) {
25840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
25940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mPendingBroadcast = null;
26040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                processCurBroadcastLocked(br, app);
26140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                didSomething = true;
26240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (Exception e) {
26340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Exception in new application when starting receiver "
26440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + br.curComponent.flattenToShortString(), e);
26540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                logBroadcastReceiverDiscardLocked(br);
26640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                finishReceiverLocked(br, br.resultCode, br.resultData,
2676285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                        br.resultExtras, br.resultAbort, false);
26840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
2697d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                // We need to reset the state if we failed to start the receiver.
27040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                br.state = BroadcastRecord.IDLE;
27140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                throw new RuntimeException(e.getMessage());
27240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
27340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
27440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return didSomething;
27540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
27640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
27740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void skipPendingBroadcastLocked(int pid) {
27840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        final BroadcastRecord br = mPendingBroadcast;
27940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (br != null && br.curApp.pid == pid) {
28040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            br.state = BroadcastRecord.IDLE;
28140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            br.nextReceiver = mPendingBroadcastRecvIndex;
28240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = null;
28340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            scheduleBroadcastsLocked();
28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void skipCurrentReceiverLocked(ProcessRecord app) {
28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean reschedule = false;
28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        BroadcastRecord r = app.curReceiver;
29040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r != null) {
29140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // The current broadcast is waiting for this app's receiver
29240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // to be finished.  Looks like that's not going to happen, so
29340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // let the broadcast continue.
29440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            logBroadcastReceiverDiscardLocked(r);
29540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            finishReceiverLocked(r, r.resultCode, r.resultData,
2966285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                    r.resultExtras, r.resultAbort, false);
29740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            reschedule = true;
29840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
29940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
30040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r = mPendingBroadcast;
30140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r != null && r.curApp == app) {
30240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST) Slog.v(TAG,
30340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "[" + mQueueName + "] skip & discard pending app " + r);
30440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            logBroadcastReceiverDiscardLocked(r);
30540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            finishReceiverLocked(r, r.resultCode, r.resultData,
3066285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                    r.resultExtras, r.resultAbort, false);
30740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            reschedule = true;
30840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
30940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (reschedule) {
31040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            scheduleBroadcastsLocked();
31140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
31240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
31340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
31440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public void scheduleBroadcastsLocked() {
31540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts ["
31640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mQueueName + "]: current="
31740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + mBroadcastsScheduled);
31840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
31940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mBroadcastsScheduled) {
32040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
32140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
32240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this));
32340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mBroadcastsScheduled = true;
32440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
32540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
32640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public BroadcastRecord getMatchingOrderedReceiver(IBinder receiver) {
32740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mOrderedBroadcasts.size() > 0) {
32840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            final BroadcastRecord r = mOrderedBroadcasts.get(0);
32940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r != null && r.receiver == receiver) {
33040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return r;
33140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
33240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
33340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return null;
33440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
33540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
33640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    public boolean finishReceiverLocked(BroadcastRecord r, int resultCode,
3376285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            String resultData, Bundle resultExtras, boolean resultAbort, boolean waitForServices) {
3386285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        final int state = r.state;
3393bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        final ActivityInfo receiver = r.curReceiver;
34040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.state = BroadcastRecord.IDLE;
34140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (state == BroadcastRecord.IDLE) {
3426285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE");
34340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
34440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiver = null;
34540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.intent.setComponent(null);
34640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.curApp != null) {
34740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curApp.curReceiver = null;
34840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
34940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.curFilter != null) {
35040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curFilter.receiverList.curBroadcast = null;
35140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
35240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curFilter = null;
35340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.curReceiver = null;
3546285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        r.curApp = null;
35540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mPendingBroadcast = null;
35640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
35740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultCode = resultCode;
35840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultData = resultData;
35940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.resultExtras = resultExtras;
3606285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (resultAbort && (r.intent.getFlags()&Intent.FLAG_RECEIVER_NO_ABORT) == 0) {
3616285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            r.resultAbort = resultAbort;
3626285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        } else {
3636285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            r.resultAbort = false;
3646285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
3656285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
3666285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (waitForServices && r.curComponent != null && r.queue.mDelayBehindServices
3676285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                && r.queue.mOrderedBroadcasts.size() > 0
3686285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                && r.queue.mOrderedBroadcasts.get(0) == r) {
3693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            ActivityInfo nextReceiver;
3703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (r.nextReceiver < r.receivers.size()) {
3713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                Object obj = r.receivers.get(r.nextReceiver);
3723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                nextReceiver = (obj instanceof ActivityInfo) ? (ActivityInfo)obj : null;
3733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            } else {
3743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                nextReceiver = null;
3753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
3763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            // Don't do this if the next receive is in the same process as the current one.
3773bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (receiver == null || nextReceiver == null
3783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    || receiver.applicationInfo.uid != nextReceiver.applicationInfo.uid
3793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    || !receiver.processName.equals(nextReceiver.processName)) {
3803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                // In this case, we are ready to process the next receiver for the current broadcast,
3813bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                // but are on a queue that would like to wait for services to finish before moving
3823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                // on.  If there are background services currently starting, then we will go into a
3833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                // special state where we hold off on continuing this broadcast until they are done.
3843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                if (mService.mServices.hasBackgroundServices(r.userId)) {
3853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    Slog.i(ActivityManagerService.TAG, "Delay finish: "
3863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                            + r.curComponent.flattenToShortString());
3873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    r.state = BroadcastRecord.WAITING_SERVICES;
3883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    return false;
3893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                }
3906285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            }
3916285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
3926285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
3936285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        r.curComponent = null;
39440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
39540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // We will process the next receiver right now if this is finishing
39640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // an app receiver (which is always asynchronous) or after we have
39740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // come back from calling a receiver.
39840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return state == BroadcastRecord.APP_RECEIVE
39940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                || state == BroadcastRecord.CALL_DONE_RECEIVE;
40040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
40140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
4026285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    public void backgroundServicesFinishedLocked(int userId) {
4036285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (mOrderedBroadcasts.size() > 0) {
4046285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            BroadcastRecord br = mOrderedBroadcasts.get(0);
4056285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            if (br.userId == userId && br.state == BroadcastRecord.WAITING_SERVICES) {
4066285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                Slog.i(ActivityManagerService.TAG, "Resuming delayed broadcast");
4076285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                br.curComponent = null;
4086285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                br.state = BroadcastRecord.IDLE;
4096285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                processNextBroadcast(false);
4106285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            }
4116285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
4126285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn    }
4136285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
41440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver,
41540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Intent intent, int resultCode, String data, Bundle extras,
41620e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
41740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Send the intent to the receiver asynchronously using one-way binder calls.
41840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app != null && app.thread != null) {
41940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If we have an app thread, do the call through that so it is
42040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // correctly ordered with other one-way calls.
42140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
422a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    data, extras, ordered, sticky, sendingUser, app.repProcState);
42340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
42420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn            receiver.performReceive(intent, resultCode, data, extras, ordered,
42520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    sticky, sendingUser);
42640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
42740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
42840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
42940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void deliverToRegisteredReceiverLocked(BroadcastRecord r,
43040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastFilter filter, boolean ordered) {
43140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean skip = false;
4328bf06edac2088ad100e67dcb00a46d3f0f95c126Amith Yamasani        if (filter.requiredPermission != null) {
43340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(filter.requiredPermission,
43440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.callingPid, r.callingUid, -1, true);
43540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
43640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Permission Denial: broadcasting "
43740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent.toString()
43840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " from " + r.callerPackage + " (pid="
43940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.callingPid + ", uid=" + r.callingUid + ")"
44040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " requires " + filter.requiredPermission
44140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " due to registered receiver " + filter);
44240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
44340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
44440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
445b4163a6e12ee7100c758c6d3d062ade1f2843fceDianne Hackborn        if (!skip && r.requiredPermission != null) {
44640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(r.requiredPermission,
44740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.pid, filter.receiverList.uid, -1, true);
44840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
44940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Permission Denial: receiving "
45040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent.toString()
45140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " to " + filter.receiverList.app
45240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " (pid=" + filter.receiverList.pid
45340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + ", uid=" + filter.receiverList.uid + ")"
45440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " requires " + r.requiredPermission
45540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " due to sender " + r.callerPackage
45640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + " (uid " + r.callingUid + ")");
45740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
45840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
45940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
460f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        if (r.appOp != AppOpsManager.OP_NONE) {
4611304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn            int mode = mService.mAppOpsService.noteOperation(r.appOp,
462f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    filter.receiverList.uid, filter.packageName);
463f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            if (mode != AppOpsManager.MODE_ALLOWED) {
464f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
465f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                        "App op " + r.appOp + " not allowed for broadcast to uid "
466f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                        + filter.receiverList.uid + " pkg " + filter.packageName);
467f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                skip = true;
468f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            }
469f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn        }
47049660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        if (!skip) {
47149660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver            skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
47249660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                    r.callingPid, r.resolvedType, filter.receiverList.uid);
47349660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver        }
47440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
4759357b11a798b804b69907f93437229cac1d82468Dianne Hackborn        if (filter.receiverList.app == null || filter.receiverList.app.crashing) {
4769357b11a798b804b69907f93437229cac1d82468Dianne Hackborn            Slog.w(TAG, "Skipping deliver [" + mQueueName + "] " + r
4779357b11a798b804b69907f93437229cac1d82468Dianne Hackborn                    + " to " + filter.receiverList + ": process crashing");
4789357b11a798b804b69907f93437229cac1d82468Dianne Hackborn            skip = true;
4799357b11a798b804b69907f93437229cac1d82468Dianne Hackborn        }
4809357b11a798b804b69907f93437229cac1d82468Dianne Hackborn
48140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (!skip) {
48240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If this is not being sent as an ordered broadcast, then we
48340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // don't want to touch the fields that keep track of the current
48440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // state of ordered broadcasts.
48540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (ordered) {
48640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = filter.receiverList.receiver.asBinder();
48740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curFilter = filter;
48840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                filter.receiverList.curBroadcast = r;
48940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.CALL_IN_RECEIVE;
49040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (filter.receiverList.app != null) {
49140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // Bump hosting application to no longer be in background
49240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // scheduling class.  Note that we can't do that if there
49340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // isn't an app...  but we can only be in that case for
49440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // things that directly call the IActivityManager API, which
49540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // are already core system stuff so don't matter for this.
49640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.curApp = filter.receiverList.app;
49740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.app.curReceiver = r;
498a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    mService.updateOomAdjLocked(r.curApp, true);
49940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
50040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
50140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
50240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) {
50340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    int seq = r.intent.getIntExtra("seq", -1);
50440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.i(TAG, "Delivering to " + filter
50540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " (seq=" + seq + "): " + r);
50640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
50740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
50820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    new Intent(r.intent), r.resultCode, r.resultData,
50920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                    r.resultExtras, r.ordered, r.initialSticky, r.userId);
51040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (ordered) {
51140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.state = BroadcastRecord.CALL_DONE_RECEIVE;
51240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
51340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (RemoteException e) {
51440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Failure sending broadcast " + r.intent, e);
51540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (ordered) {
51640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.receiver = null;
51740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.curFilter = null;
51840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    filter.receiverList.curBroadcast = null;
51940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (filter.receiverList.app != null) {
52040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        filter.receiverList.app.curReceiver = null;
52140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
52240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
52340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
52440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
52540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
52640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
52740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void processNextBroadcast(boolean fromMsg) {
52840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        synchronized(mService) {
52940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastRecord r;
53040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
53140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast ["
53240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mQueueName + "]: "
53340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mParallelBroadcasts.size() + " broadcasts, "
53440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mOrderedBroadcasts.size() + " ordered broadcasts");
53540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
53640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mService.updateCpuStats();
53740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
53840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (fromMsg) {
53940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mBroadcastsScheduled = false;
54040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
54140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
54240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // First, deliver any non-serialized broadcasts right away.
54340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            while (mParallelBroadcasts.size() > 0) {
54440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r = mParallelBroadcasts.remove(0);
54540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchTime = SystemClock.uptimeMillis();
54640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchClockTime = System.currentTimeMillis();
54740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                final int N = r.receivers.size();
54840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast ["
54940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
55040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                for (int i=0; i<N; i++) {
55140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Object target = r.receivers.get(i);
55240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST)  Slog.v(TAG,
55340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            "Delivering non-ordered on [" + mQueueName + "] to registered "
55440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + target + ": " + r);
55540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false);
55640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
55740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                addBroadcastToHistoryLocked(r);
55840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast ["
55940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
56040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
56140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
56240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Now take care of the next serialized one...
56340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
56440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // If we are waiting for a process to come up to handle the next
56540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // broadcast, then do nothing at this point.  Just in case, we
56640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // check that the process we're waiting for still exists.
56740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (mPendingBroadcast != null) {
56840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) {
56940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.v(TAG, "processNextBroadcast ["
57040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]: waiting for "
57140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mPendingBroadcast.curApp);
57240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
57340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
57440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                boolean isDead;
57540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                synchronized (mService.mPidsSelfLocked) {
5769357b11a798b804b69907f93437229cac1d82468Dianne Hackborn                    ProcessRecord proc = mService.mPidsSelfLocked.get(mPendingBroadcast.curApp.pid);
5779357b11a798b804b69907f93437229cac1d82468Dianne Hackborn                    isDead = proc == null || proc.crashing;
57840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
57940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!isDead) {
58040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // It's still alive, so keep waiting
58140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
58240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
58340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "pending app  ["
58440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]" + mPendingBroadcast.curApp
58540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " died before responding to broadcast");
58640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.state = BroadcastRecord.IDLE;
58740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex;
58840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast = null;
58940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
59040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
59140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
59240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean looped = false;
59340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
59440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            do {
59540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mOrderedBroadcasts.size() == 0) {
59640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // No more broadcasts pending, so all done!
59740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mService.scheduleAppGcsLocked();
59840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (looped) {
59940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // If we had finished the last ordered broadcast, then
60040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // make sure all processes have correct oom and sched
60140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        // adjustments.
60240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        mService.updateOomAdjLocked();
60340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
60440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
60540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
60640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r = mOrderedBroadcasts.get(0);
60740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                boolean forceReceive = false;
60840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
60940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Ensure that even if something goes awry with the timeout
61040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // detection, we catch "hung" broadcasts here, discard them,
61140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // and continue to make progress.
61240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                //
61340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // This is only done if the system is ready so that PRE_BOOT_COMPLETED
61440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // receivers don't get executed with timeouts. They're intended for
61540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // one time heavy lifting after system upgrades and can take
61640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // significant amounts of time.
61740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                int numReceivers = (r.receivers != null) ? r.receivers.size() : 0;
61840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mService.mProcessesReady && r.dispatchTime > 0) {
61940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    long now = SystemClock.uptimeMillis();
62040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if ((numReceivers > 0) &&
62140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            (now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {
62240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        Slog.w(TAG, "Hung broadcast ["
62340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + mQueueName + "] discarded after timeout failure:"
62440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " now=" + now
62540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " dispatchTime=" + r.dispatchTime
62640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " startTime=" + r.receiverTime
62740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " intent=" + r.intent
62840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " numReceivers=" + numReceivers
62940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " nextReceiver=" + r.nextReceiver
63040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                + " state=" + r.state);
63140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        broadcastTimeoutLocked(false); // forcibly finish this broadcast
63240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        forceReceive = true;
63340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.state = BroadcastRecord.IDLE;
63440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
63540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
63640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
63740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.state != BroadcastRecord.IDLE) {
63840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.d(TAG,
63940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            "processNextBroadcast("
64040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + ") called when not idle (state="
64140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.state + ")");
64240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
64340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
64440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
64540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.receivers == null || r.nextReceiver >= numReceivers
64640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        || r.resultAbort || forceReceive) {
64740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // No more receivers for this broadcast!  Send the final
64840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // result if requested...
64940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (r.resultTo != null) {
65040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        try {
65140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            if (DEBUG_BROADCAST) {
65240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                int seq = r.intent.getIntExtra("seq", -1);
65340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                Slog.i(TAG, "Finishing broadcast ["
65440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                        + mQueueName + "] " + r.intent.getAction()
65540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                        + " seq=" + seq + " app=" + r.callerApp);
65640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            }
65740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            performReceiveLocked(r.callerApp, r.resultTo,
65840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                new Intent(r.intent), r.resultCode,
65920e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                                r.resultData, r.resultExtras, false, false, r.userId);
66040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            // Set this to null so that the reference
6619357b11a798b804b69907f93437229cac1d82468Dianne Hackborn                            // (local and remote) isn't kept in the mBroadcastHistory.
66240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            r.resultTo = null;
66340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        } catch (RemoteException e) {
66440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            Slog.w(TAG, "Failure ["
66540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    + mQueueName + "] sending broadcast result of "
66640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    + r.intent, e);
66740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        }
66840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
66940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
67040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG");
67140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    cancelBroadcastTimeoutLocked();
67240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
67340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast "
67440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r);
67540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
67640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // ... and on to the next...
67740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    addBroadcastToHistoryLocked(r);
67840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mOrderedBroadcasts.remove(0);
67940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r = null;
68040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    looped = true;
68140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
68240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
68340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } while (r == null);
68440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
68540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Get the next receiver...
68640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int recIdx = r.nextReceiver++;
68740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
68840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Keep track of when this receiver started, and make sure there
68940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // is a timeout message pending to kill it if need be.
69040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.receiverTime = SystemClock.uptimeMillis();
69140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (recIdx == 0) {
69240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchTime = r.receiverTime;
69340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dispatchClockTime = System.currentTimeMillis();
69440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast ["
69540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r);
69640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
69740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (! mPendingBroadcastTimeoutMessage) {
69840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                long timeoutTime = r.receiverTime + mTimeoutPeriod;
69940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
70040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Submitting BROADCAST_TIMEOUT_MSG ["
70140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] for " + r + " at " + timeoutTime);
70240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
70340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
70440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
70540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Object nextReceiver = r.receivers.get(recIdx);
70640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (nextReceiver instanceof BroadcastFilter) {
70740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Simple case: this is a registered receiver who gets
70840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // a direct call.
70940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastFilter filter = (BroadcastFilter)nextReceiver;
71040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
71140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Delivering ordered ["
71240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] to registered "
71340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + filter + ": " + r);
71440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                deliverToRegisteredReceiverLocked(r, filter, r.ordered);
71540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (r.receiver == null || !r.ordered) {
71640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // The receiver has already finished, so schedule to
71740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    // process the next one.
71840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (DEBUG_BROADCAST) Slog.v(TAG, "Quick finishing ["
71940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + mQueueName + "]: ordered="
72040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.ordered + " receiver=" + r.receiver);
72140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.state = BroadcastRecord.IDLE;
72240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    scheduleBroadcastsLocked();
72340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
72440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
72540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
72640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
72740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Hard case: need to instantiate the receiver, possibly
72840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // starting its application process to host it.
72940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
73040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ResolveInfo info =
73140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                (ResolveInfo)nextReceiver;
7327d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ComponentName component = new ComponentName(
7337d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    info.activityInfo.applicationInfo.packageName,
7347d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    info.activityInfo.name);
73540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
73640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean skip = false;
73740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int perm = mService.checkComponentPermission(info.activityInfo.permission,
73840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.callingPid, r.callingUid, info.activityInfo.applicationInfo.uid,
73940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.exported);
74040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (perm != PackageManager.PERMISSION_GRANTED) {
74140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!info.activityInfo.exported) {
74240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: broadcasting "
74340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent.toString()
74440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " from " + r.callerPackage + " (pid=" + r.callingPid
74540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + ", uid=" + r.callingUid + ")"
74640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " is not exported from uid " + info.activityInfo.applicationInfo.uid
7477d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " due to receiver " + component.flattenToShortString());
74840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
74940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: broadcasting "
75040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent.toString()
75140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " from " + r.callerPackage + " (pid=" + r.callingPid
75240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + ", uid=" + r.callingUid + ")"
75340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " requires " + info.activityInfo.permission
7547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " due to receiver " + component.flattenToShortString());
75540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
75640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
75740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
75840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (info.activityInfo.applicationInfo.uid != Process.SYSTEM_UID &&
75940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.requiredPermission != null) {
76040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                try {
76140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    perm = AppGlobals.getPackageManager().
76240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            checkPermission(r.requiredPermission,
76340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                                    info.activityInfo.applicationInfo.packageName);
76440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } catch (RemoteException e) {
76540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    perm = PackageManager.PERMISSION_DENIED;
76640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
76740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (perm != PackageManager.PERMISSION_GRANTED) {
76840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Permission Denial: receiving "
76940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + r.intent + " to "
7707d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + component.flattenToShortString()
77140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " requires " + r.requiredPermission
77240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " due to sender " + r.callerPackage
77340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            + " (uid " + r.callingUid + ")");
77440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    skip = true;
77540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
77640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
777f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            if (r.appOp != AppOpsManager.OP_NONE) {
7781304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn                int mode = mService.mAppOpsService.noteOperation(r.appOp,
779f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                        info.activityInfo.applicationInfo.uid, info.activityInfo.packageName);
780f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                if (mode != AppOpsManager.MODE_ALLOWED) {
781f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    if (DEBUG_BROADCAST)  Slog.v(TAG,
782f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                            "App op " + r.appOp + " not allowed for broadcast to uid "
783f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                            + info.activityInfo.applicationInfo.uid + " pkg "
784f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                            + info.activityInfo.packageName);
785f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                    skip = true;
786f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn                }
787f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            }
78849660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver            if (!skip) {
78949660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                skip = !mService.mIntentFirewall.checkBroadcast(r.intent, r.callingUid,
79049660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver                        r.callingPid, r.resolvedType, info.activityInfo.applicationInfo.uid);
79149660c7c24f24c3394233e3bbf94c96281e8c408Ben Gruver            }
7927d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            boolean isSingleton = false;
7937d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            try {
7947d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                isSingleton = mService.isSingleton(info.activityInfo.processName,
7957d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.applicationInfo,
7967d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.name, info.activityInfo.flags);
7977d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            } catch (SecurityException e) {
7987d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                Slog.w(TAG, e.getMessage());
7997d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                skip = true;
8007d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
8017d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if ((info.activityInfo.flags&ActivityInfo.FLAG_SINGLE_USER) != 0) {
8027d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                if (ActivityManager.checkUidPermission(
8037d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        android.Manifest.permission.INTERACT_ACROSS_USERS,
8047d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                        info.activityInfo.applicationInfo.uid)
8057d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                                != PackageManager.PERMISSION_GRANTED) {
8067d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    Slog.w(TAG, "Permission Denial: Receiver " + component.flattenToShortString()
8077d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + " requests FLAG_SINGLE_USER, but app does not hold "
8087d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                            + android.Manifest.permission.INTERACT_ACROSS_USERS);
8097d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                    skip = true;
8107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                }
8117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            }
81240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r.curApp != null && r.curApp.crashing) {
81340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // If the target process is crashing, just skip it.
8149357b11a798b804b69907f93437229cac1d82468Dianne Hackborn                Slog.w(TAG, "Skipping deliver ordered [" + mQueueName + "] " + r
8159357b11a798b804b69907f93437229cac1d82468Dianne Hackborn                        + " to " + r.curApp + ": process crashing");
81640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                skip = true;
81740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
818ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate            if (!skip) {
819ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                boolean isAvailable = false;
820ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                try {
821ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                    isAvailable = AppGlobals.getPackageManager().isPackageAvailable(
822ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                            info.activityInfo.packageName,
823ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                            UserHandle.getUserId(info.activityInfo.applicationInfo.uid));
824ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                } catch (Exception e) {
825ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                    // all such failures mean we skip this receiver
826ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                    Slog.w(TAG, "Exception getting recipient info for "
827ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                            + info.activityInfo.packageName, e);
828ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                }
829ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                if (!isAvailable) {
830ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                    if (DEBUG_BROADCAST) {
831ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                        Slog.v(TAG, "Skipping delivery to " + info.activityInfo.packageName
832ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                                + " / " + info.activityInfo.applicationInfo.uid
833ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                                + " : package no longer available");
834ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                    }
835ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                    skip = true;
836ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate                }
837ba629da331d01d74067afdda5d4255682d4b24d7Christopher Tate            }
83840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
83940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (skip) {
84040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST)  Slog.v(TAG,
84140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Skipping delivery of ordered ["
84240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] " + r + " for whatever reason");
84340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.receiver = null;
84440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.curFilter = null;
84540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.IDLE;
84640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
84740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
84840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
84940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
85040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.state = BroadcastRecord.APP_RECEIVE;
85140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            String targetProcess = info.activityInfo.processName;
8527d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            r.curComponent = component;
8537d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            if (r.callingUid != Process.SYSTEM_UID && isSingleton) {
8547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn                info.activityInfo = mService.getActivityInfoForUser(info.activityInfo, 0);
85540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
85640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            r.curReceiver = info.activityInfo;
857f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            if (DEBUG_MU && r.callingUid > UserHandle.PER_USER_RANGE) {
85840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.v(TAG_MU, "Updated broadcast record activity info for secondary user, "
85940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo + ", callingUid = " + r.callingUid + ", uid = "
86040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.uid);
86140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
86240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
86340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Broadcast is being executed, its package can't be stopped.
86440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            try {
86540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                AppGlobals.getPackageManager().setPackageStoppedState(
866f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                        r.curComponent.getPackageName(), false, UserHandle.getUserId(r.callingUid));
86740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (RemoteException e) {
86840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } catch (IllegalArgumentException e) {
86940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Failed trying to unstop package "
87040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.curComponent.getPackageName() + ": " + e);
87140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
87240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
87340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Is this receiver's application already running?
87440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            ProcessRecord app = mService.getProcessRecordLocked(targetProcess,
8753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    info.activityInfo.applicationInfo.uid, false);
87640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (app != null && app.thread != null) {
87740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                try {
878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    app.addPackage(info.activityInfo.packageName, mService.mProcessStats);
87940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    processCurBroadcastLocked(r, app);
88040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    return;
88140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } catch (RemoteException e) {
88240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    Slog.w(TAG, "Exception when sending broadcast to "
88340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                          + r.curComponent, e);
8846c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                } catch (RuntimeException e) {
8856c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    Log.wtf(TAG, "Failed sending broadcast to "
8866c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                            + r.curComponent + " with " + r.intent, e);
8876c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // If some unexpected exception happened, just skip
8886c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // this broadcast.  At this point we are not in the call
8896c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // from a client, so throwing an exception out from here
8906c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // will crash the entire system instead of just whoever
8916c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // sent the broadcast.
8926c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    logBroadcastReceiverDiscardLocked(r);
8936c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    finishReceiverLocked(r, r.resultCode, r.resultData,
8946285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                            r.resultExtras, r.resultAbort, false);
8956c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    scheduleBroadcastsLocked();
8966c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    // We need to reset the state if we failed to start the receiver.
8976c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    r.state = BroadcastRecord.IDLE;
8986c5406acd72eed31f2b4e12f5eddc0e2d2a951e2Dianne Hackborn                    return;
89940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
90040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
90140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // If a dead object exception was thrown -- fall through to
90240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // restart the application.
90340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
90440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
90540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Not running -- get it started, to be executed when the app comes up.
90640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (DEBUG_BROADCAST)  Slog.v(TAG,
90740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "Need to start app ["
90840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + mQueueName + "] " + targetProcess + " for broadcast " + r);
90940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if ((r.curApp=mService.startProcessLocked(targetProcess,
91040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    info.activityInfo.applicationInfo, true,
91140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND,
91240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "broadcast", r.curComponent,
9133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                    (r.intent.getFlags()&Intent.FLAG_RECEIVER_BOOT_UPGRADE) != 0, false, false))
91440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            == null) {
91540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Ah, this recipient is unavailable.  Finish it if necessary,
91640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // and mark the broadcast record as ready for the next.
91740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                Slog.w(TAG, "Unable to launch app "
91840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.packageName + "/"
91940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + info.activityInfo.applicationInfo.uid + " for broadcast "
92040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + r.intent + ": process is bad");
92140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                logBroadcastReceiverDiscardLocked(r);
92240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                finishReceiverLocked(r, r.resultCode, r.resultData,
9236285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                        r.resultExtras, r.resultAbort, false);
92440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                scheduleBroadcastsLocked();
92540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.state = BroadcastRecord.IDLE;
92640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
92740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
92840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
92940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = r;
93040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastRecvIndex = recIdx;
93140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
93240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
93340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
93440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void setBroadcastTimeoutLocked(long timeoutTime) {
93540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (! mPendingBroadcastTimeoutMessage) {
93640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
93740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.sendMessageAtTime(msg, timeoutTime);
93840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = true;
93940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
94040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
94140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
94240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void cancelBroadcastTimeoutLocked() {
94340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mPendingBroadcastTimeoutMessage) {
94440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this);
94540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = false;
94640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
94740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
94840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
94940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void broadcastTimeoutLocked(boolean fromMsg) {
95040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (fromMsg) {
95140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcastTimeoutMessage = false;
95240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
95340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
95440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mOrderedBroadcasts.size() == 0) {
95540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
95640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
95740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
95840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        long now = SystemClock.uptimeMillis();
95940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        BroadcastRecord r = mOrderedBroadcasts.get(0);
96040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (fromMsg) {
96140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (mService.mDidDexOpt) {
96240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Delay timeouts until dexopt finishes.
96340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mService.mDidDexOpt = false;
96440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                long timeoutTime = SystemClock.uptimeMillis() + mTimeoutPeriod;
96540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
96640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
96740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
96840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!mService.mProcessesReady) {
96940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // Only process broadcast timeouts if the system is ready. That way
97040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // PRE_BOOT_COMPLETED broadcasts can't timeout as they are intended
97140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // to do heavy lifting for system up.
97240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
97340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
97440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
97540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            long timeoutTime = r.receiverTime + mTimeoutPeriod;
97640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (timeoutTime > now) {
97740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // We can observe premature timeouts because we do not cancel and reset the
97840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // broadcast timeout message after each receiver finishes.  Instead, we set up
97940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // an initial timeout then kick it down the road a little further as needed
98040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                // when it expires.
98140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (DEBUG_BROADCAST) Slog.v(TAG,
98240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        "Premature timeout ["
98340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + mQueueName + "] @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
98440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        + timeoutTime);
98540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                setBroadcastTimeoutLocked(timeoutTime);
98640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                return;
98740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
98840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
98940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
9906285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        BroadcastRecord br = mOrderedBroadcasts.get(0);
9916285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        if (br.state == BroadcastRecord.WAITING_SERVICES) {
9926285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // In this case the broadcast had already finished, but we had decided to wait
9936285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // for started services to finish as well before going on.  So if we have actually
9946285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // waited long enough time timeout the broadcast, let's give up on the whole thing
9956285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            // and just move on to the next.
9966285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            Slog.i(ActivityManagerService.TAG, "Waited long enough for: " + (br.curComponent != null
9976285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                    ? br.curComponent.flattenToShortString() : "(null)"));
9986285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            br.curComponent = null;
9996285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            br.state = BroadcastRecord.IDLE;
10006285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            processNextBroadcast(false);
10016285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn            return;
10026285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        }
10036285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn
10046285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn        Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r. receiver
100540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                + ", started " + (now - r.receiverTime) + "ms ago");
100640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.receiverTime = now;
100740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.anrCount++;
100840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
100940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Current receiver has passed its expiration date.
101040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.nextReceiver <= 0) {
101140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Slog.w(TAG, "Timeout on receiver with nextReceiver <= 0");
101240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
101340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
101440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
101540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        ProcessRecord app = null;
101640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        String anrMessage = null;
101740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
101840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        Object curReceiver = r.receivers.get(r.nextReceiver-1);
101940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        Slog.w(TAG, "Receiver during timeout: " + curReceiver);
102040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        logBroadcastReceiverDiscardLocked(r);
102140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (curReceiver instanceof BroadcastFilter) {
102240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastFilter bf = (BroadcastFilter)curReceiver;
102340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (bf.receiverList.pid != 0
102440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    && bf.receiverList.pid != ActivityManagerService.MY_PID) {
102540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                synchronized (mService.mPidsSelfLocked) {
102640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    app = mService.mPidsSelfLocked.get(
102740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                            bf.receiverList.pid);
102840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
102940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
103040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
103140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            app = r.curApp;
103240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
103340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
103440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (app != null) {
103540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            anrMessage = "Broadcast of " + r.intent.toString();
103640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
103740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
103840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mPendingBroadcast == r) {
103940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mPendingBroadcast = null;
104040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
104140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
104240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        // Move on to the next receiver.
104340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        finishReceiverLocked(r, r.resultCode, r.resultData,
10446285a32f74890b761579b4f67afde1b08763fd0aDianne Hackborn                r.resultExtras, r.resultAbort, false);
104540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        scheduleBroadcastsLocked();
104640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
104740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (anrMessage != null) {
104840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // Post the ANR to the handler since we do not want to process ANRs while
104940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // potentially holding our lock.
105040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            mHandler.post(new AppNotResponding(app, anrMessage));
105140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
105240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
105340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
105440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    private final void addBroadcastToHistoryLocked(BroadcastRecord r) {
105540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.callingUid < 0) {
105640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            // This was from a registerReceiver() call; ignore it.
105740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            return;
105840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
105940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        System.arraycopy(mBroadcastHistory, 0, mBroadcastHistory, 1,
106040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                MAX_BROADCAST_HISTORY-1);
106140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        r.finishTime = SystemClock.uptimeMillis();
106240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        mBroadcastHistory[0] = r;
1063c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        System.arraycopy(mBroadcastSummaryHistory, 0, mBroadcastSummaryHistory, 1,
1064c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                MAX_BROADCAST_SUMMARY_HISTORY-1);
1065c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        mBroadcastSummaryHistory[0] = r.intent;
106640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
106740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
106840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final void logBroadcastReceiverDiscardLocked(BroadcastRecord r) {
106940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (r.nextReceiver > 0) {
107040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Object curReceiver = r.receivers.get(r.nextReceiver-1);
107140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (curReceiver instanceof BroadcastFilter) {
107240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastFilter bf = (BroadcastFilter) curReceiver;
107340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER,
1074b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        bf.owningUserId, System.identityHashCode(r),
107540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.intent.getAction(),
107640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        r.nextReceiver - 1,
107740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        System.identityHashCode(bf));
107840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } else {
1079b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                ResolveInfo ri = (ResolveInfo)curReceiver;
108040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1081b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        UserHandle.getUserId(ri.activityInfo.applicationInfo.uid),
1082b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        System.identityHashCode(r), r.intent.getAction(),
1083b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                        r.nextReceiver - 1, ri.toString());
108440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
108540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        } else {
108640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            Slog.w(TAG, "Discarding broadcast before first receiver is invoked: "
108740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    + r);
108840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
1089b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                    -1, System.identityHashCode(r),
109040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.intent.getAction(),
109140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    r.nextReceiver,
109240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    "NONE");
109340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
109440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
109540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
109640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    final boolean dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args,
109740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            int opti, boolean dumpAll, String dumpPackage, boolean needSep) {
109840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0
109940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                || mPendingBroadcast != null) {
110040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            boolean printed = false;
110140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
110240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastRecord br = mParallelBroadcasts.get(i);
110340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
110440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
110540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
110640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!printed) {
110740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (needSep) {
110840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        pw.println();
110940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
11106cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                    needSep = true;
111140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    printed = true;
111240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  Active broadcasts [" + mQueueName + "]:");
111340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
11146cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.println("  Active Broadcast " + mQueueName + " #" + i + ":");
111540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                br.dump(pw, "    ");
111640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
111740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            printed = false;
111840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            needSep = true;
111940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) {
112040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                BroadcastRecord br = mOrderedBroadcasts.get(i);
112140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) {
112240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    continue;
112340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
112440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (!printed) {
112540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    if (needSep) {
112640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                        pw.println();
112740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    }
112840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    needSep = true;
11296cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                    printed = true;
113040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  Active ordered broadcasts [" + mQueueName + "]:");
113140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
11326cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.println("  Active Ordered Broadcast " + mQueueName + " #" + i + ":");
113340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                mOrderedBroadcasts.get(i).dump(pw, "    ");
113440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
113540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpPackage == null || (mPendingBroadcast != null
113640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    && dumpPackage.equals(mPendingBroadcast.callerPackage))) {
113740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (needSep) {
113840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println();
113940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
114040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                pw.println("  Pending broadcast [" + mQueueName + "]:");
114140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (mPendingBroadcast != null) {
114240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    mPendingBroadcast.dump(pw, "    ");
114340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                } else {
114440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("    (null)");
114540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
114640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                needSep = true;
114740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
114840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
114940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
1150c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        int i;
115140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        boolean printed = false;
1152c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        for (i=0; i<MAX_BROADCAST_HISTORY; i++) {
115340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            BroadcastRecord r = mBroadcastHistory[i];
115440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (r == null) {
115540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                break;
115640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
115740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) {
115840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                continue;
115940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
116040c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (!printed) {
116140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                if (needSep) {
116240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println();
116340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
116440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                needSep = true;
116540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                pw.println("  Historical broadcasts [" + mQueueName + "]:");
116640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                printed = true;
116740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
116840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            if (dumpAll) {
11696cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                pw.print("  Historical Broadcast " + mQueueName + " #");
11706cbd33fc25fa48dcb673edc150d2315bec4ade3aDianne Hackborn                        pw.print(i); pw.println(":");
117140c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                r.dump(pw, "    ");
117240c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            } else {
1173c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("  #"); pw.print(i); pw.print(": "); pw.println(r);
1174c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("    ");
1175c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.println(r.intent.toShortString(false, true, true, false));
1176a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn                if (r.targetComp != null && r.targetComp != r.intent.getComponent()) {
1177a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn                    pw.print("    targetComp: "); pw.println(r.targetComp.toShortString());
1178a40cfeb55f6caa35fee894b86175b7d916520c80Dianne Hackborn                }
1179c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Bundle bundle = r.intent.getExtras();
1180c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (bundle != null) {
1181c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.print("    extras: "); pw.println(bundle.toString());
1182c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1183c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            }
1184c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        }
1185c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn
1186c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn        if (dumpPackage == null) {
1187c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            if (dumpAll) {
1188c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                i = 0;
1189c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                printed = false;
1190c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            }
1191c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn            for (; i<MAX_BROADCAST_SUMMARY_HISTORY; i++) {
1192c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Intent intent = mBroadcastSummaryHistory[i];
1193c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (intent == null) {
1194c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    break;
1195c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1196c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (!printed) {
1197c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    if (needSep) {
1198c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                        pw.println();
1199c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    }
1200c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    needSep = true;
1201c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.println("  Historical broadcasts summary [" + mQueueName + "]:");
1202c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    printed = true;
1203c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
1204c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (!dumpAll && i >= 50) {
120540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    pw.println("  ...");
120640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                    break;
120740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn                }
1208c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.print("  #"); pw.print(i); pw.print(": ");
1209c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                pw.println(intent.toShortString(false, true, true, false));
1210c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                Bundle bundle = intent.getExtras();
1211c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                if (bundle != null) {
1212c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                    pw.print("    extras: "); pw.println(bundle.toString());
1213c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn                }
121440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn            }
121540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        }
121640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn
121740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn        return needSep;
121840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn    }
121940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn}
1220