1bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey/* 2bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * Copyright (C) 2016 The Android Open Source Project 3bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * 4bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * you may not use this file except in compliance with the License. 6bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * You may obtain a copy of the License at 7bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * 8bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * 10bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 11bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * See the License for the specific language governing permissions and 14bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * limitations under the License 15bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey */ 16bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 17bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeypackage com.android.server.am; 18bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 19bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; 20bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 21bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.app.AppOpsManager; 22bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.content.ComponentName; 23bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.content.IIntentReceiver; 24bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.content.Intent; 25bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.content.pm.ResolveInfo; 26bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.os.Bundle; 27bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.os.Process; 28bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.os.UserHandle; 29bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport android.util.Slog; 30bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 31bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport com.android.internal.R; 32bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport com.android.internal.util.ProgressReporter; 33bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 34bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeyimport java.util.List; 35bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 36bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey/** 37bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * Simple broadcaster that sends {@link Intent#ACTION_PRE_BOOT_COMPLETED} to all 38bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * system apps that register for it. Override {@link #onFinished()} to handle 39bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey * when all broadcasts are finished. 40bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey */ 41bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkeypublic abstract class PreBootBroadcaster extends IIntentReceiver.Stub { 42bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey private static final String TAG = "PreBootBroadcaster"; 43bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 44bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey private final ActivityManagerService mService; 45bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey private final int mUserId; 46bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey private final ProgressReporter mProgress; 47bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 48bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey private final Intent mIntent; 49bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey private final List<ResolveInfo> mTargets; 50bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 51bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey private int mIndex = 0; 52bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 53bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey public PreBootBroadcaster(ActivityManagerService service, int userId, 54bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey ProgressReporter progress) { 55bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mService = service; 56bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mUserId = userId; 57bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mProgress = progress; 58bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 59bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mIntent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED); 60bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mIntent.addFlags(Intent.FLAG_RECEIVER_BOOT_UPGRADE | Intent.FLAG_DEBUG_TRIAGED_MISSING); 61bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 62bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mTargets = mService.mContext.getPackageManager().queryBroadcastReceiversAsUser(mIntent, 63bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey MATCH_SYSTEM_ONLY, UserHandle.of(userId)); 64bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey } 65bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 66bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey public void sendNext() { 67bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey if (mIndex >= mTargets.size()) { 68bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey onFinished(); 69bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey return; 70bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey } 71bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 72100bd9c24a06e3b139ad51526c3eec9cbcff68eeJeff Sharkey if (!mService.isUserRunning(mUserId, 0)) { 73100bd9c24a06e3b139ad51526c3eec9cbcff68eeJeff Sharkey Slog.i(TAG, "User " + mUserId + " is no longer running; skipping remaining receivers"); 74100bd9c24a06e3b139ad51526c3eec9cbcff68eeJeff Sharkey onFinished(); 75100bd9c24a06e3b139ad51526c3eec9cbcff68eeJeff Sharkey return; 76100bd9c24a06e3b139ad51526c3eec9cbcff68eeJeff Sharkey } 77100bd9c24a06e3b139ad51526c3eec9cbcff68eeJeff Sharkey 78bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey final ResolveInfo ri = mTargets.get(mIndex++); 79bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey final ComponentName componentName = ri.activityInfo.getComponentName(); 80bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 81fd24108ca9876ac4f3598cf06464b78b61f32a96Jeff Sharkey if (mProgress != null) { 82fd24108ca9876ac4f3598cf06464b78b61f32a96Jeff Sharkey final CharSequence label = ri.activityInfo 83fd24108ca9876ac4f3598cf06464b78b61f32a96Jeff Sharkey .loadLabel(mService.mContext.getPackageManager()); 84fd24108ca9876ac4f3598cf06464b78b61f32a96Jeff Sharkey mProgress.setProgress(mIndex, mTargets.size(), 85fd24108ca9876ac4f3598cf06464b78b61f32a96Jeff Sharkey mService.mContext.getString(R.string.android_preparing_apk, label)); 86fd24108ca9876ac4f3598cf06464b78b61f32a96Jeff Sharkey } 87bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 88bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey Slog.i(TAG, "Pre-boot of " + componentName.toShortString() + " for user " + mUserId); 89bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey EventLogTags.writeAmPreBoot(mUserId, componentName.getPackageName()); 90bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 91bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mIntent.setComponent(componentName); 92bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey mService.broadcastIntentLocked(null, null, mIntent, null, this, 0, null, null, null, 93bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey AppOpsManager.OP_NONE, null, true, false, ActivityManagerService.MY_PID, 94bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey Process.SYSTEM_UID, mUserId); 95bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey } 96bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 97bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey @Override 98bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey public void performReceive(Intent intent, int resultCode, String data, Bundle extras, 99bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey boolean ordered, boolean sticky, int sendingUser) { 100bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey sendNext(); 101bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey } 102bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey 103bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey public abstract void onFinished(); 104bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey} 105